Skip to content

Commit 692065c

Browse files
Merge pull request #339 from tcet-opensource/280-megafeat-semester
[Added] Endpoints, APIDOC for Semester
2 parents e21f266 + 8e7afc0 commit 692065c

File tree

7 files changed

+268
-2
lines changed

7 files changed

+268
-2
lines changed

_apidoc.js

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,74 @@
666666
* attainment as per Bloom's Taxanomy (L1-L6).
667667
*/
668668

669+
// ------------------------------------------------------------------------------------------
670+
// Semester
671+
// ------------------------------------------------------------------------------------------
672+
/**
673+
* @api {post} /semester/add Request to add Semester information
674+
* @apiName Addsemester
675+
* @apiGroup Semester
676+
*
677+
* @apiQuery {Number} [number] Number of semester
678+
* @apiQuery {String} [academicYear] To show the current academic year
679+
* @apiQuery {String} [type] Stores the enum ODD or EVEN for semester
680+
* @apiQuery {Date} [startDate] Start date of the semester
681+
* @apiQuery {Date} [endDate] End date of the semester
682+
*
683+
* @apiSuccess {String} res Response message .
684+
* @apiError (Error 500) DatabaseError Err message if there is an error inserting into the database.
685+
*
686+
*/
687+
688+
/**
689+
* @api {get} /semester/list Request to list Semester information
690+
* @apiName semesterlist
691+
* @apiGroup Semester
692+
*
693+
* @apiQuery {Number} [number] Number of semester
694+
* @apiQuery {String} [academicYear] To show the current academic year
695+
* @apiQuery {String} [type] Stores the enum ODD or EVEN for semester
696+
* @apiQuery {Date} [startDate] Start date of the semester
697+
* @apiQuery {Date} [endDate] End date of the semester
698+
*
699+
* @apiSuccess {semester[]} res Array of Filtered semester Doc.
700+
* @apiSuccess {Number} semester.number Number of semester
701+
* @apiSuccess {String} semester.academicYear To show the current academic year of the semester
702+
* @apiSuccess {String} semester.type Stores the enum ODD or EVEN for semester
703+
* @apiSuccess {Date} semester.startDate Start date of the semester
704+
* @apiSuccess {Date} semester.endDate End date of the semester
705+
*
706+
*/
707+
708+
/**
709+
* @api {update} /semester/update/:id Request to list Semester information
710+
* @apiName Updatesemester
711+
* @apiGroup Semester
712+
*
713+
* @apiBody {Number} [number] Number of semester
714+
* @apiBody {String} [academicYear] To show the current academic year
715+
* @apiBody {String} [type] Stores the enum ODD or EVEN for semester
716+
* @apiBody {Date} [startDate] Start date of the semester
717+
* @apiBody {Date} [endDate] End date of the semester
718+
*
719+
*@apiSuccess {String} res Semester updated.
720+
* @apiError (Error 500) DatabaseError Error in updating the database.
721+
*
722+
*/
723+
724+
/**
725+
* @api {delete} /semester/delete/:id Request to list Semester information
726+
* @apiName Deletesemester
727+
* @apiGroup Semester
728+
*
729+
* @apiParam {String} id The ID of the Semester document to delete.
730+
*
731+
* @apiSuccess {String} res Success message indicating the deletion.
732+
*
733+
* @apiError (Error 500) DatabaseError Error message if there was an error during the deletion.
734+
*/
735+
736+
669737
// ------------------------------------------------------------------------------------------
670738
// Activity.
671739
// ------------------------------------------------------------------------------------------
@@ -813,4 +881,4 @@
813881
* @apiSuccess {ObjectId} task The task of the activity (ObjectId).One of possible Topic,Practical,Tutorial.
814882
* @apiSuccess {ObjectId} group The group of the activity (ObjectId).
815883
* @apiSucess {ObjectId} students the students who gonna attend the activity(ObjectId).
816-
*/
884+
*/

app.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { logger } from "#util";
88
import indexRouter from "#routes/index";
99
import usersRouter from "#routes/users";
1010
import authRouter from "#routes/auth";
11+
import semesterRouter from "#routes/semester";
1112
import accreditationRouter from "#routes/accreditation";
1213
import infrastructureRouter from "#routes/infrastructure";
1314
import practicalRouter from "#routes/practical";
@@ -55,5 +56,6 @@ app.use("/timetable", timetableRouter);
5556
app.use("/department", departmentRouter);
5657
app.use("/coursework", courseworkRouter);
5758
app.use("/module", moduleRouter);
59+
app.use("/semester", semesterRouter);
5860
app.use("/faculty", facultyRouter);
5961
export default app;

controller/semester.js

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import {
2+
createSemester, updateSemesterById, semesterList, deleteSemesterById,
3+
} from "#services/semester";
4+
import { logger } from "#util";
5+
6+
async function addSemester(req, res) {
7+
const {
8+
number, academicYear, type, startDate, endDate,
9+
} = req.body;
10+
11+
try {
12+
const newSemester = await createSemester(number, academicYear, type, startDate, endDate);
13+
res.json({ res: `added semester ${newSemester.id} `, id: newSemester.id });
14+
} catch (error) {
15+
logger.error("Error while inserting", error);
16+
res.status(500);
17+
res.json({ err: "Error while inserting in DB" });
18+
}
19+
}
20+
21+
async function updateSemester(req, res) {
22+
const { id } = req.params;
23+
const {
24+
...data
25+
} = req.body;
26+
try {
27+
await updateSemesterById(id, data);
28+
res.json({ res: `Updated Semester with id ${id}` });
29+
} catch (error) {
30+
logger.error("Error while updating", error);
31+
res.status(500);
32+
res.json({ err: "Error while updating in DB" });
33+
}
34+
}
35+
36+
async function getSemester(req, res) {
37+
const filter = req.query;
38+
const semlist = await semesterList(filter);
39+
res.json({ res: semlist });
40+
}
41+
42+
async function deleteSemester(req, res) {
43+
const { id } = req.params;
44+
try {
45+
await deleteSemesterById(id);
46+
res.json({ res: `Deleted Semster with id ${id}` });
47+
} catch (error) {
48+
logger.error("Error while deleting", error);
49+
res.status(500).json({ error: "Error while deleting from DB" });
50+
}
51+
}
52+
export default {
53+
addSemester, deleteSemester, getSemester, updateSemester,
54+
};

