64 lines
1.5 KiB
Go
64 lines
1.5 KiB
Go
package routes
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
|
|
"git.artlef.fr/PersonalLibraryManager/internal/appcontext"
|
|
"git.artlef.fr/PersonalLibraryManager/internal/model"
|
|
"git.artlef.fr/PersonalLibraryManager/internal/myvalidator"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type bookPostMarkAsRead struct {
|
|
BookID uint `json:"bookId" binding:"required"`
|
|
}
|
|
|
|
func PostBookReadHandler(ac appcontext.AppContext) {
|
|
var userbook bookPostMarkAsRead
|
|
err := ac.C.ShouldBindJSON(&userbook)
|
|
if err != nil {
|
|
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
|
return
|
|
}
|
|
err = myvalidator.ValidateId(ac.Db, userbook.BookID, &model.Book{})
|
|
if err != nil {
|
|
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
|
return
|
|
}
|
|
user, fetchUserErr := ac.GetAuthenticatedUser()
|
|
if fetchUserErr != nil {
|
|
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
|
return
|
|
}
|
|
|
|
var userbookDb model.UserBook
|
|
res := ac.Db.Where("user_id = ? AND book_id = ?", user.ID, userbook.BookID).First(&userbookDb)
|
|
err = res.Error
|
|
if err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
userbookDb = userBookWsToDb(userbook, &user)
|
|
err = ac.Db.Save(&userbookDb).Error
|
|
if err != nil {
|
|
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
|
return
|
|
}
|
|
} else {
|
|
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
|
|
return
|
|
}
|
|
} else {
|
|
userbookDb.Read = true
|
|
ac.Db.Save(&userbookDb)
|
|
}
|
|
ac.C.String(http.StatusOK, "Success")
|
|
}
|
|
|
|
func userBookWsToDb(ub bookPostMarkAsRead, user *model.User) model.UserBook {
|
|
return model.UserBook{
|
|
UserID: user.ID,
|
|
BookID: ub.BookID,
|
|
Read: true,
|
|
}
|
|
}
|