Skip to content

Commit 9b32fef

Browse files
authored
fix: implement and trigger member cache invalidation after update ops [CM-823] (#3682)
1 parent edec642 commit 9b32fef

4 files changed

Lines changed: 47 additions & 1 deletion

File tree

backend/src/api/member/memberMerge.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { CommonMemberService } from '@crowd/common_services'
2-
import { optionsQx } from '@crowd/data-access-layer'
2+
import { MemberQueryCache, optionsQx } from '@crowd/data-access-layer'
33

44
import Permissions from '../../security/permissions'
55
import track from '../../segment/track'
@@ -12,6 +12,16 @@ export default async (req, res) => {
1212

1313
const payload = await memberService.merge(req.params.memberId, req.body.memberToMerge, req)
1414

15+
// Invalidate member query cache after merge
16+
try {
17+
const cache = new MemberQueryCache(req.redis)
18+
await cache.invalidateAll()
19+
req.log.debug('Invalidated member query cache after merge')
20+
} catch (error) {
21+
// Don't fail the merge if cache invalidation fails
22+
req.log.warn('Failed to invalidate member query cache after merge', { error })
23+
}
24+
1525
track(
1626
'Merge members',
1727
{ memberId: req.params.memberId, memberToMergeId: req.body.memberToMerge },

backend/src/services/memberService.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { CommonMemberService, getGithubInstallationToken } from '@crowd/common_s
1010
import { findMemberAffiliations } from '@crowd/data-access-layer/src/member_segment_affiliations'
1111
import {
1212
MemberField,
13+
MemberQueryCache,
1314
addMemberRole,
1415
fetchManyMemberOrgsWithOrgData,
1516
fetchMemberBotSuggestionsBySegment,
@@ -67,6 +68,17 @@ import SettingsService from './settingsService'
6768
export default class MemberService extends LoggerBase {
6869
options: IServiceOptions
6970

71+
private async invalidateMemberQueryCache(): Promise<void> {
72+
try {
73+
const cache = new MemberQueryCache(this.options.redis)
74+
await cache.invalidateAll()
75+
this.log.debug('Invalidated member query cache')
76+
} catch (error) {
77+
// Don't fail the operation if cache invalidation fails
78+
this.log.warn('Failed to invalidate member query cache', { error })
79+
}
80+
}
81+
7082
constructor(options: IServiceOptions) {
7183
super(options.log)
7284
this.options = options
@@ -745,6 +757,9 @@ export default class MemberService extends LoggerBase {
745757
// trigger entity-merging-worker to move activities in the background
746758
await SequelizeRepository.commitTransaction(tx)
747759

760+
// Invalidate member query cache after unmerge
761+
await this.invalidateMemberQueryCache()
762+
748763
return { member, secondaryMember }
749764
}),
750765
)
@@ -1253,6 +1268,9 @@ export default class MemberService extends LoggerBase {
12531268

12541269
await SequelizeRepository.commitTransaction(transaction)
12551270

1271+
// Invalidate member query cache after update
1272+
await this.invalidateMemberQueryCache()
1273+
12561274
const commonMemberService = new CommonMemberService(
12571275
optionsQx(this.options),
12581276
this.options.temporal,
@@ -1304,6 +1322,9 @@ export default class MemberService extends LoggerBase {
13041322
)
13051323

13061324
await SequelizeRepository.commitTransaction(transaction)
1325+
1326+
// Invalidate member query cache after bulk delete
1327+
await this.invalidateMemberQueryCache()
13071328
} catch (error) {
13081329
await SequelizeRepository.rollbackTransaction(transaction)
13091330
throw error

services/libs/data-access-layer/src/members/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ export * from './attributes'
77
export * from './dashboard'
88
export * from './contributions'
99
export * from './bot'
10+
export { MemberQueryCache } from './queryCache'

services/libs/data-access-layer/src/members/queryCache.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,4 +83,18 @@ export class MemberQueryCache {
8383
async setCount(cacheKey: string, count: number, ttlSeconds: number): Promise<void> {
8484
await this.countCache.set(cacheKey, count.toString(), ttlSeconds)
8585
}
86+
87+
async invalidateAll(): Promise<void> {
88+
try {
89+
const [resultsDeleted, countsDeleted] = await Promise.all([
90+
this.cache.deleteAll(),
91+
this.countCache.deleteAll(),
92+
])
93+
log.info(
94+
`Invalidated member query cache: ${resultsDeleted} result entries, ${countsDeleted} count entries`,
95+
)
96+
} catch (error) {
97+
log.warn('Error invalidating member query cache', { error })
98+
}
99+
}
86100
}

0 commit comments

Comments
 (0)