-
Notifications
You must be signed in to change notification settings - Fork 729
Expand file tree
/
Copy pathdeleteMemberWorkExperience.ts
More file actions
68 lines (53 loc) · 2.04 KB
/
Copy pathdeleteMemberWorkExperience.ts
File metadata and controls
68 lines (53 loc) · 2.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import type { Request, Response } from 'express'
import { z } from 'zod'
import { captureApiChange, memberEditOrganizationsAction } from '@crowd/audit-logs'
import { NotFoundError } from '@crowd/common'
import { signalMemberUpdate } from '@crowd/common_services'
import {
MemberField,
deleteMemberOrganizations,
fetchMemberOrganizations,
findMemberById,
optionsQx,
} from '@crowd/data-access-layer'
import { noContent } from '@/utils/api'
import { getOverlappingGroupedMemberOrganizations } from '@/utils/mapper'
import { validateOrThrow } from '@/utils/validation'
const paramsSchema = z.object({
memberId: z.uuid(),
workExperienceId: z.uuid(),
})
export async function deleteMemberWorkExperience(req: Request, res: Response): Promise<void> {
const { memberId, workExperienceId } = validateOrThrow(paramsSchema, req.params)
const qx = optionsQx(req)
const member = await findMemberById(qx, memberId, [MemberField.ID])
if (!member) {
throw new NotFoundError('Member not found')
}
const memberOrgs = await fetchMemberOrganizations(qx, memberId)
const memberOrg = memberOrgs.find((mo) => mo.id === workExperienceId)
if (!memberOrg) {
throw new NotFoundError('Work experience not found')
}
const overlappingGroupedRows = getOverlappingGroupedMemberOrganizations(memberOrgs, memberOrg)
const memberOrgIdsToDelete = [
workExperienceId,
...overlappingGroupedRows.flatMap((row) => (row.id ? [row.id] : [])),
]
// Delete hidden grouped rows with the visible row so read responses stay consistent
await captureApiChange(
req,
memberEditOrganizationsAction(memberId, async (captureOldState, captureNewState) => {
captureOldState(memberOrg)
await qx.tx(async (tx) => {
await deleteMemberOrganizations(tx, memberId, memberOrgIdsToDelete)
})
// Signal after commit so the workflow sees persisted changes
await signalMemberUpdate(req.temporal, memberId, {
memberOrganizationIds: [memberOrg.organizationId],
})
captureNewState(null)
}),
)
noContent(res)
}