Skip to content

Commit f8e7bb7

Browse files
authored
Merge pull request #5953 from bcgov/fix/5948
feat(5948): revisit sync-changes API for public and private clouds
2 parents 3313711 + 8244dfd commit f8e7bb7

File tree

4 files changed

+70
-21
lines changed

4 files changed

+70
-21
lines changed

app/app/api/v1/private-cloud/requests/sync-changes/route.ts

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import createApiHandler from '@/core/api-handler';
33
import prisma from '@/core/prisma';
44
import { OkResponse } from '@/core/responses';
55
import { comparePrivateProductData } from '@/helpers/product-change';
6-
import { RequestType } from '@/prisma/client';
6+
import { PrivateCloudRequest, RequestType } from '@/prisma/client';
7+
import { enrichMembersWithEmail } from '@/services/db';
78

89
const apiHandler = createApiHandler({
910
roles: [GlobalRole.Admin],
@@ -30,12 +31,22 @@ export const POST = apiHandler(async () => {
3031
},
3132
});
3233

33-
const results = await Promise.all(
34-
requests.map((req) => {
35-
const { changes, ...otherChangeMeta } = comparePrivateProductData(req.originalData, req.decisionData);
36-
return prisma.privateCloudRequest.update({ where: { id: req.id }, data: { changes: otherChangeMeta } });
37-
}),
38-
);
34+
const results: PrivateCloudRequest[] = [];
35+
36+
for (const req of requests) {
37+
const [enrichedOriginal, enrichedDecision] = await Promise.all([
38+
enrichMembersWithEmail(req.originalData),
39+
enrichMembersWithEmail(req.decisionData),
40+
]);
41+
const { changes, ...otherChangeMeta } = comparePrivateProductData(enrichedOriginal, enrichedDecision);
42+
43+
const updated = await prisma.privateCloudRequest.update({
44+
where: { id: req.id },
45+
data: { changes: otherChangeMeta },
46+
});
47+
48+
results.push(updated);
49+
}
3950

4051
await prisma.privateCloudRequest.updateMany({
4152
where: { type: { not: RequestType.EDIT } },

app/app/api/v1/public-cloud/requests/sync-changes/route.ts

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ import createApiHandler from '@/core/api-handler';
33
import prisma from '@/core/prisma';
44
import { OkResponse } from '@/core/responses';
55
import { comparePublicProductData } from '@/helpers/product-change';
6-
import { RequestType } from '@/prisma/client';
6+
import { PublicCloudRequest, RequestType } from '@/prisma/client';
7+
import { enrichMembersWithEmail } from '@/services/db';
78

89
const apiHandler = createApiHandler({
910
roles: [GlobalRole.Admin],
@@ -18,29 +19,39 @@ export const POST = apiHandler(async () => {
1819
projectOwner: true,
1920
primaryTechnicalLead: true,
2021
secondaryTechnicalLead: true,
22+
expenseAuthority: true,
2123
},
2224
},
2325
decisionData: {
2426
include: {
2527
projectOwner: true,
2628
primaryTechnicalLead: true,
2729
secondaryTechnicalLead: true,
30+
expenseAuthority: true,
2831
},
2932
},
3033
},
3134
});
3235

33-
const results = await Promise.all(
34-
requests.map((req) => {
35-
const { changes, ...otherChangeMeta } = comparePublicProductData(req.originalData, req.decisionData);
36-
return prisma.publicCloudRequest.update({ where: { id: req.id }, data: { changes: otherChangeMeta } });
37-
}),
38-
);
36+
const results: PublicCloudRequest[] = [];
3937

40-
await prisma.publicCloudRequest.updateMany({
41-
where: { type: { not: RequestType.EDIT } },
42-
data: { changes: null },
43-
});
38+
for (const req of requests) {
39+
const [enrichedOriginal, enrichedDecision] = await Promise.all([
40+
enrichMembersWithEmail(req.originalData),
41+
enrichMembersWithEmail(req.decisionData),
42+
]);
43+
const { changes, ...otherChangeMeta } = comparePublicProductData(enrichedOriginal, enrichedDecision);
44+
45+
const updated = await prisma.publicCloudRequest.update({
46+
where: { id: req.id },
47+
data: { changes: otherChangeMeta },
48+
});
49+
50+
results.push(updated);
51+
}
4452

45-
return OkResponse(results.map((ret) => ret.id));
53+
if (!results.length) {
54+
return OkResponse({ message: 'No updates were made.' });
55+
}
56+
return OkResponse(results.map((res) => res.id));
4657
});

app/helpers/product-change.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ const publicDataFields = [
107107
'name',
108108
'description',
109109
'ministry',
110+
'providerSelectionReasons',
111+
'providerSelectionReasonsNote',
110112
'accountCoding',
111113
'budget',
112114
'projectOwner.email',
@@ -123,7 +125,9 @@ function preparePublicCloudProductCloudData(data: any) {
123125
roles: (member.roles || []).join(', '),
124126
}));
125127
}
126-
128+
if (data.providerSelectionReasons) {
129+
data.providerSelectionReasons = data.providerSelectionReasons.join(', ');
130+
}
127131
return data;
128132
}
129133

@@ -147,6 +151,8 @@ export function comparePublicProductData(data1: any, data2: any) {
147151
case 'name':
148152
case 'description':
149153
case 'ministry':
154+
case 'providerSelectionReasons':
155+
case 'providerSelectionReasonsNote':
150156
profileChanged = true;
151157
break;
152158

app/services/db/user.ts

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import _uniq from 'lodash-es/uniq';
66
import { logger } from '@/core/logging';
77
import prisma from '@/core/prisma';
88
import { parsePaginationParams } from '@/helpers/pagination';
9-
import { Prisma } from '@/prisma/client';
9+
import { Prisma, PrivateCloudRequestData, PublicCloudRequestData } from '@/prisma/client';
1010
import { listUsersByRoles, findUserByEmail, getKcAdminClient } from '@/services/keycloak/app-realm';
1111
import { getUserByEmail, getUserPhoto } from '@/services/msgraph';
1212
import { AppUser } from '@/types/user';
@@ -284,3 +284,24 @@ export async function getUsersEmailsByIds(ids: (string | null | undefined)[]) {
284284

285285
return filteredIds.map((id) => userMap.get(id) ?? null);
286286
}
287+
288+
export async function enrichMembersWithEmail(data: PublicCloudRequestData | PrivateCloudRequestData | null) {
289+
if (!data?.members?.length) return data;
290+
291+
const userIds = Array.from(new Set(data.members.map((m) => m.userId).filter((id): id is string => !!id)));
292+
293+
const users = await getUsersEmailsByIds(userIds);
294+
const userMap = new Map(users.map((u) => [u?.id, u]));
295+
296+
data.members = data.members.map((member: any) => {
297+
if (member.email) return member;
298+
299+
const user = userMap.get(member.userId);
300+
return {
301+
...member,
302+
email: user?.email ?? '',
303+
};
304+
});
305+
306+
return data;
307+
}

0 commit comments

Comments
 (0)