2021-05-22 22:24:28 +08:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2021-05-23 00:46:15 +08:00
|
|
|
"encoding/json"
|
|
|
|
"errors"
|
2021-05-22 23:53:00 +08:00
|
|
|
"html/template"
|
2021-05-23 15:36:41 +08:00
|
|
|
"io"
|
2021-05-22 22:24:28 +08:00
|
|
|
"net/http"
|
|
|
|
"os"
|
2021-05-23 00:46:15 +08:00
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/gorilla/mux"
|
2021-05-22 22:24:28 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
var globalStore store
|
|
|
|
|
|
|
|
func setupHandlers() {
|
|
|
|
var err error
|
|
|
|
globalStore, err = newRedisStore(os.Getenv("REDIS_CONNECTION"))
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2021-05-23 15:36:41 +08:00
|
|
|
|
|
|
|
if debug {
|
2021-05-23 17:00:48 +08:00
|
|
|
assetsServer = http.FileServer(http.FS(os.DirFS("web")))
|
2021-05-23 15:36:41 +08:00
|
|
|
}
|
2021-05-22 22:24:28 +08:00
|
|
|
}
|
|
|
|
|
2021-05-23 17:00:48 +08:00
|
|
|
/* assets */
|
|
|
|
|
|
|
|
var assetsServer = http.FileServer(http.FS(assetsWeb))
|
|
|
|
|
|
|
|
func handleAssets(w http.ResponseWriter, req *http.Request) {
|
|
|
|
assetsServer.ServeHTTP(w, req)
|
|
|
|
}
|
|
|
|
|
|
|
|
/* templates */
|
|
|
|
|
|
|
|
var tmpl = template.Must(template.ParseFS(assets, "web/*.tmpl"))
|
|
|
|
|
|
|
|
func executeTemplate(w io.Writer, name string, data interface{}) error {
|
|
|
|
if debug {
|
|
|
|
tmpl = template.Must(template.ParseGlob("web/*.tmpl"))
|
|
|
|
}
|
|
|
|
return tmpl.ExecuteTemplate(w, name, nil)
|
|
|
|
}
|
|
|
|
|
2021-05-23 00:46:15 +08:00
|
|
|
/* credentials */
|
|
|
|
|
|
|
|
func getCredential(id string) (credential, error) {
|
|
|
|
cred := credential{}
|
|
|
|
|
|
|
|
b, err := globalStore.get(id)
|
|
|
|
if err != nil {
|
|
|
|
return cred, err
|
|
|
|
}
|
|
|
|
|
|
|
|
err = json.Unmarshal(b, &cred)
|
|
|
|
if err != nil {
|
|
|
|
return cred, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return cred, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func setCredential(id string, cred credential, expire time.Duration) error {
|
|
|
|
b, err := json.Marshal(cred)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
err = globalStore.put(id, b, expire)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2021-05-22 23:53:00 +08:00
|
|
|
/* upload template */
|
2021-05-22 22:24:28 +08:00
|
|
|
|
2021-05-22 23:53:00 +08:00
|
|
|
func handleUpload(w http.ResponseWriter, req *http.Request) {
|
2021-05-23 00:46:15 +08:00
|
|
|
vars := mux.Vars(req)
|
|
|
|
_, err := getCredential(vars["id"])
|
|
|
|
if errors.Is(err, errNotFound) {
|
|
|
|
errorResponseStatus(w, req, err)
|
2021-05-23 15:36:41 +08:00
|
|
|
executeTemplate(w, "upload-not-found.tmpl", nil)
|
2021-05-23 00:46:15 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
if err != nil {
|
|
|
|
errorResponse(w, req, err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2021-05-23 15:36:41 +08:00
|
|
|
executeTemplate(w, "upload.tmpl", nil)
|
2021-05-22 22:24:28 +08:00
|
|
|
}
|
2021-05-23 00:46:15 +08:00
|
|
|
|
|
|
|
/* create template */
|
|
|
|
|
|
|
|
func handleCreate(w http.ResponseWriter, req *http.Request) {
|
2021-05-23 15:36:41 +08:00
|
|
|
executeTemplate(w, "create.tmpl", nil)
|
2021-05-23 00:46:15 +08:00
|
|
|
}
|