Переглянути джерело

feat: route to fetch albums by artist

Fela Maslen 5 роки тому
батько
коміт
2559fad8a9

+ 15 - 7
music-player/pkg/repository/songs.go

@@ -2,7 +2,6 @@ package repository
 
 import (
 	"errors"
-	"fmt"
 
 	"github.com/felamaslen/go-music-player/pkg/read"
 	"github.com/jmoiron/sqlx"
@@ -11,8 +10,6 @@ import (
 
 const BATCH_SIZE = 100
 
-const UNKNOWN_ARTIST = "Unknown Artist"
-
 func SelectSong(db *sqlx.DB, id int) (song *read.Song, err error) {
   var songs []*read.Song
 
@@ -41,14 +38,13 @@ func SelectSong(db *sqlx.DB, id int) (song *read.Song, err error) {
 
 func SelectPagedArtists(db *sqlx.DB, limit int, offset int) (artists *[]string, err error) {
   artists = &[]string{}
-  err = db.Select(artists, fmt.Sprintf(`
-  select distinct
-    case when artist = '' then '%s' else artist end as artist
+  err = db.Select(artists, `
+  select distinct artist
   from songs
   order by artist
   limit $1
   offset $2
-  `, UNKNOWN_ARTIST), limit, offset)
+  `, limit, offset)
   return
 }
 
@@ -70,6 +66,18 @@ func SelectArtistCount(db *sqlx.DB) (count int, err error) {
   return
 }
 
+func SelectAlbumsByArtist(db *sqlx.DB, artist string) (albums *[]string, err error) {
+  albums = &[]string{}
+  err = db.Select(albums, `
+  select distinct album
+  from songs
+  where artist = $1
+  order by album
+  `, artist)
+
+  return
+}
+
 func BatchUpsertSongs(db *sqlx.DB, batch *[BATCH_SIZE]*read.Song, batchSize int) error {
   var trackNumbers pq.Int64Array
   var titles pq.StringArray

+ 29 - 0
music-player/pkg/server/fetch.go

@@ -5,7 +5,9 @@ import (
 	"net/http"
 	"strconv"
 
+	"github.com/felamaslen/go-music-player/pkg/database"
 	"github.com/felamaslen/go-music-player/pkg/logger"
+	"github.com/felamaslen/go-music-player/pkg/repository"
 	"github.com/felamaslen/go-music-player/pkg/services"
 	"github.com/go-redis/redis/v7"
 )
@@ -49,3 +51,30 @@ func routeFetchArtists(l *logger.Logger, rdb *redis.Client, w http.ResponseWrite
   w.Write(response)
   return nil
 }
+
+type AlbumsResponse struct {
+  Artist string 	`json:"artist"`
+  Albums []string 	`json:"albums"`
+}
+
+func routeFetchAlbums(l *logger.Logger, rdb *redis.Client, w http.ResponseWriter, r *http.Request) error {
+  artist := r.URL.Query().Get("artist")
+
+  db := database.GetConnection()
+
+  albums, err := repository.SelectAlbumsByArtist(db, artist)
+  if err != nil {
+    return err
+  }
+
+  response, err := json.Marshal(AlbumsResponse{
+    Artist: artist,
+    Albums: *albums,
+  })
+  if err != nil {
+    return err
+  }
+
+  w.Write(response)
+  return nil
+}

+ 1 - 0
music-player/pkg/server/server.go

@@ -25,6 +25,7 @@ func StartServer() {
   router.Path("/stream").Methods("GET").HandlerFunc(routeHandler(l, rdb, streamSong))
 
   router.Path("/artists").Methods("GET").HandlerFunc(routeHandler(l, rdb, routeFetchArtists))
+  router.Path("/albums").Methods("GET").HandlerFunc(routeHandler(l, rdb, routeFetchAlbums))
 
   port := conf.Port
 

+ 2 - 2
music-player/pkg/services/fetch_test.go

@@ -87,11 +87,11 @@ var _ = Describe("Fetching data", func() {
 	insertArtists([]string{"", ""})
       })
 
-      It("should return Unknown Artist", func() {
+      It("should return an empty string", func() {
 	artists, more := services.GetArtists(100, 0)
 
 	Expect(*artists).To(HaveLen(1))
-	Expect((*artists)[0]).To(Equal("Unknown Artist"))
+	Expect((*artists)[0]).To(Equal(""))
 	Expect(more).To(BeFalse())
       })
     })