From 873c3c89fafd5710c68a7c96ecccd54d0f4a3de2 Mon Sep 17 00:00:00 2001 From: Arthur Lefebvre Date: Fri, 24 Oct 2025 20:06:41 +0200 Subject: [PATCH] Add route to get a particular book --- demodata.sql | 56 ++++++++++++------------ front/src/BookForm.vue | 32 ++++++++++++++ front/src/api.js | 4 ++ front/src/router.js | 3 ++ get_book_test.go | 66 +++++++++++++++++++++++++++++ get_user_book_test.go | 3 +- internal/myvalidator/myvalidator.go | 2 +- internal/routes/bookget.go | 47 ++++++++++++++++++++ internal/setup/setup.go | 3 ++ post_book_read_test.go | 2 +- search_book_test.go | 4 +- 11 files changed, 188 insertions(+), 34 deletions(-) create mode 100644 front/src/BookForm.vue create mode 100644 get_book_test.go create mode 100644 internal/routes/bookget.go diff --git a/demodata.sql b/demodata.sql index c688fc6..fc7dc5d 100644 --- a/demodata.sql +++ b/demodata.sql @@ -1,58 +1,58 @@ INSERT INTO users(created_at, name, password) VALUES ('NOW', 'demo','$2a$10$7mfCBxBwIzXDU6r9az26o.zPX/r6IlNZVfU9zxSoLVtc0kRPimzba'); INSERT INTO users(created_at, name, password) VALUES ('NOW', 'demo2','$2a$10$7mfCBxBwIzXDU6r9az26o.zPX/r6IlNZVfU9zxSoLVtc0kRPimzba'); INSERT INTO books(created_at, title, author, added_by_id) VALUES ('NOW', 'O dingos, o chateaux!','Jean-Patrick Manchette', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'O dingos, o chateaux!') ,7); +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) VALUES ('NOW', 'Le petit bleu de la côte Ouest','Jean-Patrick Manchette', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Le petit bleu de la côte Ouest') ,7); +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 books(created_at, title, author, added_by_id) VALUES ('NOW', 'D''un château l''autre','Louis-Ferdinand Céline', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'D''un château l''autre') ,10); +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) VALUES ('NOW', 'Les dieux ont soif','Anatole France', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Les dieux ont soif') ,7); +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 = 'Les dieux ont soif'), true,7); INSERT INTO books(created_at, title, author, added_by_id) VALUES ('NOW', 'Rigodon','Louis-Ferdinand Céline', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Rigodon') ,10); +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 = 'Rigodon'),true, 10); INSERT INTO books(created_at, title, author, added_by_id) VALUES ('NOW', 'Un barrage contre le Pacifique','Marguerite Duras', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Un barrage contre le Pacifique') ,7); +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) VALUES ('NOW', 'Salammbô','Flaubert Gustave', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Salammbô') ,8); +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 books(created_at, title, author, added_by_id) VALUES ('NOW', 'Langage Machine','Romain Lucazeau', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Langage Machine') ,5); +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) VALUES ('NOW', 'La Ville et les chiens','Mario Vargas Llosa', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'La Ville et les chiens'),6); +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 = 'La Ville et les chiens'),true,6); INSERT INTO books(created_at, title, author, added_by_id) VALUES ('NOW', 'La Fille Du Capitaine','A. Pouchkine', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'La Fille Du Capitaine'),8); +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 = 'La Fille Du Capitaine'),true,8); INSERT INTO books(created_at, title, author, added_by_id) VALUES ('NOW', 'Aurélien','Louis Aragon', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Aurélien') ,8); +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 = 'Aurélien'), true,8); INSERT INTO books(created_at, title, author, added_by_id) VALUES ('NOW', 'Duo','Colette', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Duo'),9); +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 = 'Duo'),true,9); INSERT INTO books(created_at, title, author, added_by_id) VALUES ('NOW', 'Gargantua','François Rabelais', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Gargantua'),7); +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 = 'Gargantua'),true,7); INSERT INTO books(created_at, title, author, added_by_id) VALUES ('NOW', 'The Life of Jesus','Ernest Renan', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'The Life of Jesus'), NULL); +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 Life of Jesus'), false, NULL); INSERT INTO books(created_at, title, author, added_by_id) VALUES ('NOW', 'L''Homme sans qualités, tome 1','Robert Musil', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'L''Homme sans qualités, tome 1') ,7); +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) VALUES ('NOW', 'The Green House','Mario Vargas Llosa', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'The Green House') ,6); +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) VALUES ('NOW', 'Le coup de pistolet','Alexandre Pouchkine', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Le coup de pistolet'),8); +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) VALUES ('NOW', 'De sang-froid','Truman Capote', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo2'),(SELECT id FROM books WHERE title = 'De sang-froid'),6); +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); INSERT INTO books(created_at, title, author, added_by_id) VALUES ('NOW', 'La position du tireur couché','Jean-Patrick Manchette', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'La position du tireur couché'),6); +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 = 'La position du tireur couché'),true,6); INSERT INTO books(created_at, title, author, added_by_id) VALUES ('NOW', 'Vers le Phare','Virginia Woolf', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Vers le Phare'),6); +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 = 'Vers le Phare'),true,6); INSERT INTO books(created_at, title, author, added_by_id) VALUES ('NOW', 'L''insoutenable légèreté de l''être', 'Milan Kundera', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo2'),(SELECT id FROM books WHERE title = 'L''insoutenable légèreté de l''être') ,8); +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 = 'L''insoutenable légèreté de l''être'), true,8); INSERT INTO books(created_at, title, author, added_by_id) VALUES ('NOW', 'Le complot contre l''Amérique','Philip Roth', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Le complot contre l''Amérique'),6); +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 complot contre l''Amérique'),true,6); INSERT INTO books(created_at, title, author, added_by_id) VALUES ('NOW', 'Nord','Louis-Ferdinand Céline', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Nord'),10); +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 = 'Nord'),true, 10); INSERT INTO books(created_at, title, author, added_by_id) VALUES ('NOW', 'Sa majesté des mouches','William Golding', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Sa majesté des mouches'),5); +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 = 'Sa majesté des mouches'),true, 5); INSERT INTO books(created_at, title, author, added_by_id) VALUES ('NOW', 'Le Pavillon d''or','Yukio Mishima', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Le Pavillon d''or'),8); +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 Pavillon d''or'),true,8); INSERT INTO books(created_at, title, author, added_by_id) VALUES ('NOW', 'Le meurtre d''O-tsuya','Junichiro Tanizaki', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Le meurtre d''O-tsuya'),7); +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 meurtre d''O-tsuya'),true, 7); INSERT INTO books(created_at, title, author, added_by_id) VALUES ('NOW', 'Dojoji et autres nouvelles','Yukio Mishima', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Dojoji et autres nouvelles'),8); +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 = 'Dojoji et autres nouvelles'),true,8); INSERT INTO books(created_at, title, author, added_by_id) VALUES ('NOW', 'Noisy outlaws, unfriendly blobs, and some other things that aren''t as scary, maybe, depending on how you feel about lost lands, stray cellphones, creatures from the sky, parents who disappear in Peru, a man named Lars Farf, and one other story we couldn''t quite finish, so maybe you could help us out','Wolfeschlegelsteinhausenbergerdorffwelchevoralternwarengewissenhaftschaferswessenschafewarenwohlgepf', (SELECT id FROM users WHERE name = 'demo')); -INSERT INTO user_books(created_at, user_id, book_id, rating) VALUES ('NOW',(SELECT id FROM users WHERE name = 'demo'),(SELECT id FROM books WHERE title = 'Noisy outlaws, unfriendly blobs, and some other things that aren''t as scary, maybe, depending on how you feel about lost lands, stray cellphones, creatures from the sky, parents who disappear in Peru, a man named Lars Farf, and one other story we couldn''t quite finish, so maybe you could help us out'),2); +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 = 'Noisy outlaws, unfriendly blobs, and some other things that aren''t as scary, maybe, depending on how you feel about lost lands, stray cellphones, creatures from the sky, parents who disappear in Peru, a man named Lars Farf, and one other story we couldn''t quite finish, so maybe you could help us out'),true,2); diff --git a/front/src/BookForm.vue b/front/src/BookForm.vue new file mode 100644 index 0000000..f8209d1 --- /dev/null +++ b/front/src/BookForm.vue @@ -0,0 +1,32 @@ + + + + + diff --git a/front/src/api.js b/front/src/api.js index aaab608..52e98b4 100644 --- a/front/src/api.js +++ b/front/src/api.js @@ -32,6 +32,10 @@ export function getSearchBooks(searchterm) { return useFetch(baseUrl + '/search/' + searchterm); } +export function getBook(id) { + return useFetch(baseUrl + '/book/' + id); +} + export function postBook(book) { return genericPostCall('/book', book.value) } diff --git a/front/src/router.js b/front/src/router.js index 0a6132c..a017e2b 100644 --- a/front/src/router.js +++ b/front/src/router.js @@ -2,6 +2,7 @@ import { createRouter, createWebHistory } from 'vue-router' import BooksBrowser from './BooksBrowser.vue' import AddBook from './AddBook.vue' +import BookForm from './BookForm.vue' import SignUp from './SignUp.vue' import LogIn from './LogIn.vue' import Home from './Home.vue' @@ -11,10 +12,12 @@ import { useAuthStore } from './auth.store' const routes = [ { path: '/', component: Home }, { path: '/books', component: BooksBrowser }, + { path: '/book/:id', component: BookForm, props: true }, { path: '/search/:searchterm', component: SearchBook, props: true }, { path: '/add', component: AddBook }, { path: '/signup', component: SignUp }, { path: '/login', component: LogIn }, + { path: '/book', component: LogIn }, ] export const router = createRouter({ diff --git a/get_book_test.go b/get_book_test.go new file mode 100644 index 0000000..51f48a6 --- /dev/null +++ b/get_book_test.go @@ -0,0 +1,66 @@ +package main + +import ( + "encoding/json" + "fmt" + "net/http" + "net/http/httptest" + "testing" + + "git.artlef.fr/PersonalLibraryManager/internal/testutils" + "github.com/stretchr/testify/assert" +) + +type fetchedBook struct { + Title string `json:"title" binding:"required,max=300"` + Author string `json:"author" binding:"max=100"` + Rating int `json:"rating"` + Read bool `json:"read"` +} + +func TestGetBook_Ok(t *testing.T) { + book := testGetBook(t, "5", http.StatusOK) + assert.Equal(t, + fetchedBook{ + Title: "Rigodon", + Author: "Louis-Ferdinand Céline", + Rating: 10, + Read: true, + }, book) +} + +func TestGetBook_NoUserBook(t *testing.T) { + book := testGetBook(t, "18", http.StatusOK) + assert.Equal(t, + fetchedBook{ + Title: "De sang-froid", + Author: "Truman Capote", + Read: false, + }, book) +} + +func TestGetBook_IdNotFound(t *testing.T) { + testGetBook(t, "46544", http.StatusNotFound) +} + +func TestGetBook_IdNotInt(t *testing.T) { + testGetBook(t, "wrong", http.StatusBadRequest) +} + +func testGetBook(t *testing.T, id string, status int) fetchedBook { + router := testutils.TestSetup() + + token := testutils.ConnectDemoUser(router) + req, _ := http.NewRequest("GET", "/book/"+id, nil) + req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", token)) + w := httptest.NewRecorder() + router.ServeHTTP(w, req) + + var book fetchedBook + err := json.Unmarshal(w.Body.Bytes(), &book) + if err != nil { + t.Error(err) + } + assert.Equal(t, status, w.Code) + return book +} diff --git a/get_user_book_test.go b/get_user_book_test.go index acaa9b4..cef0b2f 100644 --- a/get_user_book_test.go +++ b/get_user_book_test.go @@ -3,7 +3,6 @@ package main import ( "encoding/json" "fmt" - "log" "net/http" "net/http/httptest" "testing" @@ -46,7 +45,7 @@ func testGetbooksHandler(t *testing.T, router *gin.Engine, userToken string, exp var parsedResponse []bookUserGet err := json.Unmarshal(w.Body.Bytes(), &parsedResponse) if err != nil { - log.Fatal(err) + t.Error(err) } assert.Equal(t, expectedCode, w.Code) return parsedResponse diff --git a/internal/myvalidator/myvalidator.go b/internal/myvalidator/myvalidator.go index f7dfae2..71d8fde 100644 --- a/internal/myvalidator/myvalidator.go +++ b/internal/myvalidator/myvalidator.go @@ -25,7 +25,7 @@ func ValidateId(db *gorm.DB, id uint, value any) error { } if errors.Is(result.Error, gorm.ErrRecordNotFound) { return HttpError{ - StatusCode: http.StatusBadRequest, + StatusCode: http.StatusNotFound, Err: fmt.Errorf("Id %d could not be found for model %s", id, value), } } else { diff --git a/internal/routes/bookget.go b/internal/routes/bookget.go new file mode 100644 index 0000000..e52c4d2 --- /dev/null +++ b/internal/routes/bookget.go @@ -0,0 +1,47 @@ +package routes + +import ( + "net/http" + "strconv" + + "git.artlef.fr/PersonalLibraryManager/internal/appcontext" + "git.artlef.fr/PersonalLibraryManager/internal/model" + "git.artlef.fr/PersonalLibraryManager/internal/myvalidator" + "github.com/gin-gonic/gin" +) + +type bookGet struct { + Title string `json:"title" binding:"required,max=300"` + Author string `json:"author" binding:"max=100"` + Rating int `json:"rating"` + Read bool `json:"read"` +} + +func GetBookHandler(ac appcontext.AppContext) { + bookId, err := strconv.ParseUint(ac.C.Param("id"), 10, 64) + if err != nil { + ac.C.JSON(http.StatusBadRequest, gin.H{"error": err}) + return + } + user, fetchUserErr := ac.GetAuthenticatedUser() + if fetchUserErr != nil { + myvalidator.ReturnErrorsAsJsonResponse(&ac, fetchUserErr) + return + } + err = myvalidator.ValidateId(ac.Db, uint(bookId), &model.Book{}) + if err != nil { + myvalidator.ReturnErrorsAsJsonResponse(&ac, err) + return + } + var book bookGet + query := ac.Db.Model(&model.Book{}) + query = query.Select("books.title, books.author, user_books.rating, user_books.read") + query = query.Joins("left join user_books on (user_books.book_id = books.id and user_books.user_id = ?)", user.ID) + query = query.Where("books.id = ?", bookId) + res := query.First(&book) + if res.Error != nil { + myvalidator.ReturnErrorsAsJsonResponse(&ac, err) + return + } + ac.C.JSON(http.StatusOK, book) +} diff --git a/internal/setup/setup.go b/internal/setup/setup.go index 3ca676c..6a6fe3f 100644 --- a/internal/setup/setup.go +++ b/internal/setup/setup.go @@ -29,6 +29,9 @@ func Setup(config *config.Config) *gin.Engine { r.GET("/search/:searchterm", func(c *gin.Context) { routes.GetSearchBooksHandler(appcontext.AppContext{C: c, Db: db, I18n: bundle}) }) + r.GET("/book/:id", func(c *gin.Context) { + routes.GetBookHandler(appcontext.AppContext{C: c, Db: db, I18n: bundle}) + }) r.POST("/book", func(c *gin.Context) { routes.PostBookHandler(appcontext.AppContext{C: c, Db: db, I18n: bundle}) }) diff --git a/post_book_read_test.go b/post_book_read_test.go index 5fb4823..a3dcd36 100644 --- a/post_book_read_test.go +++ b/post_book_read_test.go @@ -25,7 +25,7 @@ func TestPostBookReadHandler_IDDoesNotExist(t *testing.T) { `{ "bookId": 46546 }` - testPostBookReadHandler(t, userBookJson, http.StatusBadRequest) + testPostBookReadHandler(t, userBookJson, http.StatusNotFound) } func testPostBookReadHandler(t *testing.T, userBookJson string, expectedCode int) { diff --git a/search_book_test.go b/search_book_test.go index 87c9e35..4ea607d 100644 --- a/search_book_test.go +++ b/search_book_test.go @@ -3,7 +3,7 @@ package main import ( "encoding/json" "fmt" - "log" + "net/http" "net/http/httptest" "testing" @@ -44,7 +44,7 @@ func testSearchBook(t *testing.T, searchterm string) []bookSearchGet { var books []bookSearchGet err := json.Unmarshal(w.Body.Bytes(), &books) if err != nil { - log.Fatal(err) + t.Error(err) } assert.Equal(t, 200, w.Code) return books