Add Albums endpoints

This commit is contained in:
Deluan 2023-05-22 20:45:18 -04:00 committed by Deluan
parent f62231f728
commit 90c2d7d1cf
12 changed files with 203 additions and 95 deletions

View file

@ -22,3 +22,7 @@ sort:
$ref: './query/sort.yml' $ref: './query/sort.yml'
include: include:
$ref: './query/include.yml' $ref: './query/include.yml'
includeForTracks:
$ref: './query/includeForTracks.yml'
includeForAlbums:
$ref: './query/includeForAlbums.yml'

View file

@ -0,0 +1,13 @@
name: include
in: query
description: Related resources to include in the response, separated by commas
required: false
explode: false
schema:
type: array
x-go-type: includeSlice
items:
type: string
enum:
- track
- artist

View file

@ -0,0 +1,13 @@
name: include
in: query
description: Related resources to include in the response, separated by commas
required: false
explode: false
schema:
type: array
x-go-type: includeSlice
items:
type: string
enum:
- album
- artist

View file

@ -2,7 +2,7 @@ get:
summary: Retrieve an individual album summary: Retrieve an individual album
operationId: getAlbum operationId: getAlbum
parameters: parameters:
- $ref: '../parameters/query/include.yml' - $ref: '../parameters/query/includeForAlbums.yml'
- name: albumId - name: albumId
in: path in: path
description: The unique identifier of the album description: The unique identifier of the album

View file

@ -13,7 +13,7 @@ get:
- $ref: '../parameters/query/filterStartsWith.yml' - $ref: '../parameters/query/filterStartsWith.yml'
- $ref: '../parameters/query/filterEndsWith.yml' - $ref: '../parameters/query/filterEndsWith.yml'
- $ref: '../parameters/query/sort.yml' - $ref: '../parameters/query/sort.yml'
- $ref: '../parameters/query/include.yml' - $ref: '../parameters/query/includeForAlbums.yml'
responses: responses:
'200': '200':
description: A list of albums description: A list of albums

View file

@ -2,7 +2,7 @@ get:
summary: Retrieve an individual track summary: Retrieve an individual track
operationId: getTrack operationId: getTrack
parameters: parameters:
- $ref: '../parameters/query/include.yml' - $ref: '../parameters/query/includeForTracks.yml'
- name: trackId - name: trackId
in: path in: path
description: The unique identifier of the track description: The unique identifier of the track

View file

@ -1,5 +1,5 @@
get: get:
summary: Get a list of tracks summary: Retrieve a list of tracks
operationId: getTracks operationId: getTracks
parameters: parameters:
- $ref: '../parameters/query/pageLimit.yml' - $ref: '../parameters/query/pageLimit.yml'
@ -13,7 +13,7 @@ get:
- $ref: '../parameters/query/filterStartsWith.yml' - $ref: '../parameters/query/filterStartsWith.yml'
- $ref: '../parameters/query/filterEndsWith.yml' - $ref: '../parameters/query/filterEndsWith.yml'
- $ref: '../parameters/query/sort.yml' - $ref: '../parameters/query/sort.yml'
- $ref: '../parameters/query/include.yml' - $ref: '../parameters/query/includeForTracks.yml'
responses: responses:
'200': '200':
description: A list of tracks description: A list of tracks

View file

@ -3,14 +3,21 @@ properties:
title: title:
type: string type: string
description: The title of the album description: The title of the album
artist:
type: string
description: The artist of the album
releaseDate: releaseDate:
type: string type: string
format: date
description: The release date of the album description: The release date of the album
tracktotal:
type: integer
description: The number of tracks on the album
disctotal:
type: integer
description: The number of discs in the album
genre: genre:
type: string type: string
description: The genre of the album description: The genre of the album
required: required:
- title - title
- releaseDate - artist
- genre

View file

