From db366f94b74a6f5193b85fdee056dd02a8cbbec5 Mon Sep 17 00:00:00 2001 From: JDC-horizons Date: Tue, 6 Aug 2024 15:05:06 +0100 Subject: [PATCH 1/2] first working example --- package-lock.json | 68 +++++++++++--------------------------------- package.json | 16 +++++++---- src/index.js | 4 +-- src/routers/books.js | 30 +++++++++++++++---- 4 files changed, 53 insertions(+), 65 deletions(-) diff --git a/package-lock.json b/package-lock.json index 37ccdff8..a48898c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,13 +7,14 @@ "": { "name": "api_express_with_nodepostgres", "version": "1.0.0", + "license": "ISC", "dependencies": { "body-parser": "^1.20.2", "cors": "^2.8.5", - "dotenv": "^16.3.1", - "express": "^4.18.2", + "dotenv": "^16.4.5", + "express": "^4.19.2", "faker": "^5.5.3", - "morgan": "1.10.0", + "morgan": "^1.10.0", "pg": "8.6.0", "pg-promise": "^11.5.4" }, @@ -1740,9 +1741,9 @@ "dev": true }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "engines": { "node": ">= 0.6" } @@ -1875,14 +1876,14 @@ } }, "node_modules/dotenv": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "engines": { "node": ">=12" }, "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" + "url": "https://dotenvx.com" } }, "node_modules/ee-first": { @@ -2024,16 +2025,16 @@ } }, "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -2064,43 +2065,6 @@ "node": ">= 0.10.0" } }, - "node_modules/express/node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/express/node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/faker": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/faker/-/faker-5.5.3.tgz", diff --git a/package.json b/package.json index 57d8b4fb..4a906e23 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "api_express_with_nodepostgres", "version": "1.0.0", - "description": "", + "description": "In this workshop we're going to look at how to use express with a postgres database.", "main": "src/index.js", "scripts": { "start": "npx nodemon src/index.js", @@ -11,10 +11,10 @@ "dependencies": { "body-parser": "^1.20.2", "cors": "^2.8.5", - "dotenv": "^16.3.1", - "express": "^4.18.2", + "dotenv": "^16.4.5", + "express": "^4.19.2", "faker": "^5.5.3", - "morgan": "1.10.0", + "morgan": "^1.10.0", "pg": "8.6.0", "pg-promise": "^11.5.4" }, @@ -23,5 +23,11 @@ "nodemon": "^3.0.2", "supertest": "^6.3.3" }, - "keywords": [] + "keywords": [], + "directories": { + "doc": "docs", + "test": "test" + }, + "author": "", + "license": "ISC" } diff --git a/src/index.js b/src/index.js index c712fde7..988a8bda 100644 --- a/src/index.js +++ b/src/index.js @@ -1,5 +1,5 @@ -const app = require('./server.js') -const port = 3030; +const app = require("./server.js"); +const port = 3032; app.listen(port, () => { console.log(`[SERVER] Running on http://localhost:${port}/`); diff --git a/src/routers/books.js b/src/routers/books.js index 1551dd87..c97438d3 100644 --- a/src/routers/books.js +++ b/src/routers/books.js @@ -1,9 +1,27 @@ -const express = require('express') -const router = express.Router() -const db = require("../../db"); +const express = require("express"); +const router = express.Router(); +const client = require("../../db"); -router.get('/', async (req, res) => { +router.get("/", async (req, res) => { + try { + const response = await client.query("SELECT * FROM books"); + const books = response.rows; + res.json({ books: books }); + } catch (err) { + console.log("Error:", err); + } +}); -}) +router.get("/:id", async (req, res) => { + try { + const response = await client.query( + `SELECT * FROM books WHERE id = ${req.params.id}` + ); + const book = response.rows; + res.json({ book: book }); + } catch (err) { + console.log("Error:", err); + } +}); -module.exports = router +module.exports = router; From 64719add8ee54d4a5fd6f1b3457d5470020cfbcc Mon Sep 17 00:00:00 2001 From: JDC-horizons Date: Wed, 7 Aug 2024 12:42:29 +0100 Subject: [PATCH 2/2] core spec implemented --- src/routers/books.js | 63 +++++++++++++++++++++++++++++++ src/routers/pets.js | 88 ++++++++++++++++++++++++++++++++++++++++++++ src/server.js | 8 ++-- 3 files changed, 156 insertions(+), 3 deletions(-) create mode 100644 src/routers/pets.js diff --git a/src/routers/books.js b/src/routers/books.js index c97438d3..c2eee233 100644 --- a/src/routers/books.js +++ b/src/routers/books.js @@ -24,4 +24,67 @@ router.get("/:id", async (req, res) => { } }); +router.post("/", async (req, res) => { + try { + const { title, type, author, topic, publication_date, pages } = req.body; + const query = ` + INSERT INTO books (title, type, author, topic, publication_date, pages) + VALUES ($1, $2, $3, $4, $5, $6) + RETURNING *;`; + const response = await client.query(query, [ + title, + type, + author, + topic, + publication_date, + pages, + ]); + const book = response.rows[0]; + res.status(201).json({ book: book }); + } catch (err) { + console.log("Error:", err); + } +}); + +router.put("/:id", async (req, res) => { + try { + const id = req.params.id; + const { title, type, author, topic, publication_date, pages } = req.body; + const query = ` + UPDATE books + SET title = $1, + type = $2, + author = $3, + topic = $4, + publication_date = $5, + pages = $6 + WHERE id = $7;`; + const values = [title, type, author, topic, publication_date, pages, id]; + await client.query(query, values); + + const selectQuery = `SELECT * FROM books WHERE id = ${id};`; + const selectResult = await client.query(selectQuery); + const book = selectResult.rows[0]; + + res.status(200).send({ book: book }); + } catch (err) { + console.log("Error:", err); + } +}); + +router.delete("/:id", async (req, res) => { + try { + const id = req.params.id; + const selectQuery = `SELECT * FROM books WHERE id = ${id};`; + const selectResult = await client.query(selectQuery); + const book = selectResult.rows[0]; + + const query = `DELETE FROM books WHERE id = ${id};`; + await client.query(query); + res.status(200).send({ book: book }); + } catch (err) { + console.log("Error:", err); + } +}); + module.exports = router; diff --git a/src/routers/pets.js b/src/routers/pets.js new file mode 100644 index 00000000..4611a499 --- /dev/null +++ b/src/routers/pets.js @@ -0,0 +1,88 @@ +const express = require("express"); +const router = express.Router(); +const client = require("../../db"); + +router.get("/", async (req, res) => { + try { + const response = await client.query("SELECT * FROM pets"); + const pets = response.rows; + res.json({ pets: pets }); + } catch (err) { + console.log("Error:", err); + } +}); + +router.get("/:id", async (req, res) => { + try { + const response = await client.query( + `SELECT * FROM pets WHERE id = ${req.params.id}` + ); + const pet = response.rows; + res.json({ pet: pet }); + } catch (err) { + console.log("Error:", err); + } +}); + +router.post("/", async (req, res) => { + try { + const { name, age, type, breed, has_microchip } = req.body; + const query = ` + INSERT INTO pets (name, age, type, breed, has_microchip) + VALUES ($1, $2, $3, $4, $5) + RETURNING *;`; + const response = await client.query(query, [ + name, + age, + type, + breed, + has_microchip, + ]); + const pet = response.rows[0]; + res.status(201).json({ pet: pet }); + } catch (err) { + console.log("Error:", err); + } +}); + +router.put("/:id", async (req, res) => { + try { + const id = req.params.id; + const { name, age, type, breed, has_microchip } = req.body; + const query = ` + UPDATE pets + SET name = $1, + age = $2, + type = $3, + breed = $4, + has_microchip = $5 + WHERE id = $6;`; + const values = [name, age, type, breed, has_microchip, id]; + await client.query(query, values); + + const selectQuery = `SELECT * FROM pets WHERE id = ${id};`; + const selectResult = await client.query(selectQuery); + const pet = selectResult.rows[0]; + + res.status(200).send({ pet: pet }); + } catch (err) { + console.log("Error:", err); + } +}); + +router.delete("/:id", async (req, res) => { + try { + const id = req.params.id; + const selectQuery = `SELECT * FROM pets WHERE id = ${id};`; + const selectResult = await client.query(selectQuery); + const pet = selectResult.rows[0]; + + const query = `DELETE FROM pets WHERE id = ${id};`; + await client.query(query); + res.status(200).send({ pet: pet }); + } catch (err) { + console.log("Error:", err); + } +}); + +module.exports = router; diff --git a/src/server.js b/src/server.js index dac55e5d..7e5960b2 100644 --- a/src/server.js +++ b/src/server.js @@ -9,8 +9,10 @@ app.use(cors()); app.use(express.json()); //TODO: Implement books and pets APIs using Express Modular Routers -const booksRouter = require('./routers/books.js') +const booksRouter = require("./routers/books.js"); +const petsRouter = require("./routers/pets.js"); -app.use('/books', booksRouter) +app.use("/books", booksRouter); +app.use("/pets", petsRouter); -module.exports = app +module.exports = app;