|
1 |
| -const { TASK_REQUEST_STATUS, TASK_REQUEST_TYPE } = require("../constants/taskRequests"); |
| 1 | +const { |
| 2 | + TASK_REQUEST_STATUS, |
| 3 | + TASK_REQUEST_TYPE, |
| 4 | + TASK_REQUEST_FILTER_KEYS, |
| 5 | + TASK_REQUEST_FILTER_VALUES, |
| 6 | + TASK_REQUEST_SORT_KEYS, |
| 7 | + TASK_REQUEST_SORT_VALUES, |
| 8 | + TASK_REQUEST_ERROR_MESSAGE, |
| 9 | +} = require("../constants/taskRequests"); |
2 | 10 | const { TASK_TYPE, TASK_STATUS, DEFAULT_TASK_PRIORITY } = require("../constants/tasks");
|
| 11 | +const { Operators } = require("../typeDefinitions/rqlParser"); |
| 12 | +const { RQLQueryParser } = require("../utils/RQLParser"); |
3 | 13 | const firestore = require("../utils/firestore");
|
| 14 | +const { buildTaskRequests, generateLink, transformTaskRequests } = require("../utils/task-requests"); |
4 | 15 | const taskRequestsCollection = firestore.collection("taskRequests");
|
5 | 16 | const tasksModel = require("./tasks");
|
6 | 17 | const userModel = require("./users");
|
@@ -62,6 +73,92 @@ const fetchTaskRequests = async (dev) => {
|
62 | 73 | return taskRequests;
|
63 | 74 | };
|
64 | 75 |
|
| 76 | +const fetchPaginatedTaskRequests = async (queries = {}) => { |
| 77 | + try { |
| 78 | + let taskRequestsSnapshot = taskRequestsCollection; |
| 79 | + |
| 80 | + let { next, prev, size, q: queryString } = queries; |
| 81 | + if (size) size = parseInt(size); |
| 82 | + |
| 83 | + const rqlQueryParser = new RQLQueryParser(queryString); |
| 84 | + |
| 85 | + Object.entries(rqlQueryParser.getFilterQueries()).forEach(([key, value]) => { |
| 86 | + const valuesList = value.map( |
| 87 | + (query) => query.operator === Operators.INCLUDE && TASK_REQUEST_FILTER_VALUES[query.value] |
| 88 | + ); |
| 89 | + taskRequestsSnapshot = taskRequestsSnapshot.where(TASK_REQUEST_FILTER_KEYS[key], "in", valuesList); |
| 90 | + }); |
| 91 | + |
| 92 | + const sortQueries = rqlQueryParser.getSortQueries(); |
| 93 | + const sortQueryEntries = Object.entries(sortQueries); |
| 94 | + |
| 95 | + if (sortQueryEntries.length) { |
| 96 | + sortQueryEntries.forEach(([key, value]) => { |
| 97 | + taskRequestsSnapshot = taskRequestsSnapshot.orderBy( |
| 98 | + TASK_REQUEST_SORT_KEYS[key], |
| 99 | + TASK_REQUEST_SORT_VALUES[value] |
| 100 | + ); |
| 101 | + }); |
| 102 | + } else { |
| 103 | + taskRequestsSnapshot = taskRequestsSnapshot.orderBy(TASK_REQUEST_SORT_KEYS.created, "desc"); |
| 104 | + } |
| 105 | + |
| 106 | + if (next) { |
| 107 | + const data = await taskRequestsCollection.doc(next).get(); |
| 108 | + if (!data.data()) { |
| 109 | + return { |
| 110 | + statusCode: 400, |
| 111 | + error: "Bad Request", |
| 112 | + message: `${TASK_REQUEST_ERROR_MESSAGE.INVALID_NEXT}: ${next}`, |
| 113 | + }; |
| 114 | + } |
| 115 | + taskRequestsSnapshot = taskRequestsSnapshot.startAfter(data).limit(size); |
| 116 | + } else if (prev) { |
| 117 | + const data = await taskRequestsCollection.doc(prev).get(); |
| 118 | + if (!data.data()) { |
| 119 | + return { |
| 120 | + statusCode: 400, |
| 121 | + error: "Bad Request", |
| 122 | + message: `${TASK_REQUEST_ERROR_MESSAGE.INVALID_PREV}: ${prev}`, |
| 123 | + }; |
| 124 | + } |
| 125 | + taskRequestsSnapshot = taskRequestsSnapshot.endBefore(data).limitToLast(size); |
| 126 | + } else if (size) { |
| 127 | + taskRequestsSnapshot = taskRequestsSnapshot.limit(size); |
| 128 | + } |
| 129 | + |
| 130 | + taskRequestsSnapshot = await taskRequestsSnapshot.get(); |
| 131 | + const taskRequestsList = buildTaskRequests(taskRequestsSnapshot); |
| 132 | + await transformTaskRequests(taskRequestsList); |
| 133 | + |
| 134 | + const resultDataLength = taskRequestsSnapshot.docs.length; |
| 135 | + const isNextLinkRequired = size && resultDataLength === size; |
| 136 | + const lastVisibleDoc = isNextLinkRequired && taskRequestsSnapshot.docs[resultDataLength - 1]; |
| 137 | + const firstDoc = taskRequestsSnapshot.docs[0]; |
| 138 | + const nextPageParams = { |
| 139 | + ...queries, |
| 140 | + next: lastVisibleDoc?.id, |
| 141 | + }; |
| 142 | + delete nextPageParams.prev; |
| 143 | + const prevPageParams = { |
| 144 | + ...queries, |
| 145 | + prev: firstDoc?.id, |
| 146 | + }; |
| 147 | + delete prevPageParams.next; |
| 148 | + const nextLink = lastVisibleDoc ? generateLink(nextPageParams) : ""; |
| 149 | + const prevLink = next || prev ? generateLink(prevPageParams) : ""; |
| 150 | + |
| 151 | + return { |
| 152 | + data: taskRequestsList, |
| 153 | + next: nextLink, |
| 154 | + prev: prevLink, |
| 155 | + }; |
| 156 | + } catch (err) { |
| 157 | + logger.error("error getting task requests", err); |
| 158 | + throw err; |
| 159 | + } |
| 160 | +}; |
| 161 | + |
65 | 162 | /**
|
66 | 163 | * Fetches task request by id
|
67 | 164 | *
|
@@ -406,6 +503,7 @@ module.exports = {
|
406 | 503 | fetchTaskRequestById,
|
407 | 504 | addOrUpdate,
|
408 | 505 | approveTaskRequest,
|
| 506 | + fetchPaginatedTaskRequests, |
409 | 507 | addNewFields,
|
410 | 508 | removeOldField,
|
411 | 509 | };
|
0 commit comments