@@ -13,6 +13,7 @@ const {
1313 getProgressDateTimestamp,
1414 buildQueryToSearchProgressByDay,
1515} = require ( "../utils/progresses" ) ;
16+ const { retrieveUsers } = require ( "../services/dataAccessLayer" ) ;
1617const { PROGRESS_ALREADY_CREATED , PROGRESS_DOCUMENT_NOT_FOUND } = PROGRESSES_RESPONSE_MESSAGES ;
1718
1819/**
@@ -47,9 +48,14 @@ const createProgressDocument = async (progressData) => {
4748 * @throws {Error } If the userId or taskId is invalid or does not exist.
4849 **/
4950const getProgressDocument = async ( queryParams ) => {
51+ const { dev } = queryParams ;
5052 await assertUserOrTaskExists ( queryParams ) ;
5153 const query = buildQueryToFetchDocs ( queryParams ) ;
5254 const progressDocs = await getProgressDocs ( query ) ;
55+
56+ if ( dev === "true" ) {
57+ return await addUserDetailsToProgressDocs ( progressDocs ) ;
58+ }
5359 return progressDocs ;
5460} ;
5561
@@ -77,16 +83,59 @@ const getRangeProgressData = async (queryParams) => {
7783 * @returns {Promise<object> } A Promise that resolves with the progress records of the queried user or task.
7884 * @throws {Error } If the userId or taskId is invalid or does not exist.
7985 **/
80- async function getProgressByDate ( pathParams ) {
86+ async function getProgressByDate ( pathParams , queryParams ) {
8187 const { type, typeId, date } = pathParams ;
88+ const { dev } = queryParams ;
8289 await assertUserOrTaskExists ( { [ TYPE_MAP [ type ] ] : typeId } ) ;
8390 const query = buildQueryToSearchProgressByDay ( { [ TYPE_MAP [ type ] ] : typeId , date } ) ;
8491 const result = await query . get ( ) ;
8592 if ( ! result . size ) {
8693 throw new NotFound ( PROGRESS_DOCUMENT_NOT_FOUND ) ;
8794 }
8895 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 } ;
90103}
91104
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