@@ -282,6 +282,74 @@ type MapUsersToJunksArgs = {
282282 reviewers : transform . ForgeUser [ 'id' ] [ ]
283283}
284284
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+
285353function mapUsersToJunk ( { author, mergedBy, approvers, committers, reviewers } : MapUsersToJunksArgs , nullForgeUserId : number ) {
286354 return {
287355 author : author || nullForgeUserId ,
@@ -475,12 +543,12 @@ type calcTimelineArgs = {
475543}
476544
477545export 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 ( ) ) ;
478549
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 ;
484552
485553 const startedCodingAt = firstCommitEvent ? firstCommitEvent . timestamp : null ;
486554
@@ -503,7 +571,7 @@ export function calculateTimeline(timelineMapKeys: TimelineMapKey[], timelineMap
503571 reviewedEventsBeforeLastCommitEvent . sort ( ( a , b ) => a . timestamp . getTime ( ) - b . timestamp . getTime ( ) ) ;
504572 const firstReviewedEventBeforeLastCommitEvent = reviewedEventsBeforeLastCommitEvent [ 0 ] ;
505573 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 ;
507575 }
508576
509577 return lastCommitEvent . timestamp ;
@@ -520,7 +588,7 @@ export function calculateTimeline(timelineMapKeys: TimelineMapKey[], timelineMap
520588 const firstReviewedEventAfterLastReadyForReviewEvent = reviewedEventsAfterLastReadyForReviewEvent [ 0 ]
521589
522590 if ( firstReviewedEventAfterLastReadyForReviewEvent ) {
523- const temp = [ ...commitedEvents ] . reverse ( ) . find (
591+ const temp = [ ...committedEvents ] . reverse ( ) . find (
524592 event => event . timestamp > lastReadyForReviewEvent . timestamp
525593 && event . timestamp < firstReviewedEventAfterLastReadyForReviewEvent . timestamp
526594
@@ -610,7 +678,7 @@ function runTimeline(mergeRequestData: MergeRequestData, timelineEvents: Timelin
610678 } ) ;
611679
612680 // 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 ;
614682
615683 return {
616684 startedCodingAt,
@@ -643,6 +711,8 @@ export async function run(extractMergeRequestId: number, ctx: RunContext) {
643711
644712 const timeline = runTimeline ( extractData . mergeRequest , extractData . timelineEvents , extractData . notes ) ;
645713
714+ const users = await getUserIds ( extractData . timelineEvents , ctx . extractDatabase , ctx . transformDatabase ) ;
715+
646716 const {
647717 dateId : nullDateId ,
648718 userId : nullUserId ,
@@ -672,10 +742,10 @@ export async function run(extractMergeRequestId: number, ctx: RunContext) {
672742 eq ( transform . forgeUsers . externalId , extractData . mergeRequest . authorExternalId || 0 ) ,
673743 eq ( transform . forgeUsers . forgeType , extractData . repository . forgeType ) ,
674744 ) ) . 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 ,
679749 } , nullUserId ) ;
680750
681751 const { id : transformRepositoryId } = await upsertRepository ( ctx . transformDatabase , extractData . repository ) . get ( ) ;
0 commit comments