Skip to content
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
77 changes: 77 additions & 0 deletions _apidoc.js
Original file line number Diff line number Diff line change
Expand Up @@ -666,6 +666,64 @@
* attainment as per Bloom's Taxanomy (L1-L6).
*/

// ------------------------------------------------------------------------------------------
// Paper.
// ------------------------------------------------------------------------------------------
//
/**
* @api {post} /paper/add Add Paper
* @apiName AddPaper
* @apiDescription Adds a new Paper.
* @apiGroup Paper
*
* @apiBody {String} [answersheetID] The id of the Answersheet.
* @apiBody {connector.Schema.Types.ObjectId} Exam The Exam which is associated.
* @apiBody {connector.Schema.Types.ObjectId} Student The Student which is associated.
* @apiBody {connector.Schema.Types.ObjectId} Faculty The Faculty which is associated.
* @apiBody {Number} [marks] marks in the paper.
*
* @apiSuccess {String} res added Paper successfully.
*
* @apiError (Error 500) DatabaseError Error while inserting in the DB.
*
*/

/**
* @api {get} /paper/list Listdown Paper
* @apiName GetPaper
* @apiDescription Listdown the Paper.
* @apiGroup Paper
*
* @apiQuery {String} [answersheetID] The id of the Answersheet.
* @apiQuery {connector.Schema.Types.ObjectId} Exam The Exam which is associated.
* @apiQuery {connector.Schema.Types.ObjectId} Student The Student which is associated.
* @apiQuery {connector.Schema.Types.ObjectId} Faculty The Faculty which is associated.
* @apiQuery {Number} [marks] marks in the paper.
*
* @apiSuccess {Paper[]} res Array of Filtered Paper Doc.
* @apiSuccess {String} paper._id ID of paper given by database.
* @apiSuccess {String} paper.answersheetID ID of answersheet.
* @apiSuccess {connector.Schema.Types.ObjectId} paper.exam associated Exam.
* @apiSuccess {connector.Schema.Types.ObjectId} paper.student associated Student.
* @apiSuccess {connector.Schema.Types.ObjectId} paper.faculty associated Faculty.
* @apiSuccess {Number} paper.marks The marks in the Paper.
* @apiError (Error 500) err Error while fetching the data.
*/

/**
* @api {delete} /paper/delete/:id Delete Paper
* @apiName DeletePaper
* @apiDescription Remove the existing Paper.
* @apiGroup Paper
*
* @apiParam {String} answersheetID The ID of the answersheet to delete.
*
* @apiSuccess {String} res Paper deleted successfully.
*
* @apiError (Error 500) err Error while deleting from DB.
*
* */

// ------------------------------------------------------------------------------------------
// Assignment.
// ------------------------------------------------------------------------------------------
Expand Down Expand Up @@ -836,6 +894,25 @@
*
* */

/**
* @api {post} /paper/update/ Update Paper
* @apiName UpdatePaper
* @apiGroup Paper
* @apiDescription Update Existing Paper details except
*
* @apiSuccess {Paper[]} res Array of Filtered Paper Doc .
* @apiSuccess {String} paper._id ID of paper given by database.
* @apiSuccess {String} paper.answersheetID Name of Infrastructure
* @apiSuccess {connector.Schema.Types.ObjectId} paper.exam associated Exam.
* @apiSuccess {connector.Schema.Types.ObjectId} paper.student associated Student.
* @apiSuccess {connector.Schema.Types.ObjectId} paper.faculty associated Faculty.
* @apiSuccess {Number} paper.marks The marks in the Paper.
*
* @apiSuccess {String} res Paper updated successfully.
*
* @apiError (Error 500) err Error while updating the data.s
*/

