Files
bibliomane/internal/routes/booksearchget.go

85 lines
2.3 KiB
Go

package routes
import (
"net/http"
"strings"
"git.artlef.fr/PersonalLibraryManager/internal/appcontext"
"git.artlef.fr/PersonalLibraryManager/internal/dto"
"git.artlef.fr/PersonalLibraryManager/internal/inventaire"
"git.artlef.fr/PersonalLibraryManager/internal/myvalidator"
"git.artlef.fr/PersonalLibraryManager/internal/query"
)
func GetSearchBooksHandler(ac appcontext.AppContext) {
searchterm := ac.C.Param("searchterm")
var params dto.BookSearchGetParam
err := ac.C.ShouldBind(&params)
if err != nil {
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
return
}
user, fetchUserErr := ac.GetAuthenticatedUser()
if fetchUserErr != nil {
myvalidator.ReturnErrorsAsJsonResponse(&ac, fetchUserErr)
return
}
limit, err := ac.GetQueryLimit()
if err != nil {
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
return
}
offset, err := ac.GetQueryOffset()
if err != nil {
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
return
}
books, err := query.FetchBookSearchGet(ac.Db, user.ID, searchterm, limit, offset)
if err != nil {
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
return
}
var returnedBooks dto.BookSearchGet
if len(books) > 0 {
count, err := query.FetchBookSearchGetCount(ac.Db, user.ID, searchterm)
if err != nil {
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
return
}
returnedBooks = dto.BookSearchGet{Count: count, Books: books}
} else {
queryResult, err := inventaire.CallInventaireSearch(searchterm, params.Lang, limit, offset)
if err != nil {
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
return
}
returnedBooks = InventaireBooksToBookSearchGet(queryResult)
}
ac.C.JSON(http.StatusOK, returnedBooks)
}
func InventaireBooksToBookSearchGet(results inventaire.InventaireSearchResult) dto.BookSearchGet {
var books []dto.BookSearchGetBook
for _, b := range results.Results {
coverPath := ""
if b.Image != "" && strings.HasPrefix(b.Image, "/") {
coverPath = inventaire.GetBaseInventaireUrl() + b.Image
}
bookSearchGetBook := dto.BookSearchGetBook{
ID: 0,
Title: b.Label,
Author: "",
Description: b.Description,
InventaireID: b.ID,
Rating: 0,
Read: false,
WantRead: false,
CoverPath: coverPath,
}
books = append(books, bookSearchGetBook)
}
return dto.BookSearchGet{Count: results.Total, Books: books}
}