Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
ac893b2
Initialize Prisma Client
ricky-ultimate Jun 16, 2024
29a4297
Created API route for creating a member
ricky-ultimate Jun 16, 2024
866cfdd
Created API route for retrieving a member
ricky-ultimate Jun 16, 2024
614ff80
Created API route for updating a member
ricky-ultimate Jun 16, 2024
1324476
Created API route for deleting a member
ricky-ultimate Jun 16, 2024
eab8b0a
Add default handler function to manage member API routes
ricky-ultimate Jun 16, 2024
79cbc3d
Created API route for creating a project
ricky-ultimate Jun 16, 2024
ec86511
Created API route for retrieving a project
ricky-ultimate Jun 16, 2024
4a619b7
Created API route for updating a project
ricky-ultimate Jun 16, 2024
473f8d9
Created API route for deleting a project
ricky-ultimate Jun 16, 2024
11dc0c8
Add default handler function to manage project API routes
ricky-ultimate Jun 16, 2024
3808bd6
Created API route for creating an event
ricky-ultimate Jun 16, 2024
bf67d51
Created API route for retrieving an event
ricky-ultimate Jun 16, 2024
7afe21f
Created API route for updating an event
ricky-ultimate Jun 16, 2024
0d863bc
Created API route for deleting an event
ricky-ultimate Jun 16, 2024
2a124e7
Add default handler function to manage event API routes
ricky-ultimate Jun 16, 2024
6392584
Add input validation and error handling for createMembers function
ricky-ultimate Jun 16, 2024
0b973f8
Add input validation and error handling for getMembers function
ricky-ultimate Jun 16, 2024
d3f68a5
Add input validation and error handling for updateMembers function
ricky-ultimate Jun 16, 2024
d68b16c
Add input validation and error handling for deleteMembers function
ricky-ultimate Jun 16, 2024
44c9d05
Add input validation and error handling for getProjects function
ricky-ultimate Jun 16, 2024
a341de8
Add input validation and error handling for deleteProjects function
ricky-ultimate Jun 16, 2024
7be1c68
Add input validation and error handling for createProjects function
ricky-ultimate Jun 17, 2024
41528e3
Add input validation and error handling for updateProjects function
ricky-ultimate Jun 17, 2024
c3d3683
Add input validation and error handling for createEvents function
ricky-ultimate Jun 17, 2024
5f40fc1
Add input validation and error handling for updateEvents function
ricky-ultimate Jun 17, 2024
c0b69aa
Add input validation and error handling for updateEvents function
ricky-ultimate Jun 17, 2024
005f0cb
Add input validation and error handling for deleteEvents function
ricky-ultimate Jun 17, 2024
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
4 changes: 4 additions & 0 deletions prisma/prisma/prisma.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();
export default prisma;
92 changes: 92 additions & 0 deletions src/app/api/events/route.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import { NextApiRequest, NextApiResponse } from "next";
import prisma from "../../../../prisma/prisma/prisma";

async function createEvent(req: NextApiRequest, res: NextApiResponse) {
const { name, date, location, description } = req.body;
if (!name || !date || !location || !description) {
return res.status(400).json({ error: 'All fields are required' });
}
try {
const event = await prisma.event.create({
data: {
name,
date: new Date(date),
location,
description,
},
});
res.status(201).json(event);
} catch (error) {
res.status(500).json({ error: 'Failed to create event' });
}
}


async function getEvents(req: NextApiRequest, res: NextApiResponse) {
try {
const events = await prisma.event.findMany();
res.status(200).json(events);
} catch (error) {
res.status(500).json({ error: 'Failed to fetch events' });
}
}


async function updateEvent(req: NextApiRequest, res: NextApiResponse) {
const { id, name, date, location, description } = req.body;
if (!id || !name || !date || !location || !description) {
return res.status(400).json({ error: 'All fields are required' });
}
try {
const event = await prisma.event.update({
where: { id: parseInt(id) },
data: {
name,
date: new Date(date),
location,
description,
},
});
res.status(200).json(event);
} catch (error) {
res.status(500).json({ error: 'Failed to update event' });
}
}


async function deleteEvent(req: NextApiRequest, res: NextApiResponse) {
const { id } = req.body;
if (!id) {
return res.status(400).json({ error: 'ID is required' });
}
try {
await prisma.event.delete({
where: { id: parseInt(id) },
});
res.status(204).end();
} catch (error) {
res.status(500).json({ error: 'Failed to delete event' });
}
}


