This repository has been archived on 2023-04-13. You can view files and clone it, but cannot push or open issues or pull requests.
go-discogs/user_collection.go
Richard Roché d77d28b101
User collection API additions (#42)
User collection endpoint
2021-02-17 19:26:29 +03:00

136 lines
4.4 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package discogs
import (
"strconv"
)
// CollectionService is an interface to work with collection.
type CollectionService interface {
// Retrieve a list of folders in a users collection.
// If folder_id is not 0, authentication as the collection owner is required.
CollectionFolders(username string) (*CollectionFolders, error)
// Retrieve a list of items in a folder in a users collection.
// If folderID is not 0, authentication with token is required.
CollectionItemsByFolder(username string, folderID int, pagination *Pagination) (*CollectionItems, error)
// Retrieve the users collection folders which contain a specified release.
// The releaseID must be non-zero.
CollectionItemsByRelease(username string, releaseID int) (*CollectionItems, error)
// Retrieve metadata about a folder in a users collection.
Folder(username string, folderID int) (*Folder, error)
}
type collectionService struct {
url string
}
func newCollectionService(url string) CollectionService {
return &collectionService{
url: url,
}
}
// Folder serves folder response from discogs.
type Folder struct {
ID int `json:"id"`
Count int `json:"count"`
Name string `json:"name"`
ResourceURL string `json:"resource_url"`
}
func (s *collectionService) Folder(username string, folderID int) (*Folder, error) {
if username == "" {
return nil, ErrInvalidUsername
}
var folder *Folder
err := request(s.url+"/"+username+"/collection/folders/"+strconv.Itoa(folderID), nil, &folder)
return folder, err
}
// CollectionFolders serves collection response from discogs.
type CollectionFolders struct {
Folders []Folder `json:"folders"`
}
func (s *collectionService) CollectionFolders(username string) (*CollectionFolders, error) {
if username == "" {
return nil, ErrInvalidUsername
}
var collection *CollectionFolders
err := request(s.url+"/"+username+"/collection/folders", nil, &collection)
return collection, err
}
// CollectionItemSource ...
type CollectionItemSource struct {
ID int `json:"id"`
BasicInformation BasicInformation `json:"basic_information"`
DateAdded string `json:"date_added"`
FolderID int `json:"folder_id,omitempty"`
InstanceID int `json:"instance_id"`
Notes string `json:"notes,omitempty"`
Rating int `json:"rating"`
}
// BasicInformation ...
type BasicInformation struct {
ID int `json:"id"`
Artists []ArtistSource `json:"artists"`
CoverImage string `json:"cover_image"`
Formats []Format `json:"formats"`
Labels []LabelSource `json:"labels"`
Genres []string `json:"genres"`
MasterID int `json:"master_id"`
MasterURL *string `json:"master_url"`
ResourceURL string `json:"resource_url"`
Styles []string `json:"styles"`
Thumb string `json:"thumb"`
Title string `json:"title"`
Year int `json:"year"`
}
// CollectionItems list of items in a users collection
type CollectionItems struct {
Pagination Page `json:"pagination"`
Items []CollectionItemSource `json:"releases"`
}
// valid sort keys
// https://www.discogs.com/developers#page:user-collection,header:user-collection-collection-items-by-folder
var validItemsByFolderSort = map[string]struct{}{
"": struct{}{},
"label": struct{}{},
"artist": struct{}{},
"title": struct{}{},
"catno": struct{}{},
"format": struct{}{},
"rating": struct{}{},
"added": struct{}{},
"year": struct{}{},
}
func (s *collectionService) CollectionItemsByFolder(username string, folderID int, pagination *Pagination) (*CollectionItems, error) {
if username == "" {
return nil, ErrInvalidUsername
}
if pagination != nil {
if _, ok := validItemsByFolderSort[pagination.Sort]; !ok {
return nil, ErrInvalidSortKey
}
}
var items *CollectionItems
err := request(s.url+"/"+username+"/collection/folders/"+strconv.Itoa(folderID)+"/releases", pagination.params(), &items)
return items, err
}
func (s *collectionService) CollectionItemsByRelease(username string, releaseID int) (*CollectionItems, error) {
if username == "" {
return nil, ErrInvalidUsername
}
if releaseID == 0 {
return nil, ErrInvalidReleaseID
}
var items *CollectionItems
err := request(s.url+"/"+username+"/collection/releases/"+strconv.Itoa(releaseID), nil, &items)
return items, err
}