Skip to content

Commit 4af0b36

Browse files
Merge branch 'development' into 20233110_docker_compose_refining
2 parents 2461a04 + 52d2fb0 commit 4af0b36

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1987
-109
lines changed

.env.example

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
PORT=4000
2+
TOKEN_SECRET=mysecret
3+
ENVIRONMENT=local
4+
DB_URL=mongodb://mongo1:30001,mongo2:30002,mongo3:30003/?replicaSet=my-replica-set
5+
EMAIL_HOST=
6+
EMAIL_PORT=
7+
EMAIL_USER=
8+
EMAIL_PASS=
9+
10+
# get email stuff from mailtrap

app.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import performarouter from "#routes/performance";
3131
import notificationRouter from "#routes/notification";
3232
import topicRouter from "#routes/topic";
3333
import courseRouter from "#routes/course";
34+
import activityBlueprintRouter from "#routes/activityBlueprint";
3435

3536
const app = express();
3637
const currDirName = dirname(fileURLToPath(import.meta.url));
@@ -76,5 +77,6 @@ app.use("/performance", performarouter);
7677
app.use("/notification", notificationRouter);
7778
app.use("/topic", topicRouter);
7879
app.use("/course", courseRouter);
80+
app.use("/activityBlueprint", activityBlueprintRouter);
7981

8082
export default app;

