diff --git a/demodata.sql b/demodata.sql
index 87c5c25..fd44c03 100644
--- a/demodata.sql
+++ b/demodata.sql
@@ -36,7 +36,7 @@ INSERT INTO static_files(name, path) VALUES ('noisy.jpg', 'noisy.jpg');
INSERT INTO books(created_at, title, author, added_by_id, cover_id) VALUES ('NOW', 'O dingos, o chateaux!','Jean-Patrick Manchette', (SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM static_files WHERE name = 'odingosochateaux.jpg'));
INSERT INTO user_books(created_at, user_id, book_id, read, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'O dingos, o chateaux!'), true,7);
INSERT INTO books(created_at, title, author, added_by_id, cover_id) VALUES ('NOW', 'Le petit bleu de la côte Ouest','Jean-Patrick Manchette', (SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM static_files WHERE name = 'le-petit-bleu-de-la-cote-ouest.jpg'));
-INSERT INTO user_books(created_at, user_id, book_id, read, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Le petit bleu de la côte Ouest'), true,7);
+INSERT INTO user_books(created_at, user_id, book_id, want_read, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Le petit bleu de la côte Ouest'), true,7);
INSERT INTO books(created_at, title, author, added_by_id, cover_id) VALUES ('NOW', 'D''un château l''autre','Louis-Ferdinand Céline', (SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM static_files WHERE name = 'dunchateaulautre.jpg'));
INSERT INTO user_books(created_at, user_id, book_id, read, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'D''un château l''autre'), true,10);
INSERT INTO books(created_at, title, author, added_by_id, cover_id) VALUES ('NOW', 'Les dieux ont soif','Anatole France', (SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM static_files WHERE name = 'lesdieuxontsoif.jpg'));
@@ -46,7 +46,7 @@ INSERT INTO user_books(created_at, user_id, book_id, read, rating) VALUES ('NOW'
INSERT INTO books(created_at, title, author, added_by_id, cover_id) VALUES ('NOW', 'Un barrage contre le Pacifique','Marguerite Duras', (SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM static_files WHERE name = 'Un_barrage_contre_le_Pacifique.jpg'));
INSERT INTO user_books(created_at, user_id, book_id, read, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Un barrage contre le Pacifique'), true,7);
INSERT INTO books(created_at, title, author, added_by_id, cover_id) VALUES ('NOW', 'Salammbô','Flaubert Gustave', (SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM static_files WHERE name = 'salammbo.jpg'));
-INSERT INTO user_books(created_at, user_id, book_id, read, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Salammbô'), true,8);
+INSERT INTO user_books(created_at, user_id, book_id, want_read, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Salammbô'), true,8);
INSERT INTO books(created_at, title, author, added_by_id, cover_id) VALUES ('NOW', 'Langage Machine','Romain Lucazeau', (SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM static_files WHERE name = 'Langage Machine.jpg'));
INSERT INTO user_books(created_at, user_id, book_id, read, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Langage Machine'), true,5);
INSERT INTO books(created_at, title, author, added_by_id, cover_id) VALUES ('NOW', 'La Ville et les chiens','Mario Vargas Llosa', (SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM static_files WHERE name = 'lavilleetleschiens.jpg'));
@@ -65,7 +65,7 @@ INSERT INTO books(created_at, title, author, added_by_id, cover_id) VALUES ('NOW
INSERT INTO user_books(created_at, user_id, book_id, read, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'L''Homme sans qualités, tome 1'), true,7);
INSERT INTO books(created_at, title, author, added_by_id, cover_id) VALUES ('NOW', 'The Green House','Mario Vargas Llosa', (SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM static_files WHERE name = 'lamaisonverte.jpg'));
INSERT INTO user_books(created_at, user_id, book_id, read, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'The Green House'), true,6);
-INSERT INTO books(created_at, title, author, added_by_id, cover_id) VALUES ('NOW', 'Le coup de pistolet','Alexandre Pouchkine', (SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM static_files WHERE name = 'lecoupdepistolet.jpg'));
+INSERT INTO books(created_at, title, author, added_by_id, cover_id) VALUES ('NOW', 'Le coup de pistolet','Alexandre Pouchkine', (SELECT id FROM users WHERE name = 'demo2'),(SELECT id FROM static_files WHERE name = 'lecoupdepistolet.jpg'));
INSERT INTO user_books(created_at, user_id, book_id, read, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Le coup de pistolet'),true,8);
INSERT INTO books(created_at, title, author, added_by_id, cover_id) VALUES ('NOW', 'De sang-froid','Truman Capote', (SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM static_files WHERE name = 'desangfroid.jpg'));
INSERT INTO user_books(created_at, user_id, book_id, read, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo2'),(SELECT id FROM books WHERE title = 'De sang-froid'),true,6);
diff --git a/front/src/BookForm.vue b/front/src/BookForm.vue
index 08ba9ce..da833d4 100644
--- a/front/src/BookForm.vue
+++ b/front/src/BookForm.vue
@@ -1,6 +1,6 @@
@@ -55,9 +63,16 @@
diff --git a/front/src/BookListElement.vue b/front/src/BookListElement.vue
index 2b44040..deaafde 100644
--- a/front/src/BookListElement.vue
+++ b/front/src/BookListElement.vue
@@ -16,7 +16,7 @@
const error = ref(null)
async function onUserBookRead() {
- const res = await putReadBook(props.id);
+ const res = await putReadBook(props.id, {read: true});
if (res.ok) {
router.push('/books')
} else {
diff --git a/front/src/api.js b/front/src/api.js
index 53e1f36..6501d3b 100644
--- a/front/src/api.js
+++ b/front/src/api.js
@@ -5,7 +5,7 @@ const baseUrl = "http://localhost:8080"
export function getImagePathOrDefault(path) {
return (path == "" || typeof path === 'undefined') ?
- "../defaultbook.png" : "http://localhost:8080" + path;
+ "../defaultbook.png" : baseUrl + path;
}
function useFetch(url) {
@@ -45,12 +45,16 @@ export function postBook(book) {
return genericPayloadCall('/book', book.value, 'POST')
}
-export async function putReadBook(bookId) {
- return putBookUpdate(bookId, {read: true})
+export async function putReadBook(bookId, payload) {
+ return genericPayloadCall('/book/' + bookId + "/read", payload, 'PUT')
}
-export async function putBookUpdate(bookId, payload) {
- return genericPayloadCall('/book/' + bookId, payload, 'PUT')
+export async function putWantReadBook(bookId, payload) {
+ return genericPayloadCall('/book/' + bookId + "/wantread", payload, 'PUT')
+}
+
+export async function putRateBook(bookId, payload) {
+ return genericPayloadCall('/book/' + bookId + "/rate", payload, 'PUT')
}
export function postLogin(user) {
diff --git a/internal/apitest/get_book_test.go b/internal/apitest/get_book_test.go
index 4f45401..85660c5 100644
--- a/internal/apitest/get_book_test.go
+++ b/internal/apitest/get_book_test.go
@@ -12,11 +12,12 @@ import (
)
type fetchedBook 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"`
+ 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"`
}
func TestGetBook_Ok(t *testing.T) {
diff --git a/internal/apitest/get_user_book_test.go b/internal/apitest/get_user_book_test.go
index 20b89ad..081ffd8 100644
--- a/internal/apitest/get_user_book_test.go
+++ b/internal/apitest/get_user_book_test.go
@@ -14,11 +14,12 @@ import (
)
type bookUserGet struct {
- BookId 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"`
+ BookId 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"`
+ WantRead bool `json:"wantread"`
}
func TestGetBooksHandler_Demo(t *testing.T) {
diff --git a/internal/apitest/put_userbook_read_test.go b/internal/apitest/put_userbook_read_test.go
new file mode 100644
index 0000000..cf140d5
--- /dev/null
+++ b/internal/apitest/put_userbook_read_test.go
@@ -0,0 +1,25 @@
+package apitest
+
+import (
+ "net/http"
+ "testing"
+
+ "git.artlef.fr/PersonalLibraryManager/internal/testutils"
+ "github.com/stretchr/testify/assert"
+)
+
+func TestPutReadUserBooks_NewReadOk(t *testing.T) {
+ payload :=
+ `{
+ "read": true
+ }`
+ bookId := "21"
+ testPutReadUserBooks(t, payload, bookId, http.StatusOK)
+ book := testGetBook(t, bookId, http.StatusOK)
+ assert.Equal(t, true, book.Read)
+ assert.Equal(t, false, book.WantRead)
+}
+
+func testPutReadUserBooks(t *testing.T, payload string, bookId string, expectedCode int) {
+ testutils.TestBookPutCallWithDemoPayload(t, payload, bookId, expectedCode, "/book/"+bookId+"/read")
+}
diff --git a/internal/apitest/put_userbook_update_test.go b/internal/apitest/put_userbook_update_test.go
index 6f62856..4f9349c 100644
--- a/internal/apitest/put_userbook_update_test.go
+++ b/internal/apitest/put_userbook_update_test.go
@@ -1,90 +1,74 @@
package apitest
import (
- "fmt"
"net/http"
- "net/http/httptest"
- "strings"
"testing"
"git.artlef.fr/PersonalLibraryManager/internal/testutils"
"github.com/stretchr/testify/assert"
)
-func TestPutBookUpdate_NewReadOk(t *testing.T) {
- payload :=
- `{
- "read": true
- }`
- testPutUserBooksHandler(t, payload, "21", http.StatusOK)
-}
-
-func TestPutUserBooksHandler_UpdateRating(t *testing.T) {
+func TestPutRatingUserBooksHandler_UpdateRating(t *testing.T) {
payload :=
`{
"rating": 5
}`
bookId := "17"
- testPutUserBooksHandler(t, payload, bookId, http.StatusOK)
+ testPutRateUserBooks(t, payload, bookId, http.StatusOK)
book := testGetBook(t, bookId, http.StatusOK)
assert.Equal(t, 5, book.Rating)
assert.Equal(t, true, book.Read)
}
-func TestPutUserBooksHandler_RateNewBookMakeItRead(t *testing.T) {
+func TestPutRatingUserBooksHandler_RateNewBookMakeItRead(t *testing.T) {
payload :=
`{
"rating": 7
}`
bookId := "18"
- testPutUserBooksHandler(t, payload, bookId, http.StatusOK)
+ testPutRateUserBooks(t, payload, bookId, http.StatusOK)
book := testGetBook(t, bookId, http.StatusOK)
assert.Equal(t, 7, book.Rating)
assert.Equal(t, true, book.Read)
+ assert.Equal(t, false, book.WantRead)
}
-func TestPutUserBooksHandler_RatingTypeWrong(t *testing.T) {
+func TestPutRatingUserBooksHandler_RatingTypeWrong(t *testing.T) {
payload :=
`{
"rating": "bad"
}`
bookId := "18"
- testPutUserBooksHandler(t, payload, bookId, http.StatusInternalServerError)
+ testPutRateUserBooks(t, payload, bookId, http.StatusInternalServerError)
}
-func TestPutUserBooksHandler_RatingMin(t *testing.T) {
+func TestPutRatingUserBooksHandler_RatingMin(t *testing.T) {
payload :=
`{
"rating": -3
}`
bookId := "18"
- testPutUserBooksHandler(t, payload, bookId, http.StatusBadRequest)
+ testPutRateUserBooks(t, payload, bookId, http.StatusBadRequest)
}
-func TestPutUserBooksHandler_RatingMax(t *testing.T) {
+func TestPutRatingUserBooksHandler_RatingMax(t *testing.T) {
payload :=
`{
"rating": 15
}`
bookId := "18"
- testPutUserBooksHandler(t, payload, bookId, http.StatusBadRequest)
+ testPutRateUserBooks(t, payload, bookId, http.StatusBadRequest)
}
-func TestPutUserBooksHandler_BadBookId(t *testing.T) {
+func TestPutRatingUserBooksHandler_BadBookId(t *testing.T) {
payload :=
`{
"rating": 15
}`
bookId := "18574"
- testPutUserBooksHandler(t, payload, bookId, http.StatusNotFound)
+ testPutRateUserBooks(t, payload, bookId, http.StatusNotFound)
}
-func testPutUserBooksHandler(t *testing.T, payload string, bookId string, expectedCode int) {
- router := testutils.TestSetup()
- token := testutils.ConnectDemoUser(router)
- req, _ := http.NewRequest("PUT", "/book/"+bookId, strings.NewReader(payload))
- req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token))
- w := httptest.NewRecorder()
- router.ServeHTTP(w, req)
- assert.Equal(t, expectedCode, w.Code)
+func testPutRateUserBooks(t *testing.T, payload string, bookId string, expectedCode int) {
+ testutils.TestBookPutCallWithDemoPayload(t, payload, bookId, expectedCode, "/book/"+bookId+"/rate")
}
diff --git a/internal/apitest/put_userbook_wantread_test.go b/internal/apitest/put_userbook_wantread_test.go
new file mode 100644
index 0000000..eee0579
--- /dev/null
+++ b/internal/apitest/put_userbook_wantread_test.go
@@ -0,0 +1,35 @@
+package apitest
+
+import (
+ "net/http"
+ "testing"
+
+ "git.artlef.fr/PersonalLibraryManager/internal/testutils"
+ "github.com/stretchr/testify/assert"
+)
+
+func TestPutWantRead_SetTrue(t *testing.T) {
+ payload :=
+ `{
+ "wantread": true
+ }`
+ bookId := "17"
+ testPutWantReadUserBooks(t, payload, bookId, http.StatusOK)
+ book := testGetBook(t, bookId, http.StatusOK)
+ assert.Equal(t, true, book.WantRead)
+}
+
+func TestPutWantRead_SetFalse(t *testing.T) {
+ payload :=
+ `{
+ "wantread": false
+ }`
+ bookId := "2"
+ testPutWantReadUserBooks(t, payload, bookId, http.StatusOK)
+ book := testGetBook(t, bookId, http.StatusOK)
+ assert.Equal(t, false, book.WantRead)
+}
+
+func testPutWantReadUserBooks(t *testing.T, payload string, bookId string, expectedCode int) {
+ testutils.TestBookPutCallWithDemoPayload(t, payload, bookId, expectedCode, "/book/"+bookId+"/wantread")
+}
diff --git a/internal/model/userbook.go b/internal/model/userbook.go
index eb023fb..6604712 100644
--- a/internal/model/userbook.go
+++ b/internal/model/userbook.go
@@ -5,9 +5,10 @@ import "gorm.io/gorm"
// describes the relationship between a user and a book.
type UserBook struct {
gorm.Model
- UserID uint
- BookID uint
- Book Book
- Rating int
- Read bool
+ UserID uint
+ BookID uint
+ Book Book
+ Rating int
+ Read bool
+ WantRead bool
}
diff --git a/internal/query/query.go b/internal/query/query.go
index 8c87da6..4fcae14 100644
--- a/internal/query/query.go
+++ b/internal/query/query.go
@@ -14,13 +14,14 @@ type BookGet struct {
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, " + selectStaticFilesPath())
+ 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)
@@ -51,13 +52,14 @@ type BookUserGet struct {
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 FetchBookUserGet(db *gorm.DB, userId uint) ([]BookUserGet, error) {
var books []BookUserGet
query := db.Model(&model.UserBook{})
- query = query.Select("books.id, books.title, books.author, user_books.rating, user_books.read," + selectStaticFilesPath())
+ 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)
diff --git a/internal/routes/userbookputupdate.go b/internal/routes/userbookputupdate.go
index dbf0c4a..2e034e5 100644
--- a/internal/routes/userbookputupdate.go
+++ b/internal/routes/userbookputupdate.go
@@ -12,69 +12,150 @@ import (
"gorm.io/gorm"
)
-type userbookPutUpdate struct {
- Read bool `json:"read"`
- Rating int `json:"rating" binding:"min=0,max=10"`
+func PutReadUserBookHandler(ac appcontext.AppContext) {
+ data, err := retrieveDataFromContext(ac)
+ if err != nil {
+ return
+ }
+ bookId := data.BookId
+ user := data.User
+ var read userbookPutRead
+ err = ac.C.ShouldBindJSON(&read)
+ if err != nil {
+ myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
+ return
+ }
+ userbook, err := fetchOrCreateUserBook(ac, bookId, &user)
+ if err != nil {
+ return
+ }
+
+ userbook.Read = read.Read
+
+ //remove the book from "wanted" list when it is marked as read.
+ if userbook.Read {
+ userbook.WantRead = false
+ }
+
+ ac.Db.Save(&userbook)
+ ac.C.String(http.StatusOK, "Success")
}
-func PutUserBookHandler(ac appcontext.AppContext) {
+func PutWantReadUserBookHandler(ac appcontext.AppContext) {
+ data, err := retrieveDataFromContext(ac)
+ if err != nil {
+ return
+ }
+ bookId := data.BookId
+ user := data.User
+ var wantread userbookPutWantRead
+ err = ac.C.ShouldBindJSON(&wantread)
+ if err != nil {
+ myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
+ return
+ }
+ userbook, err := fetchOrCreateUserBook(ac, bookId, &user)
+ if err != nil {
+ return
+ }
+ userbook.WantRead = wantread.WantRead
+ ac.Db.Save(&userbook)
+ ac.C.String(http.StatusOK, "Success")
+}
+
+func PutRateUserBookHandler(ac appcontext.AppContext) {
+ data, err := retrieveDataFromContext(ac)
+ if err != nil {
+ return
+ }
+ bookId := data.BookId
+ user := data.User
+ var rating userbookPutRating
+ err = ac.C.ShouldBindJSON(&rating)
+ if err != nil {
+ myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
+ return
+ }
+ userbook, err := fetchOrCreateUserBook(ac, bookId, &user)
+ if err != nil {
+ return
+ }
+ userbook.Rating = rating.Rating
+
+ //if rated, set to "read" (a rating = 0 means unrated)
+ if userbook.Rating > 0 {
+ userbook.Read = true
+ }
+ ac.Db.Save(&userbook)
+ ac.C.String(http.StatusOK, "Success")
+}
+
+type userbookPutRead struct {
+ Read bool `json:"read"`
+}
+
+type userbookPutWantRead struct {
+ WantRead bool `json:"wantread"`
+}
+
+type userbookPutRating struct {
+ Rating int `json:"rating" binding:"min=0,max=10"`
+}
+
+type apiCallData struct {
+ BookId uint
+ User model.User
+}
+
+func retrieveDataFromContext(ac appcontext.AppContext) (apiCallData, error) {
bookId64, err := strconv.ParseUint(ac.C.Param("id"), 10, 64)
bookId := uint(bookId64)
if err != nil {
ac.C.JSON(http.StatusBadRequest, gin.H{"error": err})
- return
+ return apiCallData{}, err
}
err = myvalidator.ValidateId(ac.Db, bookId, &model.Book{})
if err != nil {
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
- return
- }
- var userbook userbookPutUpdate
- err = ac.C.ShouldBindJSON(&userbook)
- if err != nil {
- myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
- return
+ return apiCallData{}, err
}
+
user, fetchUserErr := ac.GetAuthenticatedUser()
if fetchUserErr != nil {
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
- return
+ return apiCallData{}, fetchUserErr
}
+ return apiCallData{BookId: bookId, User: user}, nil
+}
- //a rating of 0 means no rating
- // if there is a rating, read is forced to true
- userbook.Read = userbook.Read || userbook.Rating > 0
-
- var userbookDb model.UserBook
- res := ac.Db.Where("user_id = ? AND book_id = ?", user.ID, bookId).First(&userbookDb)
- err = res.Error
+func fetchOrCreateUserBook(ac appcontext.AppContext, bookId uint, user *model.User) (model.UserBook, error) {
+ var userbook model.UserBook
+ res := ac.Db.Where("user_id = ? AND book_id = ?", user.ID, bookId).First(&userbook)
+ err := res.Error
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
- userbookDb = userBookWsToDb(userbook, bookId, &user)
- err = ac.Db.Save(&userbookDb).Error
+ userbook = createUserBook(bookId, user)
+ err = ac.Db.Save(&userbook).Error
if err != nil {
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
- return
+ return userbook, err
}
+ return userbook, nil
} else {
myvalidator.ReturnErrorsAsJsonResponse(&ac, err)
- return
+ return userbook, err
}
} else {
- userbookDb.Read = userbook.Read
- if userbook.Rating > 0 {
- userbookDb.Rating = userbook.Rating
- }
- ac.Db.Save(&userbookDb)
+ return userbook, nil
}
- ac.C.String(http.StatusOK, "Success")
}
-func userBookWsToDb(ub userbookPutUpdate, bookId uint, user *model.User) model.UserBook {
+func createUserBook(bookId uint, user *model.User) model.UserBook {
return model.UserBook{
- UserID: user.ID,
- BookID: bookId,
- Read: ub.Read,
- Rating: ub.Rating,
+ UserID: user.ID,
+ BookID: bookId,
+ Read: false,
+ WantRead: false,
+ Rating: 0,
}
}
diff --git a/internal/setup/setup.go b/internal/setup/setup.go
index 2c446d6..85be341 100644
--- a/internal/setup/setup.go
+++ b/internal/setup/setup.go
@@ -33,8 +33,14 @@ func Setup(config *config.Config) *gin.Engine {
r.GET("/book/:id", func(c *gin.Context) {
routes.GetBookHandler(appcontext.AppContext{C: c, Db: db, I18n: bundle, Config: config})
})
- r.PUT("/book/:id", func(c *gin.Context) {
- routes.PutUserBookHandler(appcontext.AppContext{C: c, Db: db, I18n: bundle, Config: config})
+ r.PUT("/book/:id/read", func(c *gin.Context) {
+ routes.PutReadUserBookHandler(appcontext.AppContext{C: c, Db: db, I18n: bundle, Config: config})
+ })
+ r.PUT("/book/:id/wantread", func(c *gin.Context) {
+ routes.PutWantReadUserBookHandler(appcontext.AppContext{C: c, Db: db, I18n: bundle, Config: config})
+ })
+ r.PUT("/book/:id/rate", func(c *gin.Context) {
+ routes.PutRateUserBookHandler(appcontext.AppContext{C: c, Db: db, I18n: bundle, Config: config})
})
r.POST("/book", func(c *gin.Context) {
routes.PostBookHandler(appcontext.AppContext{C: c, Db: db, I18n: bundle, Config: config})
diff --git a/internal/testutils/testutils.go b/internal/testutils/testutils.go
index 2a5950b..6e8f755 100644
--- a/internal/testutils/testutils.go
+++ b/internal/testutils/testutils.go
@@ -2,14 +2,17 @@ package testutils
import (
"encoding/json"
+ "fmt"
"log"
"net/http"
"net/http/httptest"
"strings"
+ "testing"
"git.artlef.fr/PersonalLibraryManager/internal/config"
"git.artlef.fr/PersonalLibraryManager/internal/setup"
"github.com/gin-gonic/gin"
+ "github.com/stretchr/testify/assert"
)
func TestSetup() *gin.Engine {
@@ -51,3 +54,13 @@ func connectUser(router *gin.Engine, loginJson string) string {
}
return parsedResponse.Token
}
+
+func TestBookPutCallWithDemoPayload(t *testing.T, payload string, bookId string, expectedCode int, url string) {
+ router := TestSetup()
+ token := ConnectDemoUser(router)
+ req, _ := http.NewRequest("PUT", url, strings.NewReader(payload))
+ req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token))
+ w := httptest.NewRecorder()
+ router.ServeHTTP(w, req)
+ assert.Equal(t, expectedCode, w.Code)
+}