91 lines
2.5 KiB
Go
91 lines
2.5 KiB
Go
package inventaire
|
|
|
|
import (
|
|
"math"
|
|
"slices"
|
|
"sort"
|
|
|
|
"git.artlef.fr/bibliomane/internal/callapiutils"
|
|
)
|
|
|
|
type InventaireEditionResult struct {
|
|
Results []InventaireEditionResultBook `json:"results"`
|
|
Count int64 `json:"count"`
|
|
}
|
|
|
|
type InventaireEditionResultBook struct {
|
|
Id string `json:"uri"`
|
|
Title string `json:"title"`
|
|
ISBN string `json:"isbn"`
|
|
Publisher string `json:"publisher"`
|
|
ReleaseDate string `json:"date"`
|
|
Image string `json:"image"`
|
|
Lang string `json:"lang"`
|
|
}
|
|
|
|
type inventaireReverseClaimsResult struct {
|
|
Uris []string `json:"uris"`
|
|
}
|
|
|
|
func CallInventaireEditionFromWork(inventaireUrl string, workId string, lang string, limit int, offset int) (InventaireEditionResult, error) {
|
|
var queryResult InventaireEditionResult
|
|
uris, err := callInventaireUris(inventaireUrl, workId)
|
|
if err != nil {
|
|
return queryResult, err
|
|
}
|
|
sort.Strings(uris.Uris)
|
|
listUris := slices.Compact(uris.Uris)
|
|
queryResult.Count = int64(len(listUris))
|
|
limitedUris := listUris
|
|
if limit != 0 {
|
|
l := len(listUris)
|
|
startIndex := int(math.Min(float64(offset), float64(l)))
|
|
endIndex := int(math.Min(float64(limit+offset), float64(l)))
|
|
limitedUris = listUris[startIndex:endIndex]
|
|
}
|
|
editionEntities, err := callInventaireEditionEntities(inventaireUrl, limitedUris)
|
|
|
|
if err != nil {
|
|
return queryResult, err
|
|
}
|
|
|
|
sortedEntities := editionEntities.Entities
|
|
sort.Slice(sortedEntities, func(i, j int) bool {
|
|
return sortedEntities[i].Uri < sortedEntities[j].Uri
|
|
})
|
|
|
|
for _, entity := range sortedEntities {
|
|
publisher := ""
|
|
if entity.EditionId != "" {
|
|
publisher, err = callInventairePublisherGetName(inventaireUrl, entity.EditionId, lang)
|
|
if err != nil {
|
|
return queryResult, err
|
|
}
|
|
}
|
|
queryResult.Results = append(queryResult.Results, InventaireEditionResultBook{
|
|
Id: entity.Uri,
|
|
ISBN: entity.ISBN,
|
|
Title: entity.Title,
|
|
ReleaseDate: entity.ReleaseDate,
|
|
Image: entity.Image,
|
|
Publisher: publisher,
|
|
Lang: entity.Lang,
|
|
})
|
|
}
|
|
return queryResult, err
|
|
}
|
|
|
|
func callInventaireUris(inventaireUrl string, workId string) (inventaireReverseClaimsResult, error) {
|
|
var queryResult inventaireReverseClaimsResult
|
|
u, err := computeInventaireApiUrl(inventaireUrl, "entities")
|
|
if err != nil {
|
|
return queryResult, err
|
|
}
|
|
callapiutils.AddQueryParam(u, "action", "reverse-claims")
|
|
callapiutils.AddQueryParam(u, "property", "wdt:P629")
|
|
callapiutils.AddQueryParam(u, "value", workId)
|
|
|
|
err = callapiutils.FetchAndParseResult(u, &queryResult)
|
|
return queryResult, err
|
|
}
|