Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions prisma/migrations/20240310040538_reviews/migration.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
-- This is an empty migration.
29 changes: 21 additions & 8 deletions src/controllers/customer.js
Original file line number Diff line number Diff line change
@@ -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({
Expand Down Expand Up @@ -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 }
73 changes: 73 additions & 0 deletions src/controllers/movie.js
Original file line number Diff line number Diff line change
@@ -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 }
23 changes: 23 additions & 0 deletions src/controllers/screen.js
Original file line number Diff line number Diff line change
@@ -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 }
20 changes: 20 additions & 0 deletions src/controllers/ticket.js
Original file line number Diff line number Diff line change
@@ -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 }
27 changes: 24 additions & 3 deletions src/domains/customer.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 }
80 changes: 80 additions & 0 deletions src/domains/movie.js
Original file line number Diff line number Diff line change
@@ -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 }
20 changes: 20 additions & 0 deletions src/domains/screen.js
Original file line number Diff line number Diff line change
@@ -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 }
31 changes: 31 additions & 0 deletions src/domains/ticket.js
Original file line number Diff line number Diff line change
@@ -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 }
8 changes: 4 additions & 4 deletions src/routers/customer.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
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
// The below /register route extends that, so the end result will be a URL
// that looks like http://localhost:4040/customer/register
router.post("/register", createCustomer);

// UPDATE CUSTOMER BY ID
router.put('/:id', updateCustomer)

module.exports = router;
18 changes: 18 additions & 0 deletions src/routers/movie.js
Original file line number Diff line number Diff line change
@@ -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
9 changes: 9 additions & 0 deletions src/routers/screen.js
Original file line number Diff line number Diff line change
@@ -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
9 changes: 9 additions & 0 deletions src/routers/ticket.js
Original file line number Diff line number Diff line change
@@ -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
Loading