home to your local SPACEGIRL 馃挮
arimelody.space
1package admin
2
3import (
4 "fmt"
5 "net/http"
6 "strings"
7
8 "arimelody-web/admin/templates"
9 "arimelody-web/controller"
10 "arimelody-web/model"
11)
12
13func serveTracks(app *model.AppState) http.Handler {
14 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
15 session := r.Context().Value("session").(*model.Session)
16
17 slices := strings.Split(strings.TrimPrefix(r.URL.Path, "/tracks")[1:], "/")
18 trackID := slices[0]
19
20 if len(trackID) > 0 {
21 serveTrack(app, trackID).ServeHTTP(w, r)
22 return
23 }
24
25 tracks, err := controller.GetAllTracks(app.DB)
26 if err != nil {
27 fmt.Printf("WARN: Failed to fetch tracks: %s\n", err)
28 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
29 return
30 }
31
32 type TracksResponse struct {
33 adminPageData
34 Tracks []*model.Track
35 }
36
37 err = templates.TracksTemplate.Execute(w, TracksResponse{
38 adminPageData: adminPageData{ Path: r.URL.Path, Session: session },
39 Tracks: tracks,
40 })
41 if err != nil {
42 fmt.Printf("WARN: Failed to serve admin tracks page: %s\n", err)
43 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
44 }
45 })
46}
47
48func serveTrack(app *model.AppState, trackID string) http.Handler {
49 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
50 session := r.Context().Value("session").(*model.Session)
51
52 track, err := controller.GetTrack(app.DB, trackID)
53 if err != nil {
54 fmt.Printf("WARN: Failed to serve admin track page for %s: %s\n", trackID, err)
55 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
56 return
57 }
58 if track == nil {
59 http.NotFound(w, r)
60 return
61 }
62
63 releases, err := controller.GetTrackReleases(app.DB, track.ID, true)
64 if err != nil {
65 fmt.Printf("WARN: Failed to fetch releases for track %s: %s\n", trackID, err)
66 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
67 return
68 }
69
70 type TrackResponse struct {
71 adminPageData
72 Track *model.Track
73 Releases []*model.Release
74 }
75
76 err = templates.EditTrackTemplate.Execute(w, TrackResponse{
77 adminPageData: adminPageData{ Path: r.URL.Path, Session: session },
78 Track: track,
79 Releases: releases,
80 })
81 if err != nil {
82 fmt.Printf("WARN: Failed to serve admin track page for %s: %s\n", trackID, err)
83 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
84 }
85 })
86}