diff options
Diffstat (limited to 'cmd/web')
-rw-r--r-- | cmd/web/handlers/blog.go | 8 | ||||
-rw-r--r-- | cmd/web/handlers/fs.go | 60 | ||||
-rw-r--r-- | cmd/web/handlers/routes.go | 18 | ||||
-rw-r--r-- | cmd/web/main.go | 4 | ||||
-rw-r--r-- | cmd/web/types/application.go | 8 |
5 files changed, 89 insertions, 9 deletions
diff --git a/cmd/web/handlers/blog.go b/cmd/web/handlers/blog.go index da3aec2..d995583 100644 --- a/cmd/web/handlers/blog.go +++ b/cmd/web/handlers/blog.go @@ -12,15 +12,16 @@ type blogContext struct { Name string } -func (ctx blogContext) index(w http.ResponseWriter, r *http.Request) { +func (ctx *blogContext) index(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/" { http.NotFound(w, r) return } files := []string{ - "./ui/html/base.tmpl.html", - "./ui/html/pages/index.tmpl.html", + "ui/html/base.tmpl.html", + "ui/html/music_player.tmpl.html", + "ui/html/pages/index.tmpl.html", } compiled, err := template.ParseFiles(files...) @@ -34,5 +35,6 @@ func (ctx blogContext) index(w http.ResponseWriter, r *http.Request) { if err != nil { ctx.err.Print(err.Error()) http.Error(w, "Internal Server Error", 500) + return } } diff --git a/cmd/web/handlers/fs.go b/cmd/web/handlers/fs.go new file mode 100644 index 0000000..96f11d0 --- /dev/null +++ b/cmd/web/handlers/fs.go @@ -0,0 +1,60 @@ +package handlers + +import ( + "encoding/json" + "log" + "net/http" + "os" + "path/filepath" +) + +type fsContext struct { + err *log.Logger + path string + contentType string +} + +func (ctx *fsContext) readdir(w http.ResponseWriter, r *http.Request) { + entries, err := os.ReadDir(ctx.path) + if err != nil { + ctx.err.Print(err.Error()) + http.Error(w, "Internal Server Error", 500) + return + } + + files := make([]string, len(entries)) + for index, value := range entries { + files[index] = value.Name() + } + + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(files) +} + +func (ctx *fsContext) get(w http.ResponseWriter, r *http.Request) { + name := r.URL.Query().Get("file") + + file, err := os.ReadFile(ctx.path + "/" + name) + if err != nil { + ctx.err.Print(err.Error()) + http.Error(w, "Internal Server Error", 500) + return + } + + if ctx.contentType != "" { + w.Header().Set("Content-Type", ctx.contentType) + } else { + switch filepath.Ext(name) { + case ".css": + w.Header().Set("Content-Type", "text/css") + case ".js": + w.Header().Set("Content-Type", "text/javascript") + case ".svg": + w.Header().Set("Content-Type", "image/svg+xml") + case ".png": + w.Header().Set("Content-Type", "image/png") + } + } + + w.Write(file) +} diff --git a/cmd/web/handlers/routes.go b/cmd/web/handlers/routes.go index 5c927c4..31fe401 100644 --- a/cmd/web/handlers/routes.go +++ b/cmd/web/handlers/routes.go @@ -6,13 +6,27 @@ import ( ) func RegisterEndpoints(app types.Application) *mux.Router { - ctx := blogContext{ + blog := blogContext{ err: app.Err, Name: app.Env.Webmaster, } + audio := fsContext{ + err: app.Err, + path: app.AudioDir, + contentType: "audio/mpeg", + } + static := fsContext{ + err: app.Err, + path: "static", + } blogRouter := mux.NewRouter() - blogRouter.HandleFunc("/", ctx.index) + blogRouter.HandleFunc("/", blog.index) + + blogRouter.HandleFunc("/audio", audio.readdir) + blogRouter.HandleFunc("/audio/get", audio.get) + + blogRouter.HandleFunc("/static/get", static.get) return blogRouter } diff --git a/cmd/web/main.go b/cmd/web/main.go index e260b42..246abeb 100644 --- a/cmd/web/main.go +++ b/cmd/web/main.go @@ -23,7 +23,9 @@ func main() { if err != nil { app.Err.Fatal("Failed to load env") } - + + app.AudioDir = os.Getenv("audio_dir") + app.Env.Webmaster = os.Getenv("webmaster") app.Env.Db.Username = os.Getenv("db_user") app.Env.Db.Password = os.Getenv("db_pass") diff --git a/cmd/web/types/application.go b/cmd/web/types/application.go index c981d64..8bc6a73 100644 --- a/cmd/web/types/application.go +++ b/cmd/web/types/application.go @@ -7,9 +7,11 @@ import ( ) type Application struct { - Err *log.Logger - Info *log.Logger + Err *log.Logger + Info *log.Logger - Env context.Environment + AudioDir string + + Env context.Environment } |