home to your local SPACEGIRL 馃挮
arimelody.space
1package admin
2
3import (
4 "fmt"
5 "net/http"
6 "os"
7 "strings"
8
9 "arimelody-web/admin/templates"
10 "arimelody-web/controller"
11 "arimelody-web/model"
12)
13
14func serveReleases(app *model.AppState) http.Handler {
15 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
16 session := r.Context().Value("session").(*model.Session)
17
18 slices := strings.Split(strings.TrimPrefix(r.URL.Path, "/releases")[1:], "/")
19 releaseID := slices[0]
20
21 var action string = ""
22 if len(slices) > 1 {
23 action = slices[1]
24 }
25
26 if len(releaseID) > 0 {
27 serveRelease(app, releaseID, action).ServeHTTP(w, r)
28 return
29 }
30
31 type ReleasesData struct {
32 adminPageData
33 Releases []*model.Release
34 }
35
36 releases, err := controller.GetAllReleases(app.DB, false, 0, true)
37 if err != nil {
38 fmt.Fprintf(os.Stderr, "WARN: Failed to fetch releases: %s\n", err)
39 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
40 return
41 }
42
43 err = templates.ReleasesTemplate.Execute(w, ReleasesData{
44 adminPageData: adminPageData{
45 Path: r.URL.Path,
46 Session: session,
47 },
48 Releases: releases,
49 })
50 if err != nil {
51 fmt.Fprintf(os.Stderr, "WARN: Failed to serve releases page: %s\n", err)
52 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
53 return
54 }
55 })
56}
57
58func serveRelease(app *model.AppState, releaseID string, action string) http.Handler {
59 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
60 session := r.Context().Value("session").(*model.Session)
61
62 release, err := controller.GetRelease(app.DB, releaseID, true)
63 if err != nil {
64 if strings.Contains(err.Error(), "no rows") {
65 http.NotFound(w, r)
66 return
67 }
68 fmt.Printf("WARN: Failed to fetch full release data for %s: %s\n", releaseID, err)
69 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
70 return
71 }
72
73 if len(action) > 0 {
74 switch action {
75 case "editcredits":
76 serveEditCredits(release).ServeHTTP(w, r)
77 return
78 case "addcredit":
79 serveAddCredit(app, release).ServeHTTP(w, r)
80 return
81 case "newcredit":
82 serveNewCredit(app).ServeHTTP(w, r)
83 return
84 case "editlinks":
85 serveEditLinks(release).ServeHTTP(w, r)
86 return
87 case "edittracks":
88 serveEditTracks(release).ServeHTTP(w, r)
89 return
90 case "addtrack":
91 serveAddTrack(app, release).ServeHTTP(w, r)
92 return
93 case "newtrack":
94 serveNewTrack(app).ServeHTTP(w, r)
95 return
96 }
97 http.NotFound(w, r)
98 return
99 }
100
101 type ReleaseResponse struct {
102 adminPageData
103 Release *model.Release
104 }
105
106 for i, track := range release.Tracks { track.Number = i + 1 }
107
108 err = templates.EditReleaseTemplate.Execute(w, ReleaseResponse{
109 adminPageData: adminPageData{ Path: r.URL.Path, Session: session },
110 Release: release,
111 })
112 if err != nil {
113 fmt.Printf("WARN: Failed to serve admin release page for %s: %s\n", release.ID, err)
114 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
115 }
116 })
117}
118
119func serveEditCredits(release *model.Release) http.Handler {
120 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
121 w.Header().Set("Content-Type", "text/html")
122 err := templates.EditCreditsTemplate.Execute(w, release)
123 if err != nil {
124 fmt.Printf("WARN: Failed to serve edit credits component for %s: %s\n", release.ID, err)
125 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
126 }
127 })
128}
129
130func serveAddCredit(app *model.AppState, release *model.Release) http.Handler {
131 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
132 artists, err := controller.GetArtistsNotOnRelease(app.DB, release.ID)
133 if err != nil {
134 fmt.Printf("WARN: Failed to fetch artists not on %s: %s\n", release.ID, err)
135 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
136 return
137 }
138
139 type response struct {
140 ReleaseID string;
141 Artists []*model.Artist
142 }
143
144 w.Header().Set("Content-Type", "text/html")
145 err = templates.AddCreditTemplate.Execute(w, response{
146 ReleaseID: release.ID,
147 Artists: artists,
148 })
149 if err != nil {
150 fmt.Printf("WARN: Failed to serve add credits component for %s: %s\n", release.ID, err)
151 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
152 }
153 })
154}
155
156func serveNewCredit(app *model.AppState) http.Handler {
157 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
158 split := strings.Split(r.URL.Path, "/")
159 artistID := split[len(split) - 1]
160 artist, err := controller.GetArtist(app.DB, artistID)
161 if err != nil {
162 fmt.Printf("WARN: Failed to fetch artist %s: %s\n", artistID, err)
163 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
164 return
165 }
166 if artist == nil {
167 http.NotFound(w, r)
168 return
169 }
170
171 w.Header().Set("Content-Type", "text/html")
172 err = templates.NewCreditTemplate.Execute(w, artist)
173 if err != nil {
174 fmt.Printf("WARN: Failed to serve new credit component for %s: %s\n", artist.ID, err)
175 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
176 }
177 })
178}
179
180func serveEditLinks(release *model.Release) http.Handler {
181 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
182 w.Header().Set("Content-Type", "text/html")
183 err := templates.EditLinksTemplate.Execute(w, release)
184 if err != nil {
185 fmt.Printf("WARN: Failed to serve edit links component for %s: %s\n", release.ID, err)
186 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
187 }
188 })
189}
190
191func serveEditTracks(release *model.Release) http.Handler {
192 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
193 w.Header().Set("Content-Type", "text/html")
194
195 type editTracksData struct { Release *model.Release }
196
197 for i, track := range release.Tracks { track.Number = i + 1 }
198
199 err := templates.EditTracksTemplate.Execute(w, editTracksData{ Release: release })
200 if err != nil {
201 fmt.Printf("WARN: Failed to serve edit tracks component for %s: %s\n", release.ID, err)
202 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
203 }
204 })
205}
206
207func serveAddTrack(app *model.AppState, release *model.Release) http.Handler {
208 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
209 tracks, err := controller.GetTracksNotOnRelease(app.DB, release.ID)
210 if err != nil {
211 fmt.Printf("WARN: Failed to fetch tracks not on %s: %s\n", release.ID, err)
212 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
213 return
214 }
215
216 type response struct {
217 ReleaseID string;
218 Tracks []*model.Track
219 }
220
221 w.Header().Set("Content-Type", "text/html")
222 err = templates.AddTrackTemplate.Execute(w, response{
223 ReleaseID: release.ID,
224 Tracks: tracks,
225 })
226 if err != nil {
227 fmt.Printf("WARN: Failed to add tracks component for %s: %s\n", release.ID, err)
228 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
229 }
230 })
231}
232
233func serveNewTrack(app *model.AppState) http.Handler {
234 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
235 split := strings.Split(r.URL.Path, "/")
236 trackID := split[len(split) - 1]
237 track, err := controller.GetTrack(app.DB, trackID)
238 if err != nil {
239 fmt.Printf("WARN: Failed to fetch track %s: %s\n", trackID, err)
240 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
241 return
242 }
243 if track == nil {
244 http.NotFound(w, r)
245 return
246 }
247
248 w.Header().Set("Content-Type", "text/html")
249 err = templates.NewTrackTemplate.Execute(w, track)
250 if err != nil {
251 fmt.Printf("WARN: Failed to serve new track component for %s: %s\n", track.ID, err)
252 http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
253 }
254 })
255}