-
Notifications
You must be signed in to change notification settings - Fork 731
Expand file tree
/
Copy pathdeleteMemberWorkExperience.ts
More file actions
60 lines (46 loc) · 1.68 KB
/
deleteMemberWorkExperience.ts
File metadata and controls
60 lines (46 loc) · 1.68 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
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,
fetchManyMemberOrgsWithOrgData,
findMemberById,
optionsQx,
} from '@crowd/data-access-layer'
import { noContent } from '@/utils/api'
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 orgsMap = await fetchManyMemberOrgsWithOrgData(qx, [memberId])
const memberOrg = (orgsMap.get(memberId) ?? []).find((mo) => mo.id === workExperienceId)
if (!memberOrg) {
throw new NotFoundError('Work experience not found')
}
await captureApiChange(
req,
memberEditOrganizationsAction(memberId, async (captureOldState, captureNewState) => {
captureOldState(memberOrg)
await qx.tx(async (tx) => {
await deleteMemberOrganizations(tx, memberId, [workExperienceId])
})
// Signal after commit so the workflow sees persisted changes
await signalMemberUpdate(req.temporal, memberId, {
memberOrganizationIds: [memberOrg.organizationId],
})
captureNewState(null)
}),
)
noContent(res)
}