Files
bibliomane/internal/routes/booksearchget.go
Arthur Lefebvre 1bb841332c Open Library search API
If nothing is found on the server, returns results from open library
API. Clicking on a book imports it.
2025-12-30 18:13:11 +01:00

95 lines
2.5 KiB
Go

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})
}