package routes import ( "errors" "git.artlef.fr/bibliomane/internal/appcontext" "git.artlef.fr/bibliomane/internal/dto" "git.artlef.fr/bibliomane/internal/fileutils" "git.artlef.fr/bibliomane/internal/inventaire" "git.artlef.fr/bibliomane/internal/model" "git.artlef.fr/bibliomane/internal/myvalidator" "github.com/gin-gonic/gin" "gorm.io/gorm" ) func PostImportBookHandler(ac appcontext.AppContext) { var request dto.BookPostImport err := ac.C.ShouldBindJSON(&request) if err != nil { myvalidator.ReturnErrorsAsJsonResponse(&ac, err) return } user, fetchUserErr := ac.GetAuthenticatedUser() if fetchUserErr != nil { myvalidator.ReturnErrorsAsJsonResponse(&ac, err) return } inventaireEdition, err := inventaire.CallInventaireEdition(ac.Config.InventaireUrl, request.InventaireID, request.Lang) if err != nil { myvalidator.ReturnErrorsAsJsonResponse(&ac, err) return } book, err := saveInventaireBookToDb(ac, inventaireEdition, &user) if err != nil { myvalidator.ReturnErrorsAsJsonResponse(&ac, err) return } ac.C.JSON(200, gin.H{"id": book.ID}) } func saveInventaireBookToDb(ac appcontext.AppContext, inventaireEdition inventaire.InventaireEditionDetailedSingleResult, user *model.User) (*model.Book, error) { author, err := fetchOrCreateInventaireAuthor(ac, inventaireEdition.Author) if err != nil { return nil, err } book := model.Book{ Title: inventaireEdition.Title, SmallDescription: inventaireEdition.Description, InventaireID: inventaireEdition.Id, Author: *author, AddedBy: *user, } if inventaireEdition.Image != "" { cover, err := fileutils.DownloadFile(ac, inventaireEdition.Image) if err != nil { return nil, err } book.Cover = cover } err = ac.Db.Save(&book).Error return &book, err } func fetchOrCreateInventaireAuthor(ac appcontext.AppContext, inventaireAuthor *inventaire.InventaireAuthorResult) (*model.Author, error) { var author model.Author res := ac.Db.Where("inventaire_id = ?", inventaireAuthor.ID).First(&author) err := res.Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { newAuthor := model.Author{ Name: inventaireAuthor.Name, Description: inventaireAuthor.Description, InventaireID: inventaireAuthor.ID, } return &newAuthor, nil } else { return &author, err } } else { return &author, nil } }