@@ -13,6 +13,7 @@ const {
13
13
getProgressDateTimestamp,
14
14
buildQueryToSearchProgressByDay,
15
15
} = require ( "../utils/progresses" ) ;
16
+ const { retrieveUsers } = require ( "../services/dataAccessLayer" ) ;
16
17
const { PROGRESS_ALREADY_CREATED , PROGRESS_DOCUMENT_NOT_FOUND } = PROGRESSES_RESPONSE_MESSAGES ;
17
18
18
19
/**
@@ -47,9 +48,14 @@ const createProgressDocument = async (progressData) => {
47
48
* @throws {Error } If the userId or taskId is invalid or does not exist.
48
49
**/
49
50
const getProgressDocument = async ( queryParams ) => {
51
+ const { dev } = queryParams ;
50
52
await assertUserOrTaskExists ( queryParams ) ;
51
53
const query = buildQueryToFetchDocs ( queryParams ) ;
52
54
const progressDocs = await getProgressDocs ( query ) ;
55
+
56
+ if ( dev === "true" ) {
57
+ return await addUserDetailsToProgressDocs ( progressDocs ) ;
58
+ }
53
59
return progressDocs ;
54
60
} ;
55
61
@@ -77,16 +83,59 @@ const getRangeProgressData = async (queryParams) => {
77
83
* @returns {Promise<object> } A Promise that resolves with the progress records of the queried user or task.
78
84
* @throws {Error } If the userId or taskId is invalid or does not exist.
79
85
**/
80
- async function getProgressByDate ( pathParams ) {
86
+ async function getProgressByDate ( pathParams , queryParams ) {
81
87
const { type, typeId, date } = pathParams ;
88
+ const { dev } = queryParams ;
82
89
await assertUserOrTaskExists ( { [ TYPE_MAP [ type ] ] : typeId } ) ;
83
90
const query = buildQueryToSearchProgressByDay ( { [ TYPE_MAP [ type ] ] : typeId , date } ) ;
84
91
const result = await query . get ( ) ;
85
92
if ( ! result . size ) {
86
93
throw new NotFound ( PROGRESS_DOCUMENT_NOT_FOUND ) ;
87
94
}
88
95
const doc = result . docs [ 0 ] ;
89
- return { id : doc . id , ...doc . data ( ) } ;
96
+ const docData = doc . data ( ) ;
97
+ if ( dev === "true" ) {
98
+ const { user : userData } = await retrieveUsers ( { id : docData . userId } ) ;
99
+ return { id : doc . id , ...docData , userData } ;
100
+ }
101
+
102
+ return { id : doc . id , ...docData } ;
90
103
}
91
104
92
- module . exports = { createProgressDocument, getProgressDocument, getRangeProgressData, getProgressByDate } ;
105
+ /**
106
+ * Adds user details to progress documents by fetching unique users.
107
+ * This function retrieves user details for each user ID in the progress documents and attaches the user data to each document.
108
+ *
109
+ * @param {Array<object> } progressDocs - An array of progress documents. Each document should include a `userId` property.
110
+ * @returns {Promise<Array<object>> } A Promise that resolves to an array of progress documents with the `userData` field populated.
111
+ * If an error occurs while fetching the user details, the `userData` field will be set to `null` for each document.
112
+ */
113
+ const addUserDetailsToProgressDocs = async ( progressDocs ) => {
114
+ try {
115
+ const uniqueUserIds = [ ...new Set ( progressDocs . map ( ( doc ) => doc . userId ) ) ] ;
116
+
117
+ const uniqueUsersData = await retrieveUsers ( {
118
+ userIds : uniqueUserIds ,
119
+ } ) ;
120
+ const allUsers = uniqueUsersData . flat ( ) ;
121
+ const userByIdMap = allUsers . reduce ( ( lookup , user ) => {
122
+ if ( user ) lookup [ user . id ] = user ;
123
+ return lookup ;
124
+ } , { } ) ;
125
+
126
+ return progressDocs . map ( ( doc ) => {
127
+ const userDetails = userByIdMap [ doc . userId ] || null ;
128
+ return { ...doc , userData : userDetails } ;
129
+ } ) ;
130
+ } catch ( err ) {
131
+ return progressDocs . map ( ( doc ) => ( { ...doc , userData : null } ) ) ;
132
+ }
133
+ } ;
134
+
135
+ module . exports = {
136
+ createProgressDocument,
137
+ getProgressDocument,
138
+ getRangeProgressData,
139
+ getProgressByDate,
140
+ addUserDetailsToProgressDocs,
141
+ } ;
0 commit comments