浏览代码

feat: route to fetch songs by artist

Fela Maslen 5 年之前
父节点
当前提交
7aa5abf96c

+ 8 - 0
music-player/pkg/read/types.go

@@ -11,6 +11,14 @@ type Song struct {
   ModifiedDate int64 	`db:"modified_date"` 
 }
 
+type SongExternal struct {
+  TrackNumber int 	`db:"track_number" json:"track"`
+  Title string 		`db:"title" json:"title"`
+  Artist string 	`db:"artist" json:"artist"`
+  Album string 		`db:"album" json:"album"`
+  Duration int 		`db:"duration" json:"time"`
+}
+
 type File struct {
   RelativePath string 	`db:"relative_path"`
   ModifiedDate int64 	`db:"modified_date"`

+ 17 - 0
music-player/pkg/repository/songs.go

@@ -78,6 +78,23 @@ func SelectAlbumsByArtist(db *sqlx.DB, artist string) (albums *[]string, err err
   return
 }
 
+func SelectSongsByArtist(db *sqlx.DB, artist string) (songs *[]*read.SongExternal, err error) {
+  songs = &[]*read.SongExternal{}
+  err = db.Select(songs, `
+  select
+    track_number
+    ,title
+    ,artist
+    ,album
+    ,duration
+  from songs
+  where artist = $1
+  order by track_number, title, album
+  `, artist)
+
+  return
+}
+
 func BatchUpsertSongs(db *sqlx.DB, batch *[BATCH_SIZE]*read.Song, batchSize int) error {
   var trackNumbers pq.Int64Array
   var titles pq.StringArray

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

@@ -7,6 +7,7 @@ import (
 
 	"github.com/felamaslen/go-music-player/pkg/database"
 	"github.com/felamaslen/go-music-player/pkg/logger"
+	"github.com/felamaslen/go-music-player/pkg/read"
 	"github.com/felamaslen/go-music-player/pkg/repository"
 	"github.com/felamaslen/go-music-player/pkg/services"
 	"github.com/go-redis/redis/v7"
@@ -78,3 +79,30 @@ func routeFetchAlbums(l *logger.Logger, rdb *redis.Client, w http.ResponseWriter
   w.Write(response)
   return nil
 }
+
+type SongsResponse struct {
+  Artist string 		`json:"artist"`
+  Songs *[]*read.SongExternal 	`json:"songs"`
+}
+
+func routeFetchSongs(l *logger.Logger, rdb *redis.Client, w http.ResponseWriter, r *http.Request) error {
+  artist := r.URL.Query().Get("artist")
+
+  db := database.GetConnection()
+
+  songs, err := repository.SelectSongsByArtist(db, artist)
+  if err != nil {
+    return err
+  }
+
+  response, err := json.Marshal(SongsResponse{
+    Artist: artist,
+    Songs: songs,
+  })
+  if err != nil {
+    return err
+  }
+
+  w.Write(response)
+  return nil
+}

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

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