From ba74aa8af7e1aaf8c7f2acd9e92b2aa7bf5095b0 Mon Sep 17 00:00:00 2001 From: Periklis Date: Mon, 1 Jul 2024 13:01:31 +0300 Subject: [PATCH 01/31] initial setup --- .env.example | 6 ------ package-lock.json | 46 +++++++++++++++++++++++----------------------- 2 files changed, 23 insertions(+), 29 deletions(-) delete mode 100644 .env.example diff --git a/.env.example b/.env.example deleted file mode 100644 index 60f3a816..00000000 --- a/.env.example +++ /dev/null @@ -1,6 +0,0 @@ -DATABASE_URL="YOUR_DB_URL" - -# We need the following URL environment variable for test purposes: -# - TEST_DATABASE_URL must be a **completely separate** database from any other used in this file - -TEST_DATABASE_URL="YOUR_TEST_DB_URL" diff --git a/package-lock.json b/package-lock.json index 0fc727e5..466f0d11 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1433,12 +1433,12 @@ } }, "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==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -1446,7 +1446,7 @@ "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", - "raw-body": "2.5.1", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -1493,12 +1493,12 @@ } }, "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, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -1784,9 +1784,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" } @@ -2106,16 +2106,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", @@ -2195,9 +2195,9 @@ } }, "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, "dependencies": { "to-regex-range": "^5.0.1" @@ -4134,9 +4134,9 @@ } }, "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==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", From faedb3f506f47ac1aacb85a48f26e2881f61c762 Mon Sep 17 00:00:00 2001 From: Periklis Date: Mon, 1 Jul 2024 15:12:53 +0300 Subject: [PATCH 02/31] add movie -domain -controller -router -just get all --- src/controllers/customer.js | 11 +++++++++-- src/controllers/movie.js | 10 ++++++++++ src/domains/customer.js | 7 ++++++- src/domains/movie.js | 13 +++++++++++++ src/routers/customer.js | 3 ++- src/routers/movie.js | 8 ++++++++ src/server.js | 2 ++ 7 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 src/controllers/movie.js create mode 100644 src/domains/movie.js create mode 100644 src/routers/movie.js diff --git a/src/controllers/customer.js b/src/controllers/customer.js index 775cfb42..a1e2cceb 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, getAllCustomersDb } = require('../domains/customer.js') const createCustomer = async (req, res) => { const { @@ -43,6 +43,13 @@ const createCustomer = async (req, res) => { } } +const getAllCustomers = async (req, res) => { + const allCustomers = await getAllCustomersDb() + + res.status(200).json({allCustomers}) + +} + module.exports = { - createCustomer + createCustomer, getAllCustomers } diff --git a/src/controllers/movie.js b/src/controllers/movie.js new file mode 100644 index 00000000..b079dae3 --- /dev/null +++ b/src/controllers/movie.js @@ -0,0 +1,10 @@ +const { PrismaClientKnownRequestError } = require("@prisma/client") +const { getAllMoviesDb } = require('../domains/movie') + +const getAllMovies = async (req, res) => { + const allMovies = await getAllMoviesDb() + res.status(200).json({allMovies}) +} + + +module.exports = {getAllMovies} \ No newline at end of file diff --git a/src/domains/customer.js b/src/domains/customer.js index c7f315fd..4a911c42 100644 --- a/src/domains/customer.js +++ b/src/domains/customer.js @@ -21,6 +21,11 @@ const createCustomerDb = async (name, phone, email) => await prisma.customer.cre } }) +const getAllCustomersDb = async () => { + const allCustomers = await prisma.customer.findMany() + return allCustomers +} + module.exports = { - createCustomerDb + createCustomerDb, getAllCustomersDb } diff --git a/src/domains/movie.js b/src/domains/movie.js new file mode 100644 index 00000000..30b21e4a --- /dev/null +++ b/src/domains/movie.js @@ -0,0 +1,13 @@ +const prisma = require("../utils/prisma") + + + +const getAllMoviesDb = async () => { + const allMovies = await prisma.movie.findMany() + return allMovies +} + + +module.exports = { + getAllMoviesDb +} \ No newline at end of file diff --git a/src/routers/customer.js b/src/routers/customer.js index f14a87fc..77f87b80 100644 --- a/src/routers/customer.js +++ b/src/routers/customer.js @@ -1,6 +1,6 @@ const express = require("express"); const { - createCustomer + createCustomer, getAllCustomers } = require('../controllers/customer'); const router = express.Router(); @@ -8,6 +8,7 @@ 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 // that looks like http://localhost:4040/customer/register +router.get("/", getAllCustomers) router.post("/register", createCustomer); module.exports = router; diff --git a/src/routers/movie.js b/src/routers/movie.js new file mode 100644 index 00000000..c13a121e --- /dev/null +++ b/src/routers/movie.js @@ -0,0 +1,8 @@ +const express = require("express") +const {getAllMovies} = require('../controllers/movie') + +const router = express.Router() + +router.get('/', getAllMovies) + +module.exports = router \ No newline at end of file diff --git a/src/server.js b/src/server.js index 93d47a16..87ebd830 100644 --- a/src/server.js +++ b/src/server.js @@ -15,7 +15,9 @@ app.use(express.urlencoded({ extended: true })); // Tell express to use your routers here const customerRouter = require('./routers/customer'); +const moviesRouter = require('./routers/movie') app.use('/customers', customerRouter); +app.use('/movies', moviesRouter) module.exports = app From 48c28fb1b00bbfab8b0bd111243be8263f6e8c2f Mon Sep 17 00:00:00 2001 From: Periklis Date: Mon, 1 Jul 2024 15:29:49 +0300 Subject: [PATCH 03/31] add get movie by id --- src/controllers/movie.js | 10 ++++++++-- src/domains/movie.js | 12 +++++++++++- src/routers/movie.js | 4 +++- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/controllers/movie.js b/src/controllers/movie.js index b079dae3..31d505fd 100644 --- a/src/controllers/movie.js +++ b/src/controllers/movie.js @@ -1,10 +1,16 @@ const { PrismaClientKnownRequestError } = require("@prisma/client") -const { getAllMoviesDb } = require('../domains/movie') +const { getAllMoviesDb, getMovieByIdDb } = require("../domains/movie") const getAllMovies = async (req, res) => { const allMovies = await getAllMoviesDb() res.status(200).json({allMovies}) } +const getMovieById = async (req, res) => { + const reqId = Number(req.params.id) + const movie = await getMovieByIdDb(reqId) + res.status(200).json({movie}) +} + -module.exports = {getAllMovies} \ No newline at end of file +module.exports = {getAllMovies, getMovieById} \ No newline at end of file diff --git a/src/domains/movie.js b/src/domains/movie.js index 30b21e4a..ea2881f0 100644 --- a/src/domains/movie.js +++ b/src/domains/movie.js @@ -7,7 +7,17 @@ const getAllMoviesDb = async () => { return allMovies } +const getMovieByIdDb = async (id) => { + const foundMovie = await prisma.movie.findUnique({ + where: { + id: id + }, + }) + return foundMovie +} + module.exports = { - getAllMoviesDb + getAllMoviesDb, + getMovieByIdDb, } \ No newline at end of file diff --git a/src/routers/movie.js b/src/routers/movie.js index c13a121e..065be945 100644 --- a/src/routers/movie.js +++ b/src/routers/movie.js @@ -1,8 +1,10 @@ const express = require("express") -const {getAllMovies} = require('../controllers/movie') +const {getAllMovies, getMovieById} = require('../controllers/movie') const router = express.Router() router.get('/', getAllMovies) +router.get('/:id', getMovieById) + module.exports = router \ No newline at end of file From 0fe38b01acb19a2bfd26cda51d22d276a5c13077 Mon Sep 17 00:00:00 2001 From: Periklis Date: Tue, 2 Jul 2024 03:23:04 +0300 Subject: [PATCH 04/31] finish -movie -customer -screen -core done --- src/controllers/customer.js | 58 +++++++++++++++++++++++-------------- src/controllers/movie.js | 38 +++++++++++++++++++----- src/controllers/screen.js | 11 +++++++ src/domains/customer.js | 28 ++++++++++++++++-- src/domains/movie.js | 53 +++++++++++++++++++++++++-------- src/domains/screen.js | 7 +++++ src/routers/customer.js | 6 ++-- src/routers/movie.js | 17 ++++++++--- src/routers/screen.js | 8 +++++ src/server.js | 2 ++ 10 files changed, 178 insertions(+), 50 deletions(-) create mode 100644 src/controllers/screen.js create mode 100644 src/domains/screen.js create mode 100644 src/routers/screen.js diff --git a/src/controllers/customer.js b/src/controllers/customer.js index a1e2cceb..33dd0e6a 100644 --- a/src/controllers/customer.js +++ b/src/controllers/customer.js @@ -1,5 +1,5 @@ const { PrismaClientKnownRequestError } = require("@prisma/client") -const { createCustomerDb, getAllCustomersDb } = require('../domains/customer.js') +const { createCustomerDb, getAllCustomersDb, updateCustomerDb } = require('../domains/customer.js') const createCustomer = async (req, res) => { const { @@ -13,43 +13,57 @@ 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" }) } } - + res.status(500).json({ error: e.message }) } } -const getAllCustomers = async (req, res) => { - const allCustomers = await getAllCustomersDb() - res.status(200).json({allCustomers}) +const updateCustomer = async (req, res) => { + const reqId = Number(req.params.id) + const updateInfo = String(req.body.name) + + const updatedCustomer = await updateCustomerDb(reqId, updateInfo) + res.status(201).json({customer: updatedCustomer}) +} + + + + +const getAllCustomers = async (req, res) => { + const allCustomers = await getAllCustomersDb() + res.status(200).json({allCustomers}) } module.exports = { - createCustomer, getAllCustomers + createCustomer, getAllCustomers, updateCustomer } + +// 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. + + +// 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 \ No newline at end of file diff --git a/src/controllers/movie.js b/src/controllers/movie.js index 31d505fd..81857e7c 100644 --- a/src/controllers/movie.js +++ b/src/controllers/movie.js @@ -1,16 +1,40 @@ const { PrismaClientKnownRequestError } = require("@prisma/client") -const { getAllMoviesDb, getMovieByIdDb } = require("../domains/movie") +const { + getAllMoviesDb, + getMovieByIdDb, + createMovieDb, + updateMovieDb, +} = require("../domains/movie") const getAllMovies = async (req, res) => { - const allMovies = await getAllMoviesDb() - res.status(200).json({allMovies}) + const allMovies = await getAllMoviesDb() + res.status(200).json({ movies: allMovies }) +} + +const createMovie = async (req, res) => { + const movieToAdd = req.body + + const createdMovie = await createMovieDb(movieToAdd) + res.status(201).json({ movie: createdMovie }) } const getMovieById = async (req, res) => { - const reqId = Number(req.params.id) - const movie = await getMovieByIdDb(reqId) - res.status(200).json({movie}) + const reqId = Number(req.params.id) + const movie = await getMovieByIdDb(reqId) + res.status(200).json({ movie: movie }) } +const updateMovie = async (req, res) => { + const reqId = Number(req.params.id) + const updateInfo = req.body -module.exports = {getAllMovies, getMovieById} \ No newline at end of file + const updatedMovie = await updateMovieDb(reqId, updateInfo) + res.status(201).json({ movie: updatedMovie }) +} + +module.exports = { + getAllMovies, + getMovieById, + createMovie, + updateMovie, +} diff --git a/src/controllers/screen.js b/src/controllers/screen.js new file mode 100644 index 00000000..7c3c8cf8 --- /dev/null +++ b/src/controllers/screen.js @@ -0,0 +1,11 @@ +const { PrismaClientKnownRequestError } = require("@prisma/client") +const { createScreenDB } = require('../domains/screen') + +const createScreen = async (req, res) => { + const screnToAdd = req.body + + const createScreen = await createScreenDB(screnToAdd) + res.status(201).json({screen: createScreen}) +} + +module.exports = {createScreen} \ No newline at end of file diff --git a/src/domains/customer.js b/src/domains/customer.js index 4a911c42..9715ba5f 100644 --- a/src/domains/customer.js +++ b/src/domains/customer.js @@ -14,8 +14,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 } @@ -26,6 +24,30 @@ const getAllCustomersDb = async () => { return allCustomers } +const updateCustomerDb = async (reqId, updateInfo) => { + + const updatedCustomer = await prisma.customer.update({ + where: { + id: reqId, + }, + data: { + name: updateInfo, + }, + include: { + contact: true + } + }) + return updatedCustomer +} + + module.exports = { - createCustomerDb, getAllCustomersDb + createCustomerDb, getAllCustomersDb, updateCustomerDb } + + + + + +// 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 \ No newline at end of file diff --git a/src/domains/movie.js b/src/domains/movie.js index ea2881f0..fb3e2ab1 100644 --- a/src/domains/movie.js +++ b/src/domains/movie.js @@ -1,23 +1,52 @@ const prisma = require("../utils/prisma") - - const getAllMoviesDb = async () => { - const allMovies = await prisma.movie.findMany() - return allMovies + const allMovies = await prisma.movie.findMany({ + include: { + screenings: true, + }, + }) + return allMovies +} + +const createMovieDb = async (addMovie) => { + const newMovie = await prisma.movie.create({ + data: addMovie, + include: { + screenings: true, + }, + }) + return newMovie } -const getMovieByIdDb = async (id) => { - const foundMovie = await prisma.movie.findUnique({ - where: { - id: id - }, - }) - return foundMovie +const getMovieByIdDb = async (reqId) => { + const foundMovie = await prisma.movie.findUnique({ + where: { + id: reqId, + }, + include: { + screenings: true, + }, + }) + return foundMovie } +const updateMovieDb = async (reqId, updateInfo) => { + const movieToUpdate = await prisma.movie.update({ + where: { + id: reqId, + }, + data: updateInfo, + include: { + screenings: true, + }, + }) + return movieToUpdate +} module.exports = { getAllMoviesDb, + createMovieDb, getMovieByIdDb, -} \ No newline at end of file + updateMovieDb, +} diff --git a/src/domains/screen.js b/src/domains/screen.js new file mode 100644 index 00000000..40c509e4 --- /dev/null +++ b/src/domains/screen.js @@ -0,0 +1,7 @@ +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/customer.js b/src/routers/customer.js index 77f87b80..47b283ad 100644 --- a/src/routers/customer.js +++ b/src/routers/customer.js @@ -1,6 +1,6 @@ const express = require("express"); const { - createCustomer, getAllCustomers + createCustomer, getAllCustomers, updateCustomer } = require('../controllers/customer'); const router = express.Router(); @@ -8,7 +8,9 @@ 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 // that looks like http://localhost:4040/customer/register -router.get("/", getAllCustomers) router.post("/register", createCustomer); +router.put('/:id', updateCustomer) + +router.get("/", getAllCustomers) module.exports = router; diff --git a/src/routers/movie.js b/src/routers/movie.js index 065be945..4b144832 100644 --- a/src/routers/movie.js +++ b/src/routers/movie.js @@ -1,10 +1,19 @@ const express = require("express") -const {getAllMovies, getMovieById} = require('../controllers/movie') +const { + getAllMovies, + getMovieById, + updateMovie, + createMovie, +} = require("../controllers/movie") const router = express.Router() -router.get('/', getAllMovies) -router.get('/:id', getMovieById) +router.get("/", getAllMovies) +router.post("/", createMovie) -module.exports = router \ No newline at end of file +router.get("/:id", getMovieById) + +router.put("/:id", updateMovie) + +module.exports = router diff --git a/src/routers/screen.js b/src/routers/screen.js new file mode 100644 index 00000000..1a35e2c0 --- /dev/null +++ b/src/routers/screen.js @@ -0,0 +1,8 @@ +const express = require("express") +const { createScreen } = require('../controllers/screen') + +const router = express.Router() + +router.post('/', createScreen) + +module.exports = router \ No newline at end of file diff --git a/src/server.js b/src/server.js index 87ebd830..bffb3468 100644 --- a/src/server.js +++ b/src/server.js @@ -16,8 +16,10 @@ app.use(express.urlencoded({ extended: true })); // Tell express to use your routers here const customerRouter = require('./routers/customer'); const moviesRouter = require('./routers/movie') +const screensRouter = require('./routers/screen') app.use('/customers', customerRouter); app.use('/movies', moviesRouter) +app.use('/screens', screensRouter) module.exports = app From 72639923a724ce2b6a248890d32d6d356ccbdf4d Mon Sep 17 00:00:00 2001 From: Periklis Date: Tue, 2 Jul 2024 14:41:37 +0300 Subject: [PATCH 05/31] add -filter by runtime function -some error handling for createing new movie --- src/controllers/movie.js | 29 ++++++++++++++++++--- src/domains/movie.js | 24 +++++++++++++++--- src/errors/errors.js | 14 +++++++++++ src/server.js | 54 ++++++++++++++++++++++++++++------------ 4 files changed, 99 insertions(+), 22 deletions(-) create mode 100644 src/errors/errors.js diff --git a/src/controllers/movie.js b/src/controllers/movie.js index 81857e7c..d8b83a78 100644 --- a/src/controllers/movie.js +++ b/src/controllers/movie.js @@ -6,15 +6,38 @@ const { updateMovieDb, } = require("../domains/movie") +const { + MissingFieldsError, + ExistingDataError, +} = require("../errors/errors") + const getAllMovies = async (req, res) => { - const allMovies = await getAllMoviesDb() + const { runtimeLt, runtimeGt } = req.query + + const allMovies = await getAllMoviesDb(runtimeLt, runtimeGt) + res.status(200).json({ movies: allMovies }) } const createMovie = async (req, res) => { - const movieToAdd = req.body + const { title, runtimeMins } = req.body + + if (!title || !runtimeMins) { + throw new MissingFieldsError( + "Title and duration in minutes must be provided in order to add a movie" + ) + } + + const moviesList = await getAllMoviesDb() + const existingMovie = moviesList.find((mv) => mv.title === title) + + if (existingMovie) { + throw new ExistingDataError( + "A movie with the provided title already exists" + ) + } - const createdMovie = await createMovieDb(movieToAdd) + const createdMovie = await createMovieDb(title, runtimeMins) res.status(201).json({ movie: createdMovie }) } diff --git a/src/domains/movie.js b/src/domains/movie.js index fb3e2ab1..554ebd28 100644 --- a/src/domains/movie.js +++ b/src/domains/movie.js @@ -1,7 +1,21 @@ const prisma = require("../utils/prisma") -const getAllMoviesDb = async () => { +const getAllMoviesDb = async (runtimeLt, runtimeGt) => { + const filterRuntimes = {} + + if (runtimeLt) { + filterRuntimes.lt = Number(runtimeLt) + } + if (runtimeGt) { + filterRuntimes.gt = Number(runtimeGt) + } + const allMovies = await prisma.movie.findMany({ + where: { + runtimeMins: Object.keys(filterRuntimes).length + ? filterRuntimes + : undefined, + }, include: { screenings: true, }, @@ -9,13 +23,17 @@ const getAllMoviesDb = async () => { return allMovies } -const createMovieDb = async (addMovie) => { +const createMovieDb = async (title, minutes) => { const newMovie = await prisma.movie.create({ - data: addMovie, + data: { + title: title, + runtimeMins: minutes, + }, include: { screenings: true, }, }) + return newMovie } diff --git a/src/errors/errors.js b/src/errors/errors.js new file mode 100644 index 00000000..d16a9f6b --- /dev/null +++ b/src/errors/errors.js @@ -0,0 +1,14 @@ +class MissingFieldsError extends Error {} + +class ExistingDataError extends Error {} + +class DataNotFoundError extends Error {} + +class IncorrectFieldTypeError extends Error {} + +module.exports = { + MissingFieldsError, + ExistingDataError, + DataNotFoundError, + IncorrectFieldTypeError, +} diff --git a/src/server.js b/src/server.js index bffb3468..8637622f 100644 --- a/src/server.js +++ b/src/server.js @@ -1,25 +1,47 @@ -const express = require('express'); -const app = express(); +const express = require("express") +const app = express() -const cors = require('cors'); -const morgan = require('morgan'); +const cors = require("cors") +const morgan = require("morgan") -app.disable('x-powered-by'); +app.disable("x-powered-by") // Add middleware -app.use(cors()); -app.use(morgan('dev')); -app.use(express.json()); -app.use(express.urlencoded({ extended: true })); - +app.use(cors()) +app.use(morgan("dev")) +app.use(express.json()) +app.use(express.urlencoded({ extended: true })) // Tell express to use your routers here -const customerRouter = require('./routers/customer'); -const moviesRouter = require('./routers/movie') -const screensRouter = require('./routers/screen') -app.use('/customers', customerRouter); -app.use('/movies', moviesRouter) -app.use('/screens', screensRouter) +const customerRouter = require("./routers/customer") +const moviesRouter = require("./routers/movie") +const screensRouter = require("./routers/screen") + +const { + MissingFieldsError, + ExistingDataError, + DataNotFoundError, +} = require("./errors/errors.js") + +app.use("/customers", customerRouter) +app.use("/movies", moviesRouter) +app.use("/screens", screensRouter) + +app.use((error, req, res, next) => { + if (error instanceof MissingFieldsError) { + return res.status(400).json({ error: error.message }) + } + if (error instanceof DataNotFoundError) { + return res.status(404).json({ error: error.message }) + } + if (error instanceof ExistingDataError) { + return res.status(409).json({ error: error.message }) + } + console.error(error) + res.status(500).json({ + message: "Something went wrong", + }) +}) module.exports = app From 26b9a0033d24f53a2114288052e3f77cfa1eb4fe Mon Sep 17 00:00:00 2001 From: Periklis Date: Tue, 2 Jul 2024 16:03:41 +0300 Subject: [PATCH 06/31] add functionality to search for a movie with id or title --- src/controllers/movie.js | 22 ++++++++++++++++++---- src/domains/movie.js | 20 +++++++++++++++++++- src/routers/movie.js | 2 +- 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/controllers/movie.js b/src/controllers/movie.js index d8b83a78..204d30dd 100644 --- a/src/controllers/movie.js +++ b/src/controllers/movie.js @@ -4,11 +4,13 @@ const { getMovieByIdDb, createMovieDb, updateMovieDb, + getMovieByTitleDb, } = require("../domains/movie") const { MissingFieldsError, ExistingDataError, + DataNotFoundError, } = require("../errors/errors") const getAllMovies = async (req, res) => { @@ -41,10 +43,22 @@ const createMovie = async (req, res) => { res.status(201).json({ movie: createdMovie }) } -const getMovieById = async (req, res) => { - const reqId = Number(req.params.id) - const movie = await getMovieByIdDb(reqId) - res.status(200).json({ movie: movie }) +const getMovieById = async (req, res, next) => { + const idOrTitle = req.params.idOrTitle + + try { + const movie = await getMovieByIdDb(idOrTitle) + if (!movie) { + throw new DataNotFoundError( + "No movie with the provided id or title exists" + ) + } + res.status(200).json({ movie: movie }) + } catch (e) { + console.log(e) + next(e) + } + } const updateMovie = async (req, res) => { diff --git a/src/domains/movie.js b/src/domains/movie.js index 554ebd28..1294ec5d 100644 --- a/src/domains/movie.js +++ b/src/domains/movie.js @@ -37,10 +37,28 @@ const createMovieDb = async (title, minutes) => { return newMovie } +const getMovieByTitleDb = async (title) => { + const foundMovie = await prisma.movie.findFirst({ + where: { + title: title, + }, + include: { + screenings: true, + }, + }) + return foundMovie +} + const getMovieByIdDb = async (reqId) => { + const reqType = Number(reqId) + + if (isNaN(reqType)) { + return await getMovieByTitleDb(reqId) + } + const foundMovie = await prisma.movie.findUnique({ where: { - id: reqId, + id: reqType, }, include: { screenings: true, diff --git a/src/routers/movie.js b/src/routers/movie.js index 4b144832..c89a6b06 100644 --- a/src/routers/movie.js +++ b/src/routers/movie.js @@ -12,7 +12,7 @@ router.get("/", getAllMovies) router.post("/", createMovie) -router.get("/:id", getMovieById) +router.get("/:idOrTitle", getMovieById) router.put("/:id", updateMovie) From 64780b29112a6c33531694febb720993ed8a276f Mon Sep 17 00:00:00 2001 From: Periklis Date: Tue, 2 Jul 2024 18:47:11 +0300 Subject: [PATCH 07/31] errors shown properly in insomnia now --- src/controllers/movie.js | 50 ++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/src/controllers/movie.js b/src/controllers/movie.js index 204d30dd..0701375c 100644 --- a/src/controllers/movie.js +++ b/src/controllers/movie.js @@ -21,44 +21,48 @@ const getAllMovies = async (req, res) => { res.status(200).json({ movies: allMovies }) } -const createMovie = async (req, res) => { +const createMovie = async (req, res, next) => { const { title, runtimeMins } = req.body - if (!title || !runtimeMins) { - throw new MissingFieldsError( - "Title and duration in minutes must be provided in order to add a movie" - ) - } + try { + if (!title || !runtimeMins) { + throw new MissingFieldsError( + "Title and duration in minutes must be provided in order to add a movie" + ) + } - const moviesList = await getAllMoviesDb() - const existingMovie = moviesList.find((mv) => mv.title === title) + const moviesList = await getAllMoviesDb() + const existingMovie = moviesList.find((mv) => mv.title === title) - if (existingMovie) { - throw new ExistingDataError( - "A movie with the provided title already exists" - ) - } + if (existingMovie) { + throw new ExistingDataError( + "A movie with the provided title already exists" + ) + } - const createdMovie = await createMovieDb(title, runtimeMins) - res.status(201).json({ movie: createdMovie }) + const createdMovie = await createMovieDb(title, runtimeMins) + res.status(201).json({ movie: createdMovie }) + } catch (e) { + console.log(e) + next(e) + } } const getMovieById = async (req, res, next) => { const idOrTitle = req.params.idOrTitle try { - const movie = await getMovieByIdDb(idOrTitle) - if (!movie) { - throw new DataNotFoundError( - "No movie with the provided id or title exists" - ) - } - res.status(200).json({ movie: movie }) + const movie = await getMovieByIdDb(idOrTitle) + if (!movie) { + throw new DataNotFoundError( + "No movie with the provided id or title exists" + ) + } + res.status(200).json({ movie: movie }) } catch (e) { console.log(e) next(e) } - } const updateMovie = async (req, res) => { From ebc492c534256f7307285be2bf8d530d1e903b83 Mon Sep 17 00:00:00 2001 From: Periklis Date: Tue, 2 Jul 2024 21:38:57 +0300 Subject: [PATCH 08/31] add create movie with screenings info --- src/controllers/movie.js | 25 +++++++++++++++++-------- src/domains/movie.js | 24 ++++++++++++++++++++++-- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/controllers/movie.js b/src/controllers/movie.js index 0701375c..8a1ed018 100644 --- a/src/controllers/movie.js +++ b/src/controllers/movie.js @@ -22,7 +22,7 @@ const getAllMovies = async (req, res) => { } const createMovie = async (req, res, next) => { - const { title, runtimeMins } = req.body + const { title, runtimeMins, screenings } = req.body try { if (!title || !runtimeMins) { @@ -40,6 +40,15 @@ const createMovie = async (req, res, next) => { ) } + if (screenings) { + const createdMovie = await createMovieDb( + title, + runtimeMins, + screenings + ) + res.status(201).json({ movie: createdMovie }) + } + const createdMovie = await createMovieDb(title, runtimeMins) res.status(201).json({ movie: createdMovie }) } catch (e) { @@ -52,13 +61,13 @@ const getMovieById = async (req, res, next) => { const idOrTitle = req.params.idOrTitle try { - const movie = await getMovieByIdDb(idOrTitle) - if (!movie) { - throw new DataNotFoundError( - "No movie with the provided id or title exists" - ) - } - res.status(200).json({ movie: movie }) + const movie = await getMovieByIdDb(idOrTitle) + if (!movie) { + throw new DataNotFoundError( + "No movie with the provided id or title exists" + ) + } + res.status(200).json({ movie: movie }) } catch (e) { console.log(e) next(e) diff --git a/src/domains/movie.js b/src/domains/movie.js index 1294ec5d..1f5983cd 100644 --- a/src/domains/movie.js +++ b/src/domains/movie.js @@ -23,7 +23,27 @@ const getAllMoviesDb = async (runtimeLt, runtimeGt) => { return allMovies } -const createMovieDb = async (title, minutes) => { +const createMovieDb = async (title, minutes, screenings) => { + + if (screenings) { + const newMovie = await prisma.movie.create({ + data: { + title: title, + runtimeMins: minutes, + screenings: { + create: screenings.map((scr) => ({ + startsAt: new Date(scr.startsAt), + screenId: scr.screenId + + }) ), + }, + }, + include: { + screenings: true, + }, + }) + return newMovie + } const newMovie = await prisma.movie.create({ data: { title: title, @@ -51,7 +71,7 @@ const getMovieByTitleDb = async (title) => { const getMovieByIdDb = async (reqId) => { const reqType = Number(reqId) - + if (isNaN(reqType)) { return await getMovieByTitleDb(reqId) } From ec6e4b2fc9aa30c4b3642a76c44ef1d29617c821 Mon Sep 17 00:00:00 2001 From: Periklis Date: Tue, 2 Jul 2024 22:53:48 +0300 Subject: [PATCH 09/31] add update movie with screenings info --- src/controllers/movie.js | 40 +++++++++++++++++++++++++++++++++++++--- src/domains/movie.js | 29 +++++++++++++++++++++++------ 2 files changed, 60 insertions(+), 9 deletions(-) diff --git a/src/controllers/movie.js b/src/controllers/movie.js index 8a1ed018..99d1832b 100644 --- a/src/controllers/movie.js +++ b/src/controllers/movie.js @@ -74,12 +74,46 @@ const getMovieById = async (req, res, next) => { } } -const updateMovie = async (req, res) => { +const updateMovie = async (req, res, next) => { const reqId = Number(req.params.id) const updateInfo = req.body + // const screenings = updateInfo.screenings - const updatedMovie = await updateMovieDb(reqId, updateInfo) - res.status(201).json({ movie: updatedMovie }) + const moviesList = await getAllMoviesDb() + const existingTitle = moviesList.find( + (mv) => mv.title === updateInfo.title + ) + const existingId = moviesList.find((mv) => mv.id === reqId) + + try { + if (!existingId) { + throw new DataNotFoundError( + "No movie with the provided ID exists" + ) + } + + if (!updateInfo.title || !updateInfo.runtimeMins) { + throw new MissingFieldsError( + "Title and duration in minutes must be provided in order to add a movie" + ) + } + + if (existingTitle) { + throw new ExistingDataError( + "A movie with the provided title already exists" + ) + } + + const updatedMovie = await updateMovieDb( + reqId, + updateInfo, + updateInfo.screenings + ) + res.status(201).json({ movie: updatedMovie }) + } catch (e) { + console.log(e) + next(e) + } } module.exports = { diff --git a/src/domains/movie.js b/src/domains/movie.js index 1f5983cd..894dbd3e 100644 --- a/src/domains/movie.js +++ b/src/domains/movie.js @@ -24,7 +24,6 @@ const getAllMoviesDb = async (runtimeLt, runtimeGt) => { } const createMovieDb = async (title, minutes, screenings) => { - if (screenings) { const newMovie = await prisma.movie.create({ data: { @@ -33,9 +32,8 @@ const createMovieDb = async (title, minutes, screenings) => { screenings: { create: screenings.map((scr) => ({ startsAt: new Date(scr.startsAt), - screenId: scr.screenId - - }) ), + screenId: scr.screenId, + })), }, }, include: { @@ -87,12 +85,31 @@ const getMovieByIdDb = async (reqId) => { return foundMovie } -const updateMovieDb = async (reqId, updateInfo) => { +const updateMovieDb = async (reqId, updateInfo, screenings) => { + const updateData = { + title: updateInfo.title, + runtimeMins: updateInfo.minutes, + } + + if (screenings) { + updateData.screenings = { + // deleteMany: {}, + create: screenings.map((scr) => ({ + startsAt: new Date(scr.startsAt), + screen: { + connect: { + id: scr.screenId, + }, + }, + })), + } + } + const movieToUpdate = await prisma.movie.update({ where: { id: reqId, }, - data: updateInfo, + data: updateData, include: { screenings: true, }, From 0bef682b5d16fa9f57ca7e3bd53a88b85abffafb Mon Sep 17 00:00:00 2001 From: Periklis Date: Tue, 2 Jul 2024 23:38:58 +0300 Subject: [PATCH 10/31] add functionality to update customers contact info if provided --- src/controllers/customer.js | 103 +++++++++++++++++++++++------------- src/domains/customer.js | 73 +++++++++++++------------ 2 files changed, 105 insertions(+), 71 deletions(-) diff --git a/src/controllers/customer.js b/src/controllers/customer.js index 33dd0e6a..c4ec3df3 100644 --- a/src/controllers/customer.js +++ b/src/controllers/customer.js @@ -1,54 +1,84 @@ const { PrismaClientKnownRequestError } = require("@prisma/client") -const { createCustomerDb, getAllCustomersDb, updateCustomerDb } = require('../domains/customer.js') +const { + createCustomerDb, + getAllCustomersDb, + updateCustomerDb, +} = require("../domains/customer.js") -const createCustomer = async (req, res) => { - const { - name, - phone, - email - } = req.body +const { + MissingFieldsError, + ExistingDataError, + DataNotFoundError, +} = require("../errors/errors") - if (!name || !phone || !email) { - return res.status(400).json({ - error: "Missing fields in request body" - }) - } - - try { - const createdCustomer = await createCustomerDb(name, phone, email) - - res.status(201).json({ customer: createdCustomer }) - } catch (e) { - if (e instanceof PrismaClientKnownRequestError) { - if (e.code === "P2002") { - return res.status(409).json({ error: "A customer with the provided email already exists" }) - } - } - - res.status(500).json({ error: e.message }) - } -} +const createCustomer = async (req, res) => { + const { name, phone, email } = req.body + if (!name || !phone || !email) { + return res.status(400).json({ + error: "Missing fields in request body", + }) + } + try { + const createdCustomer = await createCustomerDb(name, phone, email) -const updateCustomer = async (req, res) => { - const reqId = Number(req.params.id) - const updateInfo = String(req.body.name) + res.status(201).json({ customer: createdCustomer }) + } catch (e) { + if (e instanceof PrismaClientKnownRequestError) { + if (e.code === "P2002") { + return res.status(409).json({ + error: "A customer with the provided email already exists", + }) + } + } - const updatedCustomer = await updateCustomerDb(reqId, updateInfo) - res.status(201).json({customer: updatedCustomer}) + res.status(500).json({ error: e.message }) + } } +const updateCustomer = async (req, res, next) => { + const reqId = Number(req.params.id) + const updateInfo = req.body + const customersList = await getAllCustomersDb() + const existingCustomer = customersList.find( + (cus) => cus.id === reqId + ) + try { + if (!existingCustomer) { + throw new DataNotFoundError( + "No customer with the provided ID exists" + ) + } + if (!updateInfo.name) { + throw new MissingFieldsError( + "A name must be provided in order to update the customer" + ) + } + const updatedCustomer = await updateCustomerDb( + reqId, + updateInfo.name, + updateInfo.phone, + updateInfo.email + ) + res.status(201).json({ customer: updatedCustomer }) + } catch (e) { + console.log(e) + next(e) + } +} const getAllCustomers = async (req, res) => { - const allCustomers = await getAllCustomersDb() - res.status(200).json({allCustomers}) + const allCustomers = await getAllCustomersDb() + res.status(200).json({ allCustomers }) } module.exports = { - createCustomer, getAllCustomers, updateCustomer + createCustomer, + getAllCustomers, + updateCustomer, } // Try-catch is a very common way to handle errors in JavaScript. @@ -59,11 +89,10 @@ module.exports = { // 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. - // 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 \ No newline at end of file +// HTTP error codes: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#client_error_responses diff --git a/src/domains/customer.js b/src/domains/customer.js index 9715ba5f..e02ed33b 100644 --- a/src/domains/customer.js +++ b/src/domains/customer.js @@ -1,53 +1,58 @@ -const prisma = require('../utils/prisma') +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, - contact: { - create: { - phone, - email - } - } - }, - include: { - contact: true - } -}) +const createCustomerDb = async (name, phone, email) => + await prisma.customer.create({ + data: { + name, + contact: { + create: { + phone, + email, + }, + }, + }, + include: { + contact: true, + }, + }) const getAllCustomersDb = async () => { - const allCustomers = await prisma.customer.findMany() - return allCustomers + const allCustomers = await prisma.customer.findMany() + return allCustomers } -const updateCustomerDb = async (reqId, updateInfo) => { - - const updatedCustomer = await prisma.customer.update({ +const updateCustomerDb = async (reqId, updateInfo, contactInfo) => { + const updateData = { + name: updateInfo + } + + if (contactInfo) { + updateData.contact = { + phone: contactInfo.phone, + email: contactInfo.email, + } + } + const updatedCustomer = await prisma.customer.update({ where: { id: reqId, }, - data: { - name: updateInfo, - }, - include: { - contact: true - } + data: updateData, + include: { + contact: true, + }, }) - return updatedCustomer + return updatedCustomer } - module.exports = { - createCustomerDb, getAllCustomersDb, updateCustomerDb + createCustomerDb, + getAllCustomersDb, + updateCustomerDb, } - - - - // 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 \ No newline at end of file +// This is like doing RETURNING in SQL From 11bb3124b82cac1cea924547ba7018f45e0e329a Mon Sep 17 00:00:00 2001 From: Periklis Date: Wed, 3 Jul 2024 00:59:00 +0300 Subject: [PATCH 11/31] add create screen with screenings --- src/controllers/screen.js | 49 ++++++++++++++++++++++++++++++++++----- src/domains/screen.js | 34 +++++++++++++++++++++++---- src/routers/screen.js | 4 +++- 3 files changed, 76 insertions(+), 11 deletions(-) diff --git a/src/controllers/screen.js b/src/controllers/screen.js index 7c3c8cf8..cbb916bc 100644 --- a/src/controllers/screen.js +++ b/src/controllers/screen.js @@ -1,11 +1,48 @@ const { PrismaClientKnownRequestError } = require("@prisma/client") -const { createScreenDB } = require('../domains/screen') +const { + createScreenDB, + getAllScreensDb, +} = require("../domains/screen") +const { + MissingFieldsError, + ExistingDataError, + DataNotFoundError, +} = require("../errors/errors") -const createScreen = async (req, res) => { - const screnToAdd = req.body +const createScreen = async (req, res, next) => { + const screnToAdd = req.body - const createScreen = await createScreenDB(screnToAdd) - res.status(201).json({screen: createScreen}) + try { + if (!screnToAdd.number) { + throw new MissingFieldsError( + "Number must be provided in order to add a screen" + ) + } + + const screensList = await getAllScreensDb() + const existingScreen = screensList.find( + (scr) => scr.number === screnToAdd.number + ) + + if (existingScreen) { + throw new ExistingDataError( + "A screen with the provided number already exists" + ) + } + const createScreen = await createScreenDB( + screnToAdd.number, + screnToAdd.screenings + ) + res.status(201).json({ screen: createScreen }) + } catch (e) { + console.log(e) + next(e) + } +} + +const getAllScreens = async (req, res) => { + const allScreens = await getAllScreensDb() + res.status(200).json({ allScreens }) } -module.exports = {createScreen} \ No newline at end of file +module.exports = { createScreen, getAllScreens } diff --git a/src/domains/screen.js b/src/domains/screen.js index 40c509e4..cc26c045 100644 --- a/src/domains/screen.js +++ b/src/domains/screen.js @@ -1,7 +1,33 @@ const prisma = require("../utils/prisma") -const createScreenDB = async (number) => await prisma.screen.create({ - data: number -}) +const createScreenDB = async (number, screenings) => { + if (screenings) { + const newScreen = await prisma.screen.create({ + data: { + number: number, + screenings: { + create: screenings.map((scr) => ({ + movieId: scr.movieId, + screenId: scr.screenId, + startsAt: new Date(scr.startsAt), + })), + }, + }, + include: { screenings: true }, + }) + return newScreen + } -module.exports = {createScreenDB} \ No newline at end of file + const newScreen = await prisma.screen.create({ + data: { number: number }, + include: { screenings: true }, + }) + return newScreen +} + +const getAllScreensDb = async () => { + const allScreens = await prisma.screen.findMany() + return allScreens +} + +module.exports = { createScreenDB, getAllScreensDb } diff --git a/src/routers/screen.js b/src/routers/screen.js index 1a35e2c0..6eab7b98 100644 --- a/src/routers/screen.js +++ b/src/routers/screen.js @@ -1,8 +1,10 @@ const express = require("express") -const { createScreen } = require('../controllers/screen') +const { createScreen, getAllScreens } = require('../controllers/screen') const router = express.Router() +router.get('/', getAllScreens) + router.post('/', createScreen) module.exports = router \ No newline at end of file From 7e1c4897d3445094d0ead7d11426797cebb98d5f Mon Sep 17 00:00:00 2001 From: Periklis Date: Wed, 3 Jul 2024 03:02:58 +0300 Subject: [PATCH 12/31] add new ticket creation -a bit different output --- src/controllers/ticket.js | 16 ++++++++++++++++ src/domains/ticket.js | 40 +++++++++++++++++++++++++++++++++++++++ src/routers/ticket.js | 9 +++++++++ src/server.js | 2 ++ 4 files changed, 67 insertions(+) create mode 100644 src/controllers/ticket.js create mode 100644 src/domains/ticket.js create mode 100644 src/routers/ticket.js diff --git a/src/controllers/ticket.js b/src/controllers/ticket.js new file mode 100644 index 00000000..06eb55f6 --- /dev/null +++ b/src/controllers/ticket.js @@ -0,0 +1,16 @@ +const { PrismaClientKnownRequestError } = require("@prisma/client") +const { createTicketDB } = require('../domains/ticket') + +const { + MissingFieldsError, + ExistingDataError, + DataNotFoundError, +} = require("../errors/errors") + +const createTicket = async (req, res) => { + const { screeningId, customerId } = req.body + const newTicket = await createTicketDB(screeningId, customerId) + res.status(201).json({ticket: newTicket}) +} + +module.exports = { createTicket} \ No newline at end of file diff --git a/src/domains/ticket.js b/src/domains/ticket.js new file mode 100644 index 00000000..98ebb8b9 --- /dev/null +++ b/src/domains/ticket.js @@ -0,0 +1,40 @@ +const prisma = require("../utils/prisma") + +const createTicketDB = async (screen, customer) => { + const newTicket = await prisma.ticket.create({ + data: { + screening: { + connect: { id: screen }, + }, + customer: { + connect: { id: customer }, + }, + }, + select: { + id: true, + screening: { + select: { + id: true, + movieId: true, + screenId: true, + } + }, + customer: { + include: { + contact: true, + }, + }, + screening: { + select: { + screen: true, + movie: true, + }, + }, + }, + }) + return newTicket +} + +module.exports = { + createTicketDB, +} diff --git a/src/routers/ticket.js b/src/routers/ticket.js new file mode 100644 index 00000000..39dcc68a --- /dev/null +++ b/src/routers/ticket.js @@ -0,0 +1,9 @@ +const express = require("express") + +const { createTicket } = require('../controllers/ticket') + +const router = express.Router() + +router.post('/', createTicket) + +module.exports = router \ No newline at end of file diff --git a/src/server.js b/src/server.js index 8637622f..fe8bed6f 100644 --- a/src/server.js +++ b/src/server.js @@ -16,6 +16,7 @@ app.use(express.urlencoded({ extended: true })) const customerRouter = require("./routers/customer") const moviesRouter = require("./routers/movie") const screensRouter = require("./routers/screen") +const ticketsRouter = require('./routers/ticket') const { MissingFieldsError, @@ -26,6 +27,7 @@ const { app.use("/customers", customerRouter) app.use("/movies", moviesRouter) app.use("/screens", screensRouter) +app.use("/tickets", ticketsRouter) app.use((error, req, res, next) => { if (error instanceof MissingFieldsError) { From b243786af1062340f15c3d11d63bd8644f1cba42 Mon Sep 17 00:00:00 2001 From: Periklis Date: Wed, 3 Jul 2024 03:37:31 +0300 Subject: [PATCH 13/31] add error handling for ticket creation --- src/controllers/screening.js | 9 +++++++++ src/controllers/ticket.js | 34 +++++++++++++++++++++++++++++----- src/domains/screening.js | 10 ++++++++++ src/routers/screening.js | 8 ++++++++ src/server.js | 2 ++ 5 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 src/controllers/screening.js create mode 100644 src/domains/screening.js create mode 100644 src/routers/screening.js diff --git a/src/controllers/screening.js b/src/controllers/screening.js new file mode 100644 index 00000000..783e6a51 --- /dev/null +++ b/src/controllers/screening.js @@ -0,0 +1,9 @@ +const { PrismaClientKnownRequestError } = require("@prisma/client") +const { getAllScreeningsDb } = require("../domains/screening") + +const getAllScreenings = async (req, res) => { + const allScreenings = await getAllScreeningsDb() + res.status(200).json({ allScreenings }) +} + +module.exports = { getAllScreenings } diff --git a/src/controllers/ticket.js b/src/controllers/ticket.js index 06eb55f6..e07de635 100644 --- a/src/controllers/ticket.js +++ b/src/controllers/ticket.js @@ -1,5 +1,7 @@ const { PrismaClientKnownRequestError } = require("@prisma/client") -const { createTicketDB } = require('../domains/ticket') +const { createTicketDB } = require("../domains/ticket") +const { getAllCustomersDb } = require('../domains/customer') +const { getAllScreeningsDb } = require('../domains/screening') const { MissingFieldsError, @@ -7,10 +9,32 @@ const { DataNotFoundError, } = require("../errors/errors") -const createTicket = async (req, res) => { +const createTicket = async (req, res, next) => { const { screeningId, customerId } = req.body - const newTicket = await createTicketDB(screeningId, customerId) - res.status(201).json({ticket: newTicket}) + + const customers = await getAllCustomersDb() + const existingCustomer = customers.find(cus => cus.id === customerId) + const screenings = await getAllScreeningsDb() + const existingScreening = screenings.find(scr => scr.id === screeningId) + + try { + if (!screeningId || !customerId) { + throw new MissingFieldsError( + "Screening and Customer ID must be provided in order to create a ticket" + ) + } + + if (!existingScreening || !existingCustomer) { + throw new DataNotFoundError( + "No customer or screening exist with the provided id" + ) + } + const newTicket = await createTicketDB(screeningId, customerId) + res.status(201).json({ ticket: newTicket }) + } catch (e) { + console.log(e) + next(e) + } } -module.exports = { createTicket} \ No newline at end of file +module.exports = { createTicket } diff --git a/src/domains/screening.js b/src/domains/screening.js new file mode 100644 index 00000000..929c1348 --- /dev/null +++ b/src/domains/screening.js @@ -0,0 +1,10 @@ +const prisma = require("../utils/prisma") + +const getAllScreeningsDb = async () => { + const allScreenings = await prisma.screening.findMany() + return allScreenings +} + +module.exports = { + getAllScreeningsDb +} \ No newline at end of file diff --git a/src/routers/screening.js b/src/routers/screening.js new file mode 100644 index 00000000..041f142f --- /dev/null +++ b/src/routers/screening.js @@ -0,0 +1,8 @@ +const express = require("express") +const { getAllScreenings } = require('../controllers/screening') + +const router = express.Router() + +router.get('/', getAllScreenings) + +module.exports = router \ No newline at end of file diff --git a/src/server.js b/src/server.js index fe8bed6f..459ef08a 100644 --- a/src/server.js +++ b/src/server.js @@ -17,6 +17,7 @@ const customerRouter = require("./routers/customer") const moviesRouter = require("./routers/movie") const screensRouter = require("./routers/screen") const ticketsRouter = require('./routers/ticket') +const screeningsRouter = require('./routers/screening') const { MissingFieldsError, @@ -28,6 +29,7 @@ app.use("/customers", customerRouter) app.use("/movies", moviesRouter) app.use("/screens", screensRouter) app.use("/tickets", ticketsRouter) +app.use('/screenings', screeningsRouter) app.use((error, req, res, next) => { if (error instanceof MissingFieldsError) { From 4d4334bd95430887a5f334a1a314d04ac8eea06b Mon Sep 17 00:00:00 2001 From: Periklis Date: Wed, 3 Jul 2024 12:33:31 +0300 Subject: [PATCH 14/31] fix an error in post new movie --- src/controllers/customer.js | 14 ++++++++------ src/controllers/movie.js | 1 + src/domains/customer.js | 1 + src/domains/movie.js | 24 +++++++++++++----------- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/controllers/customer.js b/src/controllers/customer.js index c4ec3df3..8a83a27f 100644 --- a/src/controllers/customer.js +++ b/src/controllers/customer.js @@ -40,6 +40,7 @@ const createCustomer = async (req, res) => { const updateCustomer = async (req, res, next) => { const reqId = Number(req.params.id) const updateInfo = req.body + console.log(updateInfo) const customersList = await getAllCustomersDb() const existingCustomer = customersList.find( @@ -51,18 +52,19 @@ const updateCustomer = async (req, res, next) => { throw new DataNotFoundError( "No customer with the provided ID exists" ) - } - if (!updateInfo.name) { - throw new MissingFieldsError( - "A name must be provided in order to update the customer" - ) - } + } + if (!updateInfo.name) { + throw new MissingFieldsError( + "A name must be provided in order to update the customer" + ) + } const updatedCustomer = await updateCustomerDb( reqId, updateInfo.name, updateInfo.phone, updateInfo.email ) + console.log(updatedCustomer) res.status(201).json({ customer: updatedCustomer }) } catch (e) { console.log(e) diff --git a/src/controllers/movie.js b/src/controllers/movie.js index 99d1832b..b439b9dc 100644 --- a/src/controllers/movie.js +++ b/src/controllers/movie.js @@ -47,6 +47,7 @@ const createMovie = async (req, res, next) => { screenings ) res.status(201).json({ movie: createdMovie }) + return } const createdMovie = await createMovieDb(title, runtimeMins) diff --git a/src/domains/customer.js b/src/domains/customer.js index e02ed33b..83a5747d 100644 --- a/src/domains/customer.js +++ b/src/domains/customer.js @@ -36,6 +36,7 @@ const updateCustomerDb = async (reqId, updateInfo, contactInfo) => { email: contactInfo.email, } } + console.log("Domain after if", updateData.contact) const updatedCustomer = await prisma.customer.update({ where: { id: reqId, diff --git a/src/domains/movie.js b/src/domains/movie.js index 894dbd3e..8cb76e4f 100644 --- a/src/domains/movie.js +++ b/src/domains/movie.js @@ -40,19 +40,21 @@ const createMovieDb = async (title, minutes, screenings) => { screenings: true, }, }) + return newMovie + } else { + + const newMovie = await prisma.movie.create({ + data: { + title: title, + runtimeMins: minutes, + }, + include: { + screenings: true, + }, + }) + return newMovie } - const newMovie = await prisma.movie.create({ - data: { - title: title, - runtimeMins: minutes, - }, - include: { - screenings: true, - }, - }) - - return newMovie } const getMovieByTitleDb = async (title) => { From b5ae81d8133b9884db661a88c19ac5529f9ecac2 Mon Sep 17 00:00:00 2001 From: Periklis Date: Wed, 3 Jul 2024 12:37:52 +0300 Subject: [PATCH 15/31] fix an error in update movie --- src/controllers/movie.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/controllers/movie.js b/src/controllers/movie.js index b439b9dc..0482a66e 100644 --- a/src/controllers/movie.js +++ b/src/controllers/movie.js @@ -99,12 +99,6 @@ const updateMovie = async (req, res, next) => { ) } - if (existingTitle) { - throw new ExistingDataError( - "A movie with the provided title already exists" - ) - } - const updatedMovie = await updateMovieDb( reqId, updateInfo, From 3da81d5c7e441472b8d96f83a375965117b4650f Mon Sep 17 00:00:00 2001 From: Periklis Date: Wed, 3 Jul 2024 13:27:51 +0300 Subject: [PATCH 16/31] fix update movie with or without screenings --- src/controllers/customer.js | 3 +-- src/controllers/movie.js | 11 +++++------ src/domains/customer.js | 2 +- src/domains/movie.js | 10 +++++----- 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/controllers/customer.js b/src/controllers/customer.js index 8a83a27f..f1cdbaf8 100644 --- a/src/controllers/customer.js +++ b/src/controllers/customer.js @@ -40,7 +40,7 @@ const createCustomer = async (req, res) => { const updateCustomer = async (req, res, next) => { const reqId = Number(req.params.id) const updateInfo = req.body - console.log(updateInfo) + const customersList = await getAllCustomersDb() const existingCustomer = customersList.find( @@ -64,7 +64,6 @@ const updateCustomer = async (req, res, next) => { updateInfo.phone, updateInfo.email ) - console.log(updatedCustomer) res.status(201).json({ customer: updatedCustomer }) } catch (e) { console.log(e) diff --git a/src/controllers/movie.js b/src/controllers/movie.js index 0482a66e..c924f990 100644 --- a/src/controllers/movie.js +++ b/src/controllers/movie.js @@ -78,12 +78,10 @@ const getMovieById = async (req, res, next) => { const updateMovie = async (req, res, next) => { const reqId = Number(req.params.id) const updateInfo = req.body - // const screenings = updateInfo.screenings + const screenings = updateInfo.screenings + const moviesList = await getAllMoviesDb() - const existingTitle = moviesList.find( - (mv) => mv.title === updateInfo.title - ) const existingId = moviesList.find((mv) => mv.id === reqId) try { @@ -101,8 +99,9 @@ const updateMovie = async (req, res, next) => { const updatedMovie = await updateMovieDb( reqId, - updateInfo, - updateInfo.screenings + updateInfo.title, + updateInfo.runtimeMins, + screenings ) res.status(201).json({ movie: updatedMovie }) } catch (e) { diff --git a/src/domains/customer.js b/src/domains/customer.js index 83a5747d..fbc6f501 100644 --- a/src/domains/customer.js +++ b/src/domains/customer.js @@ -36,7 +36,7 @@ const updateCustomerDb = async (reqId, updateInfo, contactInfo) => { email: contactInfo.email, } } - console.log("Domain after if", updateData.contact) + const updatedCustomer = await prisma.customer.update({ where: { id: reqId, diff --git a/src/domains/movie.js b/src/domains/movie.js index 8cb76e4f..0ae4f701 100644 --- a/src/domains/movie.js +++ b/src/domains/movie.js @@ -87,15 +87,16 @@ const getMovieByIdDb = async (reqId) => { return foundMovie } -const updateMovieDb = async (reqId, updateInfo, screenings) => { +const updateMovieDb = async (reqId, title, minutes, screenings) => { + const updateData = { - title: updateInfo.title, - runtimeMins: updateInfo.minutes, + title: title, + runtimeMins: minutes, } if (screenings) { updateData.screenings = { - // deleteMany: {}, + deleteMany: {}, create: screenings.map((scr) => ({ startsAt: new Date(scr.startsAt), screen: { @@ -106,7 +107,6 @@ const updateMovieDb = async (reqId, updateInfo, screenings) => { })), } } - const movieToUpdate = await prisma.movie.update({ where: { id: reqId, From e095dc3cbd2761a86284dfacf66e296ab4fdd4c3 Mon Sep 17 00:00:00 2001 From: Periklis Date: Wed, 3 Jul 2024 14:51:53 +0300 Subject: [PATCH 17/31] fix customer update with contact info --- src/controllers/customer.js | 12 ++++++------ src/domains/customer.js | 14 +++++++++----- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/controllers/customer.js b/src/controllers/customer.js index f1cdbaf8..78c65d41 100644 --- a/src/controllers/customer.js +++ b/src/controllers/customer.js @@ -39,8 +39,8 @@ const createCustomer = async (req, res) => { const updateCustomer = async (req, res, next) => { const reqId = Number(req.params.id) - const updateInfo = req.body - + const {name, contact} = req.body + const customersList = await getAllCustomersDb() const existingCustomer = customersList.find( @@ -53,17 +53,17 @@ const updateCustomer = async (req, res, next) => { "No customer with the provided ID exists" ) } - if (!updateInfo.name) { + if (!name) { throw new MissingFieldsError( "A name must be provided in order to update the customer" ) } const updatedCustomer = await updateCustomerDb( reqId, - updateInfo.name, - updateInfo.phone, - updateInfo.email + name, + contact ) + console.log("CCC---ccc-ed", updatedCustomer) res.status(201).json({ customer: updatedCustomer }) } catch (e) { console.log(e) diff --git a/src/domains/customer.js b/src/domains/customer.js index fbc6f501..e1027467 100644 --- a/src/domains/customer.js +++ b/src/domains/customer.js @@ -26,17 +26,21 @@ const getAllCustomersDb = async () => { } const updateCustomerDb = async (reqId, updateInfo, contactInfo) => { - const updateData = { - name: updateInfo + const updateData = { + name: updateInfo, } + console.log("D-1", updateData) + console.log("D-2", contactInfo) if (contactInfo) { updateData.contact = { - phone: contactInfo.phone, - email: contactInfo.email, + update: { + phone: contactInfo.phone, + email: contactInfo.email, + }, } } - + console.log("D3", updateData) const updatedCustomer = await prisma.customer.update({ where: { id: reqId, From 04430e8ba511b18d544c7732f9484b3ac1880390 Mon Sep 17 00:00:00 2001 From: Periklis Date: Wed, 3 Jul 2024 15:03:36 +0300 Subject: [PATCH 18/31] some cleanup --- src/controllers/customer.js | 1 - src/domains/customer.js | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/controllers/customer.js b/src/controllers/customer.js index 78c65d41..0736b6ed 100644 --- a/src/controllers/customer.js +++ b/src/controllers/customer.js @@ -63,7 +63,6 @@ const updateCustomer = async (req, res, next) => { name, contact ) - console.log("CCC---ccc-ed", updatedCustomer) res.status(201).json({ customer: updatedCustomer }) } catch (e) { console.log(e) diff --git a/src/domains/customer.js b/src/domains/customer.js index e1027467..90c918a0 100644 --- a/src/domains/customer.js +++ b/src/domains/customer.js @@ -29,8 +29,6 @@ const updateCustomerDb = async (reqId, updateInfo, contactInfo) => { const updateData = { name: updateInfo, } - console.log("D-1", updateData) - console.log("D-2", contactInfo) if (contactInfo) { updateData.contact = { @@ -40,7 +38,7 @@ const updateCustomerDb = async (reqId, updateInfo, contactInfo) => { }, } } - console.log("D3", updateData) + const updatedCustomer = await prisma.customer.update({ where: { id: reqId, From db8edea50e255af75cb8271936c08d89e591cd01 Mon Sep 17 00:00:00 2001 From: Periklis Date: Wed, 3 Jul 2024 16:05:33 +0300 Subject: [PATCH 19/31] add test for filtering movies by runtime --- test/api/extensions/movie-ext.spec.js | 70 +++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 test/api/extensions/movie-ext.spec.js diff --git a/test/api/extensions/movie-ext.spec.js b/test/api/extensions/movie-ext.spec.js new file mode 100644 index 00000000..3137dd40 --- /dev/null +++ b/test/api/extensions/movie-ext.spec.js @@ -0,0 +1,70 @@ +const supertest = require("supertest") +const app = require("../../../src/server.js") +const { createMovie } = require("../../helpers/createMovie.js") +const { createScreen } = require("../../helpers/createScreen.js") + +describe("Movies endpoin", () => { + describe("GET /movies?runtimeLt", () => { + it("will get a list of movies filterd by provided_runtimeMins < runtimeLt", async () => { + await createMovie("Movie 1", 111) + await createMovie("Movie 2", 222) + await createMovie("Movie 3", 333) + + const response = await supertest(app).get( + "/movies?runtimeLt=300" + ) + + expect(response.status).toEqual(200) + expect(response.body.movies).not.toEqual(undefined) + expect(response.body.movies.length).toEqual(2) + + const [movie1, movie2] = response.body.movies + expect(movie1.title).toEqual("Movie 1") + expect(movie1.runtimeMins).toEqual(111) + expect(movie2.title).toEqual("Movie 2") + expect(movie2.runtimeMins).toEqual(222) + }) + }) + + describe("GET /movies?runtimeGt", () => { + it("will get a list of movies filterd by provided_runtimeMins > runtimeGt", async () => { + await createMovie("Movie 1", 111) + await createMovie("Movie 2", 222) + await createMovie("Movie 3", 333) + + const response = await supertest(app).get( + "/movies?runtimeGt=200" + ) + + expect(response.status).toEqual(200) + expect(response.body.movies).not.toEqual(undefined) + expect(response.body.movies.length).toEqual(2) + + const [movie1, movie2] = response.body.movies + expect(movie1.title).toEqual("Movie 2") + expect(movie1.runtimeMins).toEqual(222) + expect(movie2.title).toEqual("Movie 3") + expect(movie2.runtimeMins).toEqual(333) + }) + }) + + describe("GET /movies?runtimeLt&runtimeGt", () => { + it("will get a list of movies filterd by runtimeLt > provided_runtimeMins > runtimeGt", async () => { + await createMovie("Movie 1", 111) + await createMovie("Movie 2", 222) + await createMovie("Movie 3", 333) + + const response = await supertest(app).get( + "/movies?runtimeLt=300&runtimeGt=200" + ) + + expect(response.status).toEqual(200) + expect(response.body.movies).not.toEqual(undefined) + expect(response.body.movies.length).toEqual(1) + + const [movie1] = response.body.movies + expect(movie1.title).toEqual("Movie 2") + expect(movie1.runtimeMins).toEqual(222) + }) + }) +}) From 609c1cdd788f9dda1da23604dee303d445749ae2 Mon Sep 17 00:00:00 2001 From: Periklis Date: Wed, 3 Jul 2024 16:49:23 +0300 Subject: [PATCH 20/31] add tests for adding new movie --- test/api/extensions/movie-ext.spec.js | 91 ++++++++++++++++++++++++++- 1 file changed, 89 insertions(+), 2 deletions(-) diff --git a/test/api/extensions/movie-ext.spec.js b/test/api/extensions/movie-ext.spec.js index 3137dd40..0ec0b8ab 100644 --- a/test/api/extensions/movie-ext.spec.js +++ b/test/api/extensions/movie-ext.spec.js @@ -25,7 +25,7 @@ describe("Movies endpoin", () => { expect(movie2.runtimeMins).toEqual(222) }) }) - + describe("GET /movies?runtimeGt", () => { it("will get a list of movies filterd by provided_runtimeMins > runtimeGt", async () => { await createMovie("Movie 1", 111) @@ -47,7 +47,7 @@ describe("Movies endpoin", () => { expect(movie2.runtimeMins).toEqual(333) }) }) - + describe("GET /movies?runtimeLt&runtimeGt", () => { it("will get a list of movies filterd by runtimeLt > provided_runtimeMins > runtimeGt", async () => { await createMovie("Movie 1", 111) @@ -67,4 +67,91 @@ describe("Movies endpoin", () => { expect(movie1.runtimeMins).toEqual(222) }) }) + + describe("POST /movies", () => { + it("will add a movie with screenings if provided", async () => { + const scr1 = await createScreen(1) + + const request = { + title: "Movie 1", + runtimeMins: 111, + screenings: [ + { + movieId: 1, + screenId: scr1.id, + startsAt: "2022-06-11T18:30:00.000Z", + }, + // { + // movieId: 1, + // screenId: screen2.id, + // startsAt: "2023-06-11T18:30:00.000Z", + // }, + ], + } + + const response = await supertest(app) + .post("/movies") + .send(request) + + expect(response.status).toEqual(201) + expect(response.body.movie).not.toEqual(undefined) + expect(response.body.movie.title).toEqual("Movie 1") + expect(response.body.movie.runtimeMins).toEqual(111) + expect(response.body.movie.screenings).not.toEqual(undefined) + expect(response.body.movie.screenings.length).toEqual(1) + }) + + it("will be still able to add a movie if screenings are not provided", async () => { + const request = { + title: "Movie 1", + runtimeMins: 111, + } + + const response = await supertest(app) + .post("/movies") + .send(request) + + expect(response.status).toEqual(201) + expect(response.body.movie).not.toEqual(undefined) + expect(response.body.movie.title).toEqual("Movie 1") + expect(response.body.movie.runtimeMins).toEqual(111) + expect(response.body.movie.screenings).not.toEqual(undefined) + expect(response.body.movie.screenings.length).toEqual(0) + }) + + it("will have status 400 and return an error if the request is missing fields", async () => { + const request = { + title: "Movie 1", + } + + const response = await supertest(app) + .post("/movies") + .send(request) + + expect(response.status).toEqual(400) + expect(response.body).toHaveProperty("error") + expect(response.body.error).toEqual( + "Title and duration in minutes must be provided in order to add a movie" + ) + }) + + it("will have status 409 and return an error if adding existing movie", async () => { + const movie = await createMovie("Movie 1", 120) + + const request = { + title: "Movie 1", + runtimeMins: 111, + } + + const response = await supertest(app) + .post("/movies") + .send(request) + + expect(response.status).toEqual(409) + expect(response.body).toHaveProperty("error") + expect(response.body.error).toEqual( + "A movie with the provided title already exists" + ) + }) + }) }) From 4addcfa49d5de6dc9285d59901a6c6981ea2e2ee Mon Sep 17 00:00:00 2001 From: Periklis Date: Wed, 3 Jul 2024 19:04:47 +0300 Subject: [PATCH 21/31] add tests for updating a movie --- src/controllers/movie.js | 4 +- src/routers/movie.js | 2 +- test/api/extensions/movie-ext.spec.js | 127 +++++++++++++++++++++++++- 3 files changed, 129 insertions(+), 4 deletions(-) diff --git a/src/controllers/movie.js b/src/controllers/movie.js index c924f990..8faa977a 100644 --- a/src/controllers/movie.js +++ b/src/controllers/movie.js @@ -59,7 +59,7 @@ const createMovie = async (req, res, next) => { } const getMovieById = async (req, res, next) => { - const idOrTitle = req.params.idOrTitle + const idOrTitle = req.params.id try { const movie = await getMovieByIdDb(idOrTitle) @@ -93,7 +93,7 @@ const updateMovie = async (req, res, next) => { if (!updateInfo.title || !updateInfo.runtimeMins) { throw new MissingFieldsError( - "Title and duration in minutes must be provided in order to add a movie" + "Title and duration in minutes must be provided in order to update a movie" ) } diff --git a/src/routers/movie.js b/src/routers/movie.js index c89a6b06..4b144832 100644 --- a/src/routers/movie.js +++ b/src/routers/movie.js @@ -12,7 +12,7 @@ router.get("/", getAllMovies) router.post("/", createMovie) -router.get("/:idOrTitle", getMovieById) +router.get("/:id", getMovieById) router.put("/:id", updateMovie) diff --git a/test/api/extensions/movie-ext.spec.js b/test/api/extensions/movie-ext.spec.js index 0ec0b8ab..206b8abe 100644 --- a/test/api/extensions/movie-ext.spec.js +++ b/test/api/extensions/movie-ext.spec.js @@ -79,7 +79,7 @@ describe("Movies endpoin", () => { { movieId: 1, screenId: scr1.id, - startsAt: "2022-06-11T18:30:00.000Z", + startsAt: Date.now(), }, // { // movieId: 1, @@ -154,4 +154,129 @@ describe("Movies endpoin", () => { ) }) }) + + describe("GET /movies/:idOrTitle", () => { + it("will get a movie by title if it exists", async () => { + const screen = await createScreen(1) + const movie = await createMovie("Movie 1", 111, screen) + + const response = await supertest(app).get( + `/movies/${movie.title}` + ) + + expect(response.status).toEqual(200) + expect(response.body.movie).not.toEqual(undefined) + expect(response.body.movie.title).toEqual("Movie 1") + expect(response.body.movie.runtimeMins).toEqual(111) + expect(response.body.movie.screenings).not.toEqual(undefined) + expect(response.body.movie.screenings.length).toEqual(1) + }) + + it("will have status 404 if a movie with the provided title does not exist", async () => { + const movie = await createMovie("Movie 1", 111) + + const response = await supertest(app).get("/movies/WrongTitle") + + expect(response.status).toEqual(404) + expect(response.body).toHaveProperty("error") + expect(response.body.error).toEqual( + "No movie with the provided id or title exists" + ) + }) + + it("will have status 404 if a movie with the provided id does not exist", async () => { + const movie = await createMovie("Movie 1", 111) + + const response = await supertest(app).get("/movies/11111") + + expect(response.status).toEqual(404) + expect(response.body).toHaveProperty("error") + expect(response.body.error).toEqual( + "No movie with the provided id or title exists" + ) + }) + }) + + describe("PUT /movies/:id", () => { + it("will update a movie by id and add screenings if provided", async () => { + const scr1 = await createScreen(1) + const scr2 = await createScreen(2) + const movie = await createMovie("Movie 1", 123, scr1) + + const request = { + title: "Movie 2", + runtimeMins: 111, + screenings: [ + { + screenId: scr2.id, + startsAt: Date.now(), + }, + ], + } + + const response = await supertest(app) + .put(`/movies/${movie.id}`) + .send(request) + + expect(response.status).toEqual(201) + expect(response.body.movie).not.toEqual(undefined) + expect(response.body.movie.title).toEqual("Movie 2") + expect(response.body.movie.runtimeMins).toEqual(111) + expect(response.body.movie.screenings).not.toEqual(undefined) + expect(response.body.movie.screenings.length).toEqual(1) + }) + + it("will have status 404 if trying to update a non existing movie", async () => { + const scr1 = await createScreen(1) + const scr2 = await createScreen(2) + const movie = await createMovie("Movie 1", 123, scr1) + + const request = { + title: "Movie 2", + runtimeMins: 111, + screenings: [ + { + screenId: scr2.id, + startsAt: Date.now(), + }, + ], + } + + const response = await supertest(app) + .put(`/movies/3`) + .send(request) + + expect(response.status).toEqual(404) + expect(response.body).toHaveProperty("error") + expect(response.body.error).toEqual( + "No movie with the provided ID exists" + ) + }) + + it("will return 400 and return an error if the request is missing fields", async () => { + const scr1 = await createScreen(1) + const scr2 = await createScreen(2) + const movie = await createMovie("Movie 1", 123, scr1) + + const request = { + title: "Movie 2", + screenings: [ + { + screenId: scr2.id, + startsAt: Date.now(), + }, + ], + } + + const response = await supertest(app) + .put(`/movies/${movie.id}`) + .send(request) + + expect(response.status).toEqual(400) + expect(response.body).toHaveProperty("error") + expect(response.body.error).toEqual( + "Title and duration in minutes must be provided in order to update a movie" + ) + }) + }) }) From 8b9b8b0893b6118d69240a86c02ebe2f0ee92974 Mon Sep 17 00:00:00 2001 From: Periklis Date: Thu, 4 Jul 2024 04:49:03 +0300 Subject: [PATCH 22/31] add get only future startsAt movies -test for filtering by minutes fails --- prisma/schema.prisma | 2 ++ src/controllers/movie.js | 13 +++++-------- src/domains/movie.js | 12 +++++++++--- test/api/extensions/movie-ext.spec.js | 13 +++++++------ 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index dd9b27f1..d1430d08 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -68,3 +68,5 @@ model Ticket { createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } + + diff --git a/src/controllers/movie.js b/src/controllers/movie.js index 8faa977a..3344f087 100644 --- a/src/controllers/movie.js +++ b/src/controllers/movie.js @@ -4,7 +4,6 @@ const { getMovieByIdDb, createMovieDb, updateMovieDb, - getMovieByTitleDb, } = require("../domains/movie") const { @@ -31,10 +30,9 @@ const createMovie = async (req, res, next) => { ) } - const moviesList = await getAllMoviesDb() - const existingMovie = moviesList.find((mv) => mv.title === title) - - if (existingMovie) { + const moviesList = await getMovieByIdDb(title) + + if (moviesList) { throw new ExistingDataError( "A movie with the provided title already exists" ) @@ -81,11 +79,10 @@ const updateMovie = async (req, res, next) => { const screenings = updateInfo.screenings - const moviesList = await getAllMoviesDb() - const existingId = moviesList.find((mv) => mv.id === reqId) + const moviesList = await getMovieByIdDb(reqId) try { - if (!existingId) { + if (!moviesList) { throw new DataNotFoundError( "No movie with the provided ID exists" ) diff --git a/src/domains/movie.js b/src/domains/movie.js index 0ae4f701..1c622cd6 100644 --- a/src/domains/movie.js +++ b/src/domains/movie.js @@ -2,6 +2,8 @@ const prisma = require("../utils/prisma") const getAllMoviesDb = async (runtimeLt, runtimeGt) => { const filterRuntimes = {} + const now = new Date() + if (runtimeLt) { filterRuntimes.lt = Number(runtimeLt) @@ -15,6 +17,11 @@ const getAllMoviesDb = async (runtimeLt, runtimeGt) => { runtimeMins: Object.keys(filterRuntimes).length ? filterRuntimes : undefined, + screenings: { + some: { + startsAt: { gt: now }, + }, + }, }, include: { screenings: true, @@ -42,7 +49,6 @@ const createMovieDb = async (title, minutes, screenings) => { }) return newMovie } else { - const newMovie = await prisma.movie.create({ data: { title: title, @@ -52,7 +58,7 @@ const createMovieDb = async (title, minutes, screenings) => { screenings: true, }, }) - + return newMovie } } @@ -71,6 +77,7 @@ const getMovieByTitleDb = async (title) => { const getMovieByIdDb = async (reqId) => { const reqType = Number(reqId) + console.log(reqType); if (isNaN(reqType)) { return await getMovieByTitleDb(reqId) @@ -88,7 +95,6 @@ const getMovieByIdDb = async (reqId) => { } const updateMovieDb = async (reqId, title, minutes, screenings) => { - const updateData = { title: title, runtimeMins: minutes, diff --git a/test/api/extensions/movie-ext.spec.js b/test/api/extensions/movie-ext.spec.js index 206b8abe..d11055d0 100644 --- a/test/api/extensions/movie-ext.spec.js +++ b/test/api/extensions/movie-ext.spec.js @@ -71,6 +71,7 @@ describe("Movies endpoin", () => { describe("POST /movies", () => { it("will add a movie with screenings if provided", async () => { const scr1 = await createScreen(1) + const scr2 = await createScreen(2) const request = { title: "Movie 1", @@ -81,11 +82,11 @@ describe("Movies endpoin", () => { screenId: scr1.id, startsAt: Date.now(), }, - // { - // movieId: 1, - // screenId: screen2.id, - // startsAt: "2023-06-11T18:30:00.000Z", - // }, + { + movieId: 1, + screenId: scr2.id, + startsAt: Date.now() //"2023-06-11T18:30:00.000Z", + }, ], } @@ -98,7 +99,7 @@ describe("Movies endpoin", () => { expect(response.body.movie.title).toEqual("Movie 1") expect(response.body.movie.runtimeMins).toEqual(111) expect(response.body.movie.screenings).not.toEqual(undefined) - expect(response.body.movie.screenings.length).toEqual(1) + expect(response.body.movie.screenings.length).toEqual(2) }) it("will be still able to add a movie if screenings are not provided", async () => { From 814d186dd970572e35bb806d63a39e6c54978f72 Mon Sep 17 00:00:00 2001 From: Periklis Date: Thu, 4 Jul 2024 12:35:29 +0300 Subject: [PATCH 23/31] tests pass not sure about my solution for get all --- src/domains/movie.js | 3 +-- test/api/extensions/movie-ext.spec.js | 5 +++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/domains/movie.js b/src/domains/movie.js index 1c622cd6..6d24784b 100644 --- a/src/domains/movie.js +++ b/src/domains/movie.js @@ -18,7 +18,7 @@ const getAllMoviesDb = async (runtimeLt, runtimeGt) => { ? filterRuntimes : undefined, screenings: { - some: { + every: { startsAt: { gt: now }, }, }, @@ -77,7 +77,6 @@ const getMovieByTitleDb = async (title) => { const getMovieByIdDb = async (reqId) => { const reqType = Number(reqId) - console.log(reqType); if (isNaN(reqType)) { return await getMovieByTitleDb(reqId) diff --git a/test/api/extensions/movie-ext.spec.js b/test/api/extensions/movie-ext.spec.js index d11055d0..fc5a72b4 100644 --- a/test/api/extensions/movie-ext.spec.js +++ b/test/api/extensions/movie-ext.spec.js @@ -14,6 +14,7 @@ describe("Movies endpoin", () => { "/movies?runtimeLt=300" ) + console.log(response.body) expect(response.status).toEqual(200) expect(response.body.movies).not.toEqual(undefined) expect(response.body.movies.length).toEqual(2) @@ -57,7 +58,7 @@ describe("Movies endpoin", () => { const response = await supertest(app).get( "/movies?runtimeLt=300&runtimeGt=200" ) - + expect(response.status).toEqual(200) expect(response.body.movies).not.toEqual(undefined) expect(response.body.movies.length).toEqual(1) @@ -85,7 +86,7 @@ describe("Movies endpoin", () => { { movieId: 1, screenId: scr2.id, - startsAt: Date.now() //"2023-06-11T18:30:00.000Z", + startsAt: Date.now(), //"2023-06-11T18:30:00.000Z", }, ], } From 5e1a2e7c0da31ea8dfa55510d0373fd4c0b10ab5 Mon Sep 17 00:00:00 2001 From: Periklis Date: Thu, 4 Jul 2024 13:45:37 +0300 Subject: [PATCH 24/31] remove try-catch from controllers after installing -express-async-errors --- package-lock.json | 9 ++++ package.json | 1 + src/controllers/customer.js | 32 +++++---------- src/controllers/movie.js | 59 ++++++++++----------------- src/controllers/screen.js | 39 ++++++++---------- src/domains/movie.js | 2 +- src/server.js | 1 + test/api/extensions/movie-ext.spec.js | 32 +++++++++------ test/helpers/createMovie.js | 2 +- 9 files changed, 83 insertions(+), 94 deletions(-) diff --git a/package-lock.json b/package-lock.json index 466f0d11..dcdde761 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "cors": "^2.8.5", "dotenv": "^16.3.1", "express": "^4.18.2", + "express-async-errors": "^3.1.1", "morgan": "^1.10.0" }, "devDependencies": { @@ -2146,6 +2147,14 @@ "node": ">= 0.10.0" } }, + "node_modules/express-async-errors": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/express-async-errors/-/express-async-errors-3.1.1.tgz", + "integrity": "sha512-h6aK1da4tpqWSbyCa3FxB/V6Ehd4EEB15zyQq9qe75OZBp0krinNKuH4rAY+S/U/2I36vdLAUFSjQJ+TFmODng==", + "peerDependencies": { + "express": "^4.16.2" + } + }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", diff --git a/package.json b/package.json index ebaf03be..35df3710 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "cors": "^2.8.5", "dotenv": "^16.3.1", "express": "^4.18.2", + "express-async-errors": "^3.1.1", "morgan": "^1.10.0" } } diff --git a/src/controllers/customer.js b/src/controllers/customer.js index 0736b6ed..8718c014 100644 --- a/src/controllers/customer.js +++ b/src/controllers/customer.js @@ -39,35 +39,25 @@ const createCustomer = async (req, res) => { const updateCustomer = async (req, res, next) => { const reqId = Number(req.params.id) - const {name, contact} = req.body - + const { name, contact } = req.body const customersList = await getAllCustomersDb() const existingCustomer = customersList.find( (cus) => cus.id === reqId ) - try { - if (!existingCustomer) { - throw new DataNotFoundError( - "No customer with the provided ID exists" - ) - } - if (!name) { - throw new MissingFieldsError( - "A name must be provided in order to update the customer" - ) - } - const updatedCustomer = await updateCustomerDb( - reqId, - name, - contact + if (!existingCustomer) { + throw new DataNotFoundError( + "No customer with the provided ID exists" + ) + } + if (!name) { + throw new MissingFieldsError( + "A name must be provided in order to update the customer" ) - res.status(201).json({ customer: updatedCustomer }) - } catch (e) { - console.log(e) - next(e) } + const updatedCustomer = await updateCustomerDb(reqId, name, contact) + res.status(201).json({ customer: updatedCustomer }) } const getAllCustomers = async (req, res) => { diff --git a/src/controllers/movie.js b/src/controllers/movie.js index 3344f087..3ae1f327 100644 --- a/src/controllers/movie.js +++ b/src/controllers/movie.js @@ -23,43 +23,37 @@ const getAllMovies = async (req, res) => { const createMovie = async (req, res, next) => { const { title, runtimeMins, screenings } = req.body - try { - if (!title || !runtimeMins) { - throw new MissingFieldsError( - "Title and duration in minutes must be provided in order to add a movie" - ) - } + if (!title || !runtimeMins) { + throw new MissingFieldsError( + "Title and duration in minutes must be provided in order to add a movie" + ) + } - const moviesList = await getMovieByIdDb(title) - - if (moviesList) { - throw new ExistingDataError( - "A movie with the provided title already exists" - ) - } + const moviesList = await getMovieByIdDb(title) - if (screenings) { - const createdMovie = await createMovieDb( - title, - runtimeMins, - screenings - ) - res.status(201).json({ movie: createdMovie }) - return - } + if (moviesList) { + throw new ExistingDataError( + "A movie with the provided title already exists" + ) + } - const createdMovie = await createMovieDb(title, runtimeMins) + if (screenings) { + const createdMovie = await createMovieDb( + title, + runtimeMins, + screenings + ) res.status(201).json({ movie: createdMovie }) - } catch (e) { - console.log(e) - next(e) + return } + + const createdMovie = await createMovieDb(title, runtimeMins) + res.status(201).json({ movie: createdMovie }) } const getMovieById = async (req, res, next) => { const idOrTitle = req.params.id - try { const movie = await getMovieByIdDb(idOrTitle) if (!movie) { throw new DataNotFoundError( @@ -67,10 +61,7 @@ const getMovieById = async (req, res, next) => { ) } res.status(200).json({ movie: movie }) - } catch (e) { - console.log(e) - next(e) - } + } const updateMovie = async (req, res, next) => { @@ -78,10 +69,8 @@ const updateMovie = async (req, res, next) => { const updateInfo = req.body const screenings = updateInfo.screenings - const moviesList = await getMovieByIdDb(reqId) - try { if (!moviesList) { throw new DataNotFoundError( "No movie with the provided ID exists" @@ -101,10 +90,6 @@ const updateMovie = async (req, res, next) => { screenings ) res.status(201).json({ movie: updatedMovie }) - } catch (e) { - console.log(e) - next(e) - } } module.exports = { diff --git a/src/controllers/screen.js b/src/controllers/screen.js index cbb916bc..1397bb3d 100644 --- a/src/controllers/screen.js +++ b/src/controllers/screen.js @@ -12,32 +12,27 @@ const { const createScreen = async (req, res, next) => { const screnToAdd = req.body - try { - if (!screnToAdd.number) { - throw new MissingFieldsError( - "Number must be provided in order to add a screen" - ) - } - - const screensList = await getAllScreensDb() - const existingScreen = screensList.find( - (scr) => scr.number === screnToAdd.number + if (!screnToAdd.number) { + throw new MissingFieldsError( + "Number must be provided in order to add a screen" ) + } + + const screensList = await getAllScreensDb() + const existingScreen = screensList.find( + (scr) => scr.number === screnToAdd.number + ) - if (existingScreen) { - throw new ExistingDataError( - "A screen with the provided number already exists" - ) - } - const createScreen = await createScreenDB( - screnToAdd.number, - screnToAdd.screenings + if (existingScreen) { + throw new ExistingDataError( + "A screen with the provided number already exists" ) - res.status(201).json({ screen: createScreen }) - } catch (e) { - console.log(e) - next(e) } + const createScreen = await createScreenDB( + screnToAdd.number, + screnToAdd.screenings + ) + res.status(201).json({ screen: createScreen }) } const getAllScreens = async (req, res) => { diff --git a/src/domains/movie.js b/src/domains/movie.js index 6d24784b..b5e133a6 100644 --- a/src/domains/movie.js +++ b/src/domains/movie.js @@ -18,7 +18,7 @@ const getAllMoviesDb = async (runtimeLt, runtimeGt) => { ? filterRuntimes : undefined, screenings: { - every: { + some: { startsAt: { gt: now }, }, }, diff --git a/src/server.js b/src/server.js index 459ef08a..2c845c66 100644 --- a/src/server.js +++ b/src/server.js @@ -1,4 +1,5 @@ const express = require("express") +require("express-async-errors") const app = express() const cors = require("cors") diff --git a/test/api/extensions/movie-ext.spec.js b/test/api/extensions/movie-ext.spec.js index fc5a72b4..9e772c34 100644 --- a/test/api/extensions/movie-ext.spec.js +++ b/test/api/extensions/movie-ext.spec.js @@ -3,12 +3,15 @@ const app = require("../../../src/server.js") const { createMovie } = require("../../helpers/createMovie.js") const { createScreen } = require("../../helpers/createScreen.js") -describe("Movies endpoin", () => { +describe("Movies endpoint", () => { describe("GET /movies?runtimeLt", () => { it("will get a list of movies filterd by provided_runtimeMins < runtimeLt", async () => { - await createMovie("Movie 1", 111) - await createMovie("Movie 2", 222) - await createMovie("Movie 3", 333) + const scr1 = await createScreen(1) + const scr2 = await createScreen(2) + const scr3 = await createScreen(3) + await createMovie("Movie 1", 111, scr1) + await createMovie("Movie 2", 222, scr2) + await createMovie("Movie 3", 333, scr3) const response = await supertest(app).get( "/movies?runtimeLt=300" @@ -29,9 +32,12 @@ describe("Movies endpoin", () => { describe("GET /movies?runtimeGt", () => { it("will get a list of movies filterd by provided_runtimeMins > runtimeGt", async () => { - await createMovie("Movie 1", 111) - await createMovie("Movie 2", 222) - await createMovie("Movie 3", 333) + const scr1 = await createScreen(1) + const scr2 = await createScreen(2) + const scr3 = await createScreen(3) + await createMovie("Movie 1", 111, scr1) + await createMovie("Movie 2", 222, scr2) + await createMovie("Movie 3", 333, scr3) const response = await supertest(app).get( "/movies?runtimeGt=200" @@ -51,14 +57,16 @@ describe("Movies endpoin", () => { describe("GET /movies?runtimeLt&runtimeGt", () => { it("will get a list of movies filterd by runtimeLt > provided_runtimeMins > runtimeGt", async () => { - await createMovie("Movie 1", 111) - await createMovie("Movie 2", 222) - await createMovie("Movie 3", 333) - + const scr1 = await createScreen(1) + const scr2 = await createScreen(2) + const scr3 = await createScreen(3) + await createMovie("Movie 1", 111, scr1) + await createMovie("Movie 2", 222, scr2) + await createMovie("Movie 3", 333, scr3) const response = await supertest(app).get( "/movies?runtimeLt=300&runtimeGt=200" ) - + expect(response.status).toEqual(200) expect(response.body.movies).not.toEqual(undefined) expect(response.body.movies.length).toEqual(1) diff --git a/test/helpers/createMovie.js b/test/helpers/createMovie.js index 06903fea..2e97e65b 100644 --- a/test/helpers/createMovie.js +++ b/test/helpers/createMovie.js @@ -15,7 +15,7 @@ const createMovie = async (title, runtimeMins, screen = null) => { movieData.data.screenings = { create: [ { - startsAt: "2022-06-11T18:30:00.000Z", + startsAt: "2025-06-11T18:30:00.000Z", screenId: screen.id } ] From 6c162d88aa487b78fa025bce206b03c4b9c5d1d9 Mon Sep 17 00:00:00 2001 From: Periklis Date: Thu, 4 Jul 2024 17:43:09 +0300 Subject: [PATCH 25/31] add tests for screen --- test/api/extensions/screen-ext.spec.js | 63 ++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 test/api/extensions/screen-ext.spec.js diff --git a/test/api/extensions/screen-ext.spec.js b/test/api/extensions/screen-ext.spec.js new file mode 100644 index 00000000..143e7497 --- /dev/null +++ b/test/api/extensions/screen-ext.spec.js @@ -0,0 +1,63 @@ +const supertest = require("supertest") +const app = require("../../../src/server.js") +const { createMovie } = require("../../helpers/createMovie") +const { createScreen } = require("../../helpers/createScreen.js") + +describe("Screen Endpoint", () => { + describe("POST /screens", () => { + it("will create screenings for a movie if provided in the request", async () => { + const movie1 = await createMovie("Movie 1", 111) + const movie2 = await createMovie("Movie 2", 222) + + const request = { + number: 10, + screenings: [ + { + movieId: movie1.id, + startsAt: Date.now()", + }, + { + movieId: movie2.id, + startsAt: Date.now(), + }, + ], + } + + const response = await supertest(app) + .post("/screens") + .send(request) + + expect(response.status).toEqual(201) + expect(response.body.screen).not.toEqual(undefined) + expect(response.body.screen.number).toEqual(10) + expect(response.body.screen.screenings).not.toEqual(undefined) + expect(response.body.screen.screenings.length).toEqual(2) + }) + + it("will have status 400 and return an error if the request is missing fields", async () => { + const request = {} + + const response = await supertest(app) + .post("/movies") + .send(request) + + expect(response.status).toEqual(400) + expect(response.body).toHaveProperty("error") + }) + + it("will have status 409 and return an error if adding existing movie", async () => { + const screen = await createScreen(1) + + const request = { + number: screen.number, + } + + const response = await supertest(app) + .post("/screens") + .send(request) + + expect(response.status).toEqual(409) + expect(response.body).toHaveProperty("error") + }) + }) +}) From 50bbec75da77dbbd794d1d2ae3c89fad11b9f95e Mon Sep 17 00:00:00 2001 From: Periklis Date: Thu, 4 Jul 2024 18:03:21 +0300 Subject: [PATCH 26/31] add revie prisma model --- prisma/schema.prisma | 79 +++++++++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 34 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index d1430d08..be2baa51 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -12,22 +12,23 @@ datasource db { // https://www.prisma.io/docs/concepts/components/prisma-schema/data-model model Customer { - id Int @id @default(autoincrement()) - name String - contact Contact? - tickets Ticket[] - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + id Int @id @default(autoincrement()) + name String + contact Contact? + tickets Ticket[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + Review Review[] } model Contact { - id Int @id @default(autoincrement()) - customer Customer @relation(fields: [customerId], references: [id]) - customerId Int @unique - phone String - email String @unique - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + id Int @id @default(autoincrement()) + customer Customer @relation(fields: [customerId], references: [id]) + customerId Int @unique + phone String + email String @unique + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt } model Movie { @@ -37,36 +38,46 @@ model Movie { runtimeMins Int createdAt DateTime @default(now()) updatedAt DateTime @updatedAt + Review Review[] } model Screen { - id Int @id @default(autoincrement()) - number Int - screenings Screening[] - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt + id Int @id @default(autoincrement()) + number Int + screenings Screening[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt } model Screening { + id Int @id @default(autoincrement()) + tickets Ticket[] + movie Movie @relation(fields: [movieId], references: [id]) + movieId Int + screen Screen @relation(fields: [screenId], references: [id]) + screenId Int + startsAt DateTime + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model Ticket { id Int @id @default(autoincrement()) - tickets Ticket[] - movie Movie @relation(fields: [movieId], references: [id]) - movieId Int - screen Screen @relation(fields: [screenId], references: [id]) - screenId Int - startsAt DateTime + screening Screening @relation(fields: [screeningId], references: [id]) + screeningId Int + customer Customer @relation(fields: [customerId], references: [id]) + customerId Int createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } -model Ticket { - id Int @id @default(autoincrement()) - screening Screening @relation(fields: [screeningId], references: [id]) - screeningId Int - customer Customer @relation(fields: [customerId], references: [id]) - customerId Int - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt +model Review { + id Int @id @default(autoincrement()) + customer Customer @relation(fields: [customerId], references: [id]) + customerId Int + movie Movie @relation(fields: [movieId], references: [id]) + movieId Int + content String @db.VarChar(255) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt } - - From 06f8d95aa58ba63f4a982e535e414247cf99937c Mon Sep 17 00:00:00 2001 From: Periklis Date: Thu, 4 Jul 2024 18:23:28 +0300 Subject: [PATCH 27/31] add seed function for review --- .../20240704151358_add_reviews/migration.sql | 17 +++++++++++++ prisma/seed.js | 24 +++++++++++++++++++ src/controllers/review.js | 0 src/domains/review.js | 0 src/routers/review.js | 0 5 files changed, 41 insertions(+) create mode 100644 prisma/migrations/20240704151358_add_reviews/migration.sql create mode 100644 src/controllers/review.js create mode 100644 src/domains/review.js create mode 100644 src/routers/review.js diff --git a/prisma/migrations/20240704151358_add_reviews/migration.sql b/prisma/migrations/20240704151358_add_reviews/migration.sql new file mode 100644 index 00000000..451da56a --- /dev/null +++ b/prisma/migrations/20240704151358_add_reviews/migration.sql @@ -0,0 +1,17 @@ +-- CreateTable +CREATE TABLE "Review" ( + "id" SERIAL NOT NULL, + "customerId" INTEGER NOT NULL, + "movieId" INTEGER NOT NULL, + "content" VARCHAR(255) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Review_pkey" PRIMARY KEY ("id") +); + +-- AddForeignKey +ALTER TABLE "Review" ADD CONSTRAINT "Review_customerId_fkey" FOREIGN KEY ("customerId") REFERENCES "Customer"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Review" ADD CONSTRAINT "Review_movieId_fkey" FOREIGN KEY ("movieId") REFERENCES "Movie"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/seed.js b/prisma/seed.js index 31e28bfa..1fb680ee 100644 --- a/prisma/seed.js +++ b/prisma/seed.js @@ -97,6 +97,30 @@ async function createScreenings(screens, movies) { } } +async function createReviews(customers, movies) { + for (const customer of customers) { + for (let i = 0; i < movies.length; i++) { + const review = await prisma.review.create({ + data: { + content: "Lorem ipsum great movie", + movie: { + connect: { + id: movies[i].id, + }, + }, + customer: { + connect: { + id: customer.id, + }, + }, + }, + }) + + console.log("Reviews created", review) + } + } +} + seed() .catch(async e => { console.error(e); diff --git a/src/controllers/review.js b/src/controllers/review.js new file mode 100644 index 00000000..e69de29b diff --git a/src/domains/review.js b/src/domains/review.js new file mode 100644 index 00000000..e69de29b diff --git a/src/routers/review.js b/src/routers/review.js new file mode 100644 index 00000000..e69de29b From 2cc94c5418e93450c6c61689ac85541504baf011 Mon Sep 17 00:00:00 2001 From: Periklis Date: Thu, 4 Jul 2024 18:57:57 +0300 Subject: [PATCH 28/31] add get and post for reviews --- src/controllers/customer.js | 2 +- src/controllers/movie.js | 6 +++--- src/controllers/review.js | 30 ++++++++++++++++++++++++++ src/controllers/screen.js | 3 +-- src/controllers/ticket.js | 9 ++------ src/domains/review.js | 19 ++++++++++++++++ src/routers/review.js | 10 +++++++++ src/server.js | 2 ++ test/api/extensions/screen-ext.spec.js | 2 +- 9 files changed, 69 insertions(+), 14 deletions(-) diff --git a/src/controllers/customer.js b/src/controllers/customer.js index 8718c014..cea4391c 100644 --- a/src/controllers/customer.js +++ b/src/controllers/customer.js @@ -37,7 +37,7 @@ const createCustomer = async (req, res) => { } } -const updateCustomer = async (req, res, next) => { +const updateCustomer = async (req, res) => { const reqId = Number(req.params.id) const { name, contact } = req.body diff --git a/src/controllers/movie.js b/src/controllers/movie.js index 3ae1f327..76a214da 100644 --- a/src/controllers/movie.js +++ b/src/controllers/movie.js @@ -20,7 +20,7 @@ const getAllMovies = async (req, res) => { res.status(200).json({ movies: allMovies }) } -const createMovie = async (req, res, next) => { +const createMovie = async (req, res) => { const { title, runtimeMins, screenings } = req.body if (!title || !runtimeMins) { @@ -51,7 +51,7 @@ const createMovie = async (req, res, next) => { res.status(201).json({ movie: createdMovie }) } -const getMovieById = async (req, res, next) => { +const getMovieById = async (req, res) => { const idOrTitle = req.params.id const movie = await getMovieByIdDb(idOrTitle) @@ -64,7 +64,7 @@ const getMovieById = async (req, res, next) => { } -const updateMovie = async (req, res, next) => { +const updateMovie = async (req, res) => { const reqId = Number(req.params.id) const updateInfo = req.body const screenings = updateInfo.screenings diff --git a/src/controllers/review.js b/src/controllers/review.js index e69de29b..7eaa59a1 100644 --- a/src/controllers/review.js +++ b/src/controllers/review.js @@ -0,0 +1,30 @@ +const { PrismaClientKnownRequestError } = require("@prisma/client") +const { + createReviewDb, + getAllreviewsDb, +} = require("../domains/review") + +const { MissingFieldsError } = require("../errors/errors") + +const getAllReviews = async (req, res) => { + const allReviews = await getAllreviewsDb() + res.status(200).json({reviews: allReviews}) +} + +const createReview = async (req, res) => { + const { movieId, customerId, content } = req.body + + if (!movieId || !customerId || !content) { + throw new MissingFieldsError( + "Movie ID, Customer ID and the review text, must be provided in order to add a review" + ) + } + + const review = await createReviewDb(movieId, customerId, content) + res.status(201).json({ review: review }) +} + +module.exports = { + createReview, + getAllReviews, +} diff --git a/src/controllers/screen.js b/src/controllers/screen.js index 1397bb3d..8f452763 100644 --- a/src/controllers/screen.js +++ b/src/controllers/screen.js @@ -6,10 +6,9 @@ const { const { MissingFieldsError, ExistingDataError, - DataNotFoundError, } = require("../errors/errors") -const createScreen = async (req, res, next) => { +const createScreen = async (req, res) => { const screnToAdd = req.body if (!screnToAdd.number) { diff --git a/src/controllers/ticket.js b/src/controllers/ticket.js index e07de635..fda173f5 100644 --- a/src/controllers/ticket.js +++ b/src/controllers/ticket.js @@ -5,11 +5,10 @@ const { getAllScreeningsDb } = require('../domains/screening') const { MissingFieldsError, - ExistingDataError, DataNotFoundError, } = require("../errors/errors") -const createTicket = async (req, res, next) => { +const createTicket = async (req, res) => { const { screeningId, customerId } = req.body const customers = await getAllCustomersDb() @@ -17,7 +16,7 @@ const createTicket = async (req, res, next) => { const screenings = await getAllScreeningsDb() const existingScreening = screenings.find(scr => scr.id === screeningId) - try { + if (!screeningId || !customerId) { throw new MissingFieldsError( "Screening and Customer ID must be provided in order to create a ticket" @@ -31,10 +30,6 @@ const createTicket = async (req, res, next) => { } const newTicket = await createTicketDB(screeningId, customerId) res.status(201).json({ ticket: newTicket }) - } catch (e) { - console.log(e) - next(e) - } } module.exports = { createTicket } diff --git a/src/domains/review.js b/src/domains/review.js index e69de29b..e54196c0 100644 --- a/src/domains/review.js +++ b/src/domains/review.js @@ -0,0 +1,19 @@ +const prisma = require("../utils/prisma") + +const createReviewDb = async (movieId, customerId, content) => { + const review = await prisma.review.create({ + data: { + movieId: movieId, + customerId: customerId, + content: content, + }, + }) + return review +} + +const getAllreviewsDb = async () => { + const getAllReviews = await prisma.review.findMany() + return getAllReviews +} + +module.exports = { createReviewDb, getAllreviewsDb } diff --git a/src/routers/review.js b/src/routers/review.js index e69de29b..835af396 100644 --- a/src/routers/review.js +++ b/src/routers/review.js @@ -0,0 +1,10 @@ +const express = require("express") +const { createReview, getAllReviews } = require('../controllers/review') + +const router = express.Router() + +router.get('/', getAllReviews) + +router.post('/', createReview) + +module.exports = router \ No newline at end of file diff --git a/src/server.js b/src/server.js index 2c845c66..b5b17ab6 100644 --- a/src/server.js +++ b/src/server.js @@ -19,6 +19,7 @@ const moviesRouter = require("./routers/movie") const screensRouter = require("./routers/screen") const ticketsRouter = require('./routers/ticket') const screeningsRouter = require('./routers/screening') +const reviewsRouter = require('./routers/review.js') const { MissingFieldsError, @@ -31,6 +32,7 @@ app.use("/movies", moviesRouter) app.use("/screens", screensRouter) app.use("/tickets", ticketsRouter) app.use('/screenings', screeningsRouter) +app.use('/reviews', reviewsRouter) app.use((error, req, res, next) => { if (error instanceof MissingFieldsError) { diff --git a/test/api/extensions/screen-ext.spec.js b/test/api/extensions/screen-ext.spec.js index 143e7497..ffc11962 100644 --- a/test/api/extensions/screen-ext.spec.js +++ b/test/api/extensions/screen-ext.spec.js @@ -14,7 +14,7 @@ describe("Screen Endpoint", () => { screenings: [ { movieId: movie1.id, - startsAt: Date.now()", + startsAt: Date.now(), }, { movieId: movie2.id, From 146f1fe1f98550d311c8a332f0395fffe9de31a2 Mon Sep 17 00:00:00 2001 From: Periklis Date: Fri, 5 Jul 2024 00:48:02 +0300 Subject: [PATCH 29/31] add get review by movie title --- .../migration.sql | 1 + prisma/schema.prisma | 4 +-- src/controllers/review.js | 27 ++++++++++++++++--- src/domains/review.js | 22 +++++++++++++-- src/routers/review.js | 9 ++++++- 5 files changed, 55 insertions(+), 8 deletions(-) create mode 100644 prisma/migrations/20240704172759_reviews_corrections/migration.sql diff --git a/prisma/migrations/20240704172759_reviews_corrections/migration.sql b/prisma/migrations/20240704172759_reviews_corrections/migration.sql new file mode 100644 index 00000000..af5102c8 --- /dev/null +++ b/prisma/migrations/20240704172759_reviews_corrections/migration.sql @@ -0,0 +1 @@ +-- This is an empty migration. \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma index be2baa51..df2d22ee 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -18,7 +18,7 @@ model Customer { tickets Ticket[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt - Review Review[] + review Review[] } model Contact { @@ -38,7 +38,7 @@ model Movie { runtimeMins Int createdAt DateTime @default(now()) updatedAt DateTime @updatedAt - Review Review[] + review Review[] } model Screen { diff --git a/src/controllers/review.js b/src/controllers/review.js index 7eaa59a1..0d5f6c77 100644 --- a/src/controllers/review.js +++ b/src/controllers/review.js @@ -2,13 +2,19 @@ const { PrismaClientKnownRequestError } = require("@prisma/client") const { createReviewDb, getAllreviewsDb, + getReviewsByMovieTitleDb, } = require("../domains/review") +const { getMovieByIdDb } = require("../domains/movie") +const { getMovieById } = require("../controllers/movie") -const { MissingFieldsError } = require("../errors/errors") +const { + MissingFieldsError, + DataNotFoundError, +} = require("../errors/errors") const getAllReviews = async (req, res) => { - const allReviews = await getAllreviewsDb() - res.status(200).json({reviews: allReviews}) + const allReviews = await getAllreviewsDb() + res.status(200).json({ reviews: allReviews }) } const createReview = async (req, res) => { @@ -24,7 +30,22 @@ const createReview = async (req, res) => { res.status(201).json({ review: review }) } +const getReviewsByMovieTitle = async (req, res) => { + const { idOrTitle } = req.params + const movie = await getMovieByIdDb(idOrTitle) + + if (!movie) { + throw new DataNotFoundError( + "No movie with the provided title exists" + ) + } + + const movieReviews = await getReviewsByMovieTitleDb(idOrTitle) + res.status(200).json({ reviews: movieReviews }) +} + module.exports = { createReview, getAllReviews, + getReviewsByMovieTitle, } diff --git a/src/domains/review.js b/src/domains/review.js index e54196c0..6969e0d3 100644 --- a/src/domains/review.js +++ b/src/domains/review.js @@ -12,8 +12,26 @@ const createReviewDb = async (movieId, customerId, content) => { } const getAllreviewsDb = async () => { - const getAllReviews = await prisma.review.findMany() + const getAllReviews = await prisma.review.findMany({ + include: { + movie: true, + } + }) return getAllReviews } -module.exports = { createReviewDb, getAllreviewsDb } + +const getReviewsByMovieTitleDb = async (title) => { + console.log(title); + const getReviewsForMovie = await prisma.review.findFirst({ + where: { + movie: { + title: title, + }, + }, + }) + return getReviewsForMovie +} + + +module.exports = { createReviewDb, getAllreviewsDb, getReviewsByMovieTitleDb } diff --git a/src/routers/review.js b/src/routers/review.js index 835af396..7e0c246f 100644 --- a/src/routers/review.js +++ b/src/routers/review.js @@ -1,10 +1,17 @@ const express = require("express") -const { createReview, getAllReviews } = require('../controllers/review') +const { + createReview, + getAllReviews, + getReviewsByMovieTitle, +} = require("../controllers/review") const router = express.Router() router.get('/', getAllReviews) +router.get('/:idOrTitle', getReviewsByMovieTitle) + router.post('/', createReview) + module.exports = router \ No newline at end of file From c9f5e14be26416cca2b4017228f40c0c79c99499 Mon Sep 17 00:00:00 2001 From: Periklis Date: Fri, 5 Jul 2024 00:49:53 +0300 Subject: [PATCH 30/31] some cleanup --- src/controllers/review.js | 1 - src/domains/review.js | 1 - 2 files changed, 2 deletions(-) diff --git a/src/controllers/review.js b/src/controllers/review.js index 0d5f6c77..ad65ce8f 100644 --- a/src/controllers/review.js +++ b/src/controllers/review.js @@ -5,7 +5,6 @@ const { getReviewsByMovieTitleDb, } = require("../domains/review") const { getMovieByIdDb } = require("../domains/movie") -const { getMovieById } = require("../controllers/movie") const { MissingFieldsError, diff --git a/src/domains/review.js b/src/domains/review.js index 6969e0d3..49592fa9 100644 --- a/src/domains/review.js +++ b/src/domains/review.js @@ -22,7 +22,6 @@ const getAllreviewsDb = async () => { const getReviewsByMovieTitleDb = async (title) => { - console.log(title); const getReviewsForMovie = await prisma.review.findFirst({ where: { movie: { From b22019ed1315d93aa8cf0baee85e8dd17aca5d00 Mon Sep 17 00:00:00 2001 From: Periklis Date: Fri, 5 Jul 2024 01:12:13 +0300 Subject: [PATCH 31/31] some more cleanup and add a get all tickets --- src/controllers/movie.js | 51 +++++++++++++++++----------------- src/controllers/ticket.js | 58 +++++++++++++++++++++++---------------- src/domains/ticket.js | 20 +++++++++----- src/routers/ticket.js | 4 ++- 4 files changed, 76 insertions(+), 57 deletions(-) diff --git a/src/controllers/movie.js b/src/controllers/movie.js index 76a214da..0c54d881 100644 --- a/src/controllers/movie.js +++ b/src/controllers/movie.js @@ -54,14 +54,13 @@ const createMovie = async (req, res) => { const getMovieById = async (req, res) => { const idOrTitle = req.params.id - const movie = await getMovieByIdDb(idOrTitle) - if (!movie) { - throw new DataNotFoundError( - "No movie with the provided id or title exists" - ) - } - res.status(200).json({ movie: movie }) - + const movie = await getMovieByIdDb(idOrTitle) + if (!movie) { + throw new DataNotFoundError( + "No movie with the provided id or title exists" + ) + } + res.status(200).json({ movie: movie }) } const updateMovie = async (req, res) => { @@ -71,25 +70,25 @@ const updateMovie = async (req, res) => { const moviesList = await getMovieByIdDb(reqId) - if (!moviesList) { - throw new DataNotFoundError( - "No movie with the provided ID exists" - ) - } - - if (!updateInfo.title || !updateInfo.runtimeMins) { - throw new MissingFieldsError( - "Title and duration in minutes must be provided in order to update a movie" - ) - } - - const updatedMovie = await updateMovieDb( - reqId, - updateInfo.title, - updateInfo.runtimeMins, - screenings + if (!moviesList) { + throw new DataNotFoundError( + "No movie with the provided ID exists" + ) + } + + if (!updateInfo.title || !updateInfo.runtimeMins) { + throw new MissingFieldsError( + "Title and duration in minutes must be provided in order to update a movie" ) - res.status(201).json({ movie: updatedMovie }) + } + + const updatedMovie = await updateMovieDb( + reqId, + updateInfo.title, + updateInfo.runtimeMins, + screenings + ) + res.status(201).json({ movie: updatedMovie }) } module.exports = { diff --git a/src/controllers/ticket.js b/src/controllers/ticket.js index fda173f5..a2ca3c45 100644 --- a/src/controllers/ticket.js +++ b/src/controllers/ticket.js @@ -1,35 +1,47 @@ const { PrismaClientKnownRequestError } = require("@prisma/client") -const { createTicketDB } = require("../domains/ticket") -const { getAllCustomersDb } = require('../domains/customer') -const { getAllScreeningsDb } = require('../domains/screening') +const { + createTicketDB, + getAllTicketsDb, +} = require("../domains/ticket") +const { getAllCustomersDb } = require("../domains/customer") +const { getAllScreeningsDb } = require("../domains/screening") const { MissingFieldsError, DataNotFoundError, } = require("../errors/errors") +const { response } = require("express") const createTicket = async (req, res) => { - const { screeningId, customerId } = req.body - - const customers = await getAllCustomersDb() - const existingCustomer = customers.find(cus => cus.id === customerId) - const screenings = await getAllScreeningsDb() - const existingScreening = screenings.find(scr => scr.id === screeningId) + const { screeningId, customerId } = req.body + + const customers = await getAllCustomersDb() + const existingCustomer = customers.find( + (cus) => cus.id === customerId + ) + const screenings = await getAllScreeningsDb() + const existingScreening = screenings.find( + (scr) => scr.id === screeningId + ) + if (!screeningId || !customerId) { + throw new MissingFieldsError( + "Screening and Customer ID must be provided in order to create a ticket" + ) + } + + if (!existingScreening || !existingCustomer) { + throw new DataNotFoundError( + "No customer or screening exist with the provided id" + ) + } + const newTicket = await createTicketDB(screeningId, customerId) + res.status(201).json({ ticket: newTicket }) +} - if (!screeningId || !customerId) { - throw new MissingFieldsError( - "Screening and Customer ID must be provided in order to create a ticket" - ) - } - - if (!existingScreening || !existingCustomer) { - throw new DataNotFoundError( - "No customer or screening exist with the provided id" - ) - } - const newTicket = await createTicketDB(screeningId, customerId) - res.status(201).json({ ticket: newTicket }) +const getAllTickets = async (req, res) => { + const alltickets = await getAllTicketsDb() + res.status(200).json({ tickets: alltickets }) } -module.exports = { createTicket } +module.exports = { createTicket, getAllTickets } diff --git a/src/domains/ticket.js b/src/domains/ticket.js index 98ebb8b9..6bac53d7 100644 --- a/src/domains/ticket.js +++ b/src/domains/ticket.js @@ -12,13 +12,13 @@ const createTicketDB = async (screen, customer) => { }, select: { id: true, - screening: { - select: { - id: true, - movieId: true, - screenId: true, - } - }, + screening: { + select: { + id: true, + movieId: true, + screenId: true, + }, + }, customer: { include: { contact: true, @@ -35,6 +35,12 @@ const createTicketDB = async (screen, customer) => { return newTicket } +const getAllTicketsDb = async () => { + const allTickets = await prisma.ticket.findMany() + return allTickets +} + module.exports = { createTicketDB, + getAllTicketsDb, } diff --git a/src/routers/ticket.js b/src/routers/ticket.js index 39dcc68a..92b8143e 100644 --- a/src/routers/ticket.js +++ b/src/routers/ticket.js @@ -1,9 +1,11 @@ const express = require("express") -const { createTicket } = require('../controllers/ticket') +const { createTicket, getAllTickets } = require('../controllers/ticket') const router = express.Router() +router.get('/', getAllTickets) + router.post('/', createTicket) module.exports = router \ No newline at end of file