From bd6eb8dfd2073f774725be98db4352979bc525c6 Mon Sep 17 00:00:00 2001 From: Joan Reyero Date: Thu, 6 Apr 2023 11:07:39 +0200 Subject: [PATCH 1/5] Fixed joinedAts being overwriten --- .../__tests__/activityService.test.ts | 53 ++++++++++++++++++- backend/src/services/activityService.ts | 2 +- 2 files changed, 52 insertions(+), 3 deletions(-) diff --git a/backend/src/services/__tests__/activityService.test.ts b/backend/src/services/__tests__/activityService.test.ts index 51f515be57..5264998ff8 100644 --- a/backend/src/services/__tests__/activityService.test.ts +++ b/backend/src/services/__tests__/activityService.test.ts @@ -1464,7 +1464,7 @@ describe('ActivityService tests', () => { }) }) - it('It should replace joinedAt if the orginal was in year 1000', async () => { + it('It should replace joinedAt if the orginal was in year 1970', async () => { const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) const memberAttributeSettingsService = new MemberAttributeSettingsService( mockIRepositoryOptions, @@ -1499,7 +1499,7 @@ describe('ActivityService tests', () => { }, }, organisation: 'Crowd', - joinedAt: new Date('1000-01-01T00:00:00Z'), + joinedAt: new Date('1970-01-01T00:00:00Z'), } await MemberRepository.create(member, mockIRepositoryOptions) @@ -1576,6 +1576,55 @@ describe('ActivityService tests', () => { [PlatformType.GITHUB]: 'anil_github', }) }) + + it('Should respect joinedAt when an existing activity comes in with a different timestamp', async () => { + // This can happen in cases like the Twitter integration. + // For follow activities, if we are onboarding we set the timestamp to 1970, + // but if we are not onboarding, we set the timestamp to the current time. + // This can cause having 2 activities with different timestamps, but the same sourceId. + // The joinedAt should stay untouched in this case. + const mockIRepositoryOptions = await SequelizeTestUtils.getTestIRepositoryOptions(db) + const memberAttributeSettingsService = new MemberAttributeSettingsService( + mockIRepositoryOptions, + ) + + await memberAttributeSettingsService.createPredefined(GithubMemberAttributes) + await memberAttributeSettingsService.createPredefined(TwitterMemberAttributes) + + const member = { + username: { + [PlatformType.TWITTER]: 'anil', + }, + displayName: 'Anil', + } + + await MemberRepository.create(member, mockIRepositoryOptions) + + const data = { + member, + timestamp: '1970-01-01T00:00:00.000Z', + type: 'follow', + platform: PlatformType.TWITTER, + sourceId: '#sourceId1', + } + + const activityWithMember = await new ActivityService( + mockIRepositoryOptions, + ).createWithMember(data) + + const data2 = data + data2.timestamp = '2021-09-30T14:20:27.000Z' + + // Upsert the same activity with a different timestamp + await new ActivityService(mockIRepositoryOptions).createWithMember(data2) + + const memberFound = await MemberRepository.findById( + activityWithMember.memberId, + mockIRepositoryOptions, + ) + // The joinedAt should stay untouched + expect(memberFound.joinedAt).toStrictEqual(new Date('1970-01-01T00:00:00.000Z')) + }) }) }) diff --git a/backend/src/services/activityService.ts b/backend/src/services/activityService.ts index 5dc30e944a..10b869daa5 100644 --- a/backend/src/services/activityService.ts +++ b/backend/src/services/activityService.ts @@ -400,7 +400,7 @@ export default class ActivityService extends LoggingBase { { ...data.member, platform: data.platform, - joinedAt: data.timestamp, + joinedAt: activityExists ? activityExists.timestamp : data.timestamp, }, existingMember, ) From 7c090330b00fa857787746dd933406ae6bc71178 Mon Sep 17 00:00:00 2001 From: Joan Reyero Date: Thu, 6 Apr 2023 11:31:11 +0200 Subject: [PATCH 2/5] Fix tests --- backend/src/services/__tests__/activityService.test.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/backend/src/services/__tests__/activityService.test.ts b/backend/src/services/__tests__/activityService.test.ts index 5264998ff8..271d5960ed 100644 --- a/backend/src/services/__tests__/activityService.test.ts +++ b/backend/src/services/__tests__/activityService.test.ts @@ -1598,8 +1598,6 @@ describe('ActivityService tests', () => { displayName: 'Anil', } - await MemberRepository.create(member, mockIRepositoryOptions) - const data = { member, timestamp: '1970-01-01T00:00:00.000Z', From b2aa01451f91650b158764a92c3a76b9fa9be289 Mon Sep 17 00:00:00 2001 From: Joan Reyero Date: Thu, 6 Apr 2023 11:53:04 +0200 Subject: [PATCH 3/5] Fix tests --- backend/src/services/__tests__/activityService.test.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/backend/src/services/__tests__/activityService.test.ts b/backend/src/services/__tests__/activityService.test.ts index 271d5960ed..9e26454434 100644 --- a/backend/src/services/__tests__/activityService.test.ts +++ b/backend/src/services/__tests__/activityService.test.ts @@ -1595,7 +1595,6 @@ describe('ActivityService tests', () => { username: { [PlatformType.TWITTER]: 'anil', }, - displayName: 'Anil', } const data = { @@ -1610,11 +1609,10 @@ describe('ActivityService tests', () => { mockIRepositoryOptions, ).createWithMember(data) - const data2 = data - data2.timestamp = '2021-09-30T14:20:27.000Z' + data.timestamp = '2021-09-30T14:20:27.000Z' // Upsert the same activity with a different timestamp - await new ActivityService(mockIRepositoryOptions).createWithMember(data2) + await new ActivityService(mockIRepositoryOptions).createWithMember(data) const memberFound = await MemberRepository.findById( activityWithMember.memberId, From 9f2481b885946a1bd35bee19e8813b17c08f2364 Mon Sep 17 00:00:00 2001 From: Joan Reyero Date: Thu, 6 Apr 2023 12:06:35 +0200 Subject: [PATCH 4/5] Log --- backend/src/services/memberService.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/services/memberService.ts b/backend/src/services/memberService.ts index 8d7576e8be..cca782c551 100644 --- a/backend/src/services/memberService.ts +++ b/backend/src/services/memberService.ts @@ -188,7 +188,7 @@ export default class MemberService extends LoggingBase { if (!('platform' in data)) { throw new Error400(this.options.language, 'activity.platformRequiredWhileUpsert') } - + console.log(data) if (!data.displayName) { if (typeof data.username === 'string') { data.displayName = data.username From 4cbb5fe45c8cd3df38dc62aace421eb66406f77b Mon Sep 17 00:00:00 2001 From: Joan Reyero Date: Thu, 6 Apr 2023 12:26:06 +0200 Subject: [PATCH 5/5] Fix tests --- .../__tests__/activityService.test.ts | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/backend/src/services/__tests__/activityService.test.ts b/backend/src/services/__tests__/activityService.test.ts index 9e26454434..2381445537 100644 --- a/backend/src/services/__tests__/activityService.test.ts +++ b/backend/src/services/__tests__/activityService.test.ts @@ -1591,14 +1591,10 @@ describe('ActivityService tests', () => { await memberAttributeSettingsService.createPredefined(GithubMemberAttributes) await memberAttributeSettingsService.createPredefined(TwitterMemberAttributes) - const member = { - username: { - [PlatformType.TWITTER]: 'anil', - }, - } - const data = { - member, + member: { + username: 'anil,', + }, timestamp: '1970-01-01T00:00:00.000Z', type: 'follow', platform: PlatformType.TWITTER, @@ -1609,10 +1605,18 @@ describe('ActivityService tests', () => { mockIRepositoryOptions, ).createWithMember(data) - data.timestamp = '2021-09-30T14:20:27.000Z' - - // Upsert the same activity with a different timestamp - await new ActivityService(mockIRepositoryOptions).createWithMember(data) + const data2 = { + member: { + username: 'anil,', + }, + timestamp: '2021-09-30T14:20:27.000Z', + type: 'follow', + platform: PlatformType.TWITTER, + sourceId: '#sourceId1', + } + data.timestamp = + // Upsert the same activity with a different timestamp + await new ActivityService(mockIRepositoryOptions).createWithMember(data2) const memberFound = await MemberRepository.findById( activityWithMember.memberId,