From a45b84a2820865baacc59d1cadbe81f60e787f22 Mon Sep 17 00:00:00 2001 From: Misha Savelyev Date: Thu, 17 Aug 2023 12:51:41 +0000 Subject: [PATCH 1/3] When no org found for affiliations, fall back to to very first found org This way we still affiliat past activities if we didn't have any dates for orgs for that period --- .../src/database/repositories/memberAffiliationRepository.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/backend/src/database/repositories/memberAffiliationRepository.ts b/backend/src/database/repositories/memberAffiliationRepository.ts index e9c7fef473..718652d212 100644 --- a/backend/src/database/repositories/memberAffiliationRepository.ts +++ b/backend/src/database/repositories/memberAffiliationRepository.ts @@ -19,6 +19,7 @@ class MemberAffiliationRepository { (ARRAY_REMOVE(ARRAY_AGG(CASE WHEN msa.id IS NULL THEN '00000000-0000-0000-0000-000000000000' ELSE msa."organizationId" END), '00000000-0000-0000-0000-000000000000') || ARRAY_REMOVE(ARRAY_AGG(mo."organizationId" ORDER BY mo."dateStart" DESC, mo.id), NULL) || ARRAY_REMOVE(ARRAY_AGG(mo1."organizationId" ORDER BY mo1."createdAt" DESC, mo1.id), NULL) + || ARRAY_REMOVE(ARRAY_AGG(mo2."organizationId" ORDER BY mo2."createdAt", mo2.id), NULL) )[1] AS new_org FROM activities a LEFT JOIN "memberSegmentAffiliations" msa ON msa."memberId" = a."memberId" AND a."segmentId" = msa."segmentId" AND ( @@ -30,6 +31,7 @@ class MemberAffiliationRepository { OR (a.timestamp >= mo."dateStart" AND mo."dateEnd" IS NULL) ) LEFT JOIN "memberOrganizations" mo1 ON mo1."memberId" = a."memberId" AND mo1."createdAt" <= a.timestamp + LEFT JOIN "memberOrganizations" mo2 ON mo2."memberId" = a."memberId" WHERE a."memberId" = :memberId GROUP BY a.id ) From dfc6d02d85144f406d349cdda2d5c7756c937738 Mon Sep 17 00:00:00 2001 From: Misha Savelyev Date: Thu, 17 Aug 2023 12:57:07 +0000 Subject: [PATCH 2/3] Fall back to the recent member-org when finding affiliation --- .../database/repositories/memberRepository.ts | 28 +++++++++++++++++++ .../src/services/memberAffiliationService.ts | 8 ++++++ .../src/repo/memberAffiliation.repo.ts | 18 ++++++++++++ .../src/service/memberAffiliation.service.ts | 5 ++++ 4 files changed, 59 insertions(+) diff --git a/backend/src/database/repositories/memberRepository.ts b/backend/src/database/repositories/memberRepository.ts index 532ffee426..7513ed14ee 100644 --- a/backend/src/database/repositories/memberRepository.ts +++ b/backend/src/database/repositories/memberRepository.ts @@ -3461,6 +3461,34 @@ class MemberRepository { return records[0] } + static async findMostRecentOrganizationEver( + memberId: string, + options: IRepositoryOptions, + ): Promise { + const seq = SequelizeRepository.getSequelize(options) + const transaction = SequelizeRepository.getTransaction(options) + + const query = ` + SELECT * FROM "memberOrganizations" + WHERE "memberId" = :memberId + ORDER BY "createdAt", id + LIMIT 1 + ` + const records = await seq.query(query, { + replacements: { + memberId, + }, + type: QueryTypes.SELECT, + transaction, + }) + + if (records.length === 0) { + return null + } + + return records[0] + } + static sortOrganizations(organizations) { organizations.sort((a, b) => { a = a.dataValues ? a.get({ plain: true }) : a diff --git a/backend/src/services/memberAffiliationService.ts b/backend/src/services/memberAffiliationService.ts index b4b4d269c8..28f29b5127 100644 --- a/backend/src/services/memberAffiliationService.ts +++ b/backend/src/services/memberAffiliationService.ts @@ -41,6 +41,14 @@ export default class MemberAffiliationService extends LoggerBase { return mostRecentOrg.organizationId } + const mostRecentOrgEver: any = await MemberRepository.findMostRecentOrganizationEver( + memberId, + this.options, + ) + if (mostRecentOrgEver) { + return mostRecentOrgEver.organizationId + } + return null } diff --git a/services/apps/data_sink_worker/src/repo/memberAffiliation.repo.ts b/services/apps/data_sink_worker/src/repo/memberAffiliation.repo.ts index 811be24938..348c8c7f24 100644 --- a/services/apps/data_sink_worker/src/repo/memberAffiliation.repo.ts +++ b/services/apps/data_sink_worker/src/repo/memberAffiliation.repo.ts @@ -77,4 +77,22 @@ export default class MemberAffiliationRepository extends RepositoryBase { + const result = await this.db().oneOrNone( + ` + SELECT * FROM "memberOrganizations" + WHERE "memberId" = $(memberId) + ORDER BY "createdAt", id + LIMIT 1 + `, + { + memberId, + }, + ) + + return result + } } diff --git a/services/apps/data_sink_worker/src/service/memberAffiliation.service.ts b/services/apps/data_sink_worker/src/service/memberAffiliation.service.ts index f749dce535..eda0b32c52 100644 --- a/services/apps/data_sink_worker/src/service/memberAffiliation.service.ts +++ b/services/apps/data_sink_worker/src/service/memberAffiliation.service.ts @@ -31,6 +31,11 @@ export default class MemberAffiliationService extends LoggerBase { return mostRecentOrg.organizationId } + const mostRecentOrgEver = await this.repo.findMostRecentOrganizationEver(memberId) + if (mostRecentOrgEver) { + return mostRecentOrgEver.organizationId + } + return null } } From 2d0b7c84e7fa435e2ac2f465073afc263d7cecf0 Mon Sep 17 00:00:00 2001 From: Misha Savelyev Date: Thu, 17 Aug 2023 13:57:28 +0000 Subject: [PATCH 3/3] Adjust tests --- backend/src/services/__tests__/activityService.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/services/__tests__/activityService.test.ts b/backend/src/services/__tests__/activityService.test.ts index 45038058c3..ab08387ead 100644 --- a/backend/src/services/__tests__/activityService.test.ts +++ b/backend/src/services/__tests__/activityService.test.ts @@ -3042,7 +3042,7 @@ describe('ActivityService tests', () => { expect(activity.organization.id).toBe(org3.id) }) - it('Should affiliate nothing if there is no matching work experience', async () => { + it('Should affiliate first created org to past activities', async () => { const member = await createMember() let activity = await createActivity(member.id, { @@ -3065,7 +3065,7 @@ describe('ActivityService tests', () => { activity = await findActivity(activity.id) - expect(activity.organization).toBeNull() + expect(activity.organization.id).toBe(org1.id) }) it('Should prefer manual affiliation over work experience', async () => {