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,12 @@
/*
Warnings:

- A unique constraint covering the columns `[title]` on the table `Movie` will be added. If there are existing duplicate values, this will fail.
- A unique constraint covering the columns `[number]` on the table `Screen` will be added. If there are existing duplicate values, this will fail.

*/
-- CreateIndex
CREATE UNIQUE INDEX "Movie_title_key" ON "Movie"("title");

-- CreateIndex
CREATE UNIQUE INDEX "Screen_number_key" ON "Screen"("number");
19 changes: 19 additions & 0 deletions prisma/migrations/20240702195852_reviews/migration.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
-- CreateTable
CREATE TABLE "Review" (
"id" SERIAL NOT NULL,
"movieId" INTEGER NOT NULL,
"customerId" INTEGER NOT NULL,
"rating" INTEGER NOT NULL,
"content" TEXT NOT NULL,

CONSTRAINT "Review_pkey" PRIMARY KEY ("id")
);

-- AddForeignKey
ALTER TABLE "Review" ADD CONSTRAINT "Review_movieId_fkey" FOREIGN KEY ("movieId") REFERENCES "Movie"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE "Review" ADD CONSTRAINT "Review_customerId_fkey" FOREIGN KEY ("customerId") REFERENCES "Customer"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddCheckConstraint
ALTER TABLE "Review" ADD CONSTRAINT "Rating_check" CHECK ("rating" > 0 and "rating" <11)
82 changes: 47 additions & 35 deletions prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -12,59 +12,71 @@ 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
reviews 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 {
id Int @id @default(autoincrement())
screenings Screening[]
title String
title String @unique
runtimeMins Int
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
reviews Review[]
}

model Review {
id Int @id @default(autoincrement())
movieId Int
movie Movie? @relation(fields: [movieId], references: [id])
customerId Int
customer Customer? @relation(fields: [customerId], references: [id])
rating Int
content String
}

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

async function seed() {
await createCustomer();
const movies = await createMovies();
const screens = await createScreens();
await createScreenings(screens, movies);
const customer = await createCustomer()
const movies = await createMovies()
const screens = await createScreens()
await createScreenings(screens, movies)
await createReviews(customer, movies)

process.exit(0);
process.exit(0)
}

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

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

return customer;
const customer = await prisma.customer.create({
data: {
name: 'Alice',
contact: {
create: {
email: 'alice@boolean.co.uk',
phone: '1234567890',
},
},
},
include: {
contact: true,
},
})

console.log('Customer created', customer)

return customer
}

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

const movies = [];
const movies = []

for (const rawMovie of rawMovies) {
const movie = await prisma.movie.create({ data: rawMovie });
movies.push(movie);
}
for (const rawMovie of rawMovies) {
const movie = await prisma.movie.create({ data: rawMovie })
movies.push(movie)
}

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

return movies;
return movies
}

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

const screens = [];
const screens = []

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

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

screens.push(screen);
}
screens.push(screen)
}

return screens;
return screens
}

async function createScreenings(screens, movies) {
const screeningDate = new Date();

for (const screen of screens) {
for (let i = 0; i < movies.length; i++) {
screeningDate.setDate(screeningDate.getDate() + i);

const screening = await prisma.screening.create({
data: {
startsAt: screeningDate,
movie: {
connect: {
id: movies[i].id
}
},
screen: {
connect: {
id: screen.id
}
}
const screeningDate = new Date()

for (const screen of screens) {
for (let i = 0; i < movies.length; i++) {
screeningDate.setDate(screeningDate.getDate() + i)

const screening = await prisma.screening.create({
data: {
startsAt: screeningDate,
movie: {
connect: {
id: movies[i].id,
},
},
screen: {
connect: {
id: screen.id,
},
},
},
})

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

console.log('Screening created', screening);
async function createReviews(customer, movies) {
const rawReviews = [
{
customerId: customer.id,
movieId: movies[0].id,
rating: 5,
content: 'It was okay',
},
{
customerId: customer.id,
movieId: movies[1].id,
rating: 9,
content: 'I liked this',
},
]

const reviews = []

for (const rawReview of rawReviews) {
const review = await prisma.review.create({
data: rawReview,
})

console.log('Reviews created', review)

reviews.push(review)
}
}

return reviews
}

seed()
.catch(async e => {
console.error(e);
await prisma.$disconnect();
})
.finally(() => process.exit(1));
.catch(async (e) => {
console.error(e)
await prisma.$disconnect()
})
.finally(() => process.exit(1))
Loading