package query import ( "strings" "git.artlef.fr/PersonalLibraryManager/internal/fileutils" "git.artlef.fr/PersonalLibraryManager/internal/model" "gorm.io/gorm" ) type BookGet struct { Title string `json:"title" binding:"required,max=300"` Author string `json:"author" binding:"max=100"` Summary string `json:"summary"` Rating int `json:"rating"` Read bool `json:"read"` WantRead bool `json:"wantread"` CoverPath string `json:"coverPath"` } func FetchBookGet(db *gorm.DB, userId uint, bookId uint64) (BookGet, error) { var book BookGet query := db.Model(&model.Book{}) query = query.Select("books.title, books.author, books.summary, user_books.rating, user_books.read, user_books.want_read, " + selectStaticFilesPath()) query = query.Joins("left join user_books on (user_books.book_id = books.id and user_books.user_id = ?)", userId) query = query.Joins("left join static_files on (static_files.id = books.cover_id)") query = query.Where("books.id = ?", bookId) res := query.First(&book) return book, res.Error } type BookSearchGet struct { Title string `json:"title" binding:"required,max=300"` Author string `json:"author" binding:"max=100"` ID uint `json:"id"` CoverPath string `json:"coverPath"` } func FetchBookSearchGet(db *gorm.DB, searchterm string) ([]BookSearchGet, error) { var books []BookSearchGet query := db.Model(&model.Book{}) query = query.Select("books.title, books.author, books.id," + selectStaticFilesPath()) query = query.Joins("left join static_files on (static_files.id = books.cover_id)") query = query.Where("LOWER(title) LIKE ?", "%"+strings.ToLower(searchterm)+"%") res := query.Find(&books) return books, res.Error } type BookUserGet struct { ID uint `json:"id"` Title string `json:"title" binding:"required,max=300"` Author string `json:"author" binding:"max=100"` Rating int `json:"rating" binding:"min=0,max=10"` Read bool `json:"read" binding:"boolean"` WantRead bool `json:"wantread" binding:"boolean"` CoverPath string `json:"coverPath"` } func FetchReadUserBook(db *gorm.DB, userId uint, limit int, offset int) ([]BookUserGet, error) { var books []BookUserGet query := fetchReadUserBookQuery(db, userId) query = query.Limit(limit) query = query.Offset(offset) res := query.Find(&books) return books, res.Error } func FetchReadUserBookCount(db *gorm.DB, userId uint) (int64, error) { query := fetchReadUserBookQuery(db, userId) var count int64 res := query.Count(&count) return count, res.Error } func fetchReadUserBookQuery(db *gorm.DB, userId uint) *gorm.DB { query := fetchUserBookGet(db, userId) query = query.Where("user_books.read IS TRUE") return query } func FetchWantReadUserBook(db *gorm.DB, userId uint, limit int, offset int) ([]BookUserGet, error) { var books []BookUserGet query := fetchWantReadUserBookQuery(db, userId) query = query.Limit(limit) query = query.Offset(offset) res := query.Find(&books) return books, res.Error } func FetchWantReadUserBookCount(db *gorm.DB, userId uint) (int64, error) { query := fetchWantReadUserBookQuery(db, userId) var count int64 res := query.Count(&count) return count, res.Error } func fetchWantReadUserBookQuery(db *gorm.DB, userId uint) *gorm.DB { query := fetchUserBookGet(db, userId) query = query.Where("user_books.want_read IS TRUE") return query } func fetchUserBookGet(db *gorm.DB, userId uint) *gorm.DB { query := db.Model(&model.UserBook{}) query = query.Select("books.id, books.title, books.author, user_books.rating, user_books.read, user_books.want_read, " + selectStaticFilesPath()) query = query.Joins("left join books on (books.id = user_books.book_id)") query = query.Joins("left join static_files on (static_files.id = books.cover_id)") query = query.Where("user_id = ?", userId) return query } func selectStaticFilesPath() string { return "(CASE COALESCE(static_files.path, '') WHEN '' THEN '' ELSE concat('" + fileutils.GetWsLinkPrefix() + "', static_files.path) END) as CoverPath" }