@@ -49,19 +49,16 @@ export const syncWithIntra = async function(): Promise<void> {
4949 const now = new Date ( ) ;
5050
5151 try {
52- let lastSyncRaw = await DatabaseService . getLastSyncTimestamp ( ) ;
53- let lastSync : Date | undefined = lastSyncRaw === null ? undefined : lastSyncRaw ;
54-
5552 // Syncs all data based on:
5653 // - last successful sync timestamp (lastSync)
5754 // - active campuses
5855 // - 42 and piscine cursus (cursus/21,9)
59- await syncCampuses ( fast42Api , lastSync ) ;
60- await syncCursusProjects ( fast42Api , lastSync , '9' ) ;
61- await syncCursusProjects ( fast42Api , lastSync , '21' ) ;
62- // await syncUsers(fast42Api, lastSync );
63- await syncProjectUsers ( fast42Api , lastSync ) ;
64- await DatabaseService . saveSyncTimestamp ( now ) ;
56+ await syncCampuses ( fast42Api , now ) ;
57+ await syncCursusProjects ( fast42Api , '9' , now ) ;
58+ await syncCursusProjects ( fast42Api , '21' , now ) ;
59+ await syncUsers ( fast42Api , now ) ;
60+ await syncProjectUsers ( fast42Api , now ) ;
61+ await DatabaseService . saveSyncTimestamp ( "full" , 1 , now ) ;
6562
6663 console . info ( `Intra synchronization completed at ${ new Date ( ) . toISOString ( ) } .` ) ;
6764 }
@@ -77,11 +74,11 @@ export const syncWithIntra = async function(): Promise<void> {
7774 * @param lastPullDate The date of the last synchronization
7875 * @returns A promise that resolves when the synchronization is complete
7976 */
80- async function syncCampuses ( fast42Api : Fast42 , lastPullDate : Date | undefined ) : Promise < void > {
77+ async function syncCampuses ( fast42Api : Fast42 , lastSync : Date | undefined ) : Promise < void > {
8178 let campusesApi ;
8279 try {
8380 log ( 2 , `Syncing campuses...` ) ;
84- campusesApi = await syncData ( fast42Api , new Date ( ) , lastPullDate , `/campus` , { 'active' : 'true' } ) ;
81+ campusesApi = await syncData ( fast42Api , new Date ( ) , lastSync , `/campus` , { 'active' : 'true' } ) ;
8582 const dbCampuses = campusesApi . map ( transformApiCampusToDb ) ;
8683 await DatabaseService . insertManyCampuses ( dbCampuses ) ;
8784 log ( 2 , `Finished syncing campuses` ) ;
@@ -97,25 +94,32 @@ async function syncCampuses(fast42Api: Fast42, lastPullDate: Date | undefined):
9794 * @param lastPullDate The date of the last synchronization
9895 * @returns A promise that resolves when the synchronization is complete
9996 */
100- async function syncCursusProjects ( fast42Api : Fast42 , lastPullDate : Date | undefined , cursus : string ) : Promise < void > {
97+ async function syncCursusProjects ( fast42Api : Fast42 , cursus : string , syncDate : Date ) : Promise < void > {
10198 let pageIndex = 0 ;
10299 let hasMorePages = true ;
103100 let params : { [ key : string ] : string } = { 'page[size]' : '100' } ;
104- if ( lastPullDate ) {
105- let syncDate = new Date ( ) ;
106- params [ 'range[updated_at]' ] = `${ lastPullDate . toISOString ( ) } ,${ syncDate . toISOString ( ) } ` ;
107- }
108101
109102 try {
110103 while ( hasMorePages ) {
111104 pageIndex ++ ;
105+
106+ // Set pagination and last sync range
112107 params [ 'page[number]' ] = pageIndex . toString ( ) ;
108+ let lastSyncRaw = await DatabaseService . getLastSyncTimestamp ( "cursus_projects" , parseInt ( cursus ) ) ;
109+ let lastSync : Date | undefined = lastSyncRaw === null ? undefined : lastSyncRaw ;
110+ if ( lastSync ) {
111+ params [ 'range[updated_at]' ] = `${ lastSync . toISOString ( ) } ,${ syncDate . toISOString ( ) } ` ;
112+ } else {
113+ params [ 'range[updated_at]' ] = `${ new Date ( 0 ) . toISOString ( ) } ,${ syncDate . toISOString ( ) } ` ;
114+ }
115+
113116 log ( 2 , `Fetching page ${ pageIndex } of projects...` ) ;
114117
115118 const projectsData = await fetchSingle42ApiPage ( fast42Api , `/cursus/${ cursus } /projects` , params ) ;
116119 if ( ! projectsData || projectsData . length === 0 ) {
117120 log ( 2 , `No more projects found on page ${ pageIndex } . Stopping.` ) ;
118121 hasMorePages = false ;
122+ await DatabaseService . saveSyncTimestamp ( "cursus_projects" , parseInt ( cursus ) , syncDate ) ;
119123 continue ;
120124 }
121125
@@ -135,15 +139,11 @@ async function syncCursusProjects(fast42Api: Fast42, lastPullDate: Date | undefi
135139 * @param fast42Api The Fast42 API instance to use for fetching user data
136140 * @param lastPullDate The date of the last synchronization
137141 */
138- async function syncUsers ( fast42Api : Fast42 , lastPullDate : Date | undefined ) : Promise < void > {
142+ async function syncUsers ( fast42Api : Fast42 , syncDate : Date ) : Promise < void > {
139143 let pageIndex = 0 ;
140144 let hasMorePages = true ;
141145 let params : { [ key : string ] : string } = { } ;
142146 params [ 'page[size]' ] = '100' ;
143- if ( lastPullDate ) {
144- let syncDate = new Date ( ) ;
145- params [ 'range[updated_at]' ] = `${ lastPullDate . toISOString ( ) } ,${ syncDate . toISOString ( ) } ` ;
146- }
147147
148148 const campuses = await DatabaseService . getAllCampuses ( ) ;
149149 let campusIds = campuses . map ( c => c . id ) ;
@@ -153,7 +153,17 @@ async function syncUsers(fast42Api: Fast42, lastPullDate: Date | undefined): Pro
153153 params [ 'filter[primary_campus_id]' ] = campusId . toString ( ) ;
154154 while ( hasMorePages ) {
155155 pageIndex ++ ;
156+
157+ // Set pagination and last sync range
156158 params [ 'page[number]' ] = pageIndex . toString ( ) ;
159+ let lastSyncRaw = await DatabaseService . getLastSyncTimestamp ( "campus_users" , campusId ) ;
160+ let lastSync : Date | undefined = lastSyncRaw === null ? undefined : lastSyncRaw ;
161+ if ( lastSync ) {
162+ params [ 'range[updated_at]' ] = `${ lastSync . toISOString ( ) } ,${ syncDate . toISOString ( ) } ` ;
163+ } else {
164+ params [ 'range[updated_at]' ] = `${ new Date ( 0 ) . toISOString ( ) } ,${ syncDate . toISOString ( ) } ` ;
165+ }
166+
157167 log ( 2 , `Fetching page ${ pageIndex } of users for campus ${ campusId } (${ index + 1 } /${ totalCampuses } )...` ) ;
158168
159169 let usersData ;
@@ -167,6 +177,7 @@ async function syncUsers(fast42Api: Fast42, lastPullDate: Date | undefined): Pro
167177 if ( ! usersData || usersData . length === 0 ) {
168178 log ( 2 , `No more users found for campus ${ campusId } on page ${ pageIndex } . Stopping.` ) ;
169179 hasMorePages = false ;
180+ await DatabaseService . saveSyncTimestamp ( "campus_users" , campusId , syncDate ) ;
170181 break ;
171182 }
172183
@@ -191,16 +202,12 @@ async function syncUsers(fast42Api: Fast42, lastPullDate: Date | undefined): Pro
191202 * @param lastPullDate The date of the last synchronization
192203 * @returns A promise that resolves when the synchronization is complete
193204 */
194- async function syncProjectUsers ( fast42Api : Fast42 , lastPullDate : Date | undefined ) : Promise < void > {
205+ async function syncProjectUsers ( fast42Api : Fast42 , syncDate : Date ) : Promise < void > {
195206 let pageIndex = 0 ;
196207 let hasMorePages = true ;
197208 let params : { [ key : string ] : string } = { } ;
198209 params [ 'page[size]' ] = '100' ;
199210 params [ 'filter[campus]' ] = await DatabaseService . getAllCampuses ( ) . then ( campuses => campuses . map ( c => c . id ) . join ( ',' ) ) ;
200- if ( lastPullDate ) {
201- let syncDate = new Date ( ) ;
202- params [ 'range[updated_at]' ] = `${ lastPullDate . toISOString ( ) } ,${ syncDate . toISOString ( ) } ` ;
203- }
204211
205212 const projects = await DatabaseService . getAllProjects ( ) ;
206213 let projectIds = projects . map ( p => p . id ) ;
@@ -209,7 +216,17 @@ async function syncProjectUsers(fast42Api: Fast42, lastPullDate: Date | undefine
209216 for ( let [ index , projectId ] of projectIds . entries ( ) ) {
210217 while ( hasMorePages ) {
211218 pageIndex ++ ;
219+
220+ // Set pagination and last sync range
212221 params [ 'page[number]' ] = pageIndex . toString ( ) ;
222+ let lastSyncRaw = await DatabaseService . getLastSyncTimestamp ( "projects_projects_users" , projectId ) ;
223+ let lastSync : Date | undefined = lastSyncRaw === null ? undefined : lastSyncRaw ;
224+ if ( lastSync ) {
225+ params [ 'range[updated_at]' ] = `${ lastSync . toISOString ( ) } ,${ syncDate . toISOString ( ) } ` ;
226+ } else {
227+ params [ 'range[updated_at]' ] = `${ new Date ( 0 ) . toISOString ( ) } ,${ syncDate . toISOString ( ) } ` ;
228+ }
229+
213230 log ( 2 , `Fetching page ${ pageIndex } of projectUsers for project ${ projectId } (${ index + 1 } /${ totalProjects } )...` ) ;
214231
215232 let projectUsersData ;
@@ -223,6 +240,7 @@ async function syncProjectUsers(fast42Api: Fast42, lastPullDate: Date | undefine
223240 if ( ! projectUsersData || projectUsersData . length === 0 ) {
224241 log ( 2 , `No more users found for project ${ projectId } on page ${ pageIndex } . Stopping.` ) ;
225242 hasMorePages = false ;
243+ await DatabaseService . saveSyncTimestamp ( "projects_projects_users" , projectId , syncDate ) ;
226244 break ;
227245 }
228246
0 commit comments