package routes import ( "net/http" "git.artlef.fr/PersonalLibraryManager/internal/appcontext" "git.artlef.fr/PersonalLibraryManager/internal/myvalidator" "git.artlef.fr/PersonalLibraryManager/internal/openlibrary" "git.artlef.fr/PersonalLibraryManager/internal/query" "github.com/gin-gonic/gin" ) func GetSearchBooksHandler(ac appcontext.AppContext) { searchterm := ac.C.Param("searchterm") 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 []query.BookSearchGet if len(books) > 0 { returnedBooks = books } else { queryResult, err := openlibrary.CallOpenLibrarySearch(searchterm, limit, offset) if err != nil { myvalidator.ReturnErrorsAsJsonResponse(&ac, err) return } returnedBooks = OpenLibraryBooksToBookSearchGet(queryResult.Books) } ac.C.JSON(http.StatusOK, returnedBooks) } func OpenLibraryBooksToBookSearchGet(OLbooks []openlibrary.OpenLibrarySearchBook) []query.BookSearchGet { var books []query.BookSearchGet for _, b := range OLbooks { bookSearchGet := query.BookSearchGet{ ID: 0, Title: b.Title, Author: b.Authors[0], OpenLibraryId: b.OpenLibraryId, Rating: 0, Read: false, WantRead: false, CoverPath: "", } books = append(books, bookSearchGet) } return books } func GetSearchBooksCountHandler(ac appcontext.AppContext) { searchterm := ac.C.Param("searchterm") user, fetchUserErr := ac.GetAuthenticatedUser() if fetchUserErr != nil { myvalidator.ReturnErrorsAsJsonResponse(&ac, fetchUserErr) return } count, err := query.FetchBookSearchGetCount(ac.Db, user.ID, searchterm) if err != nil { myvalidator.ReturnErrorsAsJsonResponse(&ac, err) return } var finalCount int64 if count > 0 { finalCount = count } else { queryResult, err := openlibrary.CallOpenLibrarySearch(searchterm, 0, 0) if err != nil { myvalidator.ReturnErrorsAsJsonResponse(&ac, err) return } finalCount = int64(queryResult.NumFound) } ac.C.JSON(http.StatusOK, gin.H{"count": finalCount}) }