home to your local SPACEGIRL 馃挮 arimelody.space
at dev 255 lines 9.5 kB view raw
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}