/**
* @api {post} /assignment/update update assignment details
* @apiName UpdateAssignment
Expand Down
3 changes: 3 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 paperRouter from "#routes/paper";
import groupRouter from "#routes/group";

const app = express();
Expand Down Expand Up @@ -57,7 +58,9 @@ app.use("/timetable", timetableRouter);
app.use("/department", departmentRouter);
app.use("/coursework", courseworkRouter);
app.use("/module", moduleRouter);
app.use("/paper", paperRouter);
app.use("/group", groupRouter);
app.use("/semester", semesterRouter);
app.use("/faculty", facultyRouter);

export default app;
64 changes: 64 additions & 0 deletions controller/paper.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import {
createPaper, updatePaperById, listPaper, deletePaperById,
} from "#services/paper";
import { logger } from "#util";

async function addPaper(req, res) {
const {
answerSheetID,
exam,
student,
checkedBy,
mark,
} = req.body;
try {
const newPaper = await createPaper(
answerSheetID,
exam,
student,
checkedBy,
mark,
);
res.json({ res: `added paper for: ${newPaper.answerSheetID}`, id: newPaper.id });
} catch (error) {
logger.error("Error while inserting", error);
res.status(500);
res.json({ err: "Error while inserting in DB" });
}
}

async function updatePaper(req, res) {
const { id } = req.params;
const {
...data
} = req.body;
try {
await updatePaperById(id, data);
res.json({ res: "Paper updated" });
} catch (error) {
logger.error("Error while updating", error);
res.status(500);
res.json({ err: "Error while updating in DB" });
}
}

async function showPaper(req, res) {
const filter = req.query;
const paper = await listPaper(filter);
res.json({ res: paper });
}

async function deletePaper(req, res) {
const { id } = req.params;
try {
await deletePaperById(id);
res.json({ res: `Deleted paper with ID ${id}` });
} catch (error) {
logger.error("Error while deleting", error);
res.status(500).json({ error: "Error while deleting from DB" });
}
}

export default {
addPaper, updatePaper, showPaper, deletePaper,
};
1 change: 0 additions & 1 deletion models/paper.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ const paperSchema = {
mark: { type: Number, required: true },
};

// eslint-disable-next-line no-unused-vars
const Paper = connector.model("Paper", paperSchema);

// CRUD OPERATIONS
Expand Down
11 changes: 11 additions & 0 deletions routes/paper.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import express from "express";
import paperController from "#controller/paper";

const router = express.Router();

router.post("/add", paperController.addPaper);
router.get("/list", paperController.showPaper);
router.post("/update/:id", paperController.updatePaper);
router.delete("/delete/:id", paperController.deletePaper);

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

export async function createPaper(
answerSheetID,
exam,
student,
checkedBy,
mark,
) {
const newPaper = await Paper.create({
answerSheetID,
exam,
student,
checkedBy,
mark,
});
if (newPaper) {
return newPaper;
}
throw new databaseError.DataEntryError("paper");
}

export async function updatePaperById(id, data) {
const updated = await Paper.update({ _id: id }, data);
if (updated) {
return updated;
}
throw new databaseError.DataEntryError("paper");
}

export async function listPaper(filter) {
const paper = await Paper.read(filter, 0);
return paper;
}

export async function deletePaperById(paperId) {
const deleted = await Paper.remove({ _id: paperId });
if (deleted) {
return deleted;
}
throw new databaseError.DataDeleteError("paper");
}
117 changes: 117 additions & 0 deletions test/routes/paper.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
import request from "supertest";
import { jest } from "@jest/globals";
import app from "#app";
import paperModel from "#models/paper";
import connector from "#models/databaseUtil";

jest.mock("#util");

let server;
let agent;

beforeAll((done) => {
server = app.listen(null, () => {
agent = request.agent(server);
connector.set("debug", false);
done();
});
});

function cleanUp(callback) {
paperModel.remove(
{
answerSheetID: "asd123",
exam: "64fc3c8bde9fa947ea1f412f",
student: "64fc3c8bde9fa947ea1f412f",
checkedBy: "64fc3c8bde9fa947ea1f412f",
mark: 100,
},
)
.then(() => {
connector.disconnect((DBerr) => {
if (DBerr) console.log("Database disconnect error: ", DBerr);
server.close((serverErr) => {
if (serverErr) console.log(serverErr);
callback();
});
});
});
}

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

describe("Paper CRUD", () => {
it("should create paper with associated exam, student and faculty", async () => {
const response = await agent.post("/paper/add").send(
{
answerSheetID: "asd123",
exam: "64fc3c8bde9fa947ea1f412f",
student: "64fc3c8bde9fa947ea1f412f",
checkedBy: "64fc3c8bde9fa947ea1f412f",
mark: 100,
},
);

expect(response.status).toBe(200);
expect(response.headers["content-type"]).toMatch(/json/);
});

let id;
beforeEach(async () => {
id = await agent.post("/paper/add").send(
{
answerSheetID: "asd123",
exam: "64fc3c8bde9fa947ea1f412f",
student: "64fc3c8bde9fa947ea1f412f",
checkedBy: "64fc3c8bde9fa947ea1f412f",
mark: 100,
},
);
id = JSON.parse(id.res.text).id;
});

afterEach(async () => {
await paperModel.remove(
{
answerSheetID: "asd123",
exam: "64fc3c8bde9fa947ea1f412f",
student: "64fc3c8bde9fa947ea1f412f",
checkedBy: "64fc3c8bde9fa947ea1f412f",
mark: 100,
},
);
});

it("should read paper", async () => {
const response = await agent
.get("/paper/list")
.send(
{
answerSheetID: "asd123",
exam: "64fc3c8bde9fa947ea1f412f",
student: "64fc3c8bde9fa947ea1f412f",
checkedBy: "64fc3c8bde9fa947ea1f412f",
mark: 100,
},
);
expect(response.body.res).not.toBeNull();
});

it("should update paper", async () => {
const response = await agent
.post(`/paper/update/${id}`)
.send(
{
answerSheetID: "asd123",
exam: "64fc3c8bde9fa947ea1f412f",
student: "64fc3c8bde9fa947ea1f412f",
checkedBy: "64fc3c8bde9fa947ea1f412f",
mark: 100,
},
);
expect(response.status).toBe(200);
expect(response.body.res).toMatch(/Paper updated/);
});
});