From c6166a12a897cd77ab9897de8222b34e2514890b Mon Sep 17 00:00:00 2001 From: Tim Zoltie Date: Fri, 21 Jun 2024 13:55:43 +0100 Subject: [PATCH 01/11] get/books, post/books, get/books/id --- src/controllers/books/index.js | 54 ++++++++++++++++++++++++++++++++++ src/functions/createID.js | 6 ++++ src/routers/books.js | 23 ++++++++++++++- src/server.js | 1 + src/utils/dbConnection.js | 16 ++++++++++ 5 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 src/controllers/books/index.js create mode 100644 src/functions/createID.js create mode 100644 src/utils/dbConnection.js diff --git a/src/controllers/books/index.js b/src/controllers/books/index.js new file mode 100644 index 00000000..55c4d3e0 --- /dev/null +++ b/src/controllers/books/index.js @@ -0,0 +1,54 @@ +const dbConnection = require('../../utils/dbConnection.js') + +const getAllBooks = async() => { + const db = await dbConnection.connect() + try { + const sqlQuery = 'select * from books' + const result = await db.query(sqlQuery) + + return result.rows + } catch (e) { + console.log(e) + } finally { + db.release() + } +} + +const createBook = async(req) => { + const db = await dbConnection.connect() + + try { + const sqlQuery = `insert into books (title, type, author, topic, publication_date, pages) + values($1, $2, $3, $4, $5, $6) returning *` + const result = await db.query(sqlQuery, [req.body.title, req.body.type, req.body.author, req.body.topic, req.body.publication_date, Number(req.body.pages)]) + + return result.rows[0] + } catch (e) { + console.log(e) + } finally { + db.release() + } +} + +const getBookByID = async(req) => { + const id = req.params.id + const db = await dbConnection.connect() + try { + const sqlQuery = 'select * from books where id =' + id + const result = await db.query(sqlQuery) + + return result.rows + } catch (e) { + console.log(e) + } finally { + db.release() + } +} + + + +module.exports = { + getAllBooks, + createBook, + getBookByID +} \ No newline at end of file diff --git a/src/functions/createID.js b/src/functions/createID.js new file mode 100644 index 00000000..688bc11e --- /dev/null +++ b/src/functions/createID.js @@ -0,0 +1,6 @@ +function createID(data) { + const newID = data.reverse().find((d) => d.id) + return newID +1 +} + +module.exports = createID diff --git a/src/routers/books.js b/src/routers/books.js index 1551dd87..0463d90f 100644 --- a/src/routers/books.js +++ b/src/routers/books.js @@ -1,9 +1,30 @@ const express = require('express') +const { getAllBooks, createBook, getBookByID } = require('../controllers/books/index.js') const router = express.Router() -const db = require("../../db"); + router.get('/', async (req, res) => { + const books = await getAllBooks() + + res.status(200).json({ + books + }) +}) + +router.post('/', async (req, res) => { + + const newBook = await createBook(req) + res.status(201).json({ + book: newBook + }) +}) + +router.get('/:id', async (req, res) => { + const book = await getBookByID(req) + res.status(200).json({ + book: book + }) }) module.exports = router diff --git a/src/server.js b/src/server.js index dac55e5d..3e74f402 100644 --- a/src/server.js +++ b/src/server.js @@ -1,6 +1,7 @@ const express = require("express"); const morgan = require("morgan"); const cors = require("cors"); +require('dotenv').config() const app = express(); diff --git a/src/utils/dbConnection.js b/src/utils/dbConnection.js new file mode 100644 index 00000000..3272305e --- /dev/null +++ b/src/utils/dbConnection.js @@ -0,0 +1,16 @@ +const { Pool } = require('pg'); + +const { PGHOST, PGDATABASE, PGUSER, PGPASSWORD } = process.env; + +const dbConnection = new Pool({ + host: PGHOST, + database: PGDATABASE, + username: PGUSER, + password: PGPASSWORD, + port: 5432, + ssl: { + require: true, + }, +}) + +module.exports = dbConnection \ No newline at end of file From 0a7029d4d59199a2141d212b370a7320bbee156c Mon Sep 17 00:00:00 2001 From: Tim Zoltie Date: Fri, 21 Jun 2024 14:03:45 +0100 Subject: [PATCH 02/11] put/books/id --- src/controllers/books/index.js | 17 ++++++++++++++++- src/routers/books.js | 10 +++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/controllers/books/index.js b/src/controllers/books/index.js index 55c4d3e0..16c8dfe5 100644 --- a/src/controllers/books/index.js +++ b/src/controllers/books/index.js @@ -45,10 +45,25 @@ const getBookByID = async(req) => { } } +const updateBook = async(req) => { + const id = req.params.id + const db = await dbConnection.connect() + try { + const sqlQuery = `update books set title = $1, type = $2, author = $3, topic = $4, publication_date = $5, pages = $6 where id=${id} returning *` + const result = await db.query(sqlQuery, [req.body.title, req.body.type, req.body.author, req.body.topic, req.body.publication_date, Number(req.body.pages)]) + + return result.rows + } catch (e) { + console.log(e) + } finally { + db.release() + } +} module.exports = { getAllBooks, createBook, - getBookByID + getBookByID, + updateBook } \ No newline at end of file diff --git a/src/routers/books.js b/src/routers/books.js index 0463d90f..7bc77358 100644 --- a/src/routers/books.js +++ b/src/routers/books.js @@ -1,5 +1,5 @@ const express = require('express') -const { getAllBooks, createBook, getBookByID } = require('../controllers/books/index.js') +const { getAllBooks, createBook, getBookByID, updateBook } = require('../controllers/books/index.js') const router = express.Router() @@ -27,4 +27,12 @@ router.get('/:id', async (req, res) => { }) }) + +router.put('/:id', async(req, res) => { + const book = await updateBook(req) + + res.status(201).json({ + book: book + }) +}) module.exports = router From 85c20e6f4d287e1ecbd4eaf8528553300e22d204 Mon Sep 17 00:00:00 2001 From: Tim Zoltie Date: Fri, 21 Jun 2024 14:09:34 +0100 Subject: [PATCH 03/11] delete/books --- src/controllers/books/index.js | 19 ++++++++++++++++++- src/functions/createID.js | 6 ------ src/routers/books.js | 15 +++++++++++---- 3 files changed, 29 insertions(+), 11 deletions(-) delete mode 100644 src/functions/createID.js diff --git a/src/controllers/books/index.js b/src/controllers/books/index.js index 16c8dfe5..27136985 100644 --- a/src/controllers/books/index.js +++ b/src/controllers/books/index.js @@ -1,3 +1,4 @@ +const { findSourceMap } = require('module') const dbConnection = require('../../utils/dbConnection.js') const getAllBooks = async() => { @@ -60,10 +61,26 @@ const updateBook = async(req) => { } } +const deleteBook = async(req) => { + const id = req.params.id + const db = await dbConnection.connect() + try { + const sqlQuery = 'delete from books where id=$1 returning *' + const result = await db.query(sqlQuery, [id]) + + return result.rows + } catch (e) { + console.log(e) + } finally { + db.release() + } +} + module.exports = { getAllBooks, createBook, getBookByID, - updateBook + updateBook, + deleteBook } \ No newline at end of file diff --git a/src/functions/createID.js b/src/functions/createID.js deleted file mode 100644 index 688bc11e..00000000 --- a/src/functions/createID.js +++ /dev/null @@ -1,6 +0,0 @@ -function createID(data) { - const newID = data.reverse().find((d) => d.id) - return newID +1 -} - -module.exports = createID diff --git a/src/routers/books.js b/src/routers/books.js index 7bc77358..0550e8e0 100644 --- a/src/routers/books.js +++ b/src/routers/books.js @@ -1,5 +1,5 @@ const express = require('express') -const { getAllBooks, createBook, getBookByID, updateBook } = require('../controllers/books/index.js') +const { getAllBooks, createBook, getBookByID, updateBook, deleteBook } = require('../controllers/books/index.js') const router = express.Router() @@ -27,12 +27,19 @@ router.get('/:id', async (req, res) => { }) }) - router.put('/:id', async(req, res) => { - const book = await updateBook(req) + const updatedBook = await updateBook(req) res.status(201).json({ - book: book + book: updatedBook + }) +}) + +router.delete('/:id', async(req, res) => { + const deletedBook = await deleteBook(req) + + res.status(201).json({ + book: deletedBook }) }) module.exports = router From c18d19275ee901008da1313f463800d950b79282 Mon Sep 17 00:00:00 2001 From: Tim Zoltie Date: Fri, 21 Jun 2024 14:17:39 +0100 Subject: [PATCH 04/11] get/pets --- src/controllers/books/index.js | 1 - src/controllers/pets/index.js | 19 +++++++++++++++++++ src/routers/pets.js | 13 +++++++++++++ src/server.js | 2 ++ 4 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 src/controllers/pets/index.js create mode 100644 src/routers/pets.js diff --git a/src/controllers/books/index.js b/src/controllers/books/index.js index 27136985..b79db83b 100644 --- a/src/controllers/books/index.js +++ b/src/controllers/books/index.js @@ -1,4 +1,3 @@ -const { findSourceMap } = require('module') const dbConnection = require('../../utils/dbConnection.js') const getAllBooks = async() => { diff --git a/src/controllers/pets/index.js b/src/controllers/pets/index.js new file mode 100644 index 00000000..2aa93930 --- /dev/null +++ b/src/controllers/pets/index.js @@ -0,0 +1,19 @@ +const dbConnection = require('../../utils/dbConnection.js') + +const getAllPets = async () => { + const db = await dbConnection.connect() + try { + const sqlQuery = 'select * from pets' + const result = await db.query(sqlQuery) + + return result.rows + } catch (e) { + console.log(e) + } finally { + db.release() + } +} + +module.exports = { + getAllPets +} \ No newline at end of file diff --git a/src/routers/pets.js b/src/routers/pets.js new file mode 100644 index 00000000..793f49ce --- /dev/null +++ b/src/routers/pets.js @@ -0,0 +1,13 @@ +const express = require('express') +const { getAllPets } = require('../controllers/pets') +const router = express.Router() + +router.get('/', async(req, res) => { + const pets = await getAllPets() + + res.status(200).json({ + pets + }) +}) + +module.exports = router diff --git a/src/server.js b/src/server.js index 3e74f402..73803805 100644 --- a/src/server.js +++ b/src/server.js @@ -11,7 +11,9 @@ app.use(express.json()); //TODO: Implement books and pets APIs using Express Modular Routers const booksRouter = require('./routers/books.js') +const petsRouter = require('./routers/pets.js') app.use('/books', booksRouter) +app.use('/pets', petsRouter) module.exports = app From 58c6c175d2fb5c142af9d0fbb3438520b984a1a2 Mon Sep 17 00:00:00 2001 From: Tim Zoltie Date: Fri, 21 Jun 2024 14:29:07 +0100 Subject: [PATCH 05/11] put/pets --- src/controllers/pets/index.js | 18 +++++++++++++++++- src/routers/pets.js | 10 +++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/controllers/pets/index.js b/src/controllers/pets/index.js index 2aa93930..87cd2c79 100644 --- a/src/controllers/pets/index.js +++ b/src/controllers/pets/index.js @@ -1,3 +1,4 @@ +const { findSourceMap } = require('module') const dbConnection = require('../../utils/dbConnection.js') const getAllPets = async () => { @@ -14,6 +15,21 @@ const getAllPets = async () => { } } +const addPet = async (req) => { + const db = await dbConnection.connect() + try { + const sqlQuery = 'insert into pets (name, age, type, breed, has_microchip) values($1, $2, $3, $4, $5) returning *' + const result = await db.query(sqlQuery, [req.body.name, Number(req.body.age), req.body.type, req.body.breed, Boolean(req.body.has_microchip)]) + + return result.rows[0] + } catch (e) { + console.log(e) + } finally { + db.release() + } +} + module.exports = { - getAllPets + getAllPets, + addPet } \ No newline at end of file diff --git a/src/routers/pets.js b/src/routers/pets.js index 793f49ce..ad352457 100644 --- a/src/routers/pets.js +++ b/src/routers/pets.js @@ -1,5 +1,5 @@ const express = require('express') -const { getAllPets } = require('../controllers/pets') +const { getAllPets, addPet } = require('../controllers/pets') const router = express.Router() router.get('/', async(req, res) => { @@ -10,4 +10,12 @@ router.get('/', async(req, res) => { }) }) +router.post('/', async(req, res) => { + const newPet = await addPet(req) + + res.status(201).json({ + pet: newPet + }) +}) + module.exports = router From 41805ef38a58a2d0c8c0681b0eaa575d75a9d906 Mon Sep 17 00:00:00 2001 From: Tim Zoltie Date: Fri, 21 Jun 2024 14:53:30 +0100 Subject: [PATCH 06/11] get/pets/id --- src/controllers/books/index.js | 2 +- src/controllers/pets/index.js | 17 ++++++++++++++++- src/routers/pets.js | 10 +++++++++- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/controllers/books/index.js b/src/controllers/books/index.js index b79db83b..1b00bfcd 100644 --- a/src/controllers/books/index.js +++ b/src/controllers/books/index.js @@ -37,7 +37,7 @@ const getBookByID = async(req) => { const sqlQuery = 'select * from books where id =' + id const result = await db.query(sqlQuery) - return result.rows + return result.rows[0] } catch (e) { console.log(e) } finally { diff --git a/src/controllers/pets/index.js b/src/controllers/pets/index.js index 87cd2c79..c40d70a5 100644 --- a/src/controllers/pets/index.js +++ b/src/controllers/pets/index.js @@ -29,7 +29,22 @@ const addPet = async (req) => { } } +const getPetByID = async(req) => { + const id = Number(req.params.id) + const db = await dbConnection.connect() + try { + const sqlQuery = 'select * from pets where id ='+id + const result = await db.query(sqlQuery) + return result.rows[0] + } catch (e) { + console.log(e) + } finally { + db.release() + } +} + module.exports = { getAllPets, - addPet + addPet, + getPetByID } \ No newline at end of file diff --git a/src/routers/pets.js b/src/routers/pets.js index ad352457..ef25ea99 100644 --- a/src/routers/pets.js +++ b/src/routers/pets.js @@ -1,5 +1,5 @@ const express = require('express') -const { getAllPets, addPet } = require('../controllers/pets') +const { getAllPets, addPet, getPetByID } = require('../controllers/pets') const router = express.Router() router.get('/', async(req, res) => { @@ -18,4 +18,12 @@ router.post('/', async(req, res) => { }) }) +router.get('/:id', async(req, res) => { + const pet = await getPetByID(req) + + res.status(200).json({ + pet: pet + }) +}) + module.exports = router From b7a5376164dc1e98b00776ef48e07f3ea86a45fd Mon Sep 17 00:00:00 2001 From: Tim Zoltie Date: Fri, 21 Jun 2024 15:41:09 +0100 Subject: [PATCH 07/11] put/pets/id --- src/controllers/pets/index.js | 18 +++++++++++++++++- src/routers/pets.js | 10 +++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/controllers/pets/index.js b/src/controllers/pets/index.js index c40d70a5..36700481 100644 --- a/src/controllers/pets/index.js +++ b/src/controllers/pets/index.js @@ -43,8 +43,24 @@ const getPetByID = async(req) => { } } +const updatePet = async(req) => { + const id = Number(req.params.id) + const db = await dbConnection.connect() + try { + const sqlQuery = `update pets set name = $1, age = $2, type = $3, breed = $4, has_microchip = $5 where id=${id} returning *` + const result = await db.query(sqlQuery, [req.body.name, req.body.age, req.body.type, req.body.breed, req.body.has_microchip]) + + return result.rows[0] + } catch (e) { + console.log(e) + } finally { + db.release() + } +} + module.exports = { getAllPets, addPet, - getPetByID + getPetByID, + updatePet } \ No newline at end of file diff --git a/src/routers/pets.js b/src/routers/pets.js index ef25ea99..a3ab739a 100644 --- a/src/routers/pets.js +++ b/src/routers/pets.js @@ -1,5 +1,5 @@ const express = require('express') -const { getAllPets, addPet, getPetByID } = require('../controllers/pets') +const { getAllPets, addPet, getPetByID, updatePet } = require('../controllers/pets') const router = express.Router() router.get('/', async(req, res) => { @@ -26,4 +26,12 @@ router.get('/:id', async(req, res) => { }) }) +router.put('/:id', async (req, res) => { + const updatedPet = await updatePet(req) + + res.status(201).json({ + pet: updatedPet + }) +}) + module.exports = router From 2f158607200038cc1e15b009fd4be8fa315d66ea Mon Sep 17 00:00:00 2001 From: Tim Zoltie Date: Fri, 21 Jun 2024 15:46:08 +0100 Subject: [PATCH 08/11] delete/pets/id --- src/controllers/pets/index.js | 19 ++++++++++++++++++- src/routers/pets.js | 9 ++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/controllers/pets/index.js b/src/controllers/pets/index.js index 36700481..52fa2824 100644 --- a/src/controllers/pets/index.js +++ b/src/controllers/pets/index.js @@ -58,9 +58,26 @@ const updatePet = async(req) => { } } +const deletePet = async (req) => { + const id = Number(req.params.id) + const db = await dbConnection.connect() + + try { + const sqlQuery = `delete from pets where id=$1 returning *` + const result = db.query(sqlQuery, [id]) + + return result.rows + } catch (e) { + console.log(e) + } finally { + db.release() + } +} + module.exports = { getAllPets, addPet, getPetByID, - updatePet + updatePet, + deletePet } \ No newline at end of file diff --git a/src/routers/pets.js b/src/routers/pets.js index a3ab739a..1dd7f710 100644 --- a/src/routers/pets.js +++ b/src/routers/pets.js @@ -1,5 +1,5 @@ const express = require('express') -const { getAllPets, addPet, getPetByID, updatePet } = require('../controllers/pets') +const { getAllPets, addPet, getPetByID, updatePet, deletePet } = require('../controllers/pets') const router = express.Router() router.get('/', async(req, res) => { @@ -34,4 +34,11 @@ router.put('/:id', async (req, res) => { }) }) +router.delete('/:id', async (req, res) => { + const deletedPet = await deletePet(req) + res.status(201).json({ + pet: deletedPet + }) +}) + module.exports = router From ac6c9392e7e34a56de77bee450d62de5050b2f9e Mon Sep 17 00:00:00 2001 From: Tim Zoltie Date: Fri, 21 Jun 2024 17:35:38 +0100 Subject: [PATCH 09/11] code updated to ensure all tests pass --- db/index.js | 25 ------------------------- src/controllers/books/index.js | 6 +++--- src/controllers/pets/index.js | 11 +++++------ test/database-cleaner/index.js | 3 ++- test/helpers/createBook.js | 2 +- test/helpers/createPet.js | 2 +- 6 files changed, 12 insertions(+), 37 deletions(-) delete mode 100644 db/index.js diff --git a/db/index.js b/db/index.js deleted file mode 100644 index af723442..00000000 --- a/db/index.js +++ /dev/null @@ -1,25 +0,0 @@ -// Load our .env file -require('dotenv').config() - -// Require Client obj from the postgres node module -const { Client } = require("pg"); - -const client = { - query: async (str, values) => { - // Get the connection string from process.env - - // the dotenv library sets this variable based - // on the contents of our env file - // Create a new connection to the database using the Client - // object provided by the postgres node module - const dbClient = new Client(process.env.PGURL) - // connect a connection - await dbClient.connect() - // execute the query - const result = await dbClient.query(str, values) - // close the connection - await dbClient.end() - return result - } -} - -module.exports = client; diff --git a/src/controllers/books/index.js b/src/controllers/books/index.js index 1b00bfcd..c24f6561 100644 --- a/src/controllers/books/index.js +++ b/src/controllers/books/index.js @@ -52,7 +52,7 @@ const updateBook = async(req) => { const sqlQuery = `update books set title = $1, type = $2, author = $3, topic = $4, publication_date = $5, pages = $6 where id=${id} returning *` const result = await db.query(sqlQuery, [req.body.title, req.body.type, req.body.author, req.body.topic, req.body.publication_date, Number(req.body.pages)]) - return result.rows + return result.rows[0] } catch (e) { console.log(e) } finally { @@ -61,13 +61,13 @@ const updateBook = async(req) => { } const deleteBook = async(req) => { - const id = req.params.id + const id = Number(req.params.id) const db = await dbConnection.connect() try { const sqlQuery = 'delete from books where id=$1 returning *' const result = await db.query(sqlQuery, [id]) - return result.rows + return result.rows[0] } catch (e) { console.log(e) } finally { diff --git a/src/controllers/pets/index.js b/src/controllers/pets/index.js index 52fa2824..534f8108 100644 --- a/src/controllers/pets/index.js +++ b/src/controllers/pets/index.js @@ -1,4 +1,3 @@ -const { findSourceMap } = require('module') const dbConnection = require('../../utils/dbConnection.js') const getAllPets = async () => { @@ -47,8 +46,8 @@ const updatePet = async(req) => { const id = Number(req.params.id) const db = await dbConnection.connect() try { - const sqlQuery = `update pets set name = $1, age = $2, type = $3, breed = $4, has_microchip = $5 where id=${id} returning *` - const result = await db.query(sqlQuery, [req.body.name, req.body.age, req.body.type, req.body.breed, req.body.has_microchip]) + const sqlQuery = `update pets set name = $1, age = $2, type = $3, breed = $4, has_microchip = $5 where id=$6 returning *` + const result = await db.query(sqlQuery, [req.body.name, req.body.age, req.body.type, req.body.breed, req.body.has_microchip, id]) return result.rows[0] } catch (e) { @@ -63,10 +62,10 @@ const deletePet = async (req) => { const db = await dbConnection.connect() try { - const sqlQuery = `delete from pets where id=$1 returning *` - const result = db.query(sqlQuery, [id]) + const sqlQuery = 'delete from pets where id=$1 returning *' + const result = await db.query(sqlQuery, [id]) - return result.rows + return result.rows[0] } catch (e) { console.log(e) } finally { diff --git a/test/database-cleaner/index.js b/test/database-cleaner/index.js index 13a4e464..5bb1aabc 100644 --- a/test/database-cleaner/index.js +++ b/test/database-cleaner/index.js @@ -1,5 +1,6 @@ const fs = require('fs/promises') -const client = require("../../db"); +const client = require('../../src/utils/dbConnection.js') + global.beforeEach(async() => { const sqlDataForBooks = await fs.readFile('./sql/create-books.sql') diff --git a/test/helpers/createBook.js b/test/helpers/createBook.js index 5f7e9c76..8369f1c9 100644 --- a/test/helpers/createBook.js +++ b/test/helpers/createBook.js @@ -1,4 +1,4 @@ -const client = require("../../db"); +const client = require('../../src/utils/dbConnection.js'); const createBook = async (values) => { const sqlString = `INSERT INTO "books" (title, type, author, topic, publication_date, pages) VALUES ($1, $2, $3, $4, $5, $6) RETURNING *;` diff --git a/test/helpers/createPet.js b/test/helpers/createPet.js index 8dfca845..1f462790 100644 --- a/test/helpers/createPet.js +++ b/test/helpers/createPet.js @@ -1,4 +1,4 @@ -const client = require("../../db"); +const client = require('../../src/utils/dbConnection.js'); const createPet = async (values) => { const sqlString = `INSERT INTO "pets" (name, age, type, breed, has_microchip) VALUES ($1, $2, $3, $4, $5) RETURNING *;` From 7ab9940d795294a29928824e7b5e8d05d0a039bf Mon Sep 17 00:00:00 2001 From: Tim Zoltie Date: Mon, 24 Jun 2024 10:19:16 +0100 Subject: [PATCH 10/11] books/pets controllers refactored --- src/controllers/books/index.js | 18 +++++++++++++++--- src/controllers/pets/index.js | 18 +++++++++++++++--- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/controllers/books/index.js b/src/controllers/books/index.js index c24f6561..a7155ac7 100644 --- a/src/controllers/books/index.js +++ b/src/controllers/books/index.js @@ -17,10 +17,16 @@ const getAllBooks = async() => { const createBook = async(req) => { const db = await dbConnection.connect() + const title = req.body.title + const type = req.body.type + const author = req.body.author + const topic = req.body.topic + const pub_date = req.body.publication_date + const pages = Number(req.body.pages) try { const sqlQuery = `insert into books (title, type, author, topic, publication_date, pages) values($1, $2, $3, $4, $5, $6) returning *` - const result = await db.query(sqlQuery, [req.body.title, req.body.type, req.body.author, req.body.topic, req.body.publication_date, Number(req.body.pages)]) + const result = await db.query(sqlQuery, [title, type, author, topic, pub_date, pages]) return result.rows[0] } catch (e) { @@ -46,11 +52,17 @@ const getBookByID = async(req) => { } const updateBook = async(req) => { - const id = req.params.id const db = await dbConnection.connect() + const id = req.params.id + const title = req.body.title + const type = req.body.type + const author = req.body.author + const topic = req.body.topic + const pub_date = req.body.publication_date + const pages = Number(req.body.pages) try { const sqlQuery = `update books set title = $1, type = $2, author = $3, topic = $4, publication_date = $5, pages = $6 where id=${id} returning *` - const result = await db.query(sqlQuery, [req.body.title, req.body.type, req.body.author, req.body.topic, req.body.publication_date, Number(req.body.pages)]) + const result = await db.query(sqlQuery, [title, type, author, topic, pub_date, pages]) return result.rows[0] } catch (e) { diff --git a/src/controllers/pets/index.js b/src/controllers/pets/index.js index 534f8108..d31e9236 100644 --- a/src/controllers/pets/index.js +++ b/src/controllers/pets/index.js @@ -16,9 +16,15 @@ const getAllPets = async () => { const addPet = async (req) => { const db = await dbConnection.connect() + + const name = req.body.name + const age = Number(req.body.age) + const type = req.body.type + const breed = req.body.breed + const mchip = Boolean(req.body.has_microchip) try { const sqlQuery = 'insert into pets (name, age, type, breed, has_microchip) values($1, $2, $3, $4, $5) returning *' - const result = await db.query(sqlQuery, [req.body.name, Number(req.body.age), req.body.type, req.body.breed, Boolean(req.body.has_microchip)]) + const result = await db.query(sqlQuery, [name, age, type, breed, mchip]) return result.rows[0] } catch (e) { @@ -43,11 +49,17 @@ const getPetByID = async(req) => { } const updatePet = async(req) => { - const id = Number(req.params.id) const db = await dbConnection.connect() + + const id = Number(req.params.id) + const name = req.body.name + const age = Number(req.body.age) + const type = req.body.type + const breed = req.body.breed + const mchip = Boolean(req.body.has_microchip) try { const sqlQuery = `update pets set name = $1, age = $2, type = $3, breed = $4, has_microchip = $5 where id=$6 returning *` - const result = await db.query(sqlQuery, [req.body.name, req.body.age, req.body.type, req.body.breed, req.body.has_microchip, id]) + const result = await db.query(sqlQuery, [name, age, type, breed, mchip, id]) return result.rows[0] } catch (e) { From c1db4774295e989c0594de63673739ca9e5f5ff9 Mon Sep 17 00:00:00 2001 From: Tim Zoltie Date: Mon, 24 Jun 2024 17:25:54 +0100 Subject: [PATCH 11/11] extension attempt --- src/controllers/books/index.js | 19 +++++++++++++++--- src/routers/books.js | 33 +++++++++++++++++++++++++++++-- test/api/extensions/books.spec.js | 14 ++++++------- test/helpers/insertBooks.js | 2 +- test/helpers/insertPets.js | 2 +- 5 files changed, 56 insertions(+), 14 deletions(-) diff --git a/src/controllers/books/index.js b/src/controllers/books/index.js index a7155ac7..0b8adfba 100644 --- a/src/controllers/books/index.js +++ b/src/controllers/books/index.js @@ -1,10 +1,23 @@ const dbConnection = require('../../utils/dbConnection.js') -const getAllBooks = async() => { +const getAllBooks = async(req, page, perPage) => { const db = await dbConnection.connect() + + const author = req.body.author + let offset + + if(page > 1) { + offset = perPage-1 + } + try { - const sqlQuery = 'select * from books' - const result = await db.query(sqlQuery) + if(author === undefined) { + const sqlQuery = `select * from books limit $1 offset $2` + const result = await db.query(sqlQuery, [perPage, offset]) + return result.rows + } + const sqlQuery = `select * from books where author = $1 limit $2 offset $3 order by author` + const result = await db.query(sqlQuery, [author, perPage, offset]) return result.rows } catch (e) { diff --git a/src/routers/books.js b/src/routers/books.js index 0550e8e0..6f7c4ff5 100644 --- a/src/routers/books.js +++ b/src/routers/books.js @@ -4,10 +4,39 @@ const router = express.Router() router.get('/', async (req, res) => { - const books = await getAllBooks() + let page = req.body.page + let perPage = req.body.perPage + + if ( + page === undefined || + page === 0 + ) + { + page = 1 + } + if ( + perPage === undefined || + perPage === 0) + { + perPage = 20 + } + if ( + perPage > 50 + ) { + perPage = 50 + } else if ( + perPage < 10 + ) { + perPage = 10 + } + + const books = await getAllBooks(req, page, perPage) + res.status(200).json({ - books + books, + perPage: perPage, + page: page }) }) diff --git a/test/api/extensions/books.spec.js b/test/api/extensions/books.spec.js index cd8e011c..6e5dfd11 100644 --- a/test/api/extensions/books.spec.js +++ b/test/api/extensions/books.spec.js @@ -25,7 +25,7 @@ describe("Books Endpoint", () => { await createBook(Object.values(book2)) }) - it("will return books by author", async () => { + fit("will return books by author", async () => { const response = await supertest(app).get(`/books?author=${book1.author}`) expect(response.status).toEqual(200) @@ -43,7 +43,7 @@ describe("Books Endpoint", () => { await insertBooks() }) - it("response has pagination properties", async () => { + fit("response has pagination properties", async () => { const response = await supertest(app).get(`/books?page=2&perPage=30`) expect(response.status).toEqual(200) @@ -52,7 +52,7 @@ describe("Books Endpoint", () => { expect(response.body.per_page).toEqual(30) }) - it("will return page 2 only of 30 books", async () => { + fit("will return page 2 only of 30 books", async () => { const response = await supertest(app).get(`/books?page=2&perPage=30`) expect(response.status).toEqual(200) @@ -62,21 +62,21 @@ describe("Books Endpoint", () => { expect(response.body.books[response.body.books.length-1].id).toEqual(60) }) - it("will return 400 if pagination parameters are invalid", async () => { + fit("will return 400 if pagination parameters are invalid", async () => { const response = await supertest(app).get(`/books?page=1&perPage=9`) expect(response.status).toEqual(400) expect(response.body.error).toEqual(`parameter invalid perPage: 9 not valid. Accepted range is 10 - 50`) }) - it("will return 400 if pagination parameters are invalid", async () => { + fit("will return 400 if pagination parameters are invalid", async () => { const response = await supertest(app).get(`/books?page=1&perPage=51`) expect(response.status).toEqual(400) expect(response.body.error).toEqual(`parameter invalid perPage: 51 not valid. Accepted range is 10 - 50`) }) - it("pagination parameters are optional, have default values", async () => { + fit("pagination parameters are optional, have default values", async () => { const response = await supertest(app).get(`/books`) expect(response.status).toEqual(200) @@ -86,7 +86,7 @@ describe("Books Endpoint", () => { expect(response.body.books[response.body.books.length-1].id).toEqual(20) }) - it("pagination parameters can be used with author parameter", async () => { + fit("pagination parameters can be used with author parameter", async () => { const response = await supertest(app).get(`/books?author=Nick%20Labadie&page=1&perPage=30`) expect(response.status).toEqual(200) diff --git a/test/helpers/insertBooks.js b/test/helpers/insertBooks.js index 54e720ca..ce56ddde 100644 --- a/test/helpers/insertBooks.js +++ b/test/helpers/insertBooks.js @@ -1,5 +1,5 @@ const fs = require('fs/promises') -const client = require("../../db"); +const client = require('../../src/utils/dbConnection.js'); const insertBooks = async () => { const sqlDataForBooks = await fs.readFile('./sql/insert-books.sql') diff --git a/test/helpers/insertPets.js b/test/helpers/insertPets.js index eadddec2..cb97aac6 100644 --- a/test/helpers/insertPets.js +++ b/test/helpers/insertPets.js @@ -1,5 +1,5 @@ const fs = require('fs/promises') -const client = require("../../db"); +const client = require('../../src/utils/dbConnection.js'); const insertPets = async () => { const sqlDataForPets = await fs.readFile('./sql/insert-pets.sql')