models/semester.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const semesterSchema = {
1010
message: (props) => `${props.value} is not a valid year format starting with "2"!`,
1111
},
1212
},
13-
type: { enum: ["ODD", "EVEN"], required: true },
13+
type: { type: String, enum: ["ODD", "EVEN"], required: true },
1414

1515
startDate: { type: Date, required: true },
1616
endDate: { type: Date, required: true },

routes/semester.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import express from "express";
2+
import semesterController from "#controller/semester";
3+
4+
const router = express.Router();
5+
router.post("/add", semesterController.addSemester);
6+
router.get("/list", semesterController.getSemester);
7+
router.post("/update/:id", semesterController.updateSemester);
8+
router.delete("/delete/:id", semesterController.deleteSemester);
9+
10+
export default router;

services/semester.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import Semester from "#models/semester";
2+
import databaseError from "#error/database";
3+
4+
export async function createSemester(number, academicYear, type, startDate, endDate) {
5+
const newSemester = await Semester.create({
6+
number, academicYear, type, startDate, endDate,
7+
});
8+
if (newSemester.number === number) {
9+
return newSemester;
10+
}
11+
throw new databaseError.DataDeleteError("semster");
12+
}
13+
14+
export async function updateSemesterById(id, data) {
15+
const update = await Semester.update({ _id: id }, data);
16+
17+
if (update) {
18+
return update;
19+
}
20+
throw new databaseError.DataEntryError("semester");
21+
}
22+
23+
export async function semesterList(filter) {
24+
const semlist = await Semester.read(filter, 0);
25+
return semlist;
26+
}
27+
28+
export async function deleteSemesterById(semesterId) {
29+
const deleted = await Semester.remove({ _id: semesterId });
30+
if (deleted) {
31+
return deleted;
32+
}
33+
throw new databaseError.DataDeleteError("semester");
34+
}

test/routes/semester.test.js

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
import { jest } from "@jest/globals"; // eslint-disable-line import/no-extraneous-dependencies
2+
import request from "supertest";
3+
import app from "#app";
4+
import connector from "#models/databaseUtil";
5+
import semesterModel from "#models/semester";
6+
7+
jest.mock("#util");
8+
9+
let server;
10+
let agent;
11+
12+
beforeAll((done) => {
13+
server = app.listen(null, () => {
14+
agent = request.agent(server);
15+
connector.set("debug", false);
16+
done();
17+
});
18+
});
19+
20+
function cleanUp(callback) {
21+
semesterModel
22+
.remove({
23+
number: 3,
24+
academicYear: "2023",
25+
type: "ODD",
26+
startDate: "2023-06-18T14:11:30Z",
27+
endDate: "2023-06-18T14:11:30Z",
28+
})
29+
.then(() => {
30+
connector.disconnect((DBerr) => {
31+
if (DBerr) console.log("Database disconnect error: ", DBerr);
32+
server.close((serverErr) => {
33+
if (serverErr) console.log(serverErr);
34+
callback();
35+
});
36+
});
37+
});
38+
}
39+
40+
afterAll((done) => {
41+
cleanUp(done);
42+
});
43+
44+
describe("Semester API", () => {
45+
it("Should create semester", async () => {
46+
const response = await agent.post("/semester/add").send({
47+
number: 3,
48+
academicYear: "2023",
49+
type: "ODD",
50+
startDate: "2023-06-18T14:11:30Z",
51+
endDate: "2023-06-18T14:11:30Z",
52+
});
53+
54+
expect(response.status).toBe(200);
55+
expect(response.body.res).toMatch(/added semester/);
56+
});
57+
58+
describe("after adding semester", () => {
59+
let id;
60+
beforeEach(async () => {
61+
id = await agent.post("/semester/add").send({
62+
number: 3,
63+
academicYear: "2023",
64+
type: "ODD",
65+
startDate: "2023-06-18T14:11:30Z",
66+
endDate: "2023-06-18T14:11:30Z",
67+
});
68+
id = JSON.parse(id.res.text).id;
69+
});
70+
71+
afterEach(async () => {
72+
await semesterModel.remove({
73+
number: 3,
74+
academicYear: "2023",
75+
type: "ODD",
76+
startDate: "2023-06-18T14:11:30Z",
77+
endDate: "2023-06-18T14:11:30Z",
78+
});
79+
});
80+
81+
it("should read semester", async () => {
82+
const response = await agent
83+
.get("/semester/list")
84+
.send({ number: 3 });
85+
expect(response.status).toBe(200);
86+
expect(response.body.res).toBeDefined();
87+
});
88+
89+
it("should update semester", async () => {
90+
const response = await agent
91+
.post(`/semester/update/${id}`)
92+
.send({ number: 3 }, { academicYear: 2024 });
93+
94+
expect(response.status).toBe(200);
95+
expect(response.body.res).toMatch(/Updated Semester/);
96+
});
97+
});
98+
});

0 commit comments

Comments
 (0)