@@ -282,6 +282,74 @@ type MapUsersToJunksArgs = {
282
282
reviewers : transform . ForgeUser [ 'id' ] [ ]
283
283
}
284
284
285
+ function addUnique ( newElement : number , currentArray : number [ ] ) {
286
+ if ( ! currentArray . includes ( newElement ) ) {
287
+ currentArray . push ( newElement ) ;
288
+ }
289
+ }
290
+
291
+ async function getId ( actorId : number , db : TransformDatabase ) {
292
+ return await db . select ( {
293
+ id : transform . forgeUsers . id ,
294
+ } ) . from ( transform . forgeUsers )
295
+ . where ( eq ( transform . forgeUsers . externalId , actorId ) ) . get ( ) ;
296
+ }
297
+
298
+ async function getUserIds ( timelineEvents : TimelineEventData [ ] , extractDb : ExtractDatabase , transformDb : TransformDatabase ) {
299
+ const reviewers : number [ ] = [ ] ;
300
+ const approvers : number [ ] = [ ] ;
301
+ const committers : number [ ] = [ ] ;
302
+ let mergedBy ;
303
+
304
+ for ( const timelineEvent of timelineEvents ) {
305
+ switch ( timelineEvent . type ) {
306
+ case 'reviewed' :
307
+ if ( ! timelineEvent . actorId ) {
308
+ break ;
309
+ }
310
+ const reviewer = await getId ( timelineEvent . actorId , transformDb ) ;
311
+ if ( reviewer ) {
312
+ addUnique ( reviewer . id , reviewers ) ;
313
+ if ( timelineEvent . data && ( ( timelineEvent . data as extract . ReviewedEvent ) . state === 'approved' ) ) {
314
+ addUnique ( reviewer ?. id , approvers ) ;
315
+ }
316
+ }
317
+ break ;
318
+ case 'committed' :
319
+ const data = timelineEvent . data as extract . CommittedEvent ;
320
+ const extractUserExternalId = await extractDb . select ( {
321
+ id : extract . members . externalId ,
322
+ } ) . from ( extract . members )
323
+ . where ( or (
324
+ eq ( extract . members . username , data . committerName ) ,
325
+ eq ( extract . members . name , data . committerName ) )
326
+ ) . get ( ) ;
327
+ if ( extractUserExternalId ) {
328
+ const committer = await getId ( extractUserExternalId . id , transformDb ) ;
329
+ if ( committer ) {
330
+ addUnique ( committer . id , committers ) ;
331
+ }
332
+ }
333
+ break ;
334
+ case 'merged' :
335
+ if ( ! timelineEvent . actorId ) {
336
+ break ;
337
+ }
338
+ mergedBy = await getId ( timelineEvent . actorId , transformDb ) ;
339
+ break ;
340
+ default :
341
+ break ;
342
+ }
343
+ }
344
+
345
+ return {
346
+ mergedBy : mergedBy ?. id ,
347
+ approvers,
348
+ committers,
349
+ reviewers,
350
+ } ;
351
+ }
352
+
285
353
function mapUsersToJunk ( { author, mergedBy, approvers, committers, reviewers } : MapUsersToJunksArgs , nullForgeUserId : number ) {
286
354
return {
287
355
author : author || nullForgeUserId ,
@@ -475,12 +543,12 @@ type calcTimelineArgs = {
475
543
}
476
544
477
545
export function calculateTimeline ( timelineMapKeys : TimelineMapKey [ ] , timelineMap : Map < TimelineMapKey , MergeRequestNoteData | TimelineEventData > , { authorExternalId } : calcTimelineArgs ) {
546
+
547
+ const committedEvents = timelineMapKeys . filter ( key => key . type === 'committed' ) ;
548
+ committedEvents . sort ( ( a , b ) => a . timestamp . getTime ( ) - b . timestamp . getTime ( ) ) ;
478
549
479
- const commitedEvents = timelineMapKeys . filter ( key => key . type === 'committed' ) ;
480
- commitedEvents . sort ( ( a , b ) => a . timestamp . getTime ( ) - b . timestamp . getTime ( ) ) ;
481
-
482
- const firstCommitEvent = commitedEvents [ 0 ] || null ;
483
- const lastCommitEvent = commitedEvents [ commitedEvents . length - 1 ] || null ;
550
+ const firstCommitEvent = committedEvents [ 0 ] || null ;
551
+ const lastCommitEvent = committedEvents [ committedEvents . length - 1 ] || null ;
484
552
485
553
const startedCodingAt = firstCommitEvent ? firstCommitEvent . timestamp : null ;
486
554
@@ -503,7 +571,7 @@ export function calculateTimeline(timelineMapKeys: TimelineMapKey[], timelineMap
503
571
reviewedEventsBeforeLastCommitEvent . sort ( ( a , b ) => a . timestamp . getTime ( ) - b . timestamp . getTime ( ) ) ;
504
572
const firstReviewedEventBeforeLastCommitEvent = reviewedEventsBeforeLastCommitEvent [ 0 ] ;
505
573
if ( firstReviewedEventBeforeLastCommitEvent ) {
506
- return [ ...commitedEvents ] . reverse ( ) . find ( event => event . timestamp < firstReviewedEventBeforeLastCommitEvent . timestamp ) ?. timestamp || null ;
574
+ return [ ...committedEvents ] . reverse ( ) . find ( event => event . timestamp < firstReviewedEventBeforeLastCommitEvent . timestamp ) ?. timestamp || null ;
507
575
}
508
576
509
577
return lastCommitEvent . timestamp ;
@@ -520,7 +588,7 @@ export function calculateTimeline(timelineMapKeys: TimelineMapKey[], timelineMap
520
588
const firstReviewedEventAfterLastReadyForReviewEvent = reviewedEventsAfterLastReadyForReviewEvent [ 0 ]
521
589
522
590
if ( firstReviewedEventAfterLastReadyForReviewEvent ) {
523
- const temp = [ ...commitedEvents ] . reverse ( ) . find (
591
+ const temp = [ ...committedEvents ] . reverse ( ) . find (
524
592
event => event . timestamp > lastReadyForReviewEvent . timestamp
525
593
&& event . timestamp < firstReviewedEventAfterLastReadyForReviewEvent . timestamp
526
594
@@ -610,7 +678,7 @@ function runTimeline(mergeRequestData: MergeRequestData, timelineEvents: Timelin
610
678
} ) ;
611
679
612
680
// TODO: can this be optimized with the map ?
613
- const approved = timelineEvents . find ( ev => ev . type === 'reviewed' && ( JSON . parse ( ev . data as string ) as extract . ReviewedEvent ) . state === 'approved' ) !== undefined ;
681
+ const approved = timelineEvents . find ( ev => ev . type === 'reviewed' && ( ev . data as extract . ReviewedEvent ) . state === 'approved' ) !== undefined ;
614
682
615
683
return {
616
684
startedCodingAt,
@@ -643,6 +711,8 @@ export async function run(extractMergeRequestId: number, ctx: RunContext) {
643
711
644
712
const timeline = runTimeline ( extractData . mergeRequest , extractData . timelineEvents , extractData . notes ) ;
645
713
714
+ const users = await getUserIds ( extractData . timelineEvents , ctx . extractDatabase , ctx . transformDatabase ) ;
715
+
646
716
const {
647
717
dateId : nullDateId ,
648
718
userId : nullUserId ,
@@ -672,10 +742,10 @@ export async function run(extractMergeRequestId: number, ctx: RunContext) {
672
742
eq ( transform . forgeUsers . externalId , extractData . mergeRequest . authorExternalId || 0 ) ,
673
743
eq ( transform . forgeUsers . forgeType , extractData . repository . forgeType ) ,
674
744
) ) . get ( ) ) ?. id || null , // TODO: ???
675
- mergedBy : null ,
676
- approvers : [ ] ,
677
- committers : [ ] ,
678
- reviewers : [ ] ,
745
+ mergedBy : users . mergedBy ,
746
+ approvers : users . approvers ,
747
+ committers : users . committers ,
748
+ reviewers : users . reviewers ,
679
749
} , nullUserId ) ;
680
750
681
751
const { id : transformRepositoryId } = await upsertRepository ( ctx . transformDatabase , extractData . repository ) . get ( ) ;
0 commit comments