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(¶ms) 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} }