Skip to content

Commit ec46522

Browse files
authored
refactor: clean newly written code #106
2 parents 769eb13 + b610887 commit ec46522

File tree

8 files changed

+117
-65
lines changed

8 files changed

+117
-65
lines changed

src/controllers/RoomController.js

Lines changed: 76 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,102 +1,121 @@
11
const { RoomDay, Room, FreeRoom } = require('../models');
2+
const { fixTime, arrayToObject } = require('../utils');
23

34
class RoomController {
5+
/* ---------------------------
6+
* getDays() method response
7+
* days as single object
8+
* ---------------------------
9+
*
10+
* @params request, response
11+
* @response Object<{ dayName: dayId }>
12+
*/
413
static async getDays(req, res) {
5-
const days = {};
14+
const arr = await RoomDay.find({});
615

7-
const data = await RoomDay.find({});
16+
const days = arrayToObject(arr, 'day', '_id');
817

9-
for (let key in data) {
10-
days[data[key].day] = data[key]._id;
11-
}
1218
res.send(days);
1319
}
20+
/* ---------------------------
21+
* getRooms() method response
22+
* all rooms in single object
23+
* ---------------------------
24+
*
25+
* @params request, response
26+
* @response Object<{ roomName: roomId }>
27+
*/
1428
static async getRooms(req, res) {
15-
const rooms = {};
29+
const arr = await Room.find({});
1630

17-
const data = await Room.find({});
31+
const rooms = arrayToObject(arr, 'room', '_id');
1832

19-
for (let key in data) {
20-
rooms[data[key].room] = data[key]._id;
21-
}
2233
res.send(rooms);
2334
}
35+
/* ---------------------------------
36+
* getFreeRooms() method response
37+
* all free rooms that does not
38+
* have lecture in it filtering the
39+
* list via day, time or building.
40+
* ---------------------------------
41+
*
42+
* @params request, response
43+
* @response Object<{ dayName: Array<Room> }> or Array<Room>
44+
*/
2445
static async getFreeRooms(req, res) {
2546
const building = req.query?.building;
2647
const day = req && req.query?.day;
27-
const time = RoomController._fixTime(req.query?.time);
28-
29-
const filteredSlots =
30-
day || time
31-
? await RoomController._findFreeRooms(day, time, building)
32-
: await RoomController._findAllFreeRooms();
48+
const time = fixTime(req.query?.time);
49+
50+
let rooms = [];
51+
52+
/* -------------------------------------
53+
* when day or time is provided then
54+
* give rooms that are filtered
55+
* -------------------------------------*/
56+
if (day || time) {
57+
// filtered rooms by day, time or building(NB || OB)
58+
rooms = await RoomController._findFreeRooms(day, time, building);
59+
} else {
60+
// all rooms
61+
rooms = await RoomController._findAllFreeRooms();
62+
}
3363

34-
res.send(filteredSlots);
64+
res.send(rooms);
3565
}
66+
/* ---------------------------------------
67+
* _findFreeRooms() is a private method
68+
* that return free rooms via filters
69+
* ---------------------------------------
70+
*
71+
* @params day, time, building
72+
* @return Array<Room>
73+
*/
3674
static async _findFreeRooms(day, time, building) {
75+
//
76+
const dayFilter = day ? { day } : {};
77+
3778
// if day is not defined then find free rooms for all 7 days
38-
const AllfreeSlots = await FreeRoom.find(day ? { day } : {}, {
39-
_id: false,
40-
__v: false,
41-
});
79+
const slots = await FreeRoom.find(dayFilter, { _id: false, __v: false });
4280

43-
const filteredSlots = AllfreeSlots.filter((slot) => {
81+
const filteredSlots = slots.filter((slot) => {
4482
// time filter
4583
const tFilter = time && time >= slot.startTime && time < slot.endTime;
4684
// building filter
4785
const bFilter = building && new RegExp(building, 'ig').test(slot.room);
4886

49-
// filter the free slots with time or building
50-
if (time && building) {
51-
return tFilter && bFilter;
52-
} else if (time) {
53-
return tFilter;
54-
} else if (building) {
55-
return bFilter;
56-
}
57-
58-
// if the time is not given then don't
59-
// apply filter and return all the available
60-
// time slots
61-
return slot;
87+
// filter the free slots with time or building, return
88+
return (tFilter && bFilter) || tFilter || bFilter;
6289
});
6390

6491
return filteredSlots;
6592
}
93+
/* ---------------------------------------
94+
* _findAllFreeRooms() is a private method
95+
* that return all free rooms.
96+
* ---------------------------------------
97+
*
98+
* @params day, time, building
99+
* @return Object<{ dayName: Array<Room> }>
100+
*/
66101
static async _findAllFreeRooms() {
67102
const freeRooms = {};
68103

69104
const freeSlots = await FreeRoom.find({});
70105

71-
for (let freeSlot of freeSlots) {
72-
const freeRoom = {
73-
room: freeSlot.room,
74-
startTime: freeSlot.startTime,
75-
endTime: freeSlot.endTime,
76-
};
106+
// prepare an object containing all the free rooms
107+
for (let { day, room, startTime, endTime } of freeSlots) {
108+
const freeRoom = { room, startTime, endTime };
77109

78-
if (freeRooms[freeSlot.day]?.length > 0) {
79-
freeRooms[freeSlot.day].push(freeRoom);
110+
if (freeRooms[day]) {
111+
freeRooms[day].push(freeRoom);
80112
} else {
81-
freeRooms[freeSlot.day] = [freeRoom];
113+
freeRooms[day] = [freeRoom];
82114
}
83115
}
84116

85117
return freeRooms;
86118
}
87-
static _fixTime(time) {
88-
if (time) {
89-
const timeArr = time.split(':');
90-
const fixedTime = [];
91-
92-
for (let i = 0; i < timeArr.length; i++) {
93-
// add prefix 0 if length is not 2
94-
fixedTime.push(String(timeArr[i]).padStart(2, '0'));
95-
}
96-
return fixedTime.join(':');
97-
}
98-
return;
99-
}
100119
}
101120

102121
module.exports = { RoomController };
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

src/routes/index.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
const GCRouter = require('./GCRouter');
2-
const TimetableRouter = require('./TimetableRouter');
3-
const PopulateRouter = require('./PopulateRouter');
4-
const RoomRouter = require('./RoomRouter');
1+
const GCRouter = require('./GoogleCalendar');
2+
const TimetableRouter = require('./Timetable');
3+
const PopulateRouter = require('./Populate');
4+
const RoomRouter = require('./Room');
55

66
module.exports = {
77
GCRouter,

src/utils/helpers.js

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,34 @@ async function verifyParams(semesterName, degreeId, sectionId) {
6464
}
6565
}
6666

67-
module.exports = { calculateTime, createDate, verifyParams };
67+
function fixTime(time) {
68+
if (time) {
69+
const timeArr = time.split(':');
70+
const fixedTime = [];
71+
72+
for (let i = 0; i < timeArr.length; i++) {
73+
// add prefix 0 if length is not 2
74+
fixedTime.push(String(timeArr[i]).padStart(2, '0'));
75+
}
76+
return fixedTime.join(':');
77+
}
78+
return;
79+
}
80+
81+
function arrayToObject(arr, keyName, valueName) {
82+
const obj = {};
83+
84+
for (let element in arr) {
85+
obj[arr[element][keyName]] = arr[element][valueName];
86+
}
87+
88+
return obj;
89+
}
90+
91+
module.exports = {
92+
calculateTime,
93+
createDate,
94+
verifyParams,
95+
fixTime,
96+
arrayToObject,
97+
};

src/utils/index.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
const { calculateTime, createDate } = require('./helpers');
21
const { Sync } = require('./Sync');
2+
const helpers = require('./helpers');
3+
34
module.exports = {
4-
calculateTime,
5-
createDate,
5+
calculateTime: helpers.calculateTime,
6+
createDate: helpers.createDate,
7+
fixTime: helpers.fixTime,
8+
arrayToObject: helpers.arrayToObject,
69
Sync,
710
};

0 commit comments

Comments
 (0)