From f94f154550039b8149dafcf24cc35dcaa380d5d1 Mon Sep 17 00:00:00 2001 From: Radio58 Date: Mon, 4 Mar 2024 14:17:56 +0000 Subject: [PATCH 1/6] added update customer put request --- src/controllers/customer.js | 32 ++++++++++++++++++++++++++++++-- src/domains/customer.js | 21 ++++++++++++++++++++- src/routers/customer.js | 4 +++- 3 files changed, 53 insertions(+), 4 deletions(-) diff --git a/src/controllers/customer.js b/src/controllers/customer.js index 775cfb42..05e0b76d 100644 --- a/src/controllers/customer.js +++ b/src/controllers/customer.js @@ -1,5 +1,5 @@ const { PrismaClientKnownRequestError } = require("@prisma/client") -const { createCustomerDb } = require('../domains/customer.js') +const { createCustomerDb, updateCustomerDb } = require('../domains/customer.js') const createCustomer = async (req, res) => { const { @@ -43,6 +43,34 @@ const createCustomer = async (req, res) => { } } +const updateCustomer = async (req, res) => { + const { + name, + phone, + email + } = req.body + const id = parseInt(req.params.id) + + console.log(req.body, 'update') + + try { + const updatedCustomer = await updateCustomerDb(id, name, phone, email) + + res.status(201).json({ customer: updatedCustomer }) + } catch (e) { + if (e instanceof PrismaClientKnownRequestError) { + if (e.code === "P2002") { + return res.status(409).json({ error: "A customer with the provided email already exists" }) + } + } + + console.log(e.message, 'error') + + res.status(500).json({ error: e.message }) + } +} + module.exports = { - createCustomer + createCustomer, + updateCustomer } diff --git a/src/domains/customer.js b/src/domains/customer.js index c7f315fd..623a7dc0 100644 --- a/src/domains/customer.js +++ b/src/domains/customer.js @@ -21,6 +21,25 @@ const createCustomerDb = async (name, phone, email) => await prisma.customer.cre } }) +const updateCustomerDb = async (id, name, phone, email) => await prisma.customer.update({ + where: { + id: id + }, + data: { + name, + contact: { + update: { + phone, + email + } + } + }, + include: { + contact: true + } +}) + module.exports = { - createCustomerDb + createCustomerDb, + updateCustomerDb } diff --git a/src/routers/customer.js b/src/routers/customer.js index f14a87fc..e675a877 100644 --- a/src/routers/customer.js +++ b/src/routers/customer.js @@ -1,6 +1,7 @@ const express = require("express"); const { - createCustomer + createCustomer, + updateCustomer } = require('../controllers/customer'); const router = express.Router(); @@ -9,5 +10,6 @@ const router = express.Router(); // The below /register route extends that, so the end result will be a URL // that looks like http://localhost:4040/customer/register router.post("/register", createCustomer); +router.put("/:id", updateCustomer); module.exports = router; From c7b23e0c9846d979926e6eba6740cb176f51c656 Mon Sep 17 00:00:00 2001 From: Radio58 Date: Tue, 5 Mar 2024 12:41:29 +0000 Subject: [PATCH 2/6] Movie router setup, getMovies and getMoviesById added --- src/controllers/movies.js | 27 +++++++++++++++++++++++++++ src/domains/movies.js | 14 ++++++++++++++ src/routers/movies.js | 16 ++++++++++++++++ src/server.js | 4 ++++ 4 files changed, 61 insertions(+) create mode 100644 src/controllers/movies.js create mode 100644 src/domains/movies.js create mode 100644 src/routers/movies.js diff --git a/src/controllers/movies.js b/src/controllers/movies.js new file mode 100644 index 00000000..9b3e0b80 --- /dev/null +++ b/src/controllers/movies.js @@ -0,0 +1,27 @@ +const { getMoviesDb, getMovieByIdDb } = require('../domains/movies') + +const getMovies = async (req, res) => { + try { + const movies = await getMoviesDb() + res.status(200).json({ movies }) + } catch (e) { + console.log(e, 'error') + res.status(500).json({ error: e.message }) + } +} + +const getMovieById = async (req, res) => { + const id = parseInt(req.params.id) + + try { + const movie = await getMovieByIdDb(id) + res.status(200).json({ movie }) + } catch (e) { + res.status(500).json({ error: e.message }) + } +} + +module.exports = { + getMovies, + getMovieById +} \ No newline at end of file diff --git a/src/domains/movies.js b/src/domains/movies.js new file mode 100644 index 00000000..c144ed78 --- /dev/null +++ b/src/domains/movies.js @@ -0,0 +1,14 @@ +const prisma = require('../utils/prisma') + +const getMoviesDb = async () => await prisma.movie.findMany() + +const getMovieByIdDb = async (id) => await prisma.movie.findUnique({ + where: { + id: id + } +}) + +module.exports = { + getMoviesDb, + getMovieByIdDb +} \ No newline at end of file diff --git a/src/routers/movies.js b/src/routers/movies.js new file mode 100644 index 00000000..d46ce9b6 --- /dev/null +++ b/src/routers/movies.js @@ -0,0 +1,16 @@ +const express = require("express"); +const router = express.Router(); + +const { + getMovies, + getMovieById +} = require('../controllers/movies'); + +// In index.js, we told express that the /customer route should use this router file +// The below /register route extends that, so the end result will be a URL +// that looks like http://localhost:4040/customer/register + +router.get("/", getMovies); +router.get("/:id", getMovieById); + +module.exports = router; diff --git a/src/server.js b/src/server.js index 93d47a16..3beea7bb 100644 --- a/src/server.js +++ b/src/server.js @@ -15,7 +15,11 @@ app.use(express.urlencoded({ extended: true })); // Tell express to use your routers here const customerRouter = require('./routers/customer'); +const movieRouter = require('./routers/movies'); + app.use('/customers', customerRouter); +app.use('/movies', movieRouter); + module.exports = app From 6e25501815977ff0c97cb356bfc1e5074195ea6f Mon Sep 17 00:00:00 2001 From: Radio58 Date: Tue, 5 Mar 2024 12:47:15 +0000 Subject: [PATCH 3/6] customer cleanup --- src/controllers/customer.js | 19 +------------------ src/routers/customer.js | 3 ++- 2 files changed, 3 insertions(+), 19 deletions(-) diff --git a/src/controllers/customer.js b/src/controllers/customer.js index 05e0b76d..e33ace5e 100644 --- a/src/controllers/customer.js +++ b/src/controllers/customer.js @@ -13,26 +13,11 @@ const createCustomer = async (req, res) => { error: "Missing fields in request body" }) } - - // Try-catch is a very common way to handle errors in JavaScript. - // It allows us to customise how we want errors that are thrown to be handled. - // Read more here: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try...catch - - // Here, if Prisma throws an error in the process of trying to create a new customer, - // instead of the Prisma error being thrown (and the app potentially crashing) we exit the - // `try` block (bypassing the `res.status` code) and enter the `catch` block. try { const createdCustomer = await createCustomerDb(name, phone, email) res.status(201).json({ customer: createdCustomer }) } catch (e) { - // In this catch block, we are able to specify how different Prisma errors are handled. - // Prisma throws errors with its own codes. P2002 is the error code for - // "Unique constraint failed on the {constraint}". In our case, the {constraint} is the - // email field which we have set as needing to be unique in the prisma.schema. - // To handle this, we return a custom 409 (conflict) error as a response to the client. - // Prisma error codes: https://www.prisma.io/docs/orm/reference/error-reference#common - // HTTP error codes: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#client_error_responses if (e instanceof PrismaClientKnownRequestError) { if (e.code === "P2002") { return res.status(409).json({ error: "A customer with the provided email already exists" }) @@ -51,8 +36,6 @@ const updateCustomer = async (req, res) => { } = req.body const id = parseInt(req.params.id) - console.log(req.body, 'update') - try { const updatedCustomer = await updateCustomerDb(id, name, phone, email) @@ -64,7 +47,7 @@ const updateCustomer = async (req, res) => { } } - console.log(e.message, 'error') + console.error(e) res.status(500).json({ error: e.message }) } diff --git a/src/routers/customer.js b/src/routers/customer.js index e675a877..812e4ff6 100644 --- a/src/routers/customer.js +++ b/src/routers/customer.js @@ -1,10 +1,11 @@ const express = require("express"); +const router = express.Router(); + const { createCustomer, updateCustomer } = require('../controllers/customer'); -const router = express.Router(); // In index.js, we told express that the /customer route should use this router file // The below /register route extends that, so the end result will be a URL From b66e2fe913b9ab9a8a19ab724018eb379eb71edc Mon Sep 17 00:00:00 2001 From: Radio58 Date: Wed, 6 Mar 2024 14:18:38 +0000 Subject: [PATCH 4/6] fixed movies domain and added the rest of the movies router --- src/controllers/movies.js | 49 +++++++++++++++++++++++++++++++++++---- src/domains/movies.js | 36 ++++++++++++++++++++++++++-- src/routers/movies.js | 6 ++++- 3 files changed, 84 insertions(+), 7 deletions(-) diff --git a/src/controllers/movies.js b/src/controllers/movies.js index 9b3e0b80..c7077a8a 100644 --- a/src/controllers/movies.js +++ b/src/controllers/movies.js @@ -1,11 +1,16 @@ -const { getMoviesDb, getMovieByIdDb } = require('../domains/movies') +const { + getMoviesDb, + getMovieByIdDb, + createMovieDb, + updateMovieDb +} = require('../domains/movies') const getMovies = async (req, res) => { try { const movies = await getMoviesDb() - res.status(200).json({ movies }) + res.status(200).json({ movies: movies }) } catch (e) { - console.log(e, 'error') + console.log(e) res.status(500).json({ error: e.message }) } } @@ -17,11 +22,47 @@ const getMovieById = async (req, res) => { const movie = await getMovieByIdDb(id) res.status(200).json({ movie }) } catch (e) { + console.error(e) + res.status(500).json({ error: e.message }) + } +} + +const createMovie = async (req, res) => { + const { title, runtimeMins } = req.body + + if (!title || !runtimeMins) { + return res.status(400).json({ + error: "Missing fields in request body" + }) + } + + try { + const createdMovie = await createMovieDb(title, runtimeMins) + + res.status(201).json({ movie: createdMovie }) + } catch (e) { + console.error(e) + res.status(500).json({ error: e.message }) + } +} + +const updateMovie = async (req, res) => { + const { title, runtimeMins } = req.body + const id = parseInt(req.params.id) + + try { + const updatedMovie = await updateMovieDb(id, title, runtimeMins) + + res.status(201).json({ movie: updatedMovie }) + } catch (e) { + console.error(e) res.status(500).json({ error: e.message }) } } module.exports = { getMovies, - getMovieById + getMovieById, + createMovie, + updateMovie } \ No newline at end of file diff --git a/src/domains/movies.js b/src/domains/movies.js index c144ed78..aff3578d 100644 --- a/src/domains/movies.js +++ b/src/domains/movies.js @@ -1,14 +1,46 @@ const prisma = require('../utils/prisma') -const getMoviesDb = async () => await prisma.movie.findMany() +const getMoviesDb = async () => await prisma.movie.findMany({ + include: { + screenings: true + } +}) const getMovieByIdDb = async (id) => await prisma.movie.findUnique({ where: { id: id + }, + include: { + screenings: true + } +}) + +const createMovieDb = async (title, runtimeMins) => await prisma.movie.create({ + data: { + title, + runtimeMins, + }, + include: { + screenings: true + } +}) + +const updateMovieDb = async (id, title, runtimeMins) => await prisma.movie.update({ + where: { + id: id + }, + data: { + title, + runtimeMins + }, + include: { + screenings: true } }) module.exports = { getMoviesDb, - getMovieByIdDb + getMovieByIdDb, + createMovieDb, + updateMovieDb } \ No newline at end of file diff --git a/src/routers/movies.js b/src/routers/movies.js index d46ce9b6..3425efd6 100644 --- a/src/routers/movies.js +++ b/src/routers/movies.js @@ -3,7 +3,9 @@ const router = express.Router(); const { getMovies, - getMovieById + getMovieById, + createMovie, + updateMovie } = require('../controllers/movies'); // In index.js, we told express that the /customer route should use this router file @@ -12,5 +14,7 @@ const { router.get("/", getMovies); router.get("/:id", getMovieById); +router.post("/", createMovie); +router.put("/:id", updateMovie); module.exports = router; From 8453ce953199cf3263011131eca1c194f41be545 Mon Sep 17 00:00:00 2001 From: Radio58 Date: Wed, 6 Mar 2024 14:37:22 +0000 Subject: [PATCH 5/6] Screens router added --- src/controllers/screens.js | 28 ++++++++++++++++++++++++++++ src/domains/screens.js | 11 +++++++++++ src/routers/screens.js | 14 ++++++++++++++ src/server.js | 2 ++ 4 files changed, 55 insertions(+) create mode 100644 src/controllers/screens.js create mode 100644 src/domains/screens.js create mode 100644 src/routers/screens.js diff --git a/src/controllers/screens.js b/src/controllers/screens.js new file mode 100644 index 00000000..6efedfbd --- /dev/null +++ b/src/controllers/screens.js @@ -0,0 +1,28 @@ +const { + createScreenDb +} = require('../domains/screens') + +const createScreen = async (req, res) => { + const { number } = req.body + + console.log(req.body) + + if (!number) { + return res.status(400).json({ + error: "Missing fields in request body" + }) + } + + try { + const createdScreen = await createScreenDb(number) + + res.status(201).json({ screen: createdScreen }) + } catch (e) { + console.error(e) + res.status(500).json({ error: e.message }) + } +} + +module.exports = { + createScreen +} \ No newline at end of file diff --git a/src/domains/screens.js b/src/domains/screens.js new file mode 100644 index 00000000..835e8de0 --- /dev/null +++ b/src/domains/screens.js @@ -0,0 +1,11 @@ +const prisma = require('../utils/prisma') + +const createScreenDb = async (number) => await prisma.screen.create({ + data: { + number, + } +}) + +module.exports = { + createScreenDb +} \ No newline at end of file diff --git a/src/routers/screens.js b/src/routers/screens.js new file mode 100644 index 00000000..0b9d59c0 --- /dev/null +++ b/src/routers/screens.js @@ -0,0 +1,14 @@ +const express = require("express"); +const router = express.Router(); + +const { + createScreen, +} = require('../controllers/screens'); + +// In index.js, we told express that the /customer route should use this router file +// The below /register route extends that, so the end result will be a URL +// that looks like http://localhost:4040/customer/register + +router.post('/', createScreen); + +module.exports = router; diff --git a/src/server.js b/src/server.js index 3beea7bb..a1bad80c 100644 --- a/src/server.js +++ b/src/server.js @@ -16,9 +16,11 @@ app.use(express.urlencoded({ extended: true })); // Tell express to use your routers here const customerRouter = require('./routers/customer'); const movieRouter = require('./routers/movies'); +const screenRouter = require('./routers/screens'); app.use('/customers', customerRouter); app.use('/movies', movieRouter); +app.use('/screens', screenRouter); From 30d0a359840f017b406a226e1be3105050c1dd83 Mon Sep 17 00:00:00 2001 From: Radio58 Date: Wed, 6 Mar 2024 14:38:40 +0000 Subject: [PATCH 6/6] cleanup --- src/domains/customer.js | 6 ------ src/routers/customer.js | 4 ---- src/routers/movies.js | 4 ---- src/routers/screens.js | 4 ---- 4 files changed, 18 deletions(-) diff --git a/src/domains/customer.js b/src/domains/customer.js index 623a7dc0..83000518 100644 --- a/src/domains/customer.js +++ b/src/domains/customer.js @@ -1,9 +1,5 @@ const prisma = require('../utils/prisma') -/** - * This will create a Customer AND create a new Contact, then automatically relate them with each other - * @tutorial https://www.prisma.io/docs/concepts/components/prisma-client/relation-queries#create-a-related-record - */ const createCustomerDb = async (name, phone, email) => await prisma.customer.create({ data: { name, @@ -14,8 +10,6 @@ const createCustomerDb = async (name, phone, email) => await prisma.customer.cre } } }, - // We add an `include` outside of the `data` object to make sure the new contact is returned in the result - // This is like doing RETURNING in SQL include: { contact: true } diff --git a/src/routers/customer.js b/src/routers/customer.js index 812e4ff6..cc1cffcd 100644 --- a/src/routers/customer.js +++ b/src/routers/customer.js @@ -6,10 +6,6 @@ const { updateCustomer } = require('../controllers/customer'); - -// In index.js, we told express that the /customer route should use this router file -// The below /register route extends that, so the end result will be a URL -// that looks like http://localhost:4040/customer/register router.post("/register", createCustomer); router.put("/:id", updateCustomer); diff --git a/src/routers/movies.js b/src/routers/movies.js index 3425efd6..7e27fc77 100644 --- a/src/routers/movies.js +++ b/src/routers/movies.js @@ -8,10 +8,6 @@ const { updateMovie } = require('../controllers/movies'); -// In index.js, we told express that the /customer route should use this router file -// The below /register route extends that, so the end result will be a URL -// that looks like http://localhost:4040/customer/register - router.get("/", getMovies); router.get("/:id", getMovieById); router.post("/", createMovie); diff --git a/src/routers/screens.js b/src/routers/screens.js index 0b9d59c0..ef3cd3b7 100644 --- a/src/routers/screens.js +++ b/src/routers/screens.js @@ -5,10 +5,6 @@ const { createScreen, } = require('../controllers/screens'); -// In index.js, we told express that the /customer route should use this router file -// The below /register route extends that, so the end result will be a URL -// that looks like http://localhost:4040/customer/register - router.post('/', createScreen); module.exports = router;