Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

added endpoints,apidoc and testcases #360

Merged
merged 5 commits into from
Oct 14, 2023
Merged
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
87 changes: 87 additions & 0 deletions _apidoc.js
Original file line number Diff line number Diff line change
Expand Up @@ -672,6 +672,39 @@
* attainment as per Bloom's Taxanomy (L1-L6).
*/

// ------------------------------------------------------------------------------------------
// Attendance.
// ------------------------------------------------------------------------------------------

/**
* @api {post} /attendance/add Add Attendance
* @apiName AddAttendance
* @apiGroup Attendance
* @apiDescription Add a new attendance.
*
* @apiBody {String} student Student name.
* @apiBody {String} course Course name.
* @apiBody {Number} monthlyAttended Monthly attendance of student.
* @apiBody {Number} monthlyOccured Monthly occured.
* @apiBody {Number} cumulativeAttended sum of attendance of student.
* @apiBody {Number} cumulativeOccured sum of occured.
*
* @apiSuccess {String} res Response message.
* @apiError (Error 500) UserNotFound The of the User was not found
*
* @apiSuccessExample Success-Response:
* HTTP/1.1 200 OK
* {
* "res": "added attendance Example Attendance"
* }
*
* @apiErrorExample Error-Response:
* HTTP/1.1 500 Internal Server Error
* {
* "err": "Error while inserting in DB"
* }
*/

// ------------------------------------------------------------------------------------------
// Exam.
// ------------------------------------------------------------------------------------------
Expand Down Expand Up @@ -883,6 +916,20 @@
* "err": "Error while inserting in DB"
* }
*/

/**
* @api {delete} /attendance/delete/:attendanceId To delete Attendance
* @apiName DeleteAttendance
* @apiGroup Attendance
*
* @apiParam {String} attendanceId The ID of the attendance document to delete.
*
* @apiSuccess {String} res Success message indicating the deletion.
*
* @apiError (Error 500) err Error message if there was an error during the deletion.
*
* */

// ------------------------------------------------------------------------------------------
// Practical.
// ------------------------------------------------------------------------------------------
Expand Down Expand Up @@ -1037,6 +1084,24 @@
*
* */

/**
* @api {post} /attendance/update update attendance details
* @apiName UpdateAttendance
* @apiGroup Attendance
* @apiDescription update Existing attendance
*
* @apiBody {String} [student] Student name.
* @apiBody {String} [course] Course name.
* @apiBody {Number} [monthlyAttended] Monthly attendance of student.
* @apiBody {Number} [monthlyOccured] Monthly occured.
* @apiBody {Number} [cumulativeAttended] sum of attendance of student.
* @apiBody {Number} [cumulativeOccured] sum of occured.
*
* @apiSuccess {String} res Attendance updated.
* @apiError (Error 500) err Error in updating database
*
*/

/**
* @api {post} /paper/update/:id Update Paper
* @apiName UpdatePaper
Expand Down Expand Up @@ -1075,6 +1140,27 @@
*
*/

/**
* @api {get} attendance/list Get Attendance List
* @apiName GetAttendance
* @apiGroup Attendance
*
* @apiBody {String} [student] Student name.
* @apiBody {String} [course] Course name.
* @apiBody {Number} [monthlyAttended] Monthly attendance of student.
* @apiBody {Number} [monthlyOccured] Monthly occured.
* @apiBody {Number} [cumulativeAttended] sum of attendance of student.
* @apiBody {Number} [cumulativeOccured] sum of occured.
*
* @apiSuccess {attendance[]} res Array of Filtered attendance Doc.
* @apiSuccess {String} attendance._id ID of document given by database.
* @apiSuccess {String} attendance.student Name of student.
* @apiSuccess {String} attendance.course Name of course.
* @apiSuccess {Number} attendance.monthlyAttended Monthly attendance of student.
* @apiSuccess {Number} attendance.cumulativeAttended sum of attendance of student.
* @apiSuccess {Number} attendance.cumulativeOccured sum of occured.
*/

/**
* @api {post} /exam/update/:id Update Exam Details
* @apiName UpdateExam
Expand Down Expand Up @@ -1585,6 +1671,7 @@
* @apiSuccess {String} res Topic updated.
* @apiError (Error 500) DatabaseError Error in updating the database.
*/

