0191d5c84e
* Move to interfaces * update vendor Co-authored-by: Artem Piskun <artem.piskun@myoffice.team>
153 lines
3.9 KiB
Go
153 lines
3.9 KiB
Go
package discogs
|
|
|
|
import (
|
|
"net/url"
|
|
"strconv"
|
|
)
|
|
|
|
// SearchService is an interface to work with search.
|
|
type SearchService interface {
|
|
// Search makes search request to discogs.
|
|
// Issue a search query to database. This endpoint accepts pagination parameters.
|
|
// Authentication (as any user) is required.
|
|
// https://www.discogs.com/developers/#page:database,header:database-search
|
|
Search(req SearchRequest) (*Search, error)
|
|
}
|
|
|
|
// searchService ...
|
|
type searchService struct {
|
|
url string
|
|
}
|
|
|
|
func newSearchService(url string) SearchService {
|
|
return &searchService{
|
|
url: url,
|
|
}
|
|
}
|
|
|
|
// SearchRequest describes search request
|
|
type SearchRequest struct {
|
|
Q string // search query
|
|
Type string // one of release, master, artist, label
|
|
Title string // search by combined “Artist Name - Release Title” title field
|
|
ReleaseTitle string // search release titles
|
|
Credit string // search release credits
|
|
Artist string // search artist names
|
|
Anv string // search artist ANV
|
|
Label string // search label names
|
|
Genre string // search genres
|
|
Style string // search styles
|
|
Country string // search release country
|
|
Year string // search release year
|
|
Format string // search formats
|
|
Catno string // search catalog number
|
|
Barcode string // search barcodes
|
|
Track string // search track titles
|
|
Submitter string // search submitter username
|
|
Contributor string // search contributor usernames
|
|
|
|
Page int
|
|
PerPage int
|
|
}
|
|
|
|
func (r *SearchRequest) params() url.Values {
|
|
if r == nil {
|
|
return nil
|
|
}
|
|
|
|
params := url.Values{}
|
|
|
|
if r.Q != "" {
|
|
params.Set("q", r.Q)
|
|
}
|
|
if r.Type != "" {
|
|
params.Set("type", r.Type)
|
|
}
|
|
if r.Title != "" {
|
|
params.Set("title", r.Title)
|
|
}
|
|
if r.ReleaseTitle != "" {
|
|
params.Set("release_title", r.ReleaseTitle)
|
|
}
|
|
if r.Credit != "" {
|
|
params.Set("credit", r.Credit)
|
|
}
|
|
if r.Artist != "" {
|
|
params.Set("artist", r.Artist)
|
|
}
|
|
if r.Anv != "" {
|
|
params.Set("anv", r.Anv)
|
|
}
|
|
if r.Label != "" {
|
|
params.Set("label", r.Label)
|
|
}
|
|
if r.Genre != "" {
|
|
params.Set("genre", r.Genre)
|
|
}
|
|
if r.Style != "" {
|
|
params.Set("style", r.Style)
|
|
}
|
|
if r.Country != "" {
|
|
params.Set("country", r.Country)
|
|
}
|
|
if r.Year != "" {
|
|
params.Set("year", r.Year)
|
|
}
|
|
if r.Format != "" {
|
|
params.Set("format", r.Format)
|
|
}
|
|
if r.Catno != "" {
|
|
params.Set("catno", r.Catno)
|
|
}
|
|
if r.Barcode != "" {
|
|
params.Set("barcode", r.Barcode)
|
|
}
|
|
if r.Track != "" {
|
|
params.Set("track", r.Track)
|
|
}
|
|
if r.Submitter != "" {
|
|
params.Set("submitter", r.Submitter)
|
|
}
|
|
if r.Contributor != "" {
|
|
params.Set("contributor", r.Contributor)
|
|
}
|
|
|
|
params.Set("page", strconv.Itoa(r.Page))
|
|
if r.PerPage != 0 {
|
|
params.Set("per_page", strconv.Itoa(r.PerPage))
|
|
}
|
|
return params
|
|
}
|
|
|
|
// Search describes search response
|
|
type Search struct {
|
|
Pagination Page `json:"pagination"`
|
|
Results []Result `json:"results,omitempty"`
|
|
}
|
|
|
|
// Result describes a part of search result
|
|
type Result struct {
|
|
Style []string `json:"style,omitempty"`
|
|
Thumb string `json:"thumb,omitempty"`
|
|
CoverImage string `json:"cover_image,omitempty"`
|
|
Title string `json:"title,omitempty"`
|
|
Country string `json:"country,omitempty"`
|
|
Format []string `json:"format,omitempty"`
|
|
URI string `json:"uri,omitempty"`
|
|
Community Community `json:"community,omitempty"`
|
|
Label []string `json:"label,omitempty"`
|
|
Catno string `json:"catno,omitempty"`
|
|
Year string `json:"year,omitempty"`
|
|
Genre []string `json:"genre,omitempty"`
|
|
ResourceURL string `json:"resource_url,omitempty"`
|
|
Type string `json:"type,omitempty"`
|
|
ID int `json:"id,omitempty"`
|
|
MasterID int `json:"master_id,omitempty"`
|
|
}
|
|
|
|
func (s *searchService) Search(req SearchRequest) (*Search, error) {
|
|
var search *Search
|
|
err := request(s.url, req.params(), &search)
|
|
return search, err
|
|
}
|