Skip to content

Commit

Permalink
[#IOPID-1444] name inside mailvalidation (#304)
Browse files Browse the repository at this point in the history
  • Loading branch information
arcogabbo authored Feb 19, 2024
1 parent ab02a12 commit 1a6cb31
Show file tree
Hide file tree
Showing 16 changed files with 1,275 additions and 161 deletions.
1 change: 1 addition & 0 deletions .sonarcloud.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
sonar.cpd.exclusions=**/__tests__/*
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { context as contextMock } from "../../__mocks__/durable-functions";
import {
aEmail,
aFiscalCode,
aName,
aTokenId,
aValidator,
aValidatorHash
Expand All @@ -26,7 +27,8 @@ describe("EmailValidationWithTemaplteProcessOrchestrator", () => {
const emailValidationProcessOrchestratorInput = EmailValidationProcessOrchestratorInput.encode(
{
email: aEmail,
fiscalCode: aFiscalCode
fiscalCode: aFiscalCode,
name: aName
}
);

Expand Down Expand Up @@ -83,7 +85,8 @@ describe("EmailValidationWithTemaplteProcessOrchestrator", () => {
expect.anything(), // retryOptions
SendValidationEmailActivityInput.encode({
email: aEmail,
token: `${aTokenId}:${aValidator}`
token: `${aTokenId}:${aValidator}`,
name: aName
})
);
});
Expand Down
16 changes: 10 additions & 6 deletions EmailValidationWithTemplateProcessOrchestrator/handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,16 @@ import {
import {
ActivityInput as SendValidationEmailActivityInput,
ActivityResult as SendValidationEmailActivityResult
} from "../SendValidationEmailActivity/handler";
} from "../SendTemplatedValidationEmailActivity/handler";

// Input
export const OrchestratorInput = t.interface({
email: EmailString,
fiscalCode: FiscalCode
});
export const OrchestratorInput = t.intersection([
t.interface({
email: EmailString,
fiscalCode: FiscalCode
}),
t.partial({ name: t.string })
]);

export type OrchestratorInput = t.TypeOf<typeof OrchestratorInput>;

Expand Down Expand Up @@ -74,7 +77,7 @@ export const handler = function*(
}

const orchestratorInput = errorOrOrchestratorInput.right;
const { fiscalCode, email } = orchestratorInput;
const { fiscalCode, email, name } = orchestratorInput;

// Log the input
context.log.verbose(
Expand Down Expand Up @@ -145,6 +148,7 @@ export const handler = function*(
const sendValidationEmailActivityInput = SendValidationEmailActivityInput.encode(
{
email,
name,
token: `${validationTokenEntity.PartitionKey}:${validator}`
}
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
getSendValidationEmailActivityHandler
} from "../handler";
import { apply } from "../../generated/templates/mailvalidation/index";
import { aName } from "../../__mocks__/mocks";

const htmlAndTextContent = "CONTENT";

Expand Down Expand Up @@ -44,14 +45,16 @@ describe("SendTemplatedValidationEmailActivityHandler", () => {

const input = SendValidationEmailActivityInput.encode({
email: "[email protected]" as EmailString,
token: "FAKE_TOKEN"
token: "FAKE_TOKEN",
name: aName
});

await handler(contextMock as any, input);

expect(apply).toBeCalledWith(
emailDefaults.title,
`${functionsPublicUrl}/validate-profile-email?token=${input.token}`
`${functionsPublicUrl}/validate-profile-email?token=${input.token}`,
aName
);
expect(mailerTransporterMock.sendMail).toHaveBeenCalledWith(
{
Expand Down
18 changes: 12 additions & 6 deletions SendTemplatedValidationEmailActivity/handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,15 @@ import * as mailvalidation from "../generated/templates/mailvalidation/index";
import { EmailDefaults } from ".";

// Activity input
export const ActivityInput = t.interface({
email: EmailString,
token: t.string
});
export const ActivityInput = t.intersection([
t.interface({
email: EmailString,
token: t.string
}),
// TODO: name field from partial to required after complete rollout of
// IOPID-1444 task
t.partial({ name: t.string })
]);

export type ActivityInput = t.TypeOf<typeof ActivityInput>;

Expand Down Expand Up @@ -66,14 +71,15 @@ export const getSendValidationEmailActivityHandler = (
}

const activityInput = errorOrActivityInput.right;
const { email, token } = activityInput;
const { email, token, name } = activityInput;

// Generate the email html from the template
const { from, title, htmlToTextOptions } = emailDefaults;

const emailHtml = mailvalidation.apply(
title,
`${functionsPublicUrl}/validate-profile-email?token=${token}`
`${functionsPublicUrl}/validate-profile-email?token=${token}`,
name
);

// converts the HTML to pure text to generate the text version of the message
Expand Down
19 changes: 15 additions & 4 deletions StartEmailValidationProcess/__tests__/handler.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import * as durableFunction from "durable-functions";
import { some } from "fp-ts/lib/Option";
import { taskEither } from "fp-ts/lib/TaskEither";
import { EmailValidationProcessParams } from "../../generated/definitions/internal/EmailValidationProcessParams";
import {
context as contextMock,
mockStartNew
Expand All @@ -19,6 +20,9 @@ const isOrchestratorRunningMock = jest.fn(() =>
isRunning: false
})
);

const aValidPayload: EmailValidationProcessParams = { name: "EXAMPLE_NAME" };

jest.spyOn(durableFunction, "getClient").mockImplementation(_ => getClientMock);
jest
.spyOn(orchUtil, "isOrchestratorRunning")
Expand All @@ -37,7 +41,8 @@ describe("StartEmailValidationProcessHandler", () => {

const result = await handler(
contextMock as any,
aRetrievedProfile.fiscalCode
aRetrievedProfile.fiscalCode,
aValidPayload
);

expect(result.kind).toBe("IResponseSuccessAccepted");
Expand All @@ -59,7 +64,8 @@ describe("StartEmailValidationProcessHandler", () => {

const result = await handler(
contextMock as any,
aRetrievedProfile.fiscalCode
aRetrievedProfile.fiscalCode,
aValidPayload
);
expect(mockStartNew).not.toHaveBeenCalled();

Expand All @@ -75,10 +81,15 @@ describe("StartEmailValidationProcessHandler", () => {

const handler = StartEmailValidationProcessHandler(profileModelMock as any);

await handler(contextMock as any, aRetrievedProfile.fiscalCode);
await handler(
contextMock as any,
aRetrievedProfile.fiscalCode,
aValidPayload
);
const result = await handler(
contextMock as any,
aRetrievedProfile.fiscalCode
aRetrievedProfile.fiscalCode,
aValidPayload
);
expect(result.kind).toBe("IResponseErrorValidation");
});
Expand Down
13 changes: 9 additions & 4 deletions StartEmailValidationProcess/handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@ import {
} from "@pagopa/io-functions-commons/dist/src/utils/request_middleware";

import { pipe } from "fp-ts/lib/function";
import { RequiredBodyPayloadMiddleware } from "@pagopa/io-functions-commons/dist/src/utils/middlewares/required_body_payload";
import { OrchestratorInput as EmailValidationWithTemplateProcessOrchestratorInput } from "../EmailValidationWithTemplateProcessOrchestrator/handler";
import { EmailValidationProcessParams } from "../generated/definitions/internal/EmailValidationProcessParams";
import {
isOrchestratorRunning,
makeStartEmailValidationProcessOrchestratorId
Expand All @@ -60,15 +62,16 @@ type ReturnTypes =
*/
type IStartEmailValidationProcessHandler = (
context: Context,
fiscalCode: FiscalCode
fiscalCode: FiscalCode,
payload: EmailValidationProcessParams
) => Promise<ReturnTypes>;

// eslint-disable-next-line prefer-arrow/prefer-arrow-functions
export function StartEmailValidationProcessHandler(
profileModel: ProfileModel
): IStartEmailValidationProcessHandler {
// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
return async (context, fiscalCode) => {
return async (context, fiscalCode, payload) => {
const logPrefix = `StartEmailValidationProcessHandler|FISCAL_CODE=${fiscalCode}`;

const errorOrMaybeExistingProfile = await profileModel.findLastVersionByModelId(
Expand Down Expand Up @@ -108,7 +111,8 @@ export function StartEmailValidationProcessHandler(
const emailValidationWithTemplateProcessOrchestartorInput = EmailValidationWithTemplateProcessOrchestratorInput.encode(
{
email,
fiscalCode
fiscalCode,
name: payload.name
}
);

Expand Down Expand Up @@ -159,7 +163,8 @@ export function StartEmailValidationProcess(

const middlewaresWrap = withRequestMiddlewares(
ContextMiddleware(),
FiscalCodeMiddleware
FiscalCodeMiddleware,
RequiredBodyPayloadMiddleware(EmailValidationProcessParams)
);
return wrapRequestHandler(middlewaresWrap(handler));
}
Loading

0 comments on commit 1a6cb31

Please sign in to comment.