Skip to content

Commit

Permalink
Add homework
Browse files Browse the repository at this point in the history
  • Loading branch information
mfjkri committed Oct 13, 2023
1 parent b9ad83e commit 1dbecf3
Show file tree
Hide file tree
Showing 23 changed files with 649 additions and 9 deletions.
44 changes: 44 additions & 0 deletions cmd/seed/seed.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { createAnnouncement } from "../../src/dataaccess/announcement";
import { assignTutorToClass, createClass } from "../../src/dataaccess/class";
import { createHomework } from "../../src/dataaccess/homework";
import { createNote } from "../../src/dataaccess/note";
import {
createStudentUser,
Expand Down Expand Up @@ -46,6 +47,22 @@ const tutors = [
class: "Class 1",
},
],
homework: [
{
title: "Homework 1",
description: "This is homework",
dueDate: "2021-10-10",
centre: "testCentre",
class: "Class 1",
},
{
title: "Homework 2",
description: "This is another homework",
dueDate: "2021-10-10",
centre: "testCentre",
class: "Class 1",
},
],
},
{
fullName: "Bobby Fischer",
Expand All @@ -72,6 +89,22 @@ const tutors = [
class: "Class 4",
},
],
homework: [
{
title: "Homework 3",
description: "This is homework",
dueDate: "2021-10-10",
centre: "testCentre",
class: "Class 4",
},
{
title: "Homework 4",
description: "This is another homework",
dueDate: "2021-10-10",
centre: "testCentre",
class: "Class 4",
},
],
},
];

Expand Down Expand Up @@ -221,6 +254,17 @@ export default async function seed() {
announcement.content
);
}

for (const homework of tutor.homework) {
await createHomework(
centre.id,
centre.classes[homework.class].id,
response.tutor.id,
homework.title,
homework.description,
homework.dueDate
);
}
}

