From 68927676545f4cf6b01d83b22f3d2e0c40a62d9a Mon Sep 17 00:00:00 2001 From: Mobeen Date: Sun, 10 Mar 2024 06:46:24 +0100 Subject: [PATCH] done --- .../20240310040538_reviews/migration.sql | 1 + src/controllers/customer.js | 29 +++++-- src/controllers/movie.js | 73 +++++++++++++++++ src/controllers/screen.js | 23 ++++++ src/controllers/ticket.js | 20 +++++ src/domains/customer.js | 27 ++++++- src/domains/movie.js | 80 +++++++++++++++++++ src/domains/screen.js | 20 +++++ src/domains/ticket.js | 31 +++++++ src/routers/customer.js | 8 +- src/routers/movie.js | 18 +++++ src/routers/screen.js | 9 +++ src/routers/ticket.js | 9 +++ src/server.js | 11 ++- 14 files changed, 341 insertions(+), 18 deletions(-) create mode 100644 prisma/migrations/20240310040538_reviews/migration.sql create mode 100644 src/controllers/movie.js create mode 100644 src/controllers/screen.js create mode 100644 src/controllers/ticket.js create mode 100644 src/domains/movie.js create mode 100644 src/domains/screen.js create mode 100644 src/domains/ticket.js create mode 100644 src/routers/movie.js create mode 100644 src/routers/screen.js create mode 100644 src/routers/ticket.js diff --git a/prisma/migrations/20240310040538_reviews/migration.sql b/prisma/migrations/20240310040538_reviews/migration.sql new file mode 100644 index 00000000..af5102c8 --- /dev/null +++ b/prisma/migrations/20240310040538_reviews/migration.sql @@ -0,0 +1 @@ +-- This is an empty migration. \ No newline at end of file diff --git a/src/controllers/customer.js b/src/controllers/customer.js index 775cfb42..56224085 100644 --- a/src/controllers/customer.js +++ b/src/controllers/customer.js @@ -1,12 +1,8 @@ const { PrismaClientKnownRequestError } = require("@prisma/client") -const { createCustomerDb } = require('../domains/customer.js') +const { createCustomerDb, updateCustomerDb, updateContactDb, checkCustomerIdDb } = require('../domains/customer.js') const createCustomer = async (req, res) => { - const { - name, - phone, - email - } = req.body + const { name, phone, email } = req.body if (!name || !phone || !email) { return res.status(400).json({ @@ -43,6 +39,23 @@ const createCustomer = async (req, res) => { } } -module.exports = { - createCustomer +const updateCustomer = async (req, res) => { + const id = Number(req.params.id) + + // check customer id is valid + const customerExists = await checkCustomerIdDb(id) + if (!customerExists) return res.status(404).json({ error: `Customer with id ${id} does not exist!` }) + + // check the name field is not missing (contact optional so no check needed) + const { name, contact } = req.body + if (!name) return res.status(400).json({ error: "Oh no, you need to enter a name to update!" }) + + // if contact details provided update contact first, else skip to update customer + if (contact) await updateContactDb(id, contact) + + // finally update customer + const updatedCustomer = await updateCustomerDb(id, name) + return res.status(201).json({ customer: updatedCustomer }) } + +module.exports = { createCustomer, updateCustomer } diff --git a/src/controllers/movie.js b/src/controllers/movie.js new file mode 100644 index 00000000..cb4abe2e --- /dev/null +++ b/src/controllers/movie.js @@ -0,0 +1,73 @@ +const { getMovieListDb, createMovieDb, getMovieByIdDb, updateMovieDb, getMovieListGtLtDb, getMovieListGtDb, getMovieListLtDb, createMovieAndScreeningDb, getMovieByTitleDb } = require('../domains/movie.js') + +// GET MOVIE LIST +const getMovieList = async (req, res) => { + if (req.query) { + const runtimeLt = Number(req.query.runtimeLt) + const runtimeGt = Number(req.query.runtimeGt) + + if (runtimeLt && runtimeGt) { + const movieList = await getMovieListGtLtDb(runtimeLt, runtimeGt) + return res.status(200).json({ movies: movieList }) + } + if (runtimeLt) { + const movieList = await getMovieListLtDb(runtimeLt) + return res.status(200).json({ movies: movieList }) + } + if (runtimeGt) { + const movieList = await getMovieListGtDb(runtimeGt) + return res.status(200).json({ movies: movieList }) + } + } + + const movieList = await getMovieListDb() + return res.status(200).json({ movies: movieList }) +} + +// CREATE MOVIE +const createMovie = async (req, res) => { + const { title, runtimeMins, screenings } = req.body + + if (!title || !runtimeMins) + return res.status(400).json({ error: "Missing fields in the request body, please enter the film title and runtime in minutes."}) + + const titleExists = await getMovieByTitleDb(title) + if (titleExists) return res.status(409).json({ error: "A movie with that title already exists!"}) + + if (screenings) { + const newMovieAndScreening = await createMovieAndScreeningDb(title, runtimeMins, screenings) + return res.status(201).json({ movie: newMovieAndScreening }) + } + + const newMovie = await createMovieDb(title, runtimeMins) + return res.status(201).json({ movie: newMovie }) +} + +// GET MOVIE BY ID +const getMovieById = async (req, res) => { + const id = Number(req.params.id) + const foundMovie = await getMovieByIdDb(id) + if (!foundMovie) return res.status(404).json({ error: "Movie does not exist"}) + + return res.status(200).json({ movie: foundMovie }) +} + +// UPDATE MOVIE BY ID +const updateMovie = async (req, res) => { + const id = Number(req.params.id) + const { title, runtimeMins } = req.body + + const foundMovie = await getMovieByIdDb(id) + if (!foundMovie) return res.status(404).json({ error: "Movie does not exist"}) + + if (!title || !runtimeMins) + return res.status(400).json({ error: "Missing fields in the request body, please enter the film title and runtime in minutes."}) + + const titleExists = await getMovieByTitleDb(title) + if (titleExists) return res.status(409).json({ error: "A movie with that title already exists!"}) + + const updatedMovie = await updateMovieDb(id, title, runtimeMins) + return res.status(201).json({ movie: updatedMovie }) +} + +module.exports = { getMovieList, createMovie, getMovieById, updateMovie } \ No newline at end of file diff --git a/src/controllers/screen.js b/src/controllers/screen.js new file mode 100644 index 00000000..c9c37cad --- /dev/null +++ b/src/controllers/screen.js @@ -0,0 +1,23 @@ +const { createScreenDb, createScreenAndScreeningsDb, getScreenByNum } = require('../domains/screen.js') + +// CREATE A SCREEN +const createScreen = async (req, res) => { + const { number, screenings } = req.body + + if (!number) + return res.status(400).json({error: "Missing fields in the request body, please enter a screen number."}) + + const duplicateScreen = await getScreenByNum(number) + if (duplicateScreen) + return res.status(409).json({ error: "A screen with the provided number already exists" }) + + if (screenings) { + const screenAndScreenings = await createScreenAndScreeningsDb(number, screenings) + return res.status(201).json({ screen: screenAndScreenings }) + } + + const newScreen = await createScreenDb(number) + return res.status(201).json({ screen: newScreen }) +} + +module.exports = { createScreen } diff --git a/src/controllers/ticket.js b/src/controllers/ticket.js new file mode 100644 index 00000000..5e110d44 --- /dev/null +++ b/src/controllers/ticket.js @@ -0,0 +1,20 @@ +const { createTicketDb, checkScreeningIdDb, checkCustomerIdDb } = require("../domains/ticket.js") + +// CREATE A TICKET +const createTicket = async (req, res) => { + const { screeningId, customerId } = req.body + + if (!screeningId || !customerId) + return res.status(400).json({ error: "Missing fields in the request body, please include a screening ID and customer ID."}) + + const checkScreeningId = await checkScreeningIdDb(screeningId) + const checkCustomerId = await checkCustomerIdDb(customerId) + + if (!checkScreeningId || !checkCustomerId) + return res.status(404).json({ error: "A customer or screening does not exist with the provided ID."}) + + const ticket = await createTicketDb(screeningId, customerId) + return res.status(201).json({ ticket: ticket }) +} + +module.exports = { createTicket } diff --git a/src/domains/customer.js b/src/domains/customer.js index c7f315fd..73474c5d 100644 --- a/src/domains/customer.js +++ b/src/domains/customer.js @@ -21,6 +21,27 @@ const createCustomerDb = async (name, phone, email) => await prisma.customer.cre } }) -module.exports = { - createCustomerDb -} +// CHECK CUSTOMER ID +const checkCustomerIdDb = async (id) => await prisma.customer.findUnique({ + where: { id } +}) + +// UPDATE CUSTOMER BY ID +const updateCustomerDb = async (id, name) => await prisma.customer.update({ + where: { id }, + data: { name }, + include: { + contact: true, + tickets: true + } +}) + +const updateContactDb = async (id, contact) => await prisma.contact.update({ + where: { customerId: id }, + data: { + phone: contact.phone, + email: contact.email + } +}) + +module.exports = { createCustomerDb, updateCustomerDb, updateContactDb, checkCustomerIdDb } diff --git a/src/domains/movie.js b/src/domains/movie.js new file mode 100644 index 00000000..17b040c2 --- /dev/null +++ b/src/domains/movie.js @@ -0,0 +1,80 @@ +const prisma = require('../utils/prisma') + +// GET MOVIE LIST +const getMovieListDb = async () => await prisma.movie.findMany({ + include: { screenings: true } +}) + +// GREATER THAN AND LESS THAN RT +const getMovieListGtLtDb = async (runtimeLt, runtimeGt) => await prisma.movie.findMany({ + where: { + OR: [ + { + runtimeMins: { gt: runtimeGt } + }, + { + runtimeMins: { lt: runtimeLt } + } + ] + }, + include: { screenings: true } +}) + +// GREATER THAN RT +const getMovieListGtDb = async (runtimeGt) => await prisma.movie.findMany({ + where: { + runtimeMins: { gt: runtimeGt } + }, + include: { screenings: true } +}) + +// LESS THAN LT +const getMovieListLtDb = async (runtimeLt) => await prisma.movie.findMany({ + where: { + runtimeMins: { lt: runtimeLt } + }, + include: { screenings: true } +}) + +// CREATE MOVIE +const createMovieDb = async (title, runtimeMins) => await prisma.movie.create({ + data: { + title, + runtimeMins + }, + include: { screenings: true } +}) + +const createMovieAndScreeningDb = async (title, runtimeMins, screenings) => await prisma.movie.create({ + data: { + title, + runtimeMins, + screenings : { + create: screenings + } + }, + include: { screenings: true } +}) + +// GET MOVIE BY TITLE +const getMovieByTitleDb = async (title) => await prisma.movie.findFirst({ + where: { title } +}) + +// GET MOVIE BY ID +const getMovieByIdDb = async (id) => await prisma.movie.findUnique({ + where: { id }, + include: { screenings: true } +}) + +// UPDATE MOVIE BY ID +const updateMovieDb = async (id, title, runtimeMins) => await prisma.movie.update({ + where: { id }, + data: { + title, + runtimeMins + }, + include: { screenings: true } +}) + +module.exports = { getMovieListDb, createMovieDb, getMovieByIdDb, updateMovieDb, getMovieListGtLtDb, getMovieListGtDb, getMovieListLtDb, createMovieAndScreeningDb, getMovieByTitleDb } \ No newline at end of file diff --git a/src/domains/screen.js b/src/domains/screen.js new file mode 100644 index 00000000..cd92e268 --- /dev/null +++ b/src/domains/screen.js @@ -0,0 +1,20 @@ +const prisma = require('../utils/prisma') + +// CREATE A SCREEN +const createScreenDb = async (number) => await prisma.screen.create({ + data: { number } +}) + +const createScreenAndScreeningsDb = async (number, screenings) => await prisma.screen.create({ + data: { + number, + screenings: { create: screenings } + }, + include: { screenings: true } +}) + +const getScreenByNum = async (number) => await prisma.screen.findFirst({ + where: { number } +}) + +module.exports = { createScreenDb, createScreenAndScreeningsDb, getScreenByNum } \ No newline at end of file diff --git a/src/domains/ticket.js b/src/domains/ticket.js new file mode 100644 index 00000000..570100d1 --- /dev/null +++ b/src/domains/ticket.js @@ -0,0 +1,31 @@ +const prisma = require('../utils/prisma') + +// CREATE A TICKET +const createTicketDb = async (screeningId, customerId) => await prisma.ticket.create({ + data: { + screeningId, + customerId + }, + include: { + screening: { + include: { + movie: true, + screen: true + } + }, + customer: { + include: + {contact: true} + } + } +}) + +const checkScreeningIdDb = async (screeningId) => await prisma.screening.findUnique({ + where: { id: screeningId } +}) + +const checkCustomerIdDb = async (customerId) => await prisma.customer.findUnique({ + where: { id: customerId } +}) + +module.exports = { createTicketDb, checkScreeningIdDb, checkCustomerIdDb } \ No newline at end of file diff --git a/src/routers/customer.js b/src/routers/customer.js index f14a87fc..a5d755e2 100644 --- a/src/routers/customer.js +++ b/src/routers/customer.js @@ -1,8 +1,5 @@ const express = require("express"); -const { - createCustomer -} = require('../controllers/customer'); - +const { createCustomer, updateCustomer } = require('../controllers/customer.js'); const router = express.Router(); // In index.js, we told express that the /customer route should use this router file @@ -10,4 +7,7 @@ const router = express.Router(); // that looks like http://localhost:4040/customer/register router.post("/register", createCustomer); +// UPDATE CUSTOMER BY ID +router.put('/:id', updateCustomer) + module.exports = router; diff --git a/src/routers/movie.js b/src/routers/movie.js new file mode 100644 index 00000000..600f954e --- /dev/null +++ b/src/routers/movie.js @@ -0,0 +1,18 @@ +const express = require("express") +const router = express.Router() + +const { getMovieList, createMovie, getMovieById, updateMovie } = require('../controllers/movie.js') + +// GET LIST OF MOVIES +router.get('/', getMovieList) + +// CREATE A MOVIE +router.post('/', createMovie) + +// GET MOVIE BY ID +router.get('/:id', getMovieById) + +// UPDATE MOVIE BY ID +router.put('/:id', updateMovie) + +module.exports = router \ No newline at end of file diff --git a/src/routers/screen.js b/src/routers/screen.js new file mode 100644 index 00000000..5ca35931 --- /dev/null +++ b/src/routers/screen.js @@ -0,0 +1,9 @@ +const express = require('express') +const router = express.Router() + +const { createScreen } = require('../controllers/screen.js') + +// CREATE A SCREEN +router.post('/', createScreen) + +module.exports = router \ No newline at end of file diff --git a/src/routers/ticket.js b/src/routers/ticket.js new file mode 100644 index 00000000..0a82309f --- /dev/null +++ b/src/routers/ticket.js @@ -0,0 +1,9 @@ +const express = require('express') +const router = express.Router() + +const { createTicket } = require('../controllers/ticket.js') + +// CREATE A TICKET +router.post('/', createTicket) + +module.exports = router \ No newline at end of file diff --git a/src/server.js b/src/server.js index 93d47a16..4a485dfb 100644 --- a/src/server.js +++ b/src/server.js @@ -12,10 +12,15 @@ 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'); -app.use('/customers', customerRouter); +const movieRouter = require('./routers/movie.js') +const customerRouter = require('./routers/customer.js'); +const screenRouter = require('./routers/screen.js') +const ticketRouter = require('./routers/ticket.js') +app.use('/movies', movieRouter) +app.use('/customers', customerRouter); +app.use('/screens', screenRouter) +app.use('/tickets', ticketRouter) module.exports = app