Skip to content

Commit fa0f469

Browse files
committed
refactor: move CurrentContext to res.locals
1 parent 041e6e2 commit fa0f469

49 files changed

Lines changed: 474 additions & 444 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

app/src/controllers/accessRequest.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,10 @@ export const createUserAccessRequestController = async (
7070
const { accessRequest, user } = req.body;
7171

7272
// Check if the requestee is an admin
73-
const isAdmin = await isUserAdmin(tx, req.currentContext.initiative, req.currentAuthorization.groups);
73+
const isAdmin = await isUserAdmin(tx, res.locals.currentContext.initiative, res.locals.currentAuthorization.groups);
7474

7575
// Get all the groups for the current initiative
76-
const groups = await getGroups(tx, req.currentContext.initiative);
76+
const groups = await getGroups(tx, res.locals.currentContext.initiative);
7777

7878
// Groups the current user can modify
7979
const userAllowedGroups = [GroupName.NAVIGATOR, GroupName.NAVIGATOR_READ_ONLY];
@@ -123,7 +123,7 @@ export const createUserAccessRequestController = async (
123123

124124
if (isGroupUpdate) {
125125
// Remove current initiative groups
126-
await removeUserGroups(tx, userResponse.sub, req.currentContext.initiative, accessUserGroups);
126+
await removeUserGroups(tx, userResponse.sub, res.locals.currentContext.initiative, accessUserGroups);
127127

128128
// Assign new groups
129129
await assignGroup(tx, userResponse.sub, accessRequest.groupId);
@@ -155,7 +155,7 @@ export const createUserAccessRequestController = async (
155155
};
156156
} else {
157157
// Remove current initiative groups
158-
await removeUserGroups(tx, userResponse.sub, req.currentContext.initiative, accessUserGroups);
158+
await removeUserGroups(tx, userResponse.sub, res.locals.currentContext.initiative, accessUserGroups);
159159
}
160160

161161
updateComsPerms = true;
@@ -169,7 +169,7 @@ export const createUserAccessRequestController = async (
169169
// Assign new COMS permissions
170170
if (updateComsPerms) {
171171
try {
172-
await assignPermissions(tx, req.currentContext, userResponse.sub);
172+
await assignPermissions(tx, res.locals.currentContext, userResponse.sub);
173173
} catch (e) {
174174
if (e instanceof Error) log.warn(e.message);
175175
if (e instanceof Problem) log.warn(e.detail);
@@ -187,7 +187,7 @@ export const processUserAccessRequestController = async (
187187
res: Response
188188
) => {
189189
await transactionWrapper<void>(async (tx: PrismaTransactionClient) => {
190-
const accessRequest = await getAccessRequest(tx, req.currentContext.initiative, req.params.accessRequestId);
190+
const accessRequest = await getAccessRequest(tx, res.locals.currentContext.initiative, req.params.accessRequestId);
191191

192192
if (accessRequest) {
193193
const userResponse = await readUser(tx, accessRequest.userId);
@@ -214,14 +214,14 @@ export const processUserAccessRequestController = async (
214214
await assignGroup(tx, userResponse.sub, correspondingGlobalGroup.groupId);
215215
} else {
216216
// Remove all user groups for the initiative
217-
await removeUserGroups(tx, userResponse.sub, req.currentContext.initiative, userGroups);
217+
await removeUserGroups(tx, userResponse.sub, res.locals.currentContext.initiative, userGroups);
218218
}
219219

220220
// Update access request status
221221
await updateAccessRequest(tx, { status: AccessRequestStatus.APPROVED }, accessRequest.accessRequestId);
222222

223223
// Assign new COMS permissions
224-
await assignPermissions(tx, req.currentContext, userResponse.sub);
224+
await assignPermissions(tx, res.locals.currentContext, userResponse.sub);
225225
} else {
226226
await updateAccessRequest(tx, { status: AccessRequestStatus.REJECTED }, accessRequest.accessRequestId);
227227
}
@@ -236,7 +236,7 @@ export const processUserAccessRequestController = async (
236236

237237
export const getAccessRequestsController = async (req: Request, res: Response) => {
238238
const response = await transactionWrapper<AccessRequest[]>(async (tx: PrismaTransactionClient) => {
239-
return await getAccessRequests(tx, req.currentContext.initiative);
239+
return await getAccessRequests(tx, res.locals.currentContext.initiative);
240240
});
241241
res.status(200).json(response);
242242
};

app/src/controllers/activityContact.ts

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -74,14 +74,14 @@ export const createActivityContactController = async (
7474
const response = await transactionWrapper<ActivityContact>(async (tx: PrismaTransactionClient) => {
7575
// If the PRIMARY role is being given to another user, make any pre adjustments
7676
if (req.body.role === ActivityContactRole.PRIMARY)
77-
await verifyPrimaryChange(tx, req.params.activityId, req.currentAuthorization, req.currentContext);
77+
await verifyPrimaryChange(tx, req.params.activityId, res.locals.currentAuthorization, res.locals.currentContext);
7878

7979
const newContact = await createActivityContact(tx, req.params.activityId, req.params.contactId, req.body.role);
8080

8181
const { templateParams, navEmail } = await getTeamMemberEmailTemplateData(
8282
tx,
83-
req.currentContext.initiative,
84-
req.currentContext.userId,
83+
res.locals.currentContext.initiative,
84+
res.locals.currentContext.userId,
8585
req.params.activityId,
8686
newContact.contact!
8787
);
@@ -126,8 +126,8 @@ export const deleteActivityContactController = async (
126126

127127
const { templateParams, navEmail } = await getTeamMemberEmailTemplateData(
128128
tx,
129-
req.currentContext.initiative,
130-
req.currentContext.userId,
129+
res.locals.currentContext.initiative,
130+
res.locals.currentContext.userId,
131131
req.params.activityId,
132132
ac.contact!
133133
);
@@ -171,15 +171,20 @@ export const updateActivityContactController = async (
171171
// If the PRIMARY role is being given to another user, make any pre adjustments
172172
let demoted: ActivityContact | undefined;
173173
if (req.body.role === ActivityContactRole.PRIMARY) {
174-
demoted = await verifyPrimaryChange(tx, req.params.activityId, req.currentAuthorization, req.currentContext);
174+
demoted = await verifyPrimaryChange(
175+
tx,
176+
req.params.activityId,
177+
res.locals.currentAuthorization,
178+
res.locals.currentContext
179+
);
175180
}
176181

177182
const updated = await updateActivityContact(tx, req.params.activityId, req.params.contactId, req.body.role);
178183

179184
const { templateParams, navEmail } = await getTeamMemberEmailTemplateData(
180185
tx,
181-
req.currentContext.initiative,
182-
req.currentContext.userId,
186+
res.locals.currentContext.initiative,
187+
res.locals.currentContext.userId,
183188
req.params.activityId,
184189
updated.contact!
185190
);

app/src/controllers/ats.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ export const createATSClientController = async (
88
req: Request<never, never, ATSClientResource, never>,
99
res: Response
1010
) => {
11-
const identityProvider = req.currentContext?.tokenPayload?.identity_provider.toUpperCase();
11+
const identityProvider = res.locals.currentContext?.tokenPayload?.identity_provider.toUpperCase();
1212
const atsClient = req.body;
1313
// Set the createdBy field to current user with \\ as the separator for the domain and username to match ATS DB
14-
atsClient.createdBy = `${identityProvider}\\${getCurrentUsername(req.currentContext)}`;
14+
atsClient.createdBy = `${identityProvider}\\${getCurrentUsername(res.locals.currentContext)}`;
1515
const response = await createATSClient(atsClient);
1616
res.status(response.status).json(response.data);
1717
};
@@ -20,10 +20,10 @@ export const createATSEnquiryController = async (
2020
req: Request<never, never, ATSEnquiryResource, never>,
2121
res: Response
2222
) => {
23-
const identityProvider = req.currentContext?.tokenPayload?.identity_provider.toUpperCase();
23+
const identityProvider = res.locals.currentContext?.tokenPayload?.identity_provider.toUpperCase();
2424
const atsEnquiry = req.body;
2525
// Set the createdBy field to current user with \\ as the separator for the domain and username to match ATS DB
26-
atsEnquiry.createdBy = `${identityProvider}\\${getCurrentUsername(req.currentContext)}`;
26+
atsEnquiry.createdBy = `${identityProvider}\\${getCurrentUsername(res.locals.currentContext)}`;
2727
const response = await createATSEnquiry(atsEnquiry);
2828
res.status(response.status).json(response.data);
2929
};

app/src/controllers/contact.ts

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { addDashesToUuid, hasIdentity, isTruthy, mixedQueryToArray } from '../ut
1515

1616
import type { Request, Response } from 'express';
1717
import type { PrismaTransactionClient } from '../db/database.ts';
18-
import type { Contact, ContactSearchParameters } from '../types/index.ts';
18+
import type { Contact, ContactSearchParameters, LocalContext } from '../types/index.ts';
1919

2020
export const deleteContactController = async (req: Request<{ contactId: string }>, res: Response) => {
2121
const contactId = req.params.contactId;
@@ -27,7 +27,7 @@ export const deleteContactController = async (req: Request<{ contactId: string }
2727

2828
export const getContactController = async (
2929
req: Request<{ contactId: string }, never, never, { includeActivities?: boolean }>,
30-
res: Response
30+
res: Response<Contact>
3131
) => {
3232
const response = await transactionWrapper<Contact>(async (tx: PrismaTransactionClient) => {
3333
const contactId = req.params.contactId;
@@ -38,29 +38,30 @@ export const getContactController = async (
3838
};
3939

4040
// Get current user's contact information
41-
export const getCurrentUserContactController = async (req: Request<never, never, never, never>, res: Response) => {
41+
export const getCurrentUserContactController = async (req: Request, res: Response<Contact, LocalContext>) => {
4242
const response = await transactionWrapper<Contact[]>(async (tx: PrismaTransactionClient) => {
4343
return await searchContacts(tx, {
44-
userId: [req.currentContext.userId!]
44+
userId: [res.locals.currentContext.userId!]
4545
});
4646
});
4747
res.status(200).json(response[0]);
4848
};
4949

5050
export const matchContactsController = async (
5151
req: Request<never, never, ContactSearchParameters, never>,
52-
res: Response
52+
res: Response<Contact[], LocalContext>
5353
) => {
5454
const response = await transactionWrapper<Contact[]>(async (tx: PrismaTransactionClient) => {
55-
if (hasIdentity(IdentityProviderKind.AZUREIDIR, req.currentContext)) return await matchContacts(tx, req.body);
55+
if (hasIdentity(IdentityProviderKind.AZUREIDIR, res.locals.currentContext))
56+
return await matchContacts(tx, req.body);
5657
return await matchContactsExact(tx, req.body);
5758
});
5859
res.status(200).json(response);
5960
};
6061

6162
export const searchContactsController = async (
6263
req: Request<never, never, ContactSearchParameters | undefined, never>,
63-
res: Response
64+
res: Response<Contact[]>
6465
) => {
6566
const contactIds = mixedQueryToArray(req.body?.contactId);
6667
const userIds = mixedQueryToArray(req.body?.userId);
@@ -80,10 +81,13 @@ export const searchContactsController = async (
8081
res.status(200).json(response);
8182
};
8283

83-
export const upsertContactController = async (req: Request<never, never, Contact, never>, res: Response) => {
84+
export const upsertContactController = async (
85+
req: Request<never, never, Contact, never>,
86+
res: Response<Contact, LocalContext>
87+
) => {
8488
const contact = { ...req.body, contactId: req.body.contactId ?? uuidv4() };
8589
const response = await transactionWrapper<Contact[]>(async (tx: PrismaTransactionClient) => {
86-
return await upsertContacts(tx, [{ ...contact, ...generateUpdateStamps(req.currentContext) }]);
90+
return await upsertContacts(tx, [{ ...contact, ...generateUpdateStamps(res.locals.currentContext) }]);
8791
});
8892
res.status(200).json(response[0]);
8993
};

app/src/controllers/document.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export const createDocumentController = async (
2323
req.body.filename,
2424
req.body.mimeType,
2525
req.body.filesize,
26-
generateCreateStamps(req.currentContext)
26+
generateCreateStamps(res.locals.currentContext)
2727
);
2828

2929
let createdByFullName: string | undefined;

app/src/controllers/electrificationProject.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -149,12 +149,12 @@ export const createElectrificationProjectController = async (
149149
} as ElectrificationProjectIntake;
150150

151151
const result = await transactionWrapper<ElectrificationProject>(async (tx: PrismaTransactionClient) => {
152-
const electrificationProject = await generateElectrificationProjectData(tx, req.body, req.currentContext);
152+
const electrificationProject = await generateElectrificationProjectData(tx, req.body, res.locals.currentContext);
153153

154154
// Create new electrification project
155155
return await createElectrificationProject(tx, {
156156
...electrificationProject,
157-
...generateCreateStamps(req.currentContext)
157+
...generateCreateStamps(res.locals.currentContext)
158158
});
159159
});
160160

@@ -170,9 +170,9 @@ export const deleteElectrificationProjectController = async (
170170
await deleteElectrificationProject(
171171
tx,
172172
req.params.electrificationProjectId,
173-
generateDeleteStamps(req.currentContext)
173+
generateDeleteStamps(res.locals.currentContext)
174174
);
175-
await deleteActivity(tx, project.activityId, generateDeleteStamps(req.currentContext));
175+
await deleteActivity(tx, project.activityId, generateDeleteStamps(res.locals.currentContext));
176176
});
177177
res.status(204).end();
178178
};
@@ -246,20 +246,20 @@ export const submitElectrificationProjectDraftController = async (
246246
) => {
247247
const result = await transactionWrapper<ElectrificationProject & { contact: Contact }>(
248248
async (tx: PrismaTransactionClient) => {
249-
const electrificationProject = await generateElectrificationProjectData(tx, req.body, req.currentContext);
249+
const electrificationProject = await generateElectrificationProjectData(tx, req.body, res.locals.currentContext);
250250

251251
// Create new electrification project
252252
const data = await createElectrificationProject(tx, {
253253
...electrificationProject,
254-
...generateCreateStamps(req.currentContext)
254+
...generateCreateStamps(res.locals.currentContext)
255255
});
256256

257257
// Delete old draft
258258
if (req.body.draftId) await deleteDraft(tx, req.body.draftId);
259259

260260
// Update the contact
261261
const contactResponse = await upsertContacts(tx, [
262-
{ ...req.body.contact, ...generateUpdateStamps(req.currentContext) }
262+
{ ...req.body.contact, ...generateUpdateStamps(res.locals.currentContext) }
263263
]);
264264

265265
return { ...data, contact: contactResponse[0] };
@@ -277,26 +277,26 @@ export const upsertElectrificationProjectDraftController = async (req: Request<n
277277
// Update draft
278278
return await updateDraft(tx, {
279279
...req.body,
280-
...generateUpdateStamps(req.currentContext)
280+
...generateUpdateStamps(res.locals.currentContext)
281281
});
282282
} else {
283283
// Create new draft
284284
const activityId = (
285-
await createActivity(tx, Initiative.ELECTRIFICATION, generateCreateStamps(req.currentContext))
285+
await createActivity(tx, Initiative.ELECTRIFICATION, generateCreateStamps(res.locals.currentContext))
286286
)?.activityId;
287287

288288
const draft = await createDraft(tx, {
289289
draftId: uuidv4(),
290290
activityId: activityId,
291291
draftCode: DraftCode.ELECTRIFICATION_PROJECT,
292292
data: req.body.data,
293-
...generateCreateStamps(req.currentContext),
293+
...generateCreateStamps(res.locals.currentContext),
294294
...generateNullUpdateStamps(),
295295
...generateNullDeleteStamps()
296296
});
297297

298298
// Update the contact and link to activity
299-
const contacts = await searchContacts(tx, { userId: [req.currentContext.userId!] });
299+
const contacts = await searchContacts(tx, { userId: [res.locals.currentContext.userId!] });
300300
if (contacts[0])
301301
await createActivityContact(tx, draft.activityId, contacts[0].contactId, ActivityContactRole.PRIMARY);
302302

@@ -320,7 +320,7 @@ export const updateElectrificationProjectController = async (
320320
tx,
321321
{
322322
...req.body,
323-
...generateUpdateStamps(req.currentContext)
323+
...generateUpdateStamps(res.locals.currentContext)
324324
},
325325
req.params.electrificationProjectId
326326
);

app/src/controllers/enquiry.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ export const createEnquiryController = async (req: Request<never, never, Enquiry
6969
req.body ??= {} as EnquiryIntake;
7070

7171
const result = await transactionWrapper<Enquiry & { contact: Contact }>(async (tx: PrismaTransactionClient) => {
72-
const enquiry = await generateEnquiryData(tx, req.body, req.currentContext);
72+
const enquiry = await generateEnquiryData(tx, req.body, res.locals.currentContext);
7373

7474
// Create new enquiry
7575
const data = await createEnquiry(tx, {
@@ -79,18 +79,18 @@ export const createEnquiryController = async (req: Request<never, never, Enquiry
7979
atsClientId: null,
8080
atsEnquiryId: null,
8181
submittedMethod: EnquirySubmittedMethod.PCNS,
82-
...generateCreateStamps(req.currentContext),
82+
...generateCreateStamps(res.locals.currentContext),
8383
...generateNullUpdateStamps()
8484
});
8585

8686
// Update the contact
8787
const contactResponse = await upsertContacts(tx, [
88-
{ ...req.body.contact, ...generateUpdateStamps(req.currentContext) }
88+
{ ...req.body.contact, ...generateUpdateStamps(res.locals.currentContext) }
8989
]);
9090

9191
// Create additional activity_contact links if the enquiry is related to a project
9292
if (data.relatedActivityId) {
93-
const currentContact = await searchContacts(tx, { userId: [req.currentContext.userId!] });
93+
const currentContact = await searchContacts(tx, { userId: [res.locals.currentContext.userId!] });
9494

9595
const relatedContacts = (await listActivityContacts(tx, data.relatedActivityId)).filter(
9696
(x) => x.contactId != currentContact[0].contactId
@@ -106,7 +106,7 @@ export const createEnquiryController = async (req: Request<never, never, Enquiry
106106
return { ...data, contact: contactResponse[0] };
107107
});
108108

109-
await emailEnquiryConfirmation(result, req.currentContext.initiative, req.body.relatedActivityId);
109+
await emailEnquiryConfirmation(result, res.locals.currentContext.initiative, req.body.relatedActivityId);
110110
res.status(201).json(result);
111111
};
112112

@@ -172,8 +172,8 @@ async function emailEnquiryConfirmation(
172172
export const deleteEnquiryController = async (req: Request<{ enquiryId: string }>, res: Response) => {
173173
await transactionWrapper<void>(async (tx: PrismaTransactionClient) => {
174174
const enquiry = await getEnquiry(tx, req.params.enquiryId);
175-
await deleteEnquiry(tx, req.params.enquiryId, generateDeleteStamps(req.currentContext));
176-
await deleteActivity(tx, enquiry.activityId, generateDeleteStamps(req.currentContext));
175+
await deleteEnquiry(tx, req.params.enquiryId, generateDeleteStamps(res.locals.currentContext));
176+
await deleteActivity(tx, enquiry.activityId, generateDeleteStamps(res.locals.currentContext));
177177
});
178178
res.status(204).end();
179179
};
@@ -211,7 +211,7 @@ export const searchEnquiriesController = async (
211211
...req.body,
212212
includeUser: isTruthy(req.body?.includeUser)
213213
},
214-
req.currentContext.initiative
214+
res.locals.currentContext.initiative
215215
);
216216
});
217217

@@ -227,7 +227,7 @@ export const updateEnquiryController = async (
227227
tx,
228228
{
229229
...req.body,
230-
...generateUpdateStamps(req.currentContext)
230+
...generateUpdateStamps(res.locals.currentContext)
231231
},
232232
req.params.enquiryId
233233
);

0 commit comments

Comments
 (0)