package routes import ( "errors" "net/http" "git.artlef.fr/bibliomane/internal/adapter" "git.artlef.fr/bibliomane/internal/appcontext" "git.artlef.fr/bibliomane/internal/dto" "git.artlef.fr/bibliomane/internal/i18nresource" "git.artlef.fr/bibliomane/internal/model" "git.artlef.fr/bibliomane/internal/myvalidator" "github.com/gin-gonic/gin" ) func PostBookHandler(ac appcontext.AppContext) { var book dto.BookFields err := ac.C.ShouldBindJSON(&book) if err != nil { myvalidator.ReturnErrorsAsJsonResponse(&ac, err) return } //when creating a book, title is required if book.Title == nil { err = myvalidator.HttpError{ StatusCode: http.StatusBadRequest, Err: errors.New(i18nresource.GetTranslatedMessage(&ac, "ValidationRequired")), } myvalidator.ReturnErrorsAsJsonResponse(&ac, err) return } if book.CoverID != nil { err = myvalidator.ValidateId(ac.Db, *book.CoverID, &model.StaticFile{}) if err != nil { myvalidator.ReturnErrorsAsJsonResponse(&ac, err) return } } user, fetchUserErr := ac.GetAuthenticatedUser() if fetchUserErr != nil { myvalidator.ReturnErrorsAsJsonResponse(&ac, err) return } id, err := saveBookToDb(ac, book, &user) if err != nil { myvalidator.ReturnErrorsAsJsonResponse(&ac, err) return } ac.C.JSON(http.StatusOK, gin.H{"id": id}) } func saveBookToDb(ac appcontext.AppContext, b dto.BookFields, user *model.User) (uint, error) { book := model.Book{ AddedBy: *user, } err := adapter.FillBookDbFromFields(ac, &b, &book) if err != nil { return 0, err } err = ac.Db.Save(&book).Error return book.ID, err }