Skip to content

Commit cdefad6

Browse files
NE1NNkeraan
andauthored
Add database with Prisma
* start * ok * Initial db setup * Add schema * Make a schema for Course and Term * Create a prisma client * Route test * Implement api * Change relation mode to prisma --------- Co-authored-by: Kieren <kierenhuynh88@gmail.com>
1 parent a0585ae commit cdefad6

File tree

15 files changed

+278
-6
lines changed

15 files changed

+278
-6
lines changed

overload/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ yarn-error.log*
2626

2727
# local env files
2828
.env*.local
29+
.env
2930

3031
# vercel
3132
.vercel

overload/package-lock.json

Lines changed: 48 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

overload/package.json

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,21 @@
99
"lint": "next lint"
1010
},
1111
"dependencies": {
12+
"@prisma/client": "^5.5.2",
13+
"next": "13.5.6",
14+
"prisma": "^5.5.2",
1215
"react": "^18",
13-
"react-dom": "^18",
14-
"next": "13.5.6"
16+
"react-dom": "^18"
1517
},
1618
"devDependencies": {
17-
"typescript": "^5",
1819
"@types/node": "^20",
1920
"@types/react": "^18",
2021
"@types/react-dom": "^18",
2122
"autoprefixer": "^10",
23+
"eslint": "^8",
24+
"eslint-config-next": "13.5.6",
2225
"postcss": "^8",
2326
"tailwindcss": "^3",
24-
"eslint": "^8",
25-
"eslint-config-next": "13.5.6"
27+
"typescript": "^5"
2628
}
2729
}