for (const student of students) {
Expand Down
11 changes: 6 additions & 5 deletions src/dataaccess/announcement.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,11 @@ async function createAnnouncement(

async function deleteAnnouncement(
centreId: number,
userId: number,
announcementId: number
): Promise<boolean> {
try {
const numDeletedRows = await Announcement.destroy({
where: { centreId: centreId, id: announcementId, creatorId: userId },
where: { centreId: centreId, id: announcementId },
});
return numDeletedRows > 0;
} catch (error: any) {
Expand All @@ -46,20 +45,22 @@ async function editAnnouncement(
): Promise<Announcement> {
try {
const announcement = await Announcement.findOne({
where: { centreId: centreId, id: announcementId, creatorId: userId },
where: { centreId: centreId, id: announcementId },
});
if (!announcement) {
throw new Error(`Announcement with ID ${announcementId} not found`);
}

if (announcement.content) {
if (content) {
announcement.content = content;
}

if (announcement.title) {
if (title) {
announcement.title = title;
}

announcement.creatorId = userId;

await announcement.save();
await announcement.reload();

Expand Down
136 changes: 136 additions & 0 deletions src/dataaccess/homework.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
import Homework from "../models/homework";
import User from "../models/user";
import { getClassById, getClassesByStudentId } from "./class";

async function createHomework(
centreId: number,
classId: number,
creatorId: number,
title: string,
description: string,
dueDate: string
): Promise<Homework> {
try {
return await Homework.create({
centreId: centreId,
classId: classId,
creatorId: creatorId,
title: title,
description: description,
dueDate: new Date(dueDate),
});
} catch (error: any) {
throw new Error(`Failed to create homework: ${error.message}`);
}
}

async function deleteHomework(
centreId: number,
homeworkId: number
): Promise<boolean> {
try {
const numDeletedRows = await Homework.destroy({
where: { centreId: centreId, id: homeworkId },
});
return numDeletedRows > 0;
} catch (error: any) {
throw new Error(`Failed to delete homework: ${error.message}`);
}
}

async function editHomework(
centreId: number,
userId: number,
homeworkId: number,
title: string,
description: string,
dueDate: string
): Promise<Homework> {
try {
const homework = await Homework.findOne({
where: { centreId: centreId, id: homeworkId },
});
if (!homework) {
throw new Error(`Homework with ID ${homeworkId} not found`);
}

if (description) {
homework.description = description;
}

if (title) {
homework.title = title;
}

if (dueDate) {
homework.dueDate = new Date(dueDate);
}

homework.creatorId = userId;

await homework.save();
await homework.reload();

return homework;
} catch (error: any) {
throw new Error(`Failed to update homework: ${error.message}`);
}
}

async function getHomeworkByClassId(
centreId: number,
classId: number
): Promise<Homework[]> {
try {
const targetClass = await getClassById(centreId, classId);
if (!targetClass) {
throw new Error(`Class with ID ${classId} not found`);
}

return await Homework.findAll({
where: { centreId: centreId, classId: classId },
order: [["createdAt", "DESC"]],
include: [
{
model: User,
as: "creator",
attributes: ["id", "fullName"],
},
],
});
} catch (error: any) {
throw new Error(`Failed to get announcements: ${error.message}`);
}
}

async function getHomeworkByStudentId(
centreId: number,
studentId: number
): Promise<Homework[]> {
try {
const classes = await getClassesByStudentId(centreId, studentId);
const classIds = classes.map((c) => c.id);

return await Homework.findAll({
where: { centreId: centreId, classId: classIds },
order: [["createdAt", "DESC"]],
include: [
{
model: User,
as: "creator",
attributes: ["id", "fullName"],
},
],
});
} catch (error: any) {
throw new Error(`Failed to get note: ${error.message}`);
}
}

export {
createHomework,
deleteHomework,
editHomework,
getHomeworkByClassId,
getHomeworkByStudentId,
};
4 changes: 2 additions & 2 deletions src/dataaccess/note.ts
Original file line number Diff line number Diff line change
Expand Up @@ -99,11 +99,11 @@ async function editNote(
throw new Error(`Note with ID ${noteId} not found`);
}

if (note.content) {
if (content) {
note.content = content;
}

if (note.title) {
if (title) {
note.title = title;
}

Expand Down
2 changes: 1 addition & 1 deletion src/handlers/announcement/deleteAnnouncement.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ export default async function handleDeleteAnnouncement(
) {
try {
const user: User = req.body.user;
await deleteAnnouncement(user.centreId, user.id, params.announcementId);
await deleteAnnouncement(user.centreId, params.announcementId);

res.status(201).json({ message: SUCCESS_DELETE_ANNOUNCEMENT });
} catch (error: any) {
Expand Down
37 changes: 37 additions & 0 deletions src/handlers/homework/addHomework.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import { Request, Response } from "express";

import { createHomework } from "../../dataaccess/homework";
import { AddHomeworkParams } from "../../params/homework/addHomework";
import User from "../../models/user";

const SUCCESS_CREATED_HOMEWORK = "Homework created successfully";

const ERROR_FAILED_TO_CREATE_HOMEWORK = "Failed to create homework";

export default async function handleAddHomework(
req: Request,
res: Response,
params: AddHomeworkParams
) {
try {
const user = req.body.user as User;

const response = await createHomework(
user.centreId,
params.classId,
user.id,
params.title,
params.description,
params.dueDate
);

res
.status(201)
.json({ message: SUCCESS_CREATED_HOMEWORK, newHomeWork: response });
} catch (error: any) {
res.status(500).json({
message: ERROR_FAILED_TO_CREATE_HOMEWORK,
error: error.message,
});
}
}
27 changes: 27 additions & 0 deletions src/handlers/homework/deleteHomework.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { Request, Response } from "express";

import { DeleteHomeworkParams } from "../../params/homework/deleteHomework";
import { deleteHomework } from "../../dataaccess/homework";
import User from "../../models/user";

const SUCCESS_DELETE_HOMEWORK = "Homework deleted successfully";

const ERROR_FAILED_TO_DELETE_HOMEWORK = "Failed to delete homework";

export default async function handleDeleteHomework(
req: Request,
res: Response,
params: DeleteHomeworkParams
) {
try {
const user: User = req.body.user;
await deleteHomework(user.centreId, params.homeworkId);

res.status(201).json({ message: SUCCESS_DELETE_HOMEWORK });
} catch (error: any) {
res.status(500).json({
message: ERROR_FAILED_TO_DELETE_HOMEWORK,
error: error.message,
});
}
}
34 changes: 34 additions & 0 deletions src/handlers/homework/editHomework.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { Request, Response } from "express";

import User from "../../models/user";
import { EditHomeworkParams } from "../../params/homework/editHomework";
import { editHomework } from "../../dataaccess/homework";

const SUCCESS_EDITED_HOMEWORK = "Homework edited successfully";

const ERROR_FAILED_TO_EDIT_HOMEWORK = "Failed to edit homework";

export default async function handleEditHomework(
req: Request,
res: Response,
params: EditHomeworkParams
) {
try {
const user: User = req.body.user;
await editHomework(
user.centreId,
user.id,
params.homeworkId,
params.title,
params.description,
params.dueDate
);

res.status(201).json({ message: SUCCESS_EDITED_HOMEWORK });
} catch (error: any) {
res.status(500).json({
message: ERROR_FAILED_TO_EDIT_HOMEWORK,
error: error.message,
});
}
}
Loading

0 comments on commit 1dbecf3

Please sign in to comment.