@ -50,26 +50,6 @@ type Router struct {
ds model.DataStore ds model.DataStore
} }
func (a *Router) GetAlbums(ctx context.Context, request GetAlbumsRequestObject) (GetAlbumsResponseObject, error) {
//TODO implement me
panic("implement me")
}
func (a *Router) GetAlbum(ctx context.Context, request GetAlbumRequestObject) (GetAlbumResponseObject, error) {
//TODO implement me
panic("implement me")
}
func (a *Router) GetArtists(ctx context.Context, request GetArtistsRequestObject) (GetArtistsResponseObject, error) {
//TODO implement me
panic("implement me")
}
func (a *Router) GetArtist(ctx context.Context, request GetArtistRequestObject) (GetArtistResponseObject, error) {
//TODO implement me
panic("implement me")
}
func (a *Router) GetServerInfo(_ context.Context, _ GetServerInfoRequestObject) (GetServerInfoResponseObject, error) { func (a *Router) GetServerInfo(_ context.Context, _ GetServerInfoRequestObject) (GetServerInfoResponseObject, error) {
return GetServerInfo200JSONResponse{ return GetServerInfo200JSONResponse{
Data: ServerInfo{ Data: ServerInfo{
@ -107,3 +87,40 @@ func (a *Router) GetTrack(ctx context.Context, request GetTrackRequestObject) (G
} }
return GetTrack200JSONResponse{Data: toAPITrack(*mf)}, nil return GetTrack200JSONResponse{Data: toAPITrack(*mf)}, nil
} }
func (a *Router) GetAlbums(ctx context.Context, request GetAlbumsRequestObject) (GetAlbumsResponseObject, error) {
options := toQueryOptions(ctx, request.Params)
albums, err := a.ds.Album(ctx).GetAll(options)
if err != nil {
return nil, err
}
cnt, err := a.ds.MediaFile(ctx).CountAll(options)
if err != nil {
return nil, err
}
baseUrl := baseResourceUrl(ctx, "albums")
links, meta := buildPaginationLinksAndMeta(int32(cnt), request.Params, baseUrl)
return GetAlbums200JSONResponse{
Data: toAPIAlbums(albums),
Links: links,
Meta: &meta,
}, nil
}
func (a *Router) GetAlbum(ctx context.Context, request GetAlbumRequestObject) (GetAlbumResponseObject, error) {
album, err := a.ds.Album(ctx).Get(request.AlbumId)
if err != nil {
return nil, err
}
return GetAlbum200JSONResponse{Data: toAPIAlbum(*album)}, nil
}
func (a *Router) GetArtists(ctx context.Context, request GetArtistsRequestObject) (GetArtistsResponseObject, error) {
//TODO implement me
panic("implement me")
}
func (a *Router) GetArtist(ctx context.Context, request GetArtistRequestObject) (GetArtistResponseObject, error) {
//TODO implement me
panic("implement me")
}

View file

@ -22,6 +22,8 @@ type contextKey string
const requestInContext contextKey = "request" const requestInContext contextKey = "request"
type includeSlice []string
// storeRequestInContext is a middleware function that adds the full request object to the context. // storeRequestInContext is a middleware function that adds the full request object to the context.
func storeRequestInContext(next http.Handler) http.Handler { func storeRequestInContext(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
@ -98,9 +100,40 @@ func toAPITracks(mfs model.MediaFiles) []Track {
return tracks return tracks
} }
func toAPIAlbum(ma model.Album) Album {
return Album{
Type: ResourceTypeAlbum,
Id: ma.ID,
Attributes: &AlbumAttributes{
Artist: ma.AlbumArtist,
Genre: P(ma.Genre),
ReleaseDate: P(ma.ReleaseDate),
Title: ma.Name,
Tracktotal: P(ma.SongCount),
},
}
}
func toAPIAlbums(mas model.Albums) []Album {
albums := make([]Album, len(mas))
for i := range mas {
albums[i] = toAPIAlbum(mas[i])
}
return albums
}
type GetParams interface {
GetParams() GetTracksParams
}
func (p GetTracksParams) GetParams() GetTracksParams { return p }
func (p GetAlbumsParams) GetParams() GetTracksParams { return GetTracksParams(p) }
// toQueryOptions convert a params struct to a model.QueryOptions struct, to be used by the // toQueryOptions convert a params struct to a model.QueryOptions struct, to be used by the
// GetAll and CountAll functions. It assumes all GetXxxxParams functions have the exact same structure. // GetAll and CountAll functions. It assumes all GetXxxxParams functions have the exact same structure.
func toQueryOptions(ctx context.Context, params GetTracksParams) model.QueryOptions { func toQueryOptions(ctx context.Context, p GetParams) model.QueryOptions {
params := p.GetParams()
var filters squirrel.And var filters squirrel.And
parseFilter := func(fs *[]string, op func(f, v string) squirrel.Sqlizer) { parseFilter := func(fs *[]string, op func(f, v string) squirrel.Sqlizer) {
if fs != nil { if fs != nil {
@ -188,7 +221,8 @@ func validationErrorHandler(w http.ResponseWriter, message string, statusCode in
}}}.VisitGetTracksResponse(w) }}}.VisitGetTracksResponse(w)
} }
func buildPaginationLinksAndMeta(totalItems int32, params GetTracksParams, resourceName string) (PaginationLinks, PaginationMeta) { func buildPaginationLinksAndMeta(totalItems int32, p GetParams, resourceName string) (PaginationLinks, PaginationMeta) {
params := p.GetParams()
pageLimit := *params.PageLimit pageLimit := *params.PageLimit
pageOffset := *params.PageOffset pageOffset := *params.PageOffset
@ -230,7 +264,7 @@ func buildPaginationLinksAndMeta(totalItems int32, params GetTracksParams, resou
query.Add("sort", *params.Sort) query.Add("sort", *params.Sort)
} }
if params.Include != nil { if params.Include != nil {
query.Add("include", *params.Include) query.Add("include", A(*params.Include))
} }
link := resourceName link := resourceName
@ -268,6 +302,14 @@ func buildPaginationLinksAndMeta(totalItems int32, params GetTracksParams, resou
return links, meta return links, meta
} }
func A[T any](slice []T) string {
var buf []string
for _, v := range slice {
buf = append(buf, fmt.Sprintf("%v", v))
}
return strings.Join(buf, ",")
}
func baseResourceUrl(ctx context.Context, resourceName string) string { func baseResourceUrl(ctx context.Context, resourceName string) string {
r := ctx.Value(requestInContext).(*http.Request) r := ctx.Value(requestInContext).(*http.Request)
baseUrl, _ := url.JoinPath(spec.Servers[0].URL, resourceName) baseUrl, _ := url.JoinPath(spec.Servers[0].URL, resourceName)

View file

@ -37,7 +37,7 @@ type ServerInterface interface {
// Get server's global info // Get server's global info
// (GET /server) // (GET /server)
GetServerInfo(w http.ResponseWriter, r *http.Request) GetServerInfo(w http.ResponseWriter, r *http.Request)
// Get a list of tracks // Retrieve a list of tracks
// (GET /tracks) // (GET /tracks)
GetTracks(w http.ResponseWriter, r *http.Request, params GetTracksParams) GetTracks(w http.ResponseWriter, r *http.Request, params GetTracksParams)
// Retrieve an individual track // Retrieve an individual track
@ -155,7 +155,7 @@ func (siw *ServerInterfaceWrapper) GetAlbums(w http.ResponseWriter, r *http.Requ
// ------------- Optional query parameter "include" ------------- // ------------- Optional query parameter "include" -------------
err = runtime.BindQueryParameter("form", true, false, "include", r.URL.Query(), &params.Include) err = runtime.BindQueryParameter("form", false, false, "include", r.URL.Query(), &params.Include)
if err != nil { if err != nil {
siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "include", Err: err}) siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "include", Err: err})
return return
@ -194,7 +194,7 @@ func (siw *ServerInterfaceWrapper) GetAlbum(w http.ResponseWriter, r *http.Reque
// ------------- Optional query parameter "include" ------------- // ------------- Optional query parameter "include" -------------
err = runtime.BindQueryParameter("form", true, false, "include", r.URL.Query(), &params.Include) err = runtime.BindQueryParameter("form", false, false, "include", r.URL.Query(), &params.Include)
if err != nil { if err != nil {
siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "include", Err: err}) siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "include", Err: err})
return return
@ -486,7 +486,7 @@ func (siw *ServerInterfaceWrapper) GetTracks(w http.ResponseWriter, r *http.Requ
// ------------- Optional query parameter "include" ------------- // ------------- Optional query parameter "include" -------------
err = runtime.BindQueryParameter("form", true, false, "include", r.URL.Query(), &params.Include) err = runtime.BindQueryParameter("form", false, false, "include", r.URL.Query(), &params.Include)
if err != nil { if err != nil {
siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "include", Err: err}) siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "include", Err: err})
return return
@ -525,7 +525,7 @@ func (siw *ServerInterfaceWrapper) GetTrack(w http.ResponseWriter, r *http.Reque
// ------------- Optional query parameter "include" ------------- // ------------- Optional query parameter "include" -------------
err = runtime.BindQueryParameter("form", true, false, "include", r.URL.Query(), &params.Include) err = runtime.BindQueryParameter("form", false, false, "include", r.URL.Query(), &params.Include)
if err != nil { if err != nil {
siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "include", Err: err}) siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "include", Err: err})
return return
@ -1040,7 +1040,7 @@ type StrictServerInterface interface {
// Get server's global info // Get server's global info
// (GET /server) // (GET /server)
GetServerInfo(ctx context.Context, request GetServerInfoRequestObject) (GetServerInfoResponseObject, error) GetServerInfo(ctx context.Context, request GetServerInfoRequestObject) (GetServerInfoResponseObject, error)
// Get a list of tracks // Retrieve a list of tracks
// (GET /tracks) // (GET /tracks)
GetTracks(ctx context.Context, request GetTracksRequestObject) (GetTracksResponseObject, error) GetTracks(ctx context.Context, request GetTracksRequestObject) (GetTracksResponseObject, error)
// Retrieve an individual track // Retrieve an individual track
@ -1263,54 +1263,55 @@ func (sh *strictHandler) GetTrack(w http.ResponseWriter, r *http.Request, trackI
// Base64 encoded, gzipped, json marshaled Swagger object // Base64 encoded, gzipped, json marshaled Swagger object
var swaggerSpec = []string{ var swaggerSpec = []string{
"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",
"CjpdPsPr2/X/AgAA//8ulwADnUEAAA==", "/RlqJP9y4KspkcLe/joqpEaZLmhN3+P/e8qj63CRdGx7oXHPw8qk5voqUiUF0F9IkRS2xNE1UnNB+HVV",
"SDZYpXe1hl7Vv1R7c+OWzWde73P+VmHKKj5dPKSrm9X/AgAA//8ZTssfikQAAA==",
} }
// GetSwagger returns the content of the embedded swagger specification file // GetSwagger returns the content of the embedded swagger specification file

View file

@ -3,10 +3,6 @@
// Code generated by github.com/deepmap/oapi-codegen version v1.12.5-0.20230513000919-14548c7e7bbe DO NOT EDIT. // Code generated by github.com/deepmap/oapi-codegen version v1.12.5-0.20230513000919-14548c7e7bbe DO NOT EDIT.
package api package api
import (
openapi_types "github.com/deepmap/oapi-codegen/pkg/types"
)
const ( const (
BearerAuthScopes = "bearerAuth.Scopes" BearerAuthScopes = "bearerAuth.Scopes"
) )
@ -54,14 +50,23 @@ type AlbumArtistRelationship struct {
// AlbumAttributes defines model for AlbumAttributes. // AlbumAttributes defines model for AlbumAttributes.
type AlbumAttributes struct { type AlbumAttributes struct {
// Artist The artist of the album
Artist string `json:"artist"`
// Disctotal The number of discs in the album
Disctotal *int `json:"disctotal,omitempty"`
// Genre The genre of the album // Genre The genre of the album
Genre string `json:"genre"` Genre *string `json:"genre,omitempty"`
// ReleaseDate The release date of the album // ReleaseDate The release date of the album
ReleaseDate openapi_types.Date `json:"releaseDate"` ReleaseDate *string `json:"releaseDate,omitempty"`
// Title The title of the album // Title The title of the album
Title string `json:"title"` Title string `json:"title"`
// Tracktotal The number of tracks on the album
Tracktotal *int `json:"tracktotal,omitempty"`
} }
// AlbumTrackRelationship defines model for AlbumTrackRelationship. // AlbumTrackRelationship defines model for AlbumTrackRelationship.
@ -289,6 +294,12 @@ type FilterStartsWith = []string
// Include defines model for include. // Include defines model for include.
type Include = string type Include = string
// IncludeForAlbums defines model for includeForAlbums.
type IncludeForAlbums = includeSlice
// IncludeForTracks defines model for includeForTracks.
type IncludeForTracks = includeSlice
// PageLimit defines model for pageLimit. // PageLimit defines model for pageLimit.
type PageLimit = int32 type PageLimit = int32
@ -334,13 +345,13 @@ type GetAlbumsParams struct {
Sort *Sort `form:"sort,omitempty" json:"sort,omitempty"` Sort *Sort `form:"sort,omitempty" json:"sort,omitempty"`
// Include Related resources to include in the response, separated by commas // Include Related resources to include in the response, separated by commas
Include *Include `form:"include,omitempty" json:"include,omitempty"` Include *IncludeForAlbums `form:"include,omitempty" json:"include,omitempty"`
} }
// GetAlbumParams defines parameters for GetAlbum. // GetAlbumParams defines parameters for GetAlbum.
type GetAlbumParams struct { type GetAlbumParams struct {
// Include Related resources to include in the response, separated by commas // Include Related resources to include in the response, separated by commas
Include *Include `form:"include,omitempty" json:"include,omitempty"` Include *IncludeForAlbums `form:"include,omitempty" json:"include,omitempty"`
} }
// GetArtistsParams defines parameters for GetArtists. // GetArtistsParams defines parameters for GetArtists.
@ -424,11 +435,11 @@ type GetTracksParams struct {
Sort *Sort `form:"sort,omitempty" json:"sort,omitempty"` Sort *Sort `form:"sort,omitempty" json:"sort,omitempty"`
// Include Related resources to include in the response, separated by commas // Include Related resources to include in the response, separated by commas
Include *Include `form:"include,omitempty" json:"include,omitempty"` Include *IncludeForTracks `form:"include,omitempty" json:"include,omitempty"`
} }
// GetTrackParams defines parameters for GetTrack. // GetTrackParams defines parameters for GetTrack.
type GetTrackParams struct { type GetTrackParams struct {
// Include Related resources to include in the response, separated by commas // Include Related resources to include in the response, separated by commas
Include *Include `form:"include,omitempty" json:"include,omitempty"` Include *IncludeForTracks `form:"include,omitempty" json:"include,omitempty"`
} }