Add route to get a particular book

This commit is contained in:
2025-10-24 20:06:41 +02:00
parent a21add72ce
commit 873c3c89fa
11 changed files with 188 additions and 34 deletions

View File

@@ -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);

32
front/src/BookForm.vue Normal file
View File

@@ -0,0 +1,32 @@
<script setup>
import { getBook } from './api.js'
import { onBeforeRouteUpdate } from 'vue-router'
const props = defineProps({
id: String
});
let { data, error } = getBook(props.id);
onBeforeRouteUpdate(async (to, from) => {
let res = getBook(to.params.id);
data = res.data;
error = res.error;
})
</script>
<template>
<div>
<pre>{{ data }}</pre>
</div>
</template>
<style scoped>
img {
max-height:500px;
max-width:500px;
height:auto;
width:auto;
}
</style>

View File

@@ -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)
}

View File

@@ -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({

66
get_book_test.go Normal file
View File

@@ -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
}

View File

@@ -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

View File

@@ -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 {

View File

@@ -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)
}

View File

@@ -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})
})

View File

@@ -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) {

View File

@@ -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