From 23d017ff90abfe7aeea7fb43619d7469e3ec0c2a Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sat, 2 May 2026 11:45:27 +0300 Subject: more on this --- internal/api/handlers_media.go | 53 ++++++++++++++++++++++++++++++++++++-- internal/api/handlers_more_test.go | 2 +- internal/api/server.go | 4 ++- 3 files changed, 55 insertions(+), 4 deletions(-) (limited to 'internal/api') diff --git a/internal/api/handlers_media.go b/internal/api/handlers_media.go index 1469342..3863ab0 100644 --- a/internal/api/handlers_media.go +++ b/internal/api/handlers_media.go @@ -30,7 +30,7 @@ func (s *Server) handleListSets(w http.ResponseWriter, r *http.Request) { writeJSON(w, http.StatusOK, sets) } -func (s *Server) handleSetCover(w http.ResponseWriter, r *http.Request) { +func (s *Server) handleGetSetCover(w http.ResponseWriter, r *http.Request) { if !requireService(w, s.mediaSvc) { return } @@ -39,7 +39,34 @@ func (s *Server) handleSetCover(w http.ResponseWriter, r *http.Request) { writeJSON(w, http.StatusBadRequest, map[string]string{"error": "invalid set id"}) return } - if err := s.mediaSvc.RegenerateSetCover(r.Context(), setID, userIDFromContext(r)); err != nil { + folder := r.URL.Query().Get("folder") + fr, err := s.mediaSvc.GetSetCover(r.Context(), setID, folder, userIDFromContext(r)) + if err != nil { + if errors.Is(err, service.ErrNotFound) { + writeJSON(w, http.StatusNotFound, map[string]string{"error": "not found"}) + return + } + if errors.Is(err, service.ErrForbidden) { + writeJSON(w, http.StatusForbidden, map[string]string{"error": "forbidden"}) + return + } + writeJSON(w, http.StatusInternalServerError, map[string]string{"error": err.Error()}) + return + } + http.ServeFile(w, r, fr.Path) +} + +func (s *Server) handlePostSetCover(w http.ResponseWriter, r *http.Request) { + if !requireService(w, s.mediaSvc) { + return + } + setID := pathID(r, "id") + if setID == 0 { + writeJSON(w, http.StatusBadRequest, map[string]string{"error": "invalid set id"}) + return + } + folder := r.URL.Query().Get("folder") + if err := s.mediaSvc.RegenerateSetCover(r.Context(), setID, folder, userIDFromContext(r)); err != nil { if errors.Is(err, service.ErrNotFound) { writeJSON(w, http.StatusNotFound, map[string]string{"error": "not found"}) return @@ -54,6 +81,28 @@ func (s *Server) handleSetCover(w http.ResponseWriter, r *http.Request) { writeJSON(w, http.StatusOK, map[string]string{"status": "ok"}) } +func (s *Server) handleBrowseSet(w http.ResponseWriter, r *http.Request) { + if !requireService(w, s.mediaSvc) { + return + } + setID := pathID(r, "id") + if setID == 0 { + writeJSON(w, http.StatusBadRequest, map[string]string{"error": "invalid set id"}) + return + } + parent := r.URL.Query().Get("parent") + result, err := s.mediaSvc.BrowseSet(r.Context(), setID, userIDFromContext(r), parent) + if err != nil { + if errors.Is(err, service.ErrForbidden) { + writeJSON(w, http.StatusForbidden, map[string]string{"error": "forbidden"}) + return + } + writeJSON(w, http.StatusInternalServerError, map[string]string{"error": err.Error()}) + return + } + writeJSON(w, http.StatusOK, result) +} + func (s *Server) handleUpload(w http.ResponseWriter, r *http.Request) { if !requireService(w, s.mediaSvc) { return diff --git a/internal/api/handlers_more_test.go b/internal/api/handlers_more_test.go index 23e94c7..e5d8529 100644 --- a/internal/api/handlers_more_test.go +++ b/internal/api/handlers_more_test.go @@ -339,7 +339,7 @@ func TestServer_SetCover(t *testing.T) { var ms service.MediaService if !tt.svcNil { ms = &service.MockMediaService{ - RegenerateSetCoverFunc: func(ctx context.Context, setID, userID int64) error { + RegenerateSetCoverFunc: func(ctx context.Context, setID int64, folder string, userID int64) error { return tt.svcErr }, } diff --git a/internal/api/server.go b/internal/api/server.go index 6c15c78..1855148 100644 --- a/internal/api/server.go +++ b/internal/api/server.go @@ -112,7 +112,9 @@ func (s *Server) routes() { // Sets s.mux.Handle("GET /api/sets", s.mw.RequireSession(http.HandlerFunc(s.handleListSets))) - s.mux.Handle("POST /api/sets/{id}/cover", s.mw.RequireSession(http.HandlerFunc(s.handleSetCover))) + s.mux.Handle("GET /api/sets/{id}/browse", s.mw.RequireSession(http.HandlerFunc(s.handleBrowseSet))) + s.mux.Handle("GET /api/sets/{id}/cover", s.mw.RequireSession(http.HandlerFunc(s.handleGetSetCover))) + s.mux.Handle("POST /api/sets/{id}/cover", s.mw.RequireSession(http.HandlerFunc(s.handlePostSetCover))) s.mux.Handle("POST /api/sets/{id}/upload", s.mw.RequireSession(http.HandlerFunc(s.handleUpload))) // Media -- cgit v1.2.3