diff --git a/internal/controller/library.go b/internal/controller/library.go index 6c43bbc..a277670 100644 --- a/internal/controller/library.go +++ b/internal/controller/library.go @@ -195,6 +195,21 @@ func (c *LibraryController) GetArtists(w http.ResponseWriter, r *http.Request) { jsonResponse(w, artists, http.StatusOK) } +func (c *LibraryController) GetArtist(w http.ResponseWriter, r *http.Request) { + idParam := chi.URLParam(r, "id") + id, err := strconv.Atoi(idParam) + if err != nil { + jsonError(w, err.Error(), http.StatusBadRequest) + return + } + artist, err := c.service.GetArtist(id) + if err != nil { + jsonError(w, err.Error(), http.StatusInternalServerError) + return + } + jsonResponse(w, artist, http.StatusOK) +} + func (c *LibraryController) GetAlbums(w http.ResponseWriter, r *http.Request) { albums, err := c.service.GetAlbums() if err != nil { @@ -203,3 +218,18 @@ func (c *LibraryController) GetAlbums(w http.ResponseWriter, r *http.Request) { } jsonResponse(w, albums, http.StatusOK) } + +func (c *LibraryController) GetAlbum(w http.ResponseWriter, r *http.Request) { + idParam := chi.URLParam(r, "id") + id, err := strconv.Atoi(idParam) + if err != nil { + jsonError(w, err.Error(), http.StatusBadRequest) + return + } + album, err := c.service.GetAlbum(id) + if err != nil { + jsonError(w, err.Error(), http.StatusInternalServerError) + return + } + jsonResponse(w, album, http.StatusOK) +} diff --git a/internal/repository/library.go b/internal/repository/library.go index 3ab9b97..d8b0176 100644 --- a/internal/repository/library.go +++ b/internal/repository/library.go @@ -275,6 +275,17 @@ func (r *LibraryRepository) GetArtists() ([]model.Artist, error) { return artists, nil } +func (r *LibraryRepository) GetArtist(id int) (model.Artist, error) { + row := r.db.QueryRow("SELECT id, name FROM artists WHERE id = ?", id) + + var artist model.Artist + if err := row.Scan(&artist.ID, &artist.Name); err != nil { + return model.Artist{}, err + } + + return artist, nil +} + func (r *LibraryRepository) GetAlbums() ([]model.Album, error) { rows, err := r.db.Query("SELECT id, title, artist_id FROM albums") if err != nil { @@ -292,3 +303,13 @@ func (r *LibraryRepository) GetAlbums() ([]model.Album, error) { } return albums, nil } + +func (r *LibraryRepository) GetAlbum(id int) (model.Album, error) { + row := r.db.QueryRow("SELECT id, title, artist_id FROM albums WHERE id = ?", id) + + var album model.Album + if err := row.Scan(&album.ID, &album.Title, &album.ArtistID); err != nil { + return model.Album{}, err + } + return album, nil +} diff --git a/internal/service/library.go b/internal/service/library.go index 64f2296..f67865c 100644 --- a/internal/service/library.go +++ b/internal/service/library.go @@ -71,10 +71,18 @@ func (s *LibraryService) GetArtists() ([]model.Artist, error) { return s.repo.GetArtists() } +func (s *LibraryService) GetArtist(id int) (model.Artist, error) { + return s.repo.GetArtist(id) +} + func (s *LibraryService) GetAlbums() ([]model.Album, error) { return s.repo.GetAlbums() } +func (s *LibraryService) GetAlbum(id int) (model.Album, error) { + return s.repo.GetAlbum(id) +} + func (s *LibraryService) Scan(id int) (*ScanReport, error) { lib, err := s.repo.GetByID(id) if err != nil { diff --git a/main.go b/main.go index de4cd9b..796bd19 100644 --- a/main.go +++ b/main.go @@ -1,10 +1,10 @@ package main import ( + "butterfliu/config" "butterfliu/internal/controller" "butterfliu/internal/repository" "butterfliu/internal/service" - "butterfliu/config" "log" "net/http" @@ -53,9 +53,13 @@ func main() { r.Get("/{id}/cover", songController.Cover) }) - r.Route("/api", func(r chi.Router) { - r.Get("/artists", libraryController.GetArtists) - r.Get("/albums", libraryController.GetAlbums) + r.Route("/api/artists", func(r chi.Router) { + r.Get("/", libraryController.GetArtists) + r.Get("/{id}", libraryController.GetArtist) + }) + r.Route("/api/albums", func(r chi.Router) { + r.Get("/", libraryController.GetAlbums) + r.Get("/{id}", libraryController.GetAlbum) }) http.ListenAndServe(":8102", r)