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
6 changes: 0 additions & 6 deletions .env.example

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
-- DropForeignKey
ALTER TABLE "Screening" DROP CONSTRAINT "Screening_movieId_fkey";

-- AlterTable
ALTER TABLE "Screening" ALTER COLUMN "movieId" DROP NOT NULL;

-- AddForeignKey
ALTER TABLE "Screening" ADD CONSTRAINT "Screening_movieId_fkey" FOREIGN KEY ("movieId") REFERENCES "Movie"("id") ON DELETE SET NULL ON UPDATE CASCADE;
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
-- DropForeignKey
ALTER TABLE "Screening" DROP CONSTRAINT "Screening_screenId_fkey";

-- AlterTable
ALTER TABLE "Screening" ALTER COLUMN "screenId" DROP NOT NULL;

-- AddForeignKey
ALTER TABLE "Screening" ADD CONSTRAINT "Screening_screenId_fkey" FOREIGN KEY ("screenId") REFERENCES "Screen"("id") ON DELETE SET NULL ON UPDATE CASCADE;
68 changes: 34 additions & 34 deletions prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -12,22 +12,22 @@ 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
}

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 {
Expand All @@ -40,31 +40,31 @@ model Movie {
}

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
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())
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
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
}
48 changes: 23 additions & 25 deletions prisma/seed.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
const { PrismaClient } = require('@prisma/client');
const { PrismaClient } = require("@prisma/client");
const prisma = new PrismaClient();

async function seed() {
Expand All @@ -13,28 +13,28 @@ async function seed() {
async function createCustomer() {
const customer = await prisma.customer.create({
data: {
name: 'Alice',
name: "Alice",
contact: {
create: {
email: 'alice@boolean.co.uk',
phone: '1234567890'
}
}
email: "alice@boolean.co.uk",
phone: "1234567890",
},
},
},
include: {
contact: true
}
contact: true,
},
});

console.log('Customer created', customer);
console.log("Customer created", customer);

return customer;
}

async function createMovies() {
const rawMovies = [
{ title: 'The Matrix', runtimeMins: 120 },
{ title: 'Dodgeball', runtimeMins: 154 },
{ title: "The Matrix", runtimeMins: 120 },
{ title: "Dodgeball", runtimeMins: 154 },
];

const movies = [];
Expand All @@ -44,24 +44,22 @@ async function createMovies() {
movies.push(movie);
}

console.log('Movies created', movies);
console.log("Movies created", movies);

return movies;
}

async function createScreens() {
const rawScreens = [
{ number: 1 }, { number: 2 }
];
const rawScreens = [{ number: 1 }, { number: 2 }];

const screens = [];

for (const rawScreen of rawScreens) {
const screen = await prisma.screen.create({
data: rawScreen
data: rawScreen,
});

console.log('Screen created', screen);
console.log("Screen created", screen);

screens.push(screen);
}
Expand All @@ -81,24 +79,24 @@ async function createScreenings(screens, movies) {
startsAt: screeningDate,
movie: {
connect: {
id: movies[i].id
}
id: movies[i].id,
},
},
screen: {
connect: {
id: screen.id
}
}
}
id: screen.id,
},
},
},
});

console.log('Screening created', screening);
console.log("Screening created", screening);
}
}
}

seed()
.catch(async e => {
.catch(async (e) => {
console.error(e);
await prisma.$disconnect();
})
Expand Down
61 changes: 45 additions & 16 deletions src/controllers/customer.js → src/controllers/customerCon.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
const { PrismaClientKnownRequestError } = require("@prisma/client")
const { createCustomerDb } = require('../domains/customer.js')
const { PrismaClientKnownRequestError } = require("@prisma/client");
const {
createCustomerDb,
updateCustomerDb,
} = require("../domains/customerDom.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({
error: "Missing fields in request body"
})
error: "Missing fields in request body",
});
}

// Try-catch is a very common way to handle errors in JavaScript.
Expand All @@ -22,9 +21,9 @@ const createCustomer = async (req, res) => {
// 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)
const createdCustomer = await createCustomerDb(name, phone, email);

res.status(201).json({ customer: createdCustomer })
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
Expand All @@ -35,14 +34,44 @@ const createCustomer = async (req, res) => {
// 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" })
return res
.status(409)
.json({ error: "A customer with the provided email already exists" });
}
}

res.status(500).json({ error: e.message })
res.status(500).json({ error: e.message });
}
}
};

const updateCustomer = async (req, res) => {
const id = Number.parseInt(req.params.id, 10);
const { name, phone, email } = req.body;

if (!name) {
return res.status(400).json({
error: "Missing fields in request body",
});
}

try {
const updateCustomer = await updateCustomerDb(name, phone, email, id);

res.status(201).json({ customer: updateCustomer });
} 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 });
}
};

module.exports = {
createCustomer
}
createCustomer,
updateCustomer,
};
Loading