/**
* @api {post} /faculty/update/:id Update Faculty
* @apiName UpdateFaculty
Expand Down
2 changes: 2 additions & 0 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import moduleRouter from "#routes/module";
import facultyRouter from "#routes/faculty";
import { identifyUser } from "#middleware/identifyUser";
import departmentRouter from "#routes/department";
import attendanceRouter from "#routes/attendance";
import examRouter from "#routes/exam";
import paperRouter from "#routes/paper";
import groupRouter from "#routes/group";
Expand Down Expand Up @@ -60,6 +61,7 @@ app.use("/timetable", timetableRouter);
app.use("/department", departmentRouter);
app.use("/coursework", courseworkRouter);
app.use("/module", moduleRouter);
app.use("/attendance", attendanceRouter);
app.use("/exam", examRouter);
app.use("/paper", paperRouter);
app.use("/group", groupRouter);
Expand Down
62 changes: 62 additions & 0 deletions controller/attendance.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import {
addNewAttendance, deleteAttendanceById, updateAttendanceById, getAttendances,
} from "#services/attendance";
import { logger } from "#util";

async function addAttendance(req, res) {
const {
student, course, monthlyAttended, monthlyOccured, cumulativeAttended, cumulativeOccured,
} = req.body;
try {
// eslint-disable-next-line max-len
const attendance = await addNewAttendance( student, course, monthlyAttended, monthlyOccured, cumulativeAttended, cumulativeOccured);
res.json({ res: `added attendance ${attendance.student}`, id: attendance.id });
} catch (error) {
logger.error("Error while inserting", error);
res.status(500);
res.json({ err: "Error while inserting in DB" });
}
}
async function deleteAttendance(req, res) {
const { id } = req.params;
try {
await deleteAttendanceById(id);
res.json({ res: "Attendance deleted successfully" });
} catch (error) {
logger.error("Error while deleting", error);
res.status(500);
res.json({ err: "Error while deleting from DB" });
}
}

async function updateAttendance(req, res) {
const { id } = req.params;
const {
...data
} = req.body;

try {
await updateAttendanceById(id, data);
res.json({ res: `${id} attendance updated` });
} catch (error) {
logger.error("Error while inserting", error);
res.status(500);
res.json({ err: "Error while inserting in DB" });
}
}

async function showAttendance(req, res) {
try {
const attendance = await getAttendances(req.query);
return res.json({ res: attendance });
} catch (error) {
logger.error("Error while fetching", error);
res.status(500);
return res.json({ err: "Error while fetching the data" });
}
}

export default {
addAttendance, updateAttendance, deleteAttendance, showAttendance,
};

10 changes: 10 additions & 0 deletions routes/attendance.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import express from "express";
import attendanceController from "#controller/attendance";

const router = express.Router();
router.get("/list", attendanceController.showAttendance);
router.post("/add", attendanceController.addAttendance);
router.delete("/delete/:id", attendanceController.deleteAttendance);
router.post("/update/:id", attendanceController.updateAttendance);

export default router;
41 changes: 41 additions & 0 deletions services/attendance.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import Attendance from "#models/attendance";
import databaseError from "#error/database";

export async function addNewAttendance( student, course, monthlyAttended, monthlyOccured, cumulativeAttended, cumulativeOccured) {
const newAttendance = await Attendance.create({
student,
course,
monthlyAttended,
monthlyOccured,
cumulativeAttended,
cumulativeOccured,
});
if (String(newAttendance.student) === student) {
return newAttendance;
}
throw new databaseError.DataEntryError("Add Attendance");
}

export async function getAttendances(filter) {
const attendances = await Attendance.read(filter);
if (attendances) {
return attendances;
}
throw new databaseError.DataNotFoundError("Attendance");
}

export async function deleteAttendanceById(attendanceId) {
const deleted = await Attendance.remove({ _id: attendanceId });
if (deleted) {
return deleted;
}
throw new databaseError.DataDeleteError("Attendance");
}

export async function updateAttendanceById(id, data) {
const updated = await Attendance.update({ _id: id }, data);
if (updated) {
return updated;
}
throw new databaseError.DataEntryError("Attendance");
}
68 changes: 68 additions & 0 deletions test/routes/attendance.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import { jest } from "@jest/globals"; // eslint-disable-line import/no-extraneous-dependencies
import attendanceModel from "#models/attendance";
import connector from "#models/databaseUtil";

jest.mock("#util");
const { agent } = global;

function cleanUp(callback) {
attendanceModel.remove({ student: "64fc3c8bde9fa947ea1f412f" }).then(() => {
connector.disconnect((DBerr) => {
if (DBerr) console.log("Database dissconnnect error: ", DBerr);
callback();
});
});
}

afterAll((done) => {
cleanUp(done);
});

describe("checking attendance functions", () => {
it("create attendance", async () => {
const response = await agent.post("/attendance/add").send({
student: "64fc3c8bde9fa947ea1f412f",
course: "64fc3c8bde9fa947ea1f412f",
monthlyAttended: 123,
monthlyOccured: 123,
cumulativeAttended: 123,
cumulativeOccured: 123,
});
expect(response.headers["content-type"]).toMatch(/json/);
expect(response.status).toBe(200);
expect(response.body.res).toMatch(/added attendance/);
});
let id;
beforeEach(async () => {
id = await agent.post("/attendance/add").send({
student: "64fc3c8bde9fa947ea1f412f",
course: "64fc3c8bde9fa947ea1f412f",
monthlyAttended: 123,
monthlyOccured: 123,
cumulativeAttended: 123,
cumulativeOccured: 123,
});
id = JSON.parse(id.res.text).id;
});

afterEach(async () => {
await attendanceModel.remove({ student: "64fc3c8bde9fa947ea1f412f" });
});

it("read attendance", async () => {
const response = await agent
.get("/attendance/list")
.send({ student: "64fc3c8bde9fa947ea1f412f" });
expect(response.status).toBe(200);
expect(response.body.res).toBeDefined();
});

it("update attendance", async () => {
const response = await agent
.post(`/attendance/update/${id}`)
.send({ student: "64fc3c8bde9fa947ea1f412f" });
expect(response.headers["content-type"]).toMatch(/json/);
expect(response.status).toBe(200);
expect(response.body.res).toMatch(/attendance updated/);
});
});