mirror of
https://github.com/navidrome/navidrome.git
synced 2025-04-06 22:17:37 +03:00
Add Albums endpoints
This commit is contained in:
parent
f62231f728
commit
90c2d7d1cf
12 changed files with 203 additions and 95 deletions
|
@ -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'
|
||||||
|
|
13
api/parameters/query/includeForAlbums.yml
Normal file
13
api/parameters/query/includeForAlbums.yml
Normal 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
|
13
api/parameters/query/includeForTracks.yml
Normal file
13
api/parameters/query/includeForTracks.yml
Normal 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
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
||||||
|
|
|
@ -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")
|
||||||
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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(), ¶ms.Include)
|
err = runtime.BindQueryParameter("form", false, false, "include", r.URL.Query(), ¶ms.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(), ¶ms.Include)
|
err = runtime.BindQueryParameter("form", false, false, "include", r.URL.Query(), ¶ms.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(), ¶ms.Include)
|
err = runtime.BindQueryParameter("form", false, false, "include", r.URL.Query(), ¶ms.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(), ¶ms.Include)
|
err = runtime.BindQueryParameter("form", false, false, "include", r.URL.Query(), ¶ms.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
|
||||||
|
|
|
@ -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"`
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue