|
1 | 1 | const { RoomDay, Room, FreeRoom } = require('../models');
|
| 2 | +const { fixTime, arrayToObject } = require('../utils'); |
2 | 3 |
|
3 | 4 | class RoomController {
|
| 5 | + /* --------------------------- |
| 6 | + * getDays() method response |
| 7 | + * days as single object |
| 8 | + * --------------------------- |
| 9 | + * |
| 10 | + * @params request, response |
| 11 | + * @response Object<{ dayName: dayId }> |
| 12 | + */ |
4 | 13 | static async getDays(req, res) {
|
5 |
| - const days = {}; |
| 14 | + const arr = await RoomDay.find({}); |
6 | 15 |
|
7 |
| - const data = await RoomDay.find({}); |
| 16 | + const days = arrayToObject(arr, 'day', '_id'); |
8 | 17 |
|
9 |
| - for (let key in data) { |
10 |
| - days[data[key].day] = data[key]._id; |
11 |
| - } |
12 | 18 | res.send(days);
|
13 | 19 | }
|
| 20 | + /* --------------------------- |
| 21 | + * getRooms() method response |
| 22 | + * all rooms in single object |
| 23 | + * --------------------------- |
| 24 | + * |
| 25 | + * @params request, response |
| 26 | + * @response Object<{ roomName: roomId }> |
| 27 | + */ |
14 | 28 | static async getRooms(req, res) {
|
15 |
| - const rooms = {}; |
| 29 | + const arr = await Room.find({}); |
16 | 30 |
|
17 |
| - const data = await Room.find({}); |
| 31 | + const rooms = arrayToObject(arr, 'room', '_id'); |
18 | 32 |
|
19 |
| - for (let key in data) { |
20 |
| - rooms[data[key].room] = data[key]._id; |
21 |
| - } |
22 | 33 | res.send(rooms);
|
23 | 34 | }
|
| 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 | + */ |
24 | 45 | static async getFreeRooms(req, res) {
|
25 | 46 | const building = req.query?.building;
|
26 | 47 | 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 | + } |
33 | 63 |
|
34 |
| - res.send(filteredSlots); |
| 64 | + res.send(rooms); |
35 | 65 | }
|
| 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 | + */ |
36 | 74 | static async _findFreeRooms(day, time, building) {
|
| 75 | + // |
| 76 | + const dayFilter = day ? { day } : {}; |
| 77 | + |
37 | 78 | // 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 }); |
42 | 80 |
|
43 |
| - const filteredSlots = AllfreeSlots.filter((slot) => { |
| 81 | + const filteredSlots = slots.filter((slot) => { |
44 | 82 | // time filter
|
45 | 83 | const tFilter = time && time >= slot.startTime && time < slot.endTime;
|
46 | 84 | // building filter
|
47 | 85 | const bFilter = building && new RegExp(building, 'ig').test(slot.room);
|
48 | 86 |
|
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; |
62 | 89 | });
|
63 | 90 |
|
64 | 91 | return filteredSlots;
|
65 | 92 | }
|
| 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 | + */ |
66 | 101 | static async _findAllFreeRooms() {
|
67 | 102 | const freeRooms = {};
|
68 | 103 |
|
69 | 104 | const freeSlots = await FreeRoom.find({});
|
70 | 105 |
|
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 }; |
77 | 109 |
|
78 |
| - if (freeRooms[freeSlot.day]?.length > 0) { |
79 |
| - freeRooms[freeSlot.day].push(freeRoom); |
| 110 | + if (freeRooms[day]) { |
| 111 | + freeRooms[day].push(freeRoom); |
80 | 112 | } else {
|
81 |
| - freeRooms[freeSlot.day] = [freeRoom]; |
| 113 | + freeRooms[day] = [freeRoom]; |
82 | 114 | }
|
83 | 115 | }
|
84 | 116 |
|
85 | 117 | return freeRooms;
|
86 | 118 | }
|
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 |
| - } |
100 | 119 | }
|
101 | 120 |
|
102 | 121 | module.exports = { RoomController };
|
0 commit comments