controller/activity.js

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ async function addActivity(req, res) {
1010
const {
1111
activityBlueprint,
1212
startTime,
13-
duration,
1413
course,
1514
faculty,
1615
type,
@@ -22,7 +21,6 @@ async function addActivity(req, res) {
2221
const newActivity = await createActivity(
2322
activityBlueprint,
2423
startTime,
25-
duration,
2624
course,
2725
faculty,
2826
type,

controller/activityBlueprint.js

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import {
2+
createActivityBP,
3+
updateActivityBlueprintById,
4+
deleteActivityBlueprintById,
5+
activityBlueprintList,
6+
} from "#services/activityBlueprint";
7+
import { logger } from "#util";
8+
9+
async function addActivityBP(req, res) {
10+
const {
11+
number,
12+
academicYear,
13+
day,
14+
startTime,
15+
duration,
16+
infra,
17+
course,
18+
faculty,
19+
type,
20+
group,
21+
} = req.body;
22+
try {
23+
const newActivityBP = await createActivityBP(
24+
number,
25+
academicYear,
26+
day,
27+
startTime,
28+
duration,
29+
infra,
30+
course,
31+
faculty,
32+
type,
33+
group,
34+
);
35+
return res.json({
36+
res: `added activity ${newActivityBP.id}`,
37+
id: newActivityBP.id,
38+
});
39+
} catch (error) {
40+
logger.error("Error while inserting", error);
41+
res.status(500);
42+
return res.json({ err: "Error while inserting in DB" });
43+
}
44+
}
45+
46+
async function updateActivityBP(req, res) {
47+
const { id } = req.params;
48+
const { ...data } = req.body;
49+
try {
50+
await updateActivityBlueprintById(id, data);
51+
return res.json({ res: `updated activity with id ${id}` });
52+
} catch (error) {
53+
logger.error("Error while updating", error);
54+
res.status(500);
55+
return res.json({ err: "Error while updating in DB" });
56+
}
57+
}
58+
59+
async function getActivityBP(req, res) {
60+
try {
61+
const filter = req.body;
62+
const { limit, page } = req.query;
63+
const activitylist = await activityBlueprintList(filter, limit, page);
64+
return res.json({ res: activitylist });
65+
} catch (error) {
66+
logger.error("Error while fetching", error);
67+
res.status(500);
68+
return res.json({ err: "Error while fetching the data" });
69+
}
70+
}
71+
72+
async function deleteActivityBP(res, req) {
73+
const { id } = req.params;
74+
try {
75+
await deleteActivityBlueprintById(id);
76+
return res.json({ res: `Deleted activity with ID ${id}` });
77+
} catch (error) {
78+
logger.error("Error while deleting", error);
79+
return res.status(500).json({ error: "Error while deleting from DB" });
80+
}
81+
}
82+
83+
export default {
84+
addActivityBP,
85+
deleteActivityBP,
86+
getActivityBP,
87+
updateActivityBP,
88+
};

jest.config.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
const config = {
2-
transform: {
3-
},
2+
transform: {},
43
testTimeout: 15000,
5-
setupFiles: [
4+
globalSetup: "./test/config/globalSetup.js",
5+
globalTeardown: "./test/config/globalTeardown.js",
6+
setupFilesAfterEnv: [
7+
// "<rootDir>/test/setupFile.ts",
68
"./test/config/setup.js",
79
"./test/config/teardown.js",
810
],

misc/initDB.js

Lines changed: 139 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,18 @@ import Tutorial from "#models/tutorial";
99
import Practical from "#models/practical";
1010
import Semester from "#models/semester";
1111
import Course from "#models/course";
12+
import Faculty from "#models/faculty";
13+
import Student from "#models/student";
14+
import Attendance from "#models/attendance";
15+
import Notification from "#models/notification";
16+
import User from "#models/user";
17+
import Group from "#models/group";
18+
import ActivityBlueprint from "#models/activityBlueprint";
19+
import Activity from "#models/activity";
20+
import Exam from "#models/exam";
21+
import Paper from "#models/paper";
22+
import Coursework from "#models/coursework";
23+
import Timetable from "#models/timetable";
1224
import generateOrganizations from "#mockDB/orgMock";
1325
import ACCREDS from "#mockDB/accredMock";
1426
import TOPICS from "#mockDB/topicMock";
@@ -19,6 +31,18 @@ import generatePracticals from "#mockDB/pracMock";
1931
import generateTutorials from "#mockDB/tutMock";
2032
import generateSemesters from "#mockDB/semMock";
2133
import generateCourses from "#mockDB/courseMock";
34+
import generateFaculty from "#mockDB/facultyMock";
35+
import generateStudents from "#mockDB/studentMock";
36+
import generateAttendance from "#mockDB/attendanceMock";
37+
import generateNotifications from "#mockDB/notificationMock";
38+
import generateUsers from "#mockDB/userMock"; // eslint-disable-line no-unused-vars
39+
import generateGroups from "#mockDB/groupMock";
40+
import generateActivityBP from "#mockDB/activityBPMock";
41+
import generateActivity from "#mockDB/activityMock";
42+
import generateExams from "#mockDB/examMock";
43+
import generatePaper from "#mockDB/paperMock";
44+
import generateCoursework from "#mockDB/courseworkMock";
45+
import generateTimetables from "#mockDB/timetableMock";
2246
/* eslint-disable no-underscore-dangle */
2347
const createdAccreds = await Accreditation.createMultiple(ACCREDS);
2448

@@ -60,7 +84,7 @@ const createdDepts = await Department.createMultiple(DEPTS);
6084

6185
const createdTopics = await Topics.createMultiple(TOPICS);
6286

63-
const MODULES = await generateModules(
87+
const MODULES = generateModules(
6488
createdTopics.map((createdTopic) => createdTopic._id),
6589
);
6690

@@ -86,6 +110,119 @@ const COURSES = generateCourses(
86110
createdDepts.map((createdDept) => createdDept._id),
87111
);
88112

89-
const createdCourses = await Course.createMultiple(COURSES); // eslint-disable-line no-unused-vars
113+
const createdCourses = await Course.createMultiple(COURSES);
114+
115+
const FACULTY = generateFaculty(
116+
createdDepts.map((createdDept) => createdDept._id),
117+
createdCourses.map((createdCourse) => createdCourse._id),
118+
);
119+
120+
const createdFaculty = await Faculty.createMultiple(FACULTY);
121+
122+
const STUDENTS = generateStudents(
123+
createdDepts.map((createdDept) => createdDept._id),
124+
createdCourses.map((createdCourse) => createdCourse._id),
125+
);
126+
127+
const createdStudents = await Student.createMultiple(STUDENTS);
128+
129+
const studentCourseList = createdStudents.map((student) => {
130+
const studentId = student._id.toString();
131+
const coursesOpted = student.coursesOpted.map((courseId) =>
132+
courseId.toString(),
133+
);
134+
return { studentId, coursesOpted };
135+
});
136+
137+
const ATTENDANCE = generateAttendance(studentCourseList);
138+
139+
const createdAttendance = await Attendance.createMultiple(ATTENDANCE); // eslint-disable-line no-unused-vars
140+
141+
// const USERS = generateUsers( // TODO this takes forever bruhh
142+
// createdStudents.map((createdStudent) => createdStudent.ERPID),
143+
// createdFaculty.map((createdFaculty) => createdFaculty.ERPID),
144+
// )
145+
146+
// const createdUsers = await User.createMultiple(USERS)
147+
148+
const createdUsers = await User.read(); // use this after you initialized Users at least once, or wait for years every time
149+
150+
const NOTIFS = generateNotifications(
151+
createdUsers.data // remove data from each of these if you are initializing users for the first time
152+
.filter((user) => user.userType === "STUDENT")
153+
.map((student) => student._id),
154+
createdUsers.data
155+
.filter((user) => user.userType === "FACULTY")
156+
.map((faculty) => faculty._id),
157+
createdUsers.data
158+
.filter((user) => user.userType === "ADMIN")
159+
.map((admin) => admin._id),
160+
);
161+
162+
const createdNotifications = await Notification.createMultiple(NOTIFS); // eslint-disable-line no-unused-vars
163+
164+
const GROUPS = generateGroups(
165+
createdUsers.data
166+
.filter((user) => user.userType === "STUDENT")
167+
.map((student) => student._id),
168+
);
169+
170+
const createdGroups = await Group.createMultiple(GROUPS);
171+
172+
const ACTIVITYBP = generateActivityBP(
173+
createdInfras.map((createdInfra) => createdInfra._id),
174+
createdCourses.map((createdCourse) => createdCourse._id),
175+
createdFaculty.map((faculty) => faculty._id),
176+
createdGroups.map((createdGroup) => createdGroup._id),
177+
);
178+
179+
const createdActivityBP = await ActivityBlueprint.createMultiple(ACTIVITYBP);
180+
181+
const ACTIVITY = generateActivity(
182+
createdActivityBP.map((activityBP) => activityBP._id),
183+
createdCourses.map((createdCourse) => createdCourse._id),
184+
createdFaculty.map((faculty) => faculty._id),
185+
createdGroups.map((createdGroup) => createdGroup._id),
186+
createdTuts.map((createdTut) => createdTut._id),
187+
createdPracs.map((createdPrac) => createdPrac._id),
188+
createdTopics.map((createdTopic) => createdTopic._id),
189+
createdStudents.map((createdStudent) => createdStudent._id),
190+
);
191+
192+
const createdActivity = await Activity.createMultiple(ACTIVITY);
193+
194+
const EXAMS = generateExams(
195+
createdInfras.map((createdInfra) => createdInfra._id),
196+
createdCourses.map((createdCourse) => createdCourse._id),
197+
createdFaculty.map((faculty) => faculty._id),
198+
);
199+
200+
const createdExams = await Exam.createMultiple(EXAMS);
201+
202+
const PAPERS = generatePaper(
203+
createdStudents.map((createdStudent) => createdStudent._id),
204+
createdExams.map((createdExam) => createdExam._id),
205+
createdFaculty.map((faculty) => faculty._id),
206+
);
207+
208+
const createdPapers = await Paper.createMultiple(PAPERS); // eslint-disable-line no-unused-vars
209+
210+
const COURSEWORK = generateCoursework(
211+
createdStudents.map((createdStudent) => createdStudent._id),
212+
createdCourses.map((createdCourse) => createdCourse._id),
213+
createdTuts.map((createdTut) => createdTut._id),
214+
createdPracs.map((createdPrac) => createdPrac._id),
215+
createdActivity.map((activity) => activity._id),
216+
);
217+
218+
const createdCoursework = await Coursework.createMultiple(COURSEWORK); // eslint-disable-line no-unused-vars
219+
220+
const TIMETABLE = generateTimetables(
221+
createdActivityBP.map((activityBP) => activityBP._id),
222+
createdGroups.map((createdGroup) => createdGroup._id),
223+
createdFaculty.map((faculty) => faculty._id),
224+
);
225+
226+
const createdTimetables = await Timetable.createMultiple(TIMETABLE); // eslint-disable-line no-unused-vars
90227

91228
process.exit(0);

misc/mockDB/activityBPMock.js

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { faker } from "@faker-js/faker"; // eslint-disable-line import/no-extraneous-dependencies
2+
// TODO, not accurate to IRL!!
3+
const generateRandomActivityBP = (
4+
randomInfra,
5+
randomCourse,
6+
randomFaculty,
7+
randomGroup,
8+
) => ({
9+
number: faker.number.int(),
10+
academicYear: "2023",
11+
day: faker.helpers.arrayElement([
12+
"Monday",
13+
"Tuesday",
14+
"Wednesday",
15+
"Thursday",
16+
"Friday",
17+
]),
18+
startTime: faker.helpers.arrayElement([
19+
"09:00",
20+
"11:00",
21+
"13:00",
22+
"15:00",
23+
"17:00",
24+
]),
25+
duration: faker.number.int({ min: 1, max: 2 }),
26+
infra: randomInfra,
27+
course: randomCourse,
28+
faculty: randomFaculty,
29+
type: faker.helpers.arrayElement(["lecture", "practical", "tutorial"]),
30+
group: randomGroup,
31+
});
32+
33+
const generateActivityBP = (infraList, courseList, facultyList, groupList) => {
34+
const activityBP = [];
35+
for (let i = 0; i < 1000; i += 1) {
36+
activityBP.push(
37+
generateRandomActivityBP(
38+
faker.helpers.arrayElement(infraList),
39+
faker.helpers.arrayElement(courseList),
40+
faker.helpers.arrayElement(facultyList),
41+
faker.helpers.arrayElement(groupList),
42+
),
43+
);
44+
}
45+
return activityBP;
46+
};
47+
48+
export default generateActivityBP;

0 commit comments

Comments
 (0)