From f971344ea536d1b0d4ae3bc02c50c675a546ce6c Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Mon, 9 Dec 2024 20:39:30 +0530 Subject: [PATCH 01/23] fix miattributed activities based on username + memberId --- .../script_executor_worker/src/activities.ts | 8 +++ .../fix-misattributed-activities/index.ts | 47 +++++++++++++ .../apps/script_executor_worker/src/types.ts | 4 ++ .../script_executor_worker/src/workflows.ts | 2 + .../workflows/fixMisattributedActivities.ts | 43 ++++++++++++ .../script_executor_worker/activities.repo.ts | 68 +++++++++++++++++++ .../script_executor_worker/member.repo.ts | 30 +++++++- 7 files changed, 201 insertions(+), 1 deletion(-) create mode 100644 services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts create mode 100644 services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts create mode 100644 services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts diff --git a/services/apps/script_executor_worker/src/activities.ts b/services/apps/script_executor_worker/src/activities.ts index 0ec6f3703c..dced233181 100644 --- a/services/apps/script_executor_worker/src/activities.ts +++ b/services/apps/script_executor_worker/src/activities.ts @@ -10,6 +10,11 @@ import { findMemberIdentitiesGroupedByPlatform, findMemberMergeActions, } from './activities/dissect-member' +import { + findActivitiesWithWrongMembers, + findMemberIdentity, + updateActivities, +} from './activities/fix-misattributed-activities' import { deleteOrganizationIdentity, findOrganizationIdentity, @@ -38,4 +43,7 @@ export { updateOrganizationIdentity, deleteOrganizationIdentity, isLfxMember, + findActivitiesWithWrongMembers, + findMemberIdentity, + updateActivities, } diff --git a/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts b/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts new file mode 100644 index 0000000000..8e81a9431d --- /dev/null +++ b/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts @@ -0,0 +1,47 @@ +import { + ActivityRepository, + IActivityWithWrongMember, +} from '@crowd/data-access-layer/src/old/apps/script_executor_worker/activities.repo' +import MemberRepository from '@crowd/data-access-layer/src/old/apps/script_executor_worker/member.repo' +import { IMemberIdentity } from '@crowd/types' + +import { svc } from '../../main' + +export async function findActivitiesWithWrongMembers(limit: number) { + let activitiesWithWrongMember: IActivityWithWrongMember[] = [] + + try { + const activityRepo = new ActivityRepository(svc.postgres.reader.connection(), svc.log) + activitiesWithWrongMember = await activityRepo.getActivitiesWithWrongMembers(limit) + } catch (err) { + throw new Error(err) + } + + return activitiesWithWrongMember +} + +export async function findMemberIdentity(username: string, platform: string) { + let memberIdentity: IMemberIdentity + + try { + const memberRepo = new MemberRepository(svc.postgres.reader.connection(), svc.log) + memberIdentity = await memberRepo.findMemberIdentity(username, platform) + } catch (err) { + throw new Error(err) + } + + return memberIdentity +} + +export async function updateActivities( + username: string, + platform: string, + correctMemberId: string, +) { + try { + const activityRepo = new ActivityRepository(svc.postgres.writer.connection(), svc.log) + await activityRepo.updateActivities(username, platform, correctMemberId) + } catch (err) { + throw new Error(err) + } +} diff --git a/services/apps/script_executor_worker/src/types.ts b/services/apps/script_executor_worker/src/types.ts index 5447633312..714957178c 100644 --- a/services/apps/script_executor_worker/src/types.ts +++ b/services/apps/script_executor_worker/src/types.ts @@ -26,3 +26,7 @@ export interface IFixOrgIdentitiesWithWrongUrlsArgs { tenantId: string testRun?: boolean } + +export interface IFixMisattributedActivitiesArgs { + testRun?: boolean +} diff --git a/services/apps/script_executor_worker/src/workflows.ts b/services/apps/script_executor_worker/src/workflows.ts index 783ed8e00c..e0d919fe83 100644 --- a/services/apps/script_executor_worker/src/workflows.ts +++ b/services/apps/script_executor_worker/src/workflows.ts @@ -1,6 +1,7 @@ import { dissectMember } from './workflows/dissectMember' import { findAndMergeMembersWithSamePlatformIdentitiesDifferentCapitalization } from './workflows/findAndMergeMembersWithSamePlatformIdentitiesDifferentCapitalization' import { findAndMergeMembersWithSameVerifiedEmailsInDifferentPlatforms } from './workflows/findAndMergeMembersWithSameVerifiedEmailsInDifferentPlatforms' +import { fixMisattributedActivities } from './workflows/fixMisattributedActivities' import { fixOrgIdentitiesWithWrongUrls } from './workflows/fixOrgIdentitiesWithWrongUrls' export { @@ -8,4 +9,5 @@ export { findAndMergeMembersWithSamePlatformIdentitiesDifferentCapitalization, dissectMember, fixOrgIdentitiesWithWrongUrls, + fixMisattributedActivities, } diff --git a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts new file mode 100644 index 0000000000..0a59f55bc3 --- /dev/null +++ b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts @@ -0,0 +1,43 @@ +import { continueAsNew, proxyActivities } from '@temporalio/workflow' + +import * as activities from '../activities/fix-misattributed-activities' +import { IFixMisattributedActivitiesArgs } from '../types' + +const activity = proxyActivities({ + startToCloseTimeout: '3 minute', + retry: { maximumAttempts: 3 }, +}) + +export async function fixMisattributedActivities( + args: IFixMisattributedActivitiesArgs, +): Promise { + const PROCESS_ACTIVITIES_PER_RUN = args.testRun ? 10 : 100 + + if (args.testRun) { + console.log(`Running in test mode with limit 10!`) + } + + const activitiesWithWrongMember = await activity.findActivitiesWithWrongMembers( + PROCESS_ACTIVITIES_PER_RUN, + ) + + if (!activitiesWithWrongMember.length) { + console.log(`No activities found with misattributed members!`) + return + } + + for (const a of activitiesWithWrongMember) { + const memberIdentity = await activity.findMemberIdentity(a.username, a.platform) + console.log('activity with wrong member', a) + console.log('memberIdentity found for username and platform', memberIdentity) + // if (memberIdentity) { + // await activity.updateActivities(a.username, a.platform, memberIdentity.memberId) + // } + } + + if (!args.testRun) { + await continueAsNew({ + testRun: args.testRun, + }) + } +} diff --git a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts new file mode 100644 index 0000000000..f6108fdb54 --- /dev/null +++ b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts @@ -0,0 +1,68 @@ +import { DbConnection, DbTransaction } from '@crowd/database' +import { Logger } from '@crowd/logging' + +export interface IActivityWithWrongMember { + username: string + platform: string + activityCount: number +} + +export class ActivityRepository { + constructor( + private readonly connection: DbConnection | DbTransaction, + private readonly log: Logger, + ) {} + + async getActivitiesWithWrongMembers(limit = 100): Promise { + try { + return await this.connection.query( + ` + SELECT + a.username, + a.platform, + COUNT(*) as "activityCount" + FROM activities a + JOIN "memberIdentities" mi ON a.username = mi.value + AND a.platform = mi.platform + AND mi.type = 'username' + AND mi."verified" = true + WHERE a."memberId" <> mi."memberId" + GROUP BY a.username, a.platform + ORDER BY COUNT(*) DESC + LIMIT $(limit) + `, + { + limit, + }, + ) + } catch (err) { + this.log.error('Error while finding activities!', err) + throw new Error(err) + } + } + + async updateActivities( + username: string, + platform: string, + correctMemberId: string, + ): Promise { + try { + await this.connection.none( + ` + UPDATE activities + SET "memberId" = $(correctMemberId) + WHERE "username" = $(username) + AND platform = $(platform) + `, + { + username, + platform, + correctMemberId, + }, + ) + } catch (err) { + this.log.error('Error while updating activities!', err) + throw new Error(err) + } + } +} diff --git a/services/libs/data-access-layer/src/old/apps/script_executor_worker/member.repo.ts b/services/libs/data-access-layer/src/old/apps/script_executor_worker/member.repo.ts index 126c76219d..1f7f91a5d3 100644 --- a/services/libs/data-access-layer/src/old/apps/script_executor_worker/member.repo.ts +++ b/services/libs/data-access-layer/src/old/apps/script_executor_worker/member.repo.ts @@ -1,6 +1,6 @@ import { DbConnection, DbTransaction } from '@crowd/database' import { Logger } from '@crowd/logging' -import { IMember } from '@crowd/types' +import { IMember, IMemberIdentity } from '@crowd/types' import { IFindMemberIdentitiesGroupedByPlatformResult, ISimilarMember } from './types' @@ -159,6 +159,34 @@ class MemberRepository { return member } + + async findMemberIdentity( + username: string, + platform: string, + type = 'username', + ): Promise { + let memberIdentity: IMemberIdentity + + try { + memberIdentity = await this.connection.oneOrNone( + ` + select * from "memberIdentities" where value = $(username) and platform = $(platform) + and type = $(type) and verified = true + `, + { + username, + platform, + type, + }, + ) + } catch (err) { + this.log.error('Error while finding member identity!', err) + + throw new Error(err) + } + + return memberIdentity + } } export default MemberRepository From 4ae5d0c1655d10f5774ffd5adee3031e55e24722 Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Mon, 9 Dec 2024 21:50:42 +0530 Subject: [PATCH 02/23] fix --- .../src/old/apps/script_executor_worker/activities.repo.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts index f6108fdb54..8833a4f925 100644 --- a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts +++ b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts @@ -53,6 +53,7 @@ export class ActivityRepository { SET "memberId" = $(correctMemberId) WHERE "username" = $(username) AND platform = $(platform) + AND "memberId" != $(correctMemberId) `, { username, From 696ed054703a83ccc1d730197cf0081beddb3919 Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Tue, 10 Dec 2024 13:09:39 +0530 Subject: [PATCH 03/23] increase startToClose --- .../src/workflows/fixMisattributedActivities.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts index 0a59f55bc3..94dd4f1c9a 100644 --- a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts +++ b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts @@ -4,7 +4,7 @@ import * as activities from '../activities/fix-misattributed-activities' import { IFixMisattributedActivitiesArgs } from '../types' const activity = proxyActivities({ - startToCloseTimeout: '3 minute', + startToCloseTimeout: '10 minute', retry: { maximumAttempts: 3 }, }) From e8832615db9fcbe8a8784e77d0d5535e7c0ca044 Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Tue, 10 Dec 2024 13:51:31 +0530 Subject: [PATCH 04/23] include tenantId --- .../activities/fix-misattributed-activities/index.ts | 11 ++++++----- services/apps/script_executor_worker/src/types.ts | 7 +++---- .../src/workflows/fixMisattributedActivities.ts | 6 +++++- .../apps/script_executor_worker/activities.repo.ts | 10 +++++++++- .../old/apps/script_executor_worker/member.repo.ts | 4 +++- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts b/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts index 8e81a9431d..8557ded803 100644 --- a/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts +++ b/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts @@ -7,12 +7,12 @@ import { IMemberIdentity } from '@crowd/types' import { svc } from '../../main' -export async function findActivitiesWithWrongMembers(limit: number) { +export async function findActivitiesWithWrongMembers(tenantId: string, limit: number) { let activitiesWithWrongMember: IActivityWithWrongMember[] = [] try { const activityRepo = new ActivityRepository(svc.postgres.reader.connection(), svc.log) - activitiesWithWrongMember = await activityRepo.getActivitiesWithWrongMembers(limit) + activitiesWithWrongMember = await activityRepo.getActivitiesWithWrongMembers(tenantId, limit) } catch (err) { throw new Error(err) } @@ -20,12 +20,12 @@ export async function findActivitiesWithWrongMembers(limit: number) { return activitiesWithWrongMember } -export async function findMemberIdentity(username: string, platform: string) { +export async function findMemberIdentity(username: string, platform: string, tenantId: string) { let memberIdentity: IMemberIdentity try { const memberRepo = new MemberRepository(svc.postgres.reader.connection(), svc.log) - memberIdentity = await memberRepo.findMemberIdentity(username, platform) + memberIdentity = await memberRepo.findMemberIdentity(username, platform, tenantId) } catch (err) { throw new Error(err) } @@ -37,10 +37,11 @@ export async function updateActivities( username: string, platform: string, correctMemberId: string, + tenantId: string, ) { try { const activityRepo = new ActivityRepository(svc.postgres.writer.connection(), svc.log) - await activityRepo.updateActivities(username, platform, correctMemberId) + await activityRepo.updateActivities(username, platform, correctMemberId, tenantId) } catch (err) { throw new Error(err) } diff --git a/services/apps/script_executor_worker/src/types.ts b/services/apps/script_executor_worker/src/types.ts index 714957178c..5faf3178a7 100644 --- a/services/apps/script_executor_worker/src/types.ts +++ b/services/apps/script_executor_worker/src/types.ts @@ -22,11 +22,10 @@ export interface IDissectMemberArgs { forceSplitAllIdentities?: boolean } -export interface IFixOrgIdentitiesWithWrongUrlsArgs { +export interface tenantIdAndTestRun { tenantId: string testRun?: boolean } -export interface IFixMisattributedActivitiesArgs { - testRun?: boolean -} +export type IFixMisattributedActivitiesArgs = tenantIdAndTestRun +export type IFixOrgIdentitiesWithWrongUrlsArgs = tenantIdAndTestRun diff --git a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts index 94dd4f1c9a..e43d44ef16 100644 --- a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts +++ b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts @@ -17,7 +17,10 @@ export async function fixMisattributedActivities( console.log(`Running in test mode with limit 10!`) } + const tenantId = args.tenantId + const activitiesWithWrongMember = await activity.findActivitiesWithWrongMembers( + tenantId, PROCESS_ACTIVITIES_PER_RUN, ) @@ -27,7 +30,7 @@ export async function fixMisattributedActivities( } for (const a of activitiesWithWrongMember) { - const memberIdentity = await activity.findMemberIdentity(a.username, a.platform) + const memberIdentity = await activity.findMemberIdentity(a.username, a.platform, tenantId) console.log('activity with wrong member', a) console.log('memberIdentity found for username and platform', memberIdentity) // if (memberIdentity) { @@ -38,6 +41,7 @@ export async function fixMisattributedActivities( if (!args.testRun) { await continueAsNew({ testRun: args.testRun, + tenantId: args.tenantId, }) } } diff --git a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts index 8833a4f925..06b81299e0 100644 --- a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts +++ b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts @@ -13,7 +13,10 @@ export class ActivityRepository { private readonly log: Logger, ) {} - async getActivitiesWithWrongMembers(limit = 100): Promise { + async getActivitiesWithWrongMembers( + tenantId: string, + limit = 100, + ): Promise { try { return await this.connection.query( ` @@ -27,11 +30,13 @@ export class ActivityRepository { AND mi.type = 'username' AND mi."verified" = true WHERE a."memberId" <> mi."memberId" + AND a."tenantId" = $(tenantId) GROUP BY a.username, a.platform ORDER BY COUNT(*) DESC LIMIT $(limit) `, { + tenantId, limit, }, ) @@ -45,6 +50,7 @@ export class ActivityRepository { username: string, platform: string, correctMemberId: string, + tenantId: string, ): Promise { try { await this.connection.none( @@ -54,11 +60,13 @@ export class ActivityRepository { WHERE "username" = $(username) AND platform = $(platform) AND "memberId" != $(correctMemberId) + AND "tenantId" = $(tenantId) `, { username, platform, correctMemberId, + tenantId, }, ) } catch (err) { diff --git a/services/libs/data-access-layer/src/old/apps/script_executor_worker/member.repo.ts b/services/libs/data-access-layer/src/old/apps/script_executor_worker/member.repo.ts index 1f7f91a5d3..9eca599e7d 100644 --- a/services/libs/data-access-layer/src/old/apps/script_executor_worker/member.repo.ts +++ b/services/libs/data-access-layer/src/old/apps/script_executor_worker/member.repo.ts @@ -163,6 +163,7 @@ class MemberRepository { async findMemberIdentity( username: string, platform: string, + tenantId: string, type = 'username', ): Promise { let memberIdentity: IMemberIdentity @@ -171,12 +172,13 @@ class MemberRepository { memberIdentity = await this.connection.oneOrNone( ` select * from "memberIdentities" where value = $(username) and platform = $(platform) - and type = $(type) and verified = true + and type = $(type) and verified = true and "tenantId" = $(tenantId) `, { username, platform, type, + tenantId, }, ) } catch (err) { From 02c0dbd1f002d01954fe64ae36a3a51e34d157cc Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Tue, 10 Dec 2024 14:26:22 +0530 Subject: [PATCH 05/23] update query --- .../src/old/apps/script_executor_worker/activities.repo.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts index 06b81299e0..4a02186737 100644 --- a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts +++ b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts @@ -29,6 +29,7 @@ export class ActivityRepository { AND a.platform = mi.platform AND mi.type = 'username' AND mi."verified" = true + AND a."tenantId" = mi."tenantId" WHERE a."memberId" <> mi."memberId" AND a."tenantId" = $(tenantId) GROUP BY a.username, a.platform From b4d31204f3ec4ff1e154cc72c3ce76fdd4486f96 Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Tue, 10 Dec 2024 14:27:24 +0530 Subject: [PATCH 06/23] update query --- .../src/old/apps/script_executor_worker/activities.repo.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts index 4a02186737..dfd83fc8fc 100644 --- a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts +++ b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts @@ -33,7 +33,7 @@ export class ActivityRepository { WHERE a."memberId" <> mi."memberId" AND a."tenantId" = $(tenantId) GROUP BY a.username, a.platform - ORDER BY COUNT(*) DESC + ORDER BY "activityCount" DESC LIMIT $(limit) `, { From dfc6a5674d884a7b511c0de6dbb9ca2fcd3f5451 Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Tue, 10 Dec 2024 15:14:13 +0530 Subject: [PATCH 07/23] improve script --- .../fix-misattributed-activities/index.ts | 20 +++++++++------- .../workflows/fixMisattributedActivities.ts | 16 ++++++++----- .../script_executor_worker/activities.repo.ts | 23 ++++++++----------- 3 files changed, 31 insertions(+), 28 deletions(-) diff --git a/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts b/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts index 8557ded803..30608b5d97 100644 --- a/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts +++ b/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts @@ -1,14 +1,11 @@ -import { - ActivityRepository, - IActivityWithWrongMember, -} from '@crowd/data-access-layer/src/old/apps/script_executor_worker/activities.repo' +import { ActivityRepository } from '@crowd/data-access-layer/src/old/apps/script_executor_worker/activities.repo' import MemberRepository from '@crowd/data-access-layer/src/old/apps/script_executor_worker/member.repo' -import { IMemberIdentity } from '@crowd/types' +import { IActivityCreateData, IMemberIdentity } from '@crowd/types' import { svc } from '../../main' export async function findActivitiesWithWrongMembers(tenantId: string, limit: number) { - let activitiesWithWrongMember: IActivityWithWrongMember[] = [] + let activitiesWithWrongMember: IActivityCreateData[] = [] try { const activityRepo = new ActivityRepository(svc.postgres.reader.connection(), svc.log) @@ -33,7 +30,8 @@ export async function findMemberIdentity(username: string, platform: string, ten return memberIdentity } -export async function updateActivities( +export async function updateActivityWithWrongMember( + activityId: string, username: string, platform: string, correctMemberId: string, @@ -41,7 +39,13 @@ export async function updateActivities( ) { try { const activityRepo = new ActivityRepository(svc.postgres.writer.connection(), svc.log) - await activityRepo.updateActivities(username, platform, correctMemberId, tenantId) + await activityRepo.updateActivityWithWrongMember( + activityId, + username, + platform, + correctMemberId, + tenantId, + ) } catch (err) { throw new Error(err) } diff --git a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts index e43d44ef16..4496bb4e44 100644 --- a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts +++ b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts @@ -11,7 +11,7 @@ const activity = proxyActivities({ export async function fixMisattributedActivities( args: IFixMisattributedActivitiesArgs, ): Promise { - const PROCESS_ACTIVITIES_PER_RUN = args.testRun ? 10 : 100 + const PROCESS_ACTIVITIES_PER_RUN = args.testRun ? 10 : 1000 if (args.testRun) { console.log(`Running in test mode with limit 10!`) @@ -31,11 +31,15 @@ export async function fixMisattributedActivities( for (const a of activitiesWithWrongMember) { const memberIdentity = await activity.findMemberIdentity(a.username, a.platform, tenantId) - console.log('activity with wrong member', a) - console.log('memberIdentity found for username and platform', memberIdentity) - // if (memberIdentity) { - // await activity.updateActivities(a.username, a.platform, memberIdentity.memberId) - // } + if (memberIdentity) { + await activity.updateActivityWithWrongMember( + a.id, + a.username, + a.platform, + memberIdentity.memberId, + tenantId, + ) + } } if (!args.testRun) { diff --git a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts index dfd83fc8fc..6fff7476cc 100644 --- a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts +++ b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts @@ -1,11 +1,6 @@ import { DbConnection, DbTransaction } from '@crowd/database' import { Logger } from '@crowd/logging' - -export interface IActivityWithWrongMember { - username: string - platform: string - activityCount: number -} +import { IActivityCreateData } from '@crowd/types' export class ActivityRepository { constructor( @@ -16,14 +11,14 @@ export class ActivityRepository { async getActivitiesWithWrongMembers( tenantId: string, limit = 100, - ): Promise { + ): Promise { try { return await this.connection.query( ` SELECT + a.id, a.username, - a.platform, - COUNT(*) as "activityCount" + a.platform FROM activities a JOIN "memberIdentities" mi ON a.username = mi.value AND a.platform = mi.platform @@ -32,8 +27,6 @@ export class ActivityRepository { AND a."tenantId" = mi."tenantId" WHERE a."memberId" <> mi."memberId" AND a."tenantId" = $(tenantId) - GROUP BY a.username, a.platform - ORDER BY "activityCount" DESC LIMIT $(limit) `, { @@ -47,7 +40,8 @@ export class ActivityRepository { } } - async updateActivities( + async updateActivityWithWrongMember( + activityId: string, username: string, platform: string, correctMemberId: string, @@ -58,9 +52,9 @@ export class ActivityRepository { ` UPDATE activities SET "memberId" = $(correctMemberId) - WHERE "username" = $(username) + WHERE id = $(activityId) + AND "username" = $(username) AND platform = $(platform) - AND "memberId" != $(correctMemberId) AND "tenantId" = $(tenantId) `, { @@ -68,6 +62,7 @@ export class ActivityRepository { platform, correctMemberId, tenantId, + activityId, }, ) } catch (err) { From b06c544153f46813e5ffcae8740aeaefd8730ad6 Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Tue, 10 Dec 2024 15:25:15 +0530 Subject: [PATCH 08/23] make linter happy --- services/apps/script_executor_worker/src/activities.ts | 4 ++-- .../src/workflows/fixMisattributedActivities.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/services/apps/script_executor_worker/src/activities.ts b/services/apps/script_executor_worker/src/activities.ts index dced233181..84142ffd42 100644 --- a/services/apps/script_executor_worker/src/activities.ts +++ b/services/apps/script_executor_worker/src/activities.ts @@ -13,7 +13,7 @@ import { import { findActivitiesWithWrongMembers, findMemberIdentity, - updateActivities, + updateActivityWithWrongMember, } from './activities/fix-misattributed-activities' import { deleteOrganizationIdentity, @@ -45,5 +45,5 @@ export { isLfxMember, findActivitiesWithWrongMembers, findMemberIdentity, - updateActivities, + updateActivityWithWrongMember, } diff --git a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts index 4496bb4e44..f9a90fded0 100644 --- a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts +++ b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts @@ -1,6 +1,6 @@ import { continueAsNew, proxyActivities } from '@temporalio/workflow' -import * as activities from '../activities/fix-misattributed-activities' +import * as activities from '../activities' import { IFixMisattributedActivitiesArgs } from '../types' const activity = proxyActivities({ From 0c7382ccc13090036e099b9f11abf291fc0e14e6 Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Tue, 10 Dec 2024 18:48:54 +0530 Subject: [PATCH 09/23] fix --- .../fix-misattributed-activities/index.ts | 16 ++-------------- .../src/workflows/fixMisattributedActivities.ts | 8 +------- .../script_executor_worker/activities.repo.ts | 14 +------------- 3 files changed, 4 insertions(+), 34 deletions(-) diff --git a/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts b/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts index 30608b5d97..5778b68373 100644 --- a/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts +++ b/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts @@ -30,22 +30,10 @@ export async function findMemberIdentity(username: string, platform: string, ten return memberIdentity } -export async function updateActivityWithWrongMember( - activityId: string, - username: string, - platform: string, - correctMemberId: string, - tenantId: string, -) { +export async function updateActivityWithWrongMember(activityId: string, correctMemberId: string) { try { const activityRepo = new ActivityRepository(svc.postgres.writer.connection(), svc.log) - await activityRepo.updateActivityWithWrongMember( - activityId, - username, - platform, - correctMemberId, - tenantId, - ) + await activityRepo.updateActivityWithWrongMember(activityId, correctMemberId) } catch (err) { throw new Error(err) } diff --git a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts index f9a90fded0..083d86515c 100644 --- a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts +++ b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts @@ -32,13 +32,7 @@ export async function fixMisattributedActivities( for (const a of activitiesWithWrongMember) { const memberIdentity = await activity.findMemberIdentity(a.username, a.platform, tenantId) if (memberIdentity) { - await activity.updateActivityWithWrongMember( - a.id, - a.username, - a.platform, - memberIdentity.memberId, - tenantId, - ) + await activity.updateActivityWithWrongMember(a.id, memberIdentity.memberId) } } diff --git a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts index 6fff7476cc..13fe8cad5d 100644 --- a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts +++ b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts @@ -40,28 +40,16 @@ export class ActivityRepository { } } - async updateActivityWithWrongMember( - activityId: string, - username: string, - platform: string, - correctMemberId: string, - tenantId: string, - ): Promise { + async updateActivityWithWrongMember(activityId: string, correctMemberId: string): Promise { try { await this.connection.none( ` UPDATE activities SET "memberId" = $(correctMemberId) WHERE id = $(activityId) - AND "username" = $(username) - AND platform = $(platform) - AND "tenantId" = $(tenantId) `, { - username, - platform, correctMemberId, - tenantId, activityId, }, ) From e217fe015c005494df0de63950fe69ba374baa6a Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Tue, 10 Dec 2024 22:48:00 +0530 Subject: [PATCH 10/23] update in questdb --- .../fix-misattributed-activities/index.ts | 12 ++++++++++-- services/apps/script_executor_worker/src/main.ts | 2 +- .../script_executor_worker/activities.repo.ts | 16 +++++++++++++++- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts b/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts index 5778b68373..af70dda13a 100644 --- a/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts +++ b/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts @@ -8,7 +8,11 @@ export async function findActivitiesWithWrongMembers(tenantId: string, limit: nu let activitiesWithWrongMember: IActivityCreateData[] = [] try { - const activityRepo = new ActivityRepository(svc.postgres.reader.connection(), svc.log) + const activityRepo = new ActivityRepository( + svc.postgres.reader.connection(), + svc.log, + svc.questdbSQL, + ) activitiesWithWrongMember = await activityRepo.getActivitiesWithWrongMembers(tenantId, limit) } catch (err) { throw new Error(err) @@ -32,7 +36,11 @@ export async function findMemberIdentity(username: string, platform: string, ten export async function updateActivityWithWrongMember(activityId: string, correctMemberId: string) { try { - const activityRepo = new ActivityRepository(svc.postgres.writer.connection(), svc.log) + const activityRepo = new ActivityRepository( + svc.postgres.writer.connection(), + svc.log, + svc.questdbSQL, + ) await activityRepo.updateActivityWithWrongMember(activityId, correctMemberId) } catch (err) { throw new Error(err) diff --git a/services/apps/script_executor_worker/src/main.ts b/services/apps/script_executor_worker/src/main.ts index 8ae0530519..cf70f25450 100644 --- a/services/apps/script_executor_worker/src/main.ts +++ b/services/apps/script_executor_worker/src/main.ts @@ -10,7 +10,7 @@ const config: Config = { enabled: true, }, questdb: { - enabled: false, + enabled: true, }, redis: { enabled: true, diff --git a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts index 13fe8cad5d..ab8c295a38 100644 --- a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts +++ b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts @@ -1,11 +1,14 @@ -import { DbConnection, DbTransaction } from '@crowd/database' +import { DbConnOrTx, DbConnection, DbTransaction } from '@crowd/database' import { Logger } from '@crowd/logging' import { IActivityCreateData } from '@crowd/types' +import { updateActivities } from '../../../activities/update' + export class ActivityRepository { constructor( private readonly connection: DbConnection | DbTransaction, private readonly log: Logger, + private readonly questdbSQL: DbConnOrTx, ) {} async getActivitiesWithWrongMembers( @@ -42,6 +45,7 @@ export class ActivityRepository { async updateActivityWithWrongMember(activityId: string, correctMemberId: string): Promise { try { + // Update the activity in pgsql to persist progress await this.connection.none( ` UPDATE activities @@ -53,6 +57,16 @@ export class ActivityRepository { activityId, }, ) + + // Update the activity in QuestDB + await updateActivities( + this.questdbSQL, + async () => ({ memberId: correctMemberId }), + 'id = $(activityId)', + { + activityId, + }, + ) } catch (err) { this.log.error('Error while updating activities!', err) throw new Error(err) From 56c4ee6063161937cea944e48f5ac23b81e1eed2 Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Tue, 10 Dec 2024 23:26:26 +0530 Subject: [PATCH 11/23] batch --- .../script_executor_worker/src/activities.ts | 2 + .../fix-misattributed-activities/index.ts | 20 ++++++++- .../workflows/fixMisattributedActivities.ts | 8 ++-- .../script_executor_worker/activities.repo.ts | 42 ++++++++++++++++--- 4 files changed, 60 insertions(+), 12 deletions(-) diff --git a/services/apps/script_executor_worker/src/activities.ts b/services/apps/script_executor_worker/src/activities.ts index 84142ffd42..860987be68 100644 --- a/services/apps/script_executor_worker/src/activities.ts +++ b/services/apps/script_executor_worker/src/activities.ts @@ -11,6 +11,7 @@ import { findMemberMergeActions, } from './activities/dissect-member' import { + batchUpdateActivitiesWithWrongMember, findActivitiesWithWrongMembers, findMemberIdentity, updateActivityWithWrongMember, @@ -46,4 +47,5 @@ export { findActivitiesWithWrongMembers, findMemberIdentity, updateActivityWithWrongMember, + batchUpdateActivitiesWithWrongMember, } diff --git a/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts b/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts index af70dda13a..58f14692d3 100644 --- a/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts +++ b/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts @@ -1,11 +1,11 @@ import { ActivityRepository } from '@crowd/data-access-layer/src/old/apps/script_executor_worker/activities.repo' import MemberRepository from '@crowd/data-access-layer/src/old/apps/script_executor_worker/member.repo' -import { IActivityCreateData, IMemberIdentity } from '@crowd/types' +import { IMemberIdentity } from '@crowd/types' import { svc } from '../../main' export async function findActivitiesWithWrongMembers(tenantId: string, limit: number) { - let activitiesWithWrongMember: IActivityCreateData[] = [] + let activitiesWithWrongMember = [] try { const activityRepo = new ActivityRepository( @@ -46,3 +46,19 @@ export async function updateActivityWithWrongMember(activityId: string, correctM throw new Error(err) } } + +export async function batchUpdateActivitiesWithWrongMember( + activityIds: string[], + correctMemberId: string, +) { + try { + const activityRepo = new ActivityRepository( + svc.postgres.writer.connection(), + svc.log, + svc.questdbSQL, + ) + await activityRepo.batchUpdateActivitiesWithWrongMember(activityIds, correctMemberId) + } catch (err) { + throw new Error(err) + } +} diff --git a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts index 083d86515c..4b19f65f64 100644 --- a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts +++ b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts @@ -29,11 +29,9 @@ export async function fixMisattributedActivities( return } - for (const a of activitiesWithWrongMember) { - const memberIdentity = await activity.findMemberIdentity(a.username, a.platform, tenantId) - if (memberIdentity) { - await activity.updateActivityWithWrongMember(a.id, memberIdentity.memberId) - } + // Process each group of activities + for (const group of activitiesWithWrongMember) { + await activity.batchUpdateActivitiesWithWrongMember(group.activityIds, group.correctMemberId) } if (!args.testRun) { diff --git a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts index ab8c295a38..4ababb441d 100644 --- a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts +++ b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts @@ -1,6 +1,5 @@ import { DbConnOrTx, DbConnection, DbTransaction } from '@crowd/database' import { Logger } from '@crowd/logging' -import { IActivityCreateData } from '@crowd/types' import { updateActivities } from '../../../activities/update' @@ -14,14 +13,13 @@ export class ActivityRepository { async getActivitiesWithWrongMembers( tenantId: string, limit = 100, - ): Promise { + ): Promise<{ correctMemberId: string; activityIds: string[] }[]> { try { return await this.connection.query( ` SELECT - a.id, - a.username, - a.platform + mi."memberId" as "correctMemberId", + array_agg(a.id) as "activityIds" FROM activities a JOIN "memberIdentities" mi ON a.username = mi.value AND a.platform = mi.platform @@ -30,6 +28,7 @@ export class ActivityRepository { AND a."tenantId" = mi."tenantId" WHERE a."memberId" <> mi."memberId" AND a."tenantId" = $(tenantId) + GROUP BY mi."memberId" LIMIT $(limit) `, { @@ -72,4 +71,37 @@ export class ActivityRepository { throw new Error(err) } } + + async batchUpdateActivitiesWithWrongMember( + activityIds: string[], + correctMemberId: string, + ): Promise { + try { + // Batch update activities in PostgreSQL + await this.connection.none( + ` + UPDATE activities + SET "memberId" = $(correctMemberId) + WHERE id = ANY($(activityIds)) + `, + { + correctMemberId, + activityIds, + }, + ) + + // Batch update activities in QuestDB + await updateActivities( + this.questdbSQL, + async () => ({ memberId: correctMemberId }), + 'id IN ($(activityIds:csv))', + { + activityIds: activityIds.join(','), + }, + ) + } catch (err) { + this.log.error('Error while batch updating activities!', err) + throw new Error(err) + } + } } From 3644f91219b57cff3dec0c395957f48acdf3a530 Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Wed, 11 Dec 2024 19:07:33 +0530 Subject: [PATCH 12/23] update script --- pnpm-lock.yaml | 12 ++-- .../apps/script_executor_worker/package.json | 1 + .../fix-misattributed-activities/index.ts | 4 +- .../workflows/fixMisattributedActivities.ts | 59 ++++++++++--------- .../script_executor_worker/activities.repo.ts | 27 +++------ 5 files changed, 49 insertions(+), 54 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8e203a7775..38995027b9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1275,6 +1275,9 @@ importers: axios: specifier: ^1.6.8 version: 1.6.8 + csv-parse: + specifier: ^5.5.6 + version: 5.5.6 moment: specifier: ~2.29.4 version: 2.29.4 @@ -9925,7 +9928,7 @@ snapshots: dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.572.0(@aws-sdk/client-sts@3.572.0) + '@aws-sdk/client-sso-oidc': 3.572.0 '@aws-sdk/client-sts': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0) '@aws-sdk/core': 3.572.0 '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0) @@ -10169,7 +10172,7 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso-oidc@3.572.0(@aws-sdk/client-sts@3.572.0)': + '@aws-sdk/client-sso-oidc@3.572.0': dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 @@ -10212,7 +10215,6 @@ snapshots: '@smithy/util-utf8': 2.3.0 tslib: 2.6.2 transitivePeerDependencies: - - '@aws-sdk/client-sts' - aws-crt '@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)': @@ -10437,7 +10439,7 @@ snapshots: dependencies: '@aws-crypto/sha256-browser': 3.0.0 '@aws-crypto/sha256-js': 3.0.0 - '@aws-sdk/client-sso-oidc': 3.572.0(@aws-sdk/client-sts@3.572.0) + '@aws-sdk/client-sso-oidc': 3.572.0 '@aws-sdk/core': 3.572.0 '@aws-sdk/credential-provider-node': 3.572.0(@aws-sdk/client-sso-oidc@3.572.0)(@aws-sdk/client-sts@3.572.0) '@aws-sdk/middleware-host-header': 3.567.0 @@ -11072,7 +11074,7 @@ snapshots: '@aws-sdk/token-providers@3.572.0(@aws-sdk/client-sso-oidc@3.572.0)': dependencies: - '@aws-sdk/client-sso-oidc': 3.572.0(@aws-sdk/client-sts@3.572.0) + '@aws-sdk/client-sso-oidc': 3.572.0 '@aws-sdk/types': 3.567.0 '@smithy/property-provider': 2.2.0 '@smithy/shared-ini-file-loader': 2.4.0 diff --git a/services/apps/script_executor_worker/package.json b/services/apps/script_executor_worker/package.json index 8d1806ac97..52303aad0a 100644 --- a/services/apps/script_executor_worker/package.json +++ b/services/apps/script_executor_worker/package.json @@ -21,6 +21,7 @@ "@crowd/types": "workspace:*", "@temporalio/workflow": "~1.11.1", "axios": "^1.6.8", + "csv-parse": "^5.5.6", "moment": "~2.29.4", "tsx": "^4.7.1", "typescript": "^5.6.3" diff --git a/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts b/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts index 58f14692d3..261493c89b 100644 --- a/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts +++ b/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts @@ -48,7 +48,7 @@ export async function updateActivityWithWrongMember(activityId: string, correctM } export async function batchUpdateActivitiesWithWrongMember( - activityIds: string[], + wrongMemberId: string, correctMemberId: string, ) { try { @@ -57,7 +57,7 @@ export async function batchUpdateActivitiesWithWrongMember( svc.log, svc.questdbSQL, ) - await activityRepo.batchUpdateActivitiesWithWrongMember(activityIds, correctMemberId) + await activityRepo.batchUpdateActivitiesWithWrongMember(wrongMemberId, correctMemberId) } catch (err) { throw new Error(err) } diff --git a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts index 4b19f65f64..5ef837390c 100644 --- a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts +++ b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts @@ -1,43 +1,48 @@ -import { continueAsNew, proxyActivities } from '@temporalio/workflow' +import { proxyActivities } from '@temporalio/workflow' +import { parse } from 'csv-parse/sync' +import * as fs from 'fs' +import * as path from 'path' import * as activities from '../activities' -import { IFixMisattributedActivitiesArgs } from '../types' const activity = proxyActivities({ startToCloseTimeout: '10 minute', retry: { maximumAttempts: 3 }, }) -export async function fixMisattributedActivities( - args: IFixMisattributedActivitiesArgs, -): Promise { - const PROCESS_ACTIVITIES_PER_RUN = args.testRun ? 10 : 1000 - - if (args.testRun) { - console.log(`Running in test mode with limit 10!`) +export async function fixMisattributedActivities(): Promise { + // Read CSV file + const csvFilePath = path.join(process.cwd(), 'misattributed_activities.csv') + const fileContent = fs.readFileSync(csvFilePath, 'utf-8') + const records = parse(fileContent, { + columns: true, + skip_empty_lines: true, + }) + + if (!records.length) { + console.log(`No activities found in the CSV file!`) + return } - const tenantId = args.tenantId + let processedMemberCount = 0 + const totalRecords = records.length - const activitiesWithWrongMember = await activity.findActivitiesWithWrongMembers( - tenantId, - PROCESS_ACTIVITIES_PER_RUN, - ) + // Process each record from CSV + for (const record of records) { + // await activity.batchUpdateActivitiesWithWrongMember( + // record.wrongMemberId, + // record.correctMemberId, + // ) - if (!activitiesWithWrongMember.length) { - console.log(`No activities found with misattributed members!`) - return - } + console.log( + `Processing member wrongMemberId: ${record.wrongMemberId}, correctMemberId: ${record.correctMemberId}, activitiesCount: ${record.activitiesCount}`, + ) - // Process each group of activities - for (const group of activitiesWithWrongMember) { - await activity.batchUpdateActivitiesWithWrongMember(group.activityIds, group.correctMemberId) - } + break + + processedMemberCount++ - if (!args.testRun) { - await continueAsNew({ - testRun: args.testRun, - tenantId: args.tenantId, - }) + // Log progress + console.log(`Processed ${processedMemberCount}/${totalRecords} members in the CSV file.`) } } diff --git a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts index 4ababb441d..a8be90229f 100644 --- a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts +++ b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts @@ -13,13 +13,13 @@ export class ActivityRepository { async getActivitiesWithWrongMembers( tenantId: string, limit = 100, - ): Promise<{ correctMemberId: string; activityIds: string[] }[]> { + ): Promise<{ wrongMemberId: string; correctMemberId: string }[]> { try { return await this.connection.query( ` SELECT - mi."memberId" as "correctMemberId", - array_agg(a.id) as "activityIds" + a."memberId" as "wrongMemberId", + mi."memberId" as "correctMemberId" FROM activities a JOIN "memberIdentities" mi ON a.username = mi.value AND a.platform = mi.platform @@ -28,7 +28,7 @@ export class ActivityRepository { AND a."tenantId" = mi."tenantId" WHERE a."memberId" <> mi."memberId" AND a."tenantId" = $(tenantId) - GROUP BY mi."memberId" + GROUP BY a."memberId", mi."memberId" LIMIT $(limit) `, { @@ -73,30 +73,17 @@ export class ActivityRepository { } async batchUpdateActivitiesWithWrongMember( - activityIds: string[], + wrongMemberId: string, correctMemberId: string, ): Promise { try { - // Batch update activities in PostgreSQL - await this.connection.none( - ` - UPDATE activities - SET "memberId" = $(correctMemberId) - WHERE id = ANY($(activityIds)) - `, - { - correctMemberId, - activityIds, - }, - ) - // Batch update activities in QuestDB await updateActivities( this.questdbSQL, async () => ({ memberId: correctMemberId }), - 'id IN ($(activityIds:csv))', + '"memberId" = $(wrongMemberId)', { - activityIds: activityIds.join(','), + wrongMemberId, }, ) } catch (err) { From 1bc2a48edbb43df8326eb0997e44cd4dc813b8bd Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Wed, 11 Dec 2024 19:18:07 +0530 Subject: [PATCH 13/23] fix script worker --- .../fix-misattributed-activities/index.ts | 47 +++++++++++++------ .../workflows/fixMisattributedActivities.ts | 10 +--- 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts b/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts index 261493c89b..fa82a77271 100644 --- a/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts +++ b/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts @@ -1,25 +1,29 @@ +import { parse } from 'csv-parse/sync' +import * as fs from 'fs' +import * as path from 'path' + import { ActivityRepository } from '@crowd/data-access-layer/src/old/apps/script_executor_worker/activities.repo' import MemberRepository from '@crowd/data-access-layer/src/old/apps/script_executor_worker/member.repo' import { IMemberIdentity } from '@crowd/types' import { svc } from '../../main' -export async function findActivitiesWithWrongMembers(tenantId: string, limit: number) { - let activitiesWithWrongMember = [] +// export async function findActivitiesWithWrongMembers(tenantId: string, limit: number) { +// let activitiesWithWrongMember = [] - try { - const activityRepo = new ActivityRepository( - svc.postgres.reader.connection(), - svc.log, - svc.questdbSQL, - ) - activitiesWithWrongMember = await activityRepo.getActivitiesWithWrongMembers(tenantId, limit) - } catch (err) { - throw new Error(err) - } +// try { +// const activityRepo = new ActivityRepository( +// svc.postgres.reader.connection(), +// svc.log, +// svc.questdbSQL, +// ) +// activitiesWithWrongMember = await activityRepo.getActivitiesWithWrongMembers(tenantId, limit) +// } catch (err) { +// throw new Error(err) +// } - return activitiesWithWrongMember -} +// return activitiesWithWrongMember +// } export async function findMemberIdentity(username: string, platform: string, tenantId: string) { let memberIdentity: IMemberIdentity @@ -62,3 +66,18 @@ export async function batchUpdateActivitiesWithWrongMember( throw new Error(err) } } + +export async function findActivitiesWithWrongMembers(): Promise< + Array<{ + wrongMemberId: string + correctMemberId: string + activitiesCount: number + }> +> { + const csvFilePath = path.join(process.cwd(), 'misattributed_activities.csv') + const fileContent = fs.readFileSync(csvFilePath, 'utf-8') + return parse(fileContent, { + columns: true, + skip_empty_lines: true, + }) +} diff --git a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts index 5ef837390c..6cdf006cce 100644 --- a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts +++ b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts @@ -1,7 +1,4 @@ import { proxyActivities } from '@temporalio/workflow' -import { parse } from 'csv-parse/sync' -import * as fs from 'fs' -import * as path from 'path' import * as activities from '../activities' @@ -12,12 +9,7 @@ const activity = proxyActivities({ export async function fixMisattributedActivities(): Promise { // Read CSV file - const csvFilePath = path.join(process.cwd(), 'misattributed_activities.csv') - const fileContent = fs.readFileSync(csvFilePath, 'utf-8') - const records = parse(fileContent, { - columns: true, - skip_empty_lines: true, - }) + const records = await activity.findActivitiesWithWrongMembers() if (!records.length) { console.log(`No activities found in the CSV file!`) From 6566479cb7b5ad5936b5fe6f7b911f4c87537dc0 Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Wed, 11 Dec 2024 19:29:44 +0530 Subject: [PATCH 14/23] update script --- .../src/workflows/fixMisattributedActivities.ts | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts index 6cdf006cce..c29bcbe145 100644 --- a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts +++ b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts @@ -21,20 +21,14 @@ export async function fixMisattributedActivities(): Promise { // Process each record from CSV for (const record of records) { - // await activity.batchUpdateActivitiesWithWrongMember( - // record.wrongMemberId, - // record.correctMemberId, - // ) - - console.log( - `Processing member wrongMemberId: ${record.wrongMemberId}, correctMemberId: ${record.correctMemberId}, activitiesCount: ${record.activitiesCount}`, + await activity.batchUpdateActivitiesWithWrongMember( + record.wrongMemberId, + record.correctMemberId, ) - break - processedMemberCount++ // Log progress - console.log(`Processed ${processedMemberCount}/${totalRecords} members in the CSV file.`) + console.log(`Processed ${processedMemberCount}/${totalRecords} members in the CSV file!`) } } From cfea6fa9537a41c6d96a5a25ce4a92e73e08397a Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Wed, 11 Dec 2024 21:08:07 +0530 Subject: [PATCH 15/23] increase timeout --- .../src/workflows/fixMisattributedActivities.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts index c29bcbe145..db5c22740c 100644 --- a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts +++ b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts @@ -3,8 +3,7 @@ import { proxyActivities } from '@temporalio/workflow' import * as activities from '../activities' const activity = proxyActivities({ - startToCloseTimeout: '10 minute', - retry: { maximumAttempts: 3 }, + startToCloseTimeout: '60 minutes', }) export async function fixMisattributedActivities(): Promise { From 4804b58d1a8fe44dece1072e1a0dec4719e31a2c Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Wed, 11 Dec 2024 21:46:16 +0530 Subject: [PATCH 16/23] donot use updateActivities --- .../old/apps/script_executor_worker/activities.repo.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts index a8be90229f..10e6dac2a9 100644 --- a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts +++ b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts @@ -77,13 +77,11 @@ export class ActivityRepository { correctMemberId: string, ): Promise { try { - // Batch update activities in QuestDB - await updateActivities( - this.questdbSQL, - async () => ({ memberId: correctMemberId }), - '"memberId" = $(wrongMemberId)', + await this.questdbSQL.none( + 'UPDATE "activities" SET "memberId" = $(memberId) WHERE "memberId" = $(wrongMemberId)', { wrongMemberId, + memberId: correctMemberId, }, ) } catch (err) { From 47611cfe810c34d9c99d8dfd335062cc3a5d59aa Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Wed, 11 Dec 2024 21:47:17 +0530 Subject: [PATCH 17/23] fix script worker --- .../src/old/apps/script_executor_worker/activities.repo.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts index 10e6dac2a9..6b4f15126e 100644 --- a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts +++ b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts @@ -78,10 +78,10 @@ export class ActivityRepository { ): Promise { try { await this.questdbSQL.none( - 'UPDATE "activities" SET "memberId" = $(memberId) WHERE "memberId" = $(wrongMemberId)', + 'UPDATE "activities" SET "memberId" = $(correctMemberId) WHERE "memberId" = $(wrongMemberId)', { wrongMemberId, - memberId: correctMemberId, + correctMemberId, }, ) } catch (err) { From 6c520c2df9c6d94fa913c1c8646d980ca338ec0c Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Thu, 2 Jan 2025 20:32:23 +0530 Subject: [PATCH 18/23] fix rest of the members --- .../script_executor_worker/src/activities.ts | 2 ++ .../fix-misattributed-activities/index.ts | 13 +++++++++++++ .../src/workflows/fixMisattributedActivities.ts | 16 +++++++++++++--- .../script_executor_worker/activities.repo.ts | 14 ++++++++++++++ 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/services/apps/script_executor_worker/src/activities.ts b/services/apps/script_executor_worker/src/activities.ts index 860987be68..a878b77fd8 100644 --- a/services/apps/script_executor_worker/src/activities.ts +++ b/services/apps/script_executor_worker/src/activities.ts @@ -15,6 +15,7 @@ import { findActivitiesWithWrongMembers, findMemberIdentity, updateActivityWithWrongMember, + updateMemberActivitiesUpdatedAt, } from './activities/fix-misattributed-activities' import { deleteOrganizationIdentity, @@ -48,4 +49,5 @@ export { findMemberIdentity, updateActivityWithWrongMember, batchUpdateActivitiesWithWrongMember, + updateMemberActivitiesUpdatedAt, } diff --git a/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts b/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts index fa82a77271..7e922d95e6 100644 --- a/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts +++ b/services/apps/script_executor_worker/src/activities/fix-misattributed-activities/index.ts @@ -67,6 +67,19 @@ export async function batchUpdateActivitiesWithWrongMember( } } +export async function updateMemberActivitiesUpdatedAt(memberId: string) { + try { + const activityRepo = new ActivityRepository( + svc.postgres.writer.connection(), + svc.log, + svc.questdbSQL, + ) + await activityRepo.updateMemberActivitiesUpdatedAt(memberId) + } catch (err) { + throw new Error(err) + } +} + export async function findActivitiesWithWrongMembers(): Promise< Array<{ wrongMemberId: string diff --git a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts index db5c22740c..4addb3c0e2 100644 --- a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts +++ b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts @@ -6,7 +6,7 @@ const activity = proxyActivities({ startToCloseTimeout: '60 minutes', }) -export async function fixMisattributedActivities(): Promise { +export async function fixMisattributedActivities(restartIndex = 0): Promise { // Read CSV file const records = await activity.findActivitiesWithWrongMembers() @@ -15,11 +15,19 @@ export async function fixMisattributedActivities(): Promise { return } - let processedMemberCount = 0 + // Skip records that were already processed + const remainingRecords = records.slice(restartIndex) + + if (!remainingRecords.length) { + console.log(`No remaining records to process after skipping ${restartIndex} records!`) + return + } + + let processedMemberCount = restartIndex const totalRecords = records.length // Process each record from CSV - for (const record of records) { + for (const record of remainingRecords) { await activity.batchUpdateActivitiesWithWrongMember( record.wrongMemberId, record.correctMemberId, @@ -30,4 +38,6 @@ export async function fixMisattributedActivities(): Promise { // Log progress console.log(`Processed ${processedMemberCount}/${totalRecords} members in the CSV file!`) } + + console.log('Completed processing all members!') } diff --git a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts index 6b4f15126e..89abf38ecb 100644 --- a/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts +++ b/services/libs/data-access-layer/src/old/apps/script_executor_worker/activities.repo.ts @@ -89,4 +89,18 @@ export class ActivityRepository { throw new Error(err) } } + + async updateMemberActivitiesUpdatedAt(memberId: string): Promise { + try { + await this.questdbSQL.none( + 'UPDATE "activities" SET "updatedAt" = now() WHERE "memberId" = $(memberId)', + { + memberId, + }, + ) + } catch (err) { + this.log.error('Error while updating activities!', err) + throw new Error(err) + } + } } From 092621f51be244bd49a898e04f34e58a62a669c8 Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Thu, 2 Jan 2025 20:47:06 +0530 Subject: [PATCH 19/23] fix --- .../workflows/fixMisattributedActivities.ts | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts index 4addb3c0e2..503411cc67 100644 --- a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts +++ b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts @@ -15,19 +15,29 @@ export async function fixMisattributedActivities(restartIndex = 0): Promise ${record.correctMemberId}`, + ) + await activity.batchUpdateActivitiesWithWrongMember( record.wrongMemberId, record.correctMemberId, @@ -35,8 +45,10 @@ export async function fixMisattributedActivities(restartIndex = 0): Promise Date: Thu, 2 Jan 2025 21:05:27 +0530 Subject: [PATCH 20/23] fix --- .../apps/script_executor_worker/src/types.ts | 5 +++- .../workflows/fixMisattributedActivities.ts | 26 +++++++++++-------- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/services/apps/script_executor_worker/src/types.ts b/services/apps/script_executor_worker/src/types.ts index 5faf3178a7..d46a735c70 100644 --- a/services/apps/script_executor_worker/src/types.ts +++ b/services/apps/script_executor_worker/src/types.ts @@ -27,5 +27,8 @@ export interface tenantIdAndTestRun { testRun?: boolean } -export type IFixMisattributedActivitiesArgs = tenantIdAndTestRun export type IFixOrgIdentitiesWithWrongUrlsArgs = tenantIdAndTestRun + +export interface IFixMisattributedActivitiesArgs { + restartIndex?: number +} diff --git a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts index 503411cc67..780b6f52bd 100644 --- a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts +++ b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts @@ -1,12 +1,15 @@ import { proxyActivities } from '@temporalio/workflow' import * as activities from '../activities' +import { IFixMisattributedActivitiesArgs } from '../types' const activity = proxyActivities({ startToCloseTimeout: '60 minutes', }) -export async function fixMisattributedActivities(restartIndex = 0): Promise { +export async function fixMisattributedActivities( + args: IFixMisattributedActivitiesArgs, +): Promise { // Read CSV file const records = await activity.findActivitiesWithWrongMembers() @@ -15,8 +18,14 @@ export async function fixMisattributedActivities(restartIndex = 0): Promise Date: Fri, 3 Jan 2025 00:23:17 +0530 Subject: [PATCH 21/23] update updatedAt for fixed activities --- .../apps/script_executor_worker/src/types.ts | 2 +- .../workflows/fixMisattributedActivities.ts | 36 +++++-------------- 2 files changed, 10 insertions(+), 28 deletions(-) diff --git a/services/apps/script_executor_worker/src/types.ts b/services/apps/script_executor_worker/src/types.ts index d46a735c70..ba06828d59 100644 --- a/services/apps/script_executor_worker/src/types.ts +++ b/services/apps/script_executor_worker/src/types.ts @@ -30,5 +30,5 @@ export interface tenantIdAndTestRun { export type IFixOrgIdentitiesWithWrongUrlsArgs = tenantIdAndTestRun export interface IFixMisattributedActivitiesArgs { - restartIndex?: number + testRun?: boolean } diff --git a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts index 780b6f52bd..14a01fa63a 100644 --- a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts +++ b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts @@ -18,40 +18,22 @@ export async function fixMisattributedActivities( return } - const startIndex = Number(args.restartIndex) - - if (!startIndex) { - console.log('something wrong with startIndex') - return - } - - console.log(`Starting at record ${startIndex}`) - - // Skip records that were already processed - const remainingRecords = records.slice(startIndex) - - if (!remainingRecords.length) { - console.log(`No remaining records to process after skipping ${startIndex} records!`) - return - } - let processedMemberCount = 0 - const totalRecords = remainingRecords.length + const totalRecords = records.length // Process each record from CSV - for (const record of remainingRecords) { - console.log( - `Fixing activities with wrong member ${record.wrongMemberId} -> ${record.correctMemberId}`, - ) + for (const record of records) { + console.log(`Updating ${record.correctMemberId} member activities updatedAt`) - await activity.batchUpdateActivitiesWithWrongMember( - record.wrongMemberId, - record.correctMemberId, - ) + await activity.updateMemberActivitiesUpdatedAt(record.correctMemberId) processedMemberCount++ - // Log progress with explicit number conversion + if (args.testRun && processedMemberCount >= 10) { + console.log('Test run complete!') + break + } + console.log(`Processed ${processedMemberCount}/${totalRecords} members in the CSV file!`) } From ee4156e8e77e800a2cd782480ff77b1f431343d1 Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Fri, 3 Jan 2025 14:08:58 +0530 Subject: [PATCH 22/23] update script --- .../apps/script_executor_worker/src/types.ts | 1 + .../workflows/fixMisattributedActivities.ts | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/services/apps/script_executor_worker/src/types.ts b/services/apps/script_executor_worker/src/types.ts index ba06828d59..3af8577ef8 100644 --- a/services/apps/script_executor_worker/src/types.ts +++ b/services/apps/script_executor_worker/src/types.ts @@ -30,5 +30,6 @@ export interface tenantIdAndTestRun { export type IFixOrgIdentitiesWithWrongUrlsArgs = tenantIdAndTestRun export interface IFixMisattributedActivitiesArgs { + startIndex?: number testRun?: boolean } diff --git a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts index 14a01fa63a..8a11565e42 100644 --- a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts +++ b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts @@ -18,8 +18,25 @@ export async function fixMisattributedActivities( return } + const startIndex = Number(args.startIndex) + + if (!startIndex) { + console.log('something wrong with startIndex') + return + } + + console.log(`Starting at record ${startIndex}`) + + // Skip records that were already processed + const remainingRecords = records.slice(startIndex) + + if (!remainingRecords.length) { + console.log(`No remaining records to process after skipping ${startIndex} records!`) + return + } + let processedMemberCount = 0 - const totalRecords = records.length + const totalRecords = remainingRecords.length // Process each record from CSV for (const record of records) { From 861f177f79e17849436b8b4ed93b86dc61ed869b Mon Sep 17 00:00:00 2001 From: Yeganathan S Date: Fri, 3 Jan 2025 14:15:41 +0530 Subject: [PATCH 23/23] fix --- .../src/workflows/fixMisattributedActivities.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts index 8a11565e42..d5c1f44d07 100644 --- a/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts +++ b/services/apps/script_executor_worker/src/workflows/fixMisattributedActivities.ts @@ -39,7 +39,7 @@ export async function fixMisattributedActivities( const totalRecords = remainingRecords.length // Process each record from CSV - for (const record of records) { + for (const record of remainingRecords) { console.log(`Updating ${record.correctMemberId} member activities updatedAt`) await activity.updateMemberActivitiesUpdatedAt(record.correctMemberId)