Skip to content

Commit be6d318

Browse files
authored
Merge pull request #3761 from bcgov/chore/3747
refactor(3747): organize email templates' types
2 parents fbdd19b + cc48107 commit be6d318

Some content is hidden

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

56 files changed

+790
-1050
lines changed

app/app/api/private-cloud/products/[licencePlate]/reprovision/route.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { $Enums } from '@prisma/client';
1+
import { $Enums, RequestType } from '@prisma/client';
22
import { z } from 'zod';
33
import createApiHandler from '@/core/api-handler';
44
import { BadRequestResponse, OkResponse, UnauthorizedResponse } from '@/core/responses';
@@ -25,14 +25,23 @@ export const GET = apiHandler(async ({ pathParams, session }) => {
2525

2626
const msgId = `reprovision-${new Date().getTime()}`;
2727

28-
await sendPrivateCloudNatsMessage(msgId, $Enums.RequestType.EDIT, product, false);
28+
await sendPrivateCloudNatsMessage(
29+
{
30+
id: msgId,
31+
type: RequestType.EDIT,
32+
decisionData: product,
33+
},
34+
false,
35+
);
2936

3037
// For GOLD requests, we create an identical request for GOLDDR
3138
if (product.cluster === $Enums.Cluster.GOLD && product.golddrEnabled) {
3239
await sendPrivateCloudNatsMessage(
33-
msgId,
34-
$Enums.RequestType.EDIT,
35-
{ ...product, cluster: $Enums.Cluster.GOLDDR },
40+
{
41+
id: msgId,
42+
type: RequestType.EDIT,
43+
decisionData: { ...product, cluster: $Enums.Cluster.GOLDDR },
44+
},
3645
false,
3746
);
3847
}

app/app/api/private-cloud/provision/[licencePlate]/route.ts

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
import { $Enums, DecisionStatus, RequestType } from '@prisma/client';
1+
import { $Enums, DecisionStatus, RequestType, ProjectStatus } from '@prisma/client';
22
import { z } from 'zod';
33
import createApiHandler from '@/core/api-handler';
44
import { logger } from '@/core/logging';
55
import prisma from '@/core/prisma';
6-
import { NotFoundResponse, OkResponse } from '@/core/responses';
6+
import { NotFoundResponse, OkResponse, UnprocessableEntityResponse } from '@/core/responses';
7+
import { privateCloudProductDetailInclude } from '@/queries/private-cloud-products';
78
import {
89
sendProvisionedEmails,
910
sendDeleteRequestApprovalEmails,
1011
sendEditRequestCompletedEmails,
1112
} from '@/services/ches/private-cloud/email-handler';
12-
import { PrivateCloudRequestedProjectWithContacts } from '@/services/nats/private-cloud';
1313

1414
const pathParamSchema = z.object({
1515
licencePlate: z.string(),
@@ -53,10 +53,10 @@ export const PUT = apiHandler(async ({ pathParams }) => {
5353
// Upsert the project with the requested project data. If admin requested project data exists, use that instead.
5454
const filter = { licencePlate };
5555
const upsertProject =
56-
request.type === $Enums.RequestType.DELETE
56+
request.type === RequestType.DELETE
5757
? prisma.privateCloudProject.update({
5858
where: filter,
59-
data: { status: $Enums.ProjectStatus.INACTIVE },
59+
data: { status: ProjectStatus.INACTIVE },
6060
})
6161
: prisma.privateCloudProject.upsert({
6262
where: filter,
@@ -66,22 +66,19 @@ export const PUT = apiHandler(async ({ pathParams }) => {
6666

6767
await Promise.all([updateRequest, upsertProject]);
6868

69-
// Note: For some reason this information cannot be retrieved from the transaction above without failing the test
70-
const project = await prisma.privateCloudProject.findUnique({
69+
const product = await prisma.privateCloudProject.findUnique({
7170
where: filter,
72-
include: {
73-
projectOwner: true,
74-
primaryTechnicalLead: true,
75-
secondaryTechnicalLead: true,
76-
},
71+
include: privateCloudProductDetailInclude,
7772
});
7873

74+
if (!product) return UnprocessableEntityResponse('product not found');
75+
7976
if (request.type == RequestType.CREATE) {
80-
await sendProvisionedEmails(project as PrivateCloudRequestedProjectWithContacts);
77+
await sendProvisionedEmails(product);
8178
} else if (request.type == RequestType.DELETE) {
82-
await sendDeleteRequestApprovalEmails(project as PrivateCloudRequestedProjectWithContacts);
79+
await sendDeleteRequestApprovalEmails(product);
8380
} else if (request.type == RequestType.EDIT) {
84-
await sendEditRequestCompletedEmails(project as PrivateCloudRequestedProjectWithContacts);
81+
await sendEditRequestCompletedEmails(product);
8582
}
8683

8784
logger.info(`Successfully marked ${licencePlate} as provisioned.`);

app/app/api/private-cloud/requests/[id]/resend/route.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,16 @@ export const GET = apiHandler(async ({ pathParams, session }) => {
2727
const contactsChanged = hasContactsChanged(request.project, request.decisionData);
2828
const msgId = `resend-${new Date().getTime()}`;
2929

30-
await sendPrivateCloudNatsMessage(msgId, request.type, request.decisionData, contactsChanged);
30+
await sendPrivateCloudNatsMessage({ ...request, id: msgId }, contactsChanged);
3131

3232
// For GOLD requests, we create an identical request for GOLDDR
3333
if (request.decisionData.cluster === Cluster.GOLD && request.decisionData.golddrEnabled) {
3434
await sendPrivateCloudNatsMessage(
35-
msgId,
36-
request.type,
37-
{ ...request.decisionData, cluster: Cluster.GOLDDR },
35+
{
36+
id: msgId,
37+
type: request.type,
38+
decisionData: { ...request.decisionData, cluster: Cluster.GOLDDR },
39+
},
3840
contactsChanged,
3941
);
4042
}

app/app/api/public-cloud/products/_operations/delete.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ export default async function deleteOp({
4949

5050
if (request) {
5151
await Promise.all([
52-
sendDeleteRequestEmails(request.decisionData, session.user.name),
53-
sendAdminDeleteRequestEmails(request.decisionData, session.user.name),
52+
sendDeleteRequestEmails(request, session.user.name),
53+
sendAdminDeleteRequestEmails(request, session.user.name),
5454
createEvent(EventType.DELETE_PUBLIC_CLOUD_PRODUCT, session.user.id, { requestId: request.id }),
5555
]);
5656
}

app/app/api/public-cloud/products/_operations/update.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export default async function updateOp({
3131

3232
const proms = [];
3333

34-
proms.push(sendPublicCloudNatsMessage(request.type, request.decisionData, request.project));
34+
proms.push(sendPublicCloudNatsMessage(request));
3535

3636
const users: User[] = [
3737
request.decisionData.projectOwner,
@@ -43,7 +43,7 @@ export default async function updateOp({
4343
proms.push(sendEditRequestEmails(request, session.user.name));
4444

4545
if (request.decisionData.expenseAuthorityId !== request.project?.expenseAuthorityId) {
46-
proms.push(sendExpenseAuthorityEmail(request.decisionData));
46+
proms.push(sendExpenseAuthorityEmail(request));
4747
}
4848

4949
await Promise.all(proms);

app/app/api/public-cloud/provision/[licencePlate]/route.ts

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
import { $Enums, DecisionStatus } from '@prisma/client';
1+
import { $Enums, DecisionStatus, ProjectStatus, RequestType } from '@prisma/client';
22
import { z } from 'zod';
33
import createApiHandler from '@/core/api-handler';
44
import prisma from '@/core/prisma';
5-
import { NotFoundResponse, OkResponse } from '@/core/responses';
5+
import { NotFoundResponse, OkResponse, UnprocessableEntityResponse } from '@/core/responses';
6+
import { publicCloudProductDetailInclude } from '@/queries/public-cloud-products';
67
import { sendProvisionedEmails, sendDeleteRequestApprovalEmails } from '@/services/ches/public-cloud/email-handler';
7-
import { PublicCloudRequestedProjectWithContacts } from '@/services/nats/public-cloud';
88

99
const pathParamSchema = z.object({
1010
licencePlate: z.string(),
@@ -48,10 +48,10 @@ export const PUT = apiHandler(async ({ pathParams }) => {
4848
// Upsert the project with the requested project data. If admin requested project data exists, use that instead.
4949
const filter = { licencePlate };
5050
const upsertProject =
51-
request.type === $Enums.RequestType.DELETE
51+
request.type === RequestType.DELETE
5252
? prisma.publicCloudProject.update({
5353
where: filter,
54-
data: { status: $Enums.ProjectStatus.INACTIVE },
54+
data: { status: ProjectStatus.INACTIVE },
5555
})
5656
: prisma.publicCloudProject.upsert({
5757
where: filter,
@@ -61,22 +61,17 @@ export const PUT = apiHandler(async ({ pathParams }) => {
6161

6262
await Promise.all([updateRequest, upsertProject]);
6363

64-
// Note: For some reason this information cannot be retrieved from the transaction above without failing the test
65-
const project = await prisma.publicCloudProject.findUnique({
64+
const product = await prisma.publicCloudProject.findUnique({
6665
where: filter,
67-
include: {
68-
projectOwner: true,
69-
primaryTechnicalLead: true,
70-
secondaryTechnicalLead: true,
71-
expenseAuthority: true,
72-
billing: true,
73-
},
66+
include: publicCloudProductDetailInclude,
7467
});
7568

69+
if (!product) return UnprocessableEntityResponse('product not found');
70+
7671
if (request.type == 'CREATE') {
77-
await sendProvisionedEmails(project as PublicCloudRequestedProjectWithContacts);
72+
await sendProvisionedEmails(product);
7873
} else if (request.type == 'DELETE') {
79-
await sendDeleteRequestApprovalEmails(project as PublicCloudRequestedProjectWithContacts);
74+
await sendDeleteRequestApprovalEmails(product);
8075
}
8176

8277
return OkResponse(`Successfully marked ${licencePlate} as provisioned.`);

app/app/api/public-cloud/requests/[id]/decision/route.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export const POST = apiHandler(async ({ pathParams, body, session }) => {
2929
}
3030

3131
if (request.decisionStatus === DecisionStatus.REJECTED) {
32-
await sendRequestRejectionEmails(request.decisionData, decisionComment);
32+
await sendRequestRejectionEmails(request);
3333
return OkResponse(request);
3434
}
3535

@@ -39,10 +39,10 @@ export const POST = apiHandler(async ({ pathParams, body, session }) => {
3939
request.decisionStatus === DecisionStatus.APPROVED &&
4040
request.project?.expenseAuthorityId !== request.decisionData.expenseAuthorityId
4141
) {
42-
proms.push(sendExpenseAuthorityEmail(request.decisionData));
42+
proms.push(sendExpenseAuthorityEmail(request));
4343
}
4444

45-
proms.push(sendPublicCloudNatsMessage(request.type, request.decisionData, request.project));
45+
proms.push(sendPublicCloudNatsMessage(request));
4646

4747
// Subscribe users to Mautic
4848
const users: User[] = [

app/app/api/v1/private-cloud/products/[idOrLicencePlate]/nats-message/route.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { $Enums } from '@prisma/client';
1+
import { RequestType } from '@prisma/client';
22
import { z } from 'zod';
33
import createApiHandler from '@/core/api-handler';
44
import prisma from '@/core/prisma';
@@ -33,7 +33,10 @@ export const GET = apiHandler(async ({ pathParams, session }) => {
3333
return BadRequestResponse(`there is no products associated with key '${idOrLicencePlate}'`);
3434
}
3535

36-
const result = await createPrivateCloudNatsMessage(product.id, $Enums.RequestType.EDIT, product, false);
36+
const result = await createPrivateCloudNatsMessage(
37+
{ id: product.id, type: RequestType.EDIT, decisionData: product },
38+
false,
39+
);
3740

3841
return OkResponse(result);
3942
});

app/core/responses.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,10 @@ export function NotFoundResponse(error: any) {
4747
return NextResponse.json({ success: false, message: 'Not Found', error }, { status: 404 });
4848
}
4949

50+
export function UnprocessableEntityResponse(error: any) {
51+
return NextResponse.json({ success: false, message: 'Unprocessable Entity', error }, { status: 422 });
52+
}
53+
5054
export function InternalServerErrorResponse(error: any) {
5155
return NextResponse.json({ success: false, message: 'Internal Server Error', error }, { status: 500 });
5256
}

0 commit comments

Comments
 (0)