diff --git a/.env.example b/.env.example deleted file mode 100644 index 6d05b4ad..00000000 --- a/.env.example +++ /dev/null @@ -1 +0,0 @@ -PGURL="postgres://[user]:[password]@[host]/[dbname]" diff --git a/package-lock.json b/package-lock.json index 37ccdff8..717f0215 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1441,12 +1441,13 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -1740,9 +1741,10 @@ "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==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -2024,16 +2026,17 @@ } }, "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==", + "license": "MIT", "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 +2067,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", @@ -2128,10 +2094,11 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -2587,6 +2554,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -4805,6 +4773,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, diff --git a/src/index.js b/src/index.js index c712fde7..ddfbc198 100644 --- a/src/index.js +++ b/src/index.js @@ -1,6 +1,6 @@ -const app = require('./server.js') -const port = 3030; +const app = require("./server.js"); +const ಠ_ಠ = 3030; -app.listen(port, () => { - console.log(`[SERVER] Running on http://localhost:${port}/`); +app.listen(ಠ_ಠ, () => { + console.log(`[SERVER] Running on http://localhost:${ಠ_ಠ}/`); }); diff --git a/src/routers/books.js b/src/routers/books.js index 1551dd87..b85d208c 100644 --- a/src/routers/books.js +++ b/src/routers/books.js @@ -1,9 +1,48 @@ -const express = require('express') -const router = express.Router() +const express = require("express"); +const router = express.Router(); const db = require("../../db"); -router.get('/', async (req, res) => { +// GET REQUESTS -}) +router.get("/", async (req, res) => { + const response = await db.query("select * from books"); + res.json({ books: response.rows }); +}); -module.exports = router +router.get("/:id", async (req, res) => { + const response = await db.query( + `select * from books where id = ${req.params.id};` + ); + res.json({ book: response.rows[0] }); +}); + +// POST REQUESTS + +router.post("/", async (req, res) => { + let postedBook = req.body; + const response = await db.query( + `INSERT INTO books (title, type, author, topic, publication_date, pages) VALUES ('${postedBook.title}', '${postedBook.type}', '${postedBook.author}', '${postedBook.topic}', '${postedBook.publication_date}', ${postedBook.pages}) RETURNING *` + ); + res.status(201).json({ book: response.rows[0] }); +}); + +// PUT REQUESTS + +router.put("/:id", async (req, res) => { + let postedBook = req.body; + const response = await db.query( + `UPDATE books SET (title, type, author, topic, publication_date, pages) = ('${postedBook.title}', '${postedBook.type}', '${postedBook.author}', '${postedBook.topic}', '${postedBook.publication_date}', ${postedBook.pages}) WHERE id = ${req.params.id} RETURNING *` + ); + res.status(201).json({ book: response.rows[0] }); +}); + +// DELETE REQUESTS + +router.delete("/:id", async (req, res) => { + const response = await db.query( + `DELETE FROM books WHERE id = ${req.params.id} RETURNING *;` + ); + res.status(201).json({ book: response.rows[0] }); +}); + +module.exports = router; diff --git a/src/routers/pets.js b/src/routers/pets.js new file mode 100644 index 00000000..23d9d185 --- /dev/null +++ b/src/routers/pets.js @@ -0,0 +1,48 @@ +const express = require("express"); +const router = express.Router(); +const db = require("../../db"); + +// GET REQUESTS + +router.get("/", async (req, res) => { + const response = await db.query("select * from pets"); + res.json({ pets: response.rows }); +}); + +router.get("/:id", async (req, res) => { + const response = await db.query( + `select * from pets where id = ${req.params.id};` + ); + res.json({ pet: response.rows[0] }); +}); + +// POST REQUESTS + +router.post("/", async (req, res) => { + let postedPet = req.body; + const response = await db.query( + `INSERT INTO pets (name, age, type, breed, has_microchip) VALUES ('${postedPet.name}', '${postedPet.age}', '${postedPet.type}', '${postedPet.breed}', '${postedPet.has_microchip}') RETURNING *` + ); + res.status(201).json({ pet: response.rows[0] }); +}); + +// PUT REQUESTS + +router.put("/:id", async (req, res) => { + let postedPet = req.body; + const response = await db.query( + `UPDATE pets SET (name, age, type, breed, has_microchip) = ('${postedPet.name}', '${postedPet.age}', '${postedPet.type}', '${postedPet.breed}', '${postedPet.has_microchip}') WHERE id = ${req.params.id} RETURNING *` + ); + res.status(201).json({ pet: response.rows[0] }); +}); + +// DELETE REQUESTS + +router.delete("/:id", async (req, res) => { + const response = await db.query( + `DELETE FROM pets WHERE id = ${req.params.id} RETURNING *;` + ); + res.status(201).json({ pet: response.rows[0] }); +}); + +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;