diff --git a/Dockerfile b/Dockerfile index 6c8193f..53f1776 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,7 @@ FROM node:16-alpine3.13 as build-web +ARG NODE_ENV=production + WORKDIR /src COPY . . RUN cd web && npm install diff --git a/assets.go b/assets.go index d553b7f..17525d6 100644 --- a/assets.go +++ b/assets.go @@ -2,7 +2,17 @@ package main import ( "embed" + "io/fs" ) //go:embed web/*.tmpl web/assets/* var assets embed.FS + +var assetsWeb = fsMust(fs.Sub(assets, "web")) + +func fsMust(fs fs.FS, err error) fs.FS { + if err != nil { + panic(err) + } + return fs +} diff --git a/handlers.go b/handlers.go index 726b6d1..dcfa833 100644 --- a/handlers.go +++ b/handlers.go @@ -4,6 +4,7 @@ import ( "encoding/json" "errors" "html/template" + "io" "net/http" "os" "time" @@ -12,6 +13,7 @@ import ( ) var globalStore store +var handleAssets = http.FileServer(http.FS(assetsWeb)) func setupHandlers() { var err error @@ -19,6 +21,10 @@ func setupHandlers() { if err != nil { panic(err) } + + if debug { + handleAssets = http.FileServer(http.FS(os.DirFS("web/assets/"))) + } } /* credentials */ @@ -57,6 +63,13 @@ func setCredential(id string, cred credential, expire time.Duration) error { 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) +} + /* upload template */ func handleUpload(w http.ResponseWriter, req *http.Request) { @@ -64,7 +77,7 @@ func handleUpload(w http.ResponseWriter, req *http.Request) { _, err := getCredential(vars["id"]) if errors.Is(err, errNotFound) { errorResponseStatus(w, req, err) - tmpl.ExecuteTemplate(w, "upload-not-found.tmpl", nil) + executeTemplate(w, "upload-not-found.tmpl", nil) return } if err != nil { @@ -72,11 +85,11 @@ func handleUpload(w http.ResponseWriter, req *http.Request) { return } - tmpl.ExecuteTemplate(w, "upload.tmpl", nil) + executeTemplate(w, "upload.tmpl", nil) } /* create template */ func handleCreate(w http.ResponseWriter, req *http.Request) { - tmpl.ExecuteTemplate(w, "create.tmpl", nil) + executeTemplate(w, "create.tmpl", nil) } diff --git a/main.go b/main.go index d52d9c4..3965594 100644 --- a/main.go +++ b/main.go @@ -1,7 +1,6 @@ package main import ( - "io/fs" "log" "net/http" "os" @@ -10,17 +9,14 @@ import ( "github.com/gorilla/mux" ) +var debug = os.Getenv("DEBUG") == "true" + func main() { listen := os.Getenv("LISTEN") if listen == "" { listen = ":8080" } - assetsWeb, err := fs.Sub(assets, "web") - if err != nil { - panic(err) - } - setupHandlers() setupS3() @@ -28,8 +24,9 @@ func main() { router.Use(middlewareLogger) router.Methods(http.MethodGet).Path("/readyz").HandlerFunc(readyz) - router.Methods(http.MethodGet).PathPrefix("/assets").Handler(http.FileServer(http.FS(assetsWeb))) - router.Methods(http.MethodGet).Path("/").HandlerFunc(handleCreate) + router.Methods(http.MethodGet).PathPrefix("/assets").Handler(handleAssets) + + router.Methods(http.MethodGet).Path("/create").HandlerFunc(handleCreate) uploadRouter := router.PathPrefix("/{id}").Subrouter() uploadTemplateRouter := uploadRouter.Path("").Subrouter() @@ -49,8 +46,8 @@ func main() { ReadTimeout: 5 * time.Second, WriteTimeout: 10 * time.Second, } - log.Printf("listeining on %s", listen) - err = server.ListenAndServe() + log.Printf("listening on %s", listen) + err := server.ListenAndServe() if err != nil { panic(err) } diff --git a/web/create.tmpl b/web/create.tmpl new file mode 100644 index 0000000..6710341 --- /dev/null +++ b/web/create.tmpl @@ -0,0 +1,116 @@ +{{template "head.tmpl" "Create Dropbox"}} +
+{{template "foot.tmpl"}} diff --git a/web/foot.tmpl b/web/foot.tmpl index 11a09ca..a0357db 100644 --- a/web/foot.tmpl +++ b/web/foot.tmpl @@ -1,3 +1,4 @@ +