overload/prisma/client.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { PrismaClient } from '@prisma/client';
2+
3+
const prismaClientSingleton = () => {
4+
return new PrismaClient();
5+
};
6+
7+
type PrismaClientSingleton = ReturnType<typeof prismaClientSingleton>;
8+
9+
const globalForPrisma = globalThis as unknown as {
10+
prisma: PrismaClientSingleton | undefined;
11+
};
12+
13+
const prisma = globalForPrisma.prisma ?? prismaClientSingleton();
14+
15+
export default prisma;
16+
17+
if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
-- CreateTable
2+
CREATE TABLE `Course` (
3+
`courseCode` VARCHAR(191) NOT NULL,
4+
`courseName` VARCHAR(191) NOT NULL,
5+
`doomness` INTEGER NOT NULL,
6+
7+
PRIMARY KEY (`courseCode`)
8+
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
9+
10+
-- CreateTable
11+
CREATE TABLE `Term` (
12+
`id` INTEGER NOT NULL AUTO_INCREMENT,
13+
`courseId` VARCHAR(191) NOT NULL,
14+
`term` VARCHAR(191) NOT NULL,
15+
16+
PRIMARY KEY (`id`)
17+
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
18+
19+
-- AddForeignKey
20+
ALTER TABLE `Term` ADD CONSTRAINT `Term_courseId_fkey` FOREIGN KEY (`courseId`) REFERENCES `Course`(`courseCode`) ON DELETE RESTRICT ON UPDATE CASCADE;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Please do not edit this file manually
2+
# It should be added in your version-control system (i.e. Git)
3+
provider = "mysql"

overload/prisma/schema.prisma

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// This is your Prisma schema file,
2+
// learn more about it in the docs: https://pris.ly/d/prisma-schema
3+
4+
generator client {
5+
provider = "prisma-client-js"
6+
}
7+
8+
datasource db {
9+
provider = "mysql"
10+
url = env("DATABASE_URL")
11+
relationMode = "prisma"
12+
}
13+
14+
model Course {
15+
courseCode String @id
16+
courseName String
17+
termsOffered Term[]
18+
doomness Int
19+
}
20+
21+
model Term {
22+
id Int @id @default(autoincrement())
23+
courseId String
24+
term String
25+
course Course @relation(fields: [courseId], references: [courseCode])
26+
27+
@@index([courseId])
28+
}

overload/src/app/api/home/route.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { NextRequest, NextResponse } from 'next/server';
2+
import prisma from '../../../../prisma/client';
3+
4+
export async function GET(request: NextRequest) {
5+
const courses = await prisma.term.findMany({
6+
where: {
7+
term: 'Term 2'
8+
},
9+
include: {
10+
course: true
11+
}
12+
})
13+
console.log(courses)
14+
15+
return NextResponse.json(courses);
16+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
type CourseOptionProps = {
2+
courseCode: string
3+
courseName: string
4+
}
5+
export const CourseOption = ({courseCode, courseName}: CourseOptionProps) => {
6+
return (
7+
<div className="flex justify-center bg-white m-5">
8+
{courseCode}: {courseName}
9+
</div>
10+
)
11+
}
12+
13+
export default CourseOption;
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import CourseOption from './courseOption';
2+
3+
// const courses = [
4+
// { courseCode: 'COMP1511', courseName: 'Programming Fundementals' },
5+
// { courseCode: 'COMP1521', courseName: 'Computer Fundementals' },
6+
// { courseCode: 'COMP1531', courseName: 'Software Engineering Fundementals' }
7+
// ]
8+
9+
type Course = {
10+
courseCode: string;
11+
courseName: string;
12+
};
13+
14+
type Term = {
15+
id: number;
16+
courseId: string;
17+
term: string;
18+
course: Course;
19+
};
20+
21+
export const CoursesList = async () => {
22+
const res = await fetch('http://localhost:3000/api/home', {
23+
cache: 'no-store',
24+
});
25+
26+
const terms: Term[] = await res.json();
27+
28+
const allCourses = terms.map((term, index) => {
29+
const course = term.course;
30+
return (
31+
<CourseOption
32+
key={index}
33+
courseCode={course.courseCode}
34+
courseName={course.courseName}
35+
/>
36+
);
37+
});
38+
39+
return (
40+
<div className="justify-center">
41+
<h2 className="text-white text-center pt-5">Courses List</h2>
42+
<div>{allCourses}</div>
43+
</div>
44+
);
45+
};
46+
47+
export default CoursesList;
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
export const SelectedCourse = () => {
2+
return (
3+
<div className="bg-white w-[100%] m-3 rounded-md">
4+
SelectedCourse
5+
</div>
6+
)
7+
}
8+
9+
export default SelectedCourse;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import SelectedCourse from "./selectedCourse";
2+
import Dropdown from "./termSelectDropDown";
3+
4+
export const SelectedCourses = () => {
5+
return (
6+
<div className="flex flex-col h-[70%]">
7+
<div className="flex justify-center pb-8">
8+
<Dropdown />
9+
</div>
10+
<div className="flex flex-col items-center p-8 bg-black ">
11+
<SelectedCourse />
12+
<SelectedCourse />
13+
<SelectedCourse />
14+
</div>
15+
</div>
16+
)
17+
}
18+
19+
export default SelectedCourses;
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import React, { useState } from 'react';
2+
3+
export default function Dropdown() {
4+
// const [selectedOption, setSelectedOption] = useState('');
5+
6+
// const handleChange = (event: any) => {
7+
// setSelectedOption(event.target.value);
8+
// };
9+
10+
return (
11+
<div className="w-60">
12+
<select
13+
className="block w-full px-4 py-2 mt-2 bg-red-500 border border-gray-200 rounded-md shadow-sm focus:border-blue-500 focus:ring focus:ring-blue-200 focus:ring-opacity-50"
14+
//value={selectedOption}
15+
//onChange={handleChange}
16+
>
17+
<option value="">Select a Term</option>
18+
<option value="term1">Term 1</option>
19+
<option value="term2">Term 2</option>
20+
<option value="term3">Term 3</option>
21+
</select>
22+
</div>
23+
);
24+
}

overload/src/app/globals.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
@tailwind components;
33
@tailwind utilities;
44

5-
:root {
5+
/* :root {
66
--foreground-rgb: 0, 0, 0;
77
--background-start-rgb: 214, 219, 220;
88
--background-end-rgb: 255, 255, 255;

overload/src/app/home/page.tsx

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import SelectedCourses from "../components/selectedCourses";
2+
import CoursesList from "../components/coursesList";
3+
4+
export const Home = async () => {
5+
6+
return (
7+
<div className="bg-gray-500 h-[100vh]">
8+
<div className="text-center h-[20vh]">
9+
top
10+
</div>
11+
<div className="flex pr-[8vw] pl-[8vw]">
12+
<div className="w-[70%]">
13+
{/* Content for the 70% width div */}
14+
<SelectedCourses />
15+
</div>
16+
<div className="w-[30%] bg-black">
17+
{/* Content for the 30% width div */}
18+
<CoursesList />
19+
</div>
20+
</div>
21+
</div>
22+
)
23+
}
24+
25+
export default Home;

0 commit comments

Comments
 (0)