export default async function handler(req: NextApiRequest, res: NextApiResponse) {
switch (req.method) {
case 'GET':
await getEvents(req, res);
break;
case 'POST':
await createEvent(req, res);
break;
case 'PUT':
case 'PATCH':
await updateEvent(req, res);
break;
case 'DELETE':
await deleteEvent(req, res);
break;
default:
res.setHeader('Allow', ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']);
res.status(405).end(`Method ${req.method} Not Allowed`);
}
}
90 changes: 90 additions & 0 deletions src/app/api/members/route.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
import { NextApiRequest, NextApiResponse } from "next";
import prisma from "../../../../prisma/prisma/prisma";

async function createMember(req: NextApiRequest, res: NextApiResponse) {
const { firstName, lastName, matricno, email, role } = req.body;
if (!firstName || !lastName || !matricno || !email || !role) {
return res.status(400).json({ error: 'All fields are required' });
}
try {
const member = await prisma.member.create({
data: {
firstName,
lastName,
matricno,
email,
role,
},
});
res.status(201).json(member);
} catch (error) {
res.status(500).json({ error: 'Failed to create member' });
}
}

async function getMembers(req: NextApiRequest, res: NextApiResponse) {
try {
const members = await prisma.member.findMany();
res.status(200).json(members);
} catch (error) {
res.status(500).json({ error: 'Failed to fetch members' });
}
}

async function updateMember(req: NextApiRequest, res: NextApiResponse) {
const { id, firstName, lastName, matricno, email, role } = req.body;
if (!id || !firstName || !lastName || !matricno || !email || !role) {
return res.status(400).json({ error: 'All fields are required' });
}
try {
const member = await prisma.member.update({
where: { id: parseInt(id) },
data: {
firstName,
lastName,
matricno,
email,
role,
},
});
res.status(200).json(member);
} catch (error) {
res.status(500).json({ error: 'Failed to update member' });
}
}

async function deleteMember(req: NextApiRequest, res: NextApiResponse) {
const { id } = req.body;
if (!id) {
return res.status(400).json({ error: 'ID is required' });
}
try {
await prisma.member.delete({
where: { id: parseInt(id) },
});
res.status(204).end();
} catch (error) {
res.status(500).json({ error: 'Failed to delete member' });
}
}

export default async function handler(req: NextApiRequest, res: NextApiResponse) {
switch (req.method) {
case 'GET':
await getMembers(req, res);
break;
case 'POST':
await createMember(req, res);
break;
case 'PUT':
case 'PATCH':
await updateMember(req, res);
break;
case 'DELETE':
await deleteMember(req, res);
break;
default:
res.setHeader('Allow', ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']);
res.status(405).end(`Method ${req.method} Not Allowed`);
}
}
106 changes: 106 additions & 0 deletions src/app/api/projects/route.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
import { NextApiRequest, NextApiResponse } from "next";
import prisma from "../../../../prisma/prisma/prisma";

async function createProject(req: NextApiRequest, res: NextApiResponse) {
const { title, description, startDate, endDate, members } = req.body;
if (!title || !description || !startDate || !members) {
return res.status(400).json({ error: 'Title, description, startDate, and members are required' });
}
try {
const validMembers = await prisma.member.findMany({ where: { id: { in: members } } });
if (validMembers.length !== members.length) {
return res.status(400).json({ error: 'Some member IDs are invalid' });
}
const project = await prisma.project.create({
data: {
title,
description,
startDate: new Date(startDate),
endDate: endDate ? new Date(endDate) : null,
members: {
connect: members.map((memberId: number) => ({ id: memberId })),
},
},
});
res.status(201).json(project);
} catch (error) {
res.status(500).json({ error: 'Failed to create project' });
}
}


async function getProjects(req: NextApiRequest, res: NextApiResponse) {
try {
const projects = await prisma.project.findMany();
res.status(200).json(projects);
} catch (error) {
res.status(500).json({ error: 'Failed to fetch projects' });
}
}


async function updateProject(req: NextApiRequest, res: NextApiResponse) {
const { id, title, description, startDate, endDate, members } = req.body;
if (!id || !title || !description || !startDate || !members) {
return res.status(400).json({ error: 'ID, title, description, startDate, and members are required' });
}
try {
const validMembers = await prisma.member.findMany({ where: { id: { in: members } } });
if (validMembers.length !== members.length) {
return res.status(400).json({ error: 'Some member IDs are invalid' });
}
const project = await prisma.project.update({
where: { id: parseInt(id) },
data: {
title,
description,
startDate: new Date(startDate),
endDate: endDate ? new Date(endDate) : null,
members: {
set: members.map((memberId: number) => ({ id: memberId })),
},
},
});
res.status(200).json(project);
} catch (error) {
res.status(500).json({ error: 'Failed to update project' });
}
}


async function deleteProject(req: NextApiRequest, res: NextApiResponse) {
const { id } = req.body;
if (!id) {
return res.status(400).json({ error: 'ID is required' });
}
try {
await prisma.project.delete({
where: { id: parseInt(id) },
});
res.status(204).end();
} catch (error) {
res.status(500).json({ error: 'Failed to delete project' });
}
}


export default async function handler(req: NextApiRequest, res: NextApiResponse) {
switch (req.method) {
case 'GET':
await getProjects(req, res);
break;
case 'POST':
await createProject(req, res);
break;
case 'PUT':
case 'PATCH':
await updateProject(req, res);
break;
case 'DELETE':
await deleteProject(req, res);
break;
default:
res.setHeader('Allow', ['GET', 'POST', 'PUT', 'PATCH', 'DELETE']);
res.status(405).end(`Method ${req.method} Not Allowed`);
}
}