111 lines
2.7 KiB
Go
111 lines
2.7 KiB
Go
package inventaire
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
|
|
"git.artlef.fr/PersonalLibraryManager/internal/callapiutils"
|
|
)
|
|
|
|
type InventaireBookResult struct {
|
|
ID string
|
|
Lang string
|
|
Title string
|
|
Description string
|
|
Author *InventaireAuthorResult
|
|
}
|
|
|
|
type InventaireAuthorResult struct {
|
|
ID string
|
|
Name string
|
|
Description string
|
|
}
|
|
|
|
func (i *InventaireBookResult) UnmarshalJSON(b []byte) error {
|
|
var parsed struct {
|
|
Entities map[string]json.RawMessage
|
|
}
|
|
err := json.Unmarshal(b, &parsed)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, entity := range parsed.Entities {
|
|
|
|
var inventaireEntity struct {
|
|
WdId string `json:"wdId"`
|
|
Type string `json:"type"`
|
|
Labels map[string]json.RawMessage `json:"labels"`
|
|
Descriptions map[string]json.RawMessage `json:"descriptions"`
|
|
}
|
|
|
|
err := json.Unmarshal(entity, &inventaireEntity)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if ("wd:" + inventaireEntity.WdId) == i.ID {
|
|
title, err := findLangageField(inventaireEntity.Labels, i.Lang)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
i.Title = title
|
|
description, err := findLangageField(inventaireEntity.Descriptions, i.Lang)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
i.Description = description
|
|
} else if inventaireEntity.Type == "human" {
|
|
a := InventaireAuthorResult{ID: inventaireEntity.WdId}
|
|
name, err := findLangageField(inventaireEntity.Labels, i.Lang)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
a.Name = name
|
|
desc, err := findLangageField(inventaireEntity.Descriptions, i.Lang)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
a.Description = desc
|
|
i.Author = &a
|
|
}
|
|
}
|
|
return err
|
|
}
|
|
|
|
func findLangageField(multipleMessageFields map[string]json.RawMessage, lang string) (string, error) {
|
|
if len(multipleMessageFields) == 0 {
|
|
return "", errors.New("empty multilang field")
|
|
}
|
|
|
|
var fieldToParse json.RawMessage
|
|
var ok bool
|
|
fieldToParse, ok = multipleMessageFields[lang]
|
|
if !ok {
|
|
for _, field := range multipleMessageFields {
|
|
fieldToParse = field
|
|
break
|
|
}
|
|
}
|
|
var parsedField string
|
|
err := json.Unmarshal(fieldToParse, &parsedField)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return parsedField, err
|
|
}
|
|
|
|
func callInventaireBook(inventaireUrl string, inventaireId string, lang string) (InventaireBookResult, error) {
|
|
queryResult := InventaireBookResult{ID: inventaireId, Lang: lang}
|
|
u, err := computeInventaireApiUrl(inventaireUrl, "entities")
|
|
if err != nil {
|
|
return queryResult, err
|
|
}
|
|
callapiutils.AddQueryParam(u, "action", "by-uris")
|
|
callapiutils.AddQueryParam(u, "relatives", "wdt:P50")
|
|
callapiutils.AddQueryParam(u, "lang", lang)
|
|
callapiutils.AddQueryParam(u, "uris", inventaireId)
|
|
|
|
err = callapiutils.FetchAndParseResult(u, &queryResult)
|
|
return queryResult, err
|
|
}
|