account management should be done on the frontend. some work will need to be done to generate API keys for external clients, but notably some API endpoints are currently used by the frontend using session tokens.
146 lines
5.1 KiB
Go
146 lines
5.1 KiB
Go
package api
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"arimelody-web/admin"
|
|
"arimelody-web/controller"
|
|
"arimelody-web/model"
|
|
)
|
|
|
|
func Handler(app *model.AppState) http.Handler {
|
|
mux := http.NewServeMux()
|
|
|
|
// TODO: generate API keys on the frontend
|
|
|
|
// ARTIST ENDPOINTS
|
|
|
|
mux.Handle("/v1/artist/", http.StripPrefix("/v1/artist", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
var artistID = strings.Split(r.URL.Path[1:], "/")[0]
|
|
artist, err := controller.GetArtist(app.DB, artistID)
|
|
if err != nil {
|
|
if strings.Contains(err.Error(), "no rows") {
|
|
http.NotFound(w, r)
|
|
return
|
|
}
|
|
fmt.Printf("FATAL: Error while retrieving artist %s: %s\n", artistID, err)
|
|
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
switch r.Method {
|
|
case http.MethodGet:
|
|
// GET /api/v1/artist/{id}
|
|
ServeArtist(app, artist).ServeHTTP(w, r)
|
|
case http.MethodPut:
|
|
// PUT /api/v1/artist/{id} (admin)
|
|
admin.RequireAccount(app, UpdateArtist(app, artist)).ServeHTTP(w, r)
|
|
case http.MethodDelete:
|
|
// DELETE /api/v1/artist/{id} (admin)
|
|
admin.RequireAccount(app, DeleteArtist(app, artist)).ServeHTTP(w, r)
|
|
default:
|
|
http.NotFound(w, r)
|
|
}
|
|
})))
|
|
mux.Handle("/v1/artist", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
switch r.Method {
|
|
case http.MethodGet:
|
|
// GET /api/v1/artist
|
|
ServeAllArtists(app).ServeHTTP(w, r)
|
|
case http.MethodPost:
|
|
// POST /api/v1/artist (admin)
|
|
admin.RequireAccount(app, CreateArtist(app)).ServeHTTP(w, r)
|
|
default:
|
|
http.NotFound(w, r)
|
|
}
|
|
}))
|
|
|
|
// RELEASE ENDPOINTS
|
|
|
|
mux.Handle("/v1/music/", http.StripPrefix("/v1/music", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
var releaseID = strings.Split(r.URL.Path[1:], "/")[0]
|
|
release, err := controller.GetRelease(app.DB, releaseID, true)
|
|
if err != nil {
|
|
if strings.Contains(err.Error(), "no rows") {
|
|
http.NotFound(w, r)
|
|
return
|
|
}
|
|
fmt.Printf("FATAL: Error while retrieving release %s: %s\n", releaseID, err)
|
|
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
switch r.Method {
|
|
case http.MethodGet:
|
|
// GET /api/v1/music/{id}
|
|
ServeRelease(app, release).ServeHTTP(w, r)
|
|
case http.MethodPut:
|
|
// PUT /api/v1/music/{id} (admin)
|
|
admin.RequireAccount(app, UpdateRelease(app, release)).ServeHTTP(w, r)
|
|
case http.MethodDelete:
|
|
// DELETE /api/v1/music/{id} (admin)
|
|
admin.RequireAccount(app, DeleteRelease(app, release)).ServeHTTP(w, r)
|
|
default:
|
|
http.NotFound(w, r)
|
|
}
|
|
})))
|
|
mux.Handle("/v1/music", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
switch r.Method {
|
|
case http.MethodGet:
|
|
// GET /api/v1/music
|
|
ServeCatalog(app).ServeHTTP(w, r)
|
|
case http.MethodPost:
|
|
// POST /api/v1/music (admin)
|
|
admin.RequireAccount(app, CreateRelease(app)).ServeHTTP(w, r)
|
|
default:
|
|
http.NotFound(w, r)
|
|
}
|
|
}))
|
|
|
|
// TRACK ENDPOINTS
|
|
|
|
mux.Handle("/v1/track/", http.StripPrefix("/v1/track", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
var trackID = strings.Split(r.URL.Path[1:], "/")[0]
|
|
track, err := controller.GetTrack(app.DB, trackID)
|
|
if err != nil {
|
|
if strings.Contains(err.Error(), "no rows") {
|
|
http.NotFound(w, r)
|
|
return
|
|
}
|
|
fmt.Printf("FATAL: Error while retrieving track %s: %s\n", trackID, err)
|
|
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
switch r.Method {
|
|
case http.MethodGet:
|
|
// GET /api/v1/track/{id} (admin)
|
|
admin.RequireAccount(app, ServeTrack(app, track)).ServeHTTP(w, r)
|
|
case http.MethodPut:
|
|
// PUT /api/v1/track/{id} (admin)
|
|
admin.RequireAccount(app, UpdateTrack(app, track)).ServeHTTP(w, r)
|
|
case http.MethodDelete:
|
|
// DELETE /api/v1/track/{id} (admin)
|
|
admin.RequireAccount(app, DeleteTrack(app, track)).ServeHTTP(w, r)
|
|
default:
|
|
http.NotFound(w, r)
|
|
}
|
|
})))
|
|
mux.Handle("/v1/track", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
switch r.Method {
|
|
case http.MethodGet:
|
|
// GET /api/v1/track (admin)
|
|
admin.RequireAccount(app, ServeAllTracks(app)).ServeHTTP(w, r)
|
|
case http.MethodPost:
|
|
// POST /api/v1/track (admin)
|
|
admin.RequireAccount(app, CreateTrack(app)).ServeHTTP(w, r)
|
|
default:
|
|
http.NotFound(w, r)
|
|
}
|
|
}))
|
|
|
|
return mux
|
|
}
|