Skip to content
This repository has been archived by the owner on Jan 15, 2025. It is now read-only.

Commit

Permalink
Add partition key to Expiration delete (#72)
Browse files Browse the repository at this point in the history
  • Loading branch information
AleDore authored Jan 19, 2022
1 parent 5c8942b commit cb30a99
Show file tree
Hide file tree
Showing 7 changed files with 95 additions and 13 deletions.
30 changes: 28 additions & 2 deletions DeleteCgnExpirationActivity/__test__/handler.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import * as TE from "fp-ts/lib/TaskEither";
import { FiscalCode, NonEmptyString } from "@pagopa/ts-commons/lib/strings";
import { toError } from "fp-ts/lib/Either";
import { pipe } from "fp-ts/lib/function";
import { NonNegativeInteger } from "@pagopa/ts-commons/lib/numbers";
import { context } from "../../__mocks__/durable-functions";
import * as tableUtils from "../../utils/table_storage";
import {
Expand All @@ -14,6 +15,7 @@ import { testFail } from "../../__mocks__/mock";
const aFiscalCode = "RODFDS82S10H501T" as FiscalCode;
const tableServiceMock = jest.fn();
const expiredCgnTableName = "aTable" as NonEmptyString;
const aCgnUpperBoundAge = 36 as NonNegativeInteger;

const deleteCardExpirationMock = jest.fn();
jest
Expand All @@ -31,7 +33,8 @@ describe("DeleteCgnExpirationActivity", () => {
it("should throw if an error occurs during CgnExpiration delete", async () => {
const deleteCgnExpirationActivityHandler = getDeleteCgnExpirationActivityHandler(
tableServiceMock as any,
expiredCgnTableName
expiredCgnTableName,
aCgnUpperBoundAge
);

deleteCardExpirationMock.mockImplementationOnce(_ =>
Expand All @@ -51,10 +54,33 @@ describe("DeleteCgnExpirationActivity", () => {
)();
});

it("should return a permanent failure if extractExpirationDate fails", async () => {
const storeCgnExpirationActivityHandler = getDeleteCgnExpirationActivityHandler(
tableServiceMock as any,
expiredCgnTableName,
aCgnUpperBoundAge
);

deleteCardExpirationMock.mockImplementationOnce(_ =>
jest.fn(() => TE.of({}))
);
const response = await storeCgnExpirationActivityHandler(context, {
...anActivityInput,
fiscalCode: "RODFDSL2S10H501T" as FiscalCode
});
expect(response.kind).toBe("FAILURE");
if (response.kind === "FAILURE") {
expect(response.reason).toContain(
"PERMANENT FAILURE|ERROR=Cannot extract CGN expirationDate"
);
}
});

it("should return success if a CgnExpiration's delete succeded", async () => {
const storeCgnExpirationActivityHandler = getDeleteCgnExpirationActivityHandler(
tableServiceMock as any,
expiredCgnTableName
expiredCgnTableName,
aCgnUpperBoundAge
);

deleteCardExpirationMock.mockImplementationOnce(_ =>
Expand Down
17 changes: 14 additions & 3 deletions DeleteCgnExpirationActivity/handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { flow, pipe } from "fp-ts/lib/function";
import * as TE from "fp-ts/lib/TaskEither";
import * as t from "io-ts";
import { FiscalCode, NonEmptyString } from "@pagopa/ts-commons/lib/strings";
import { NonNegativeInteger } from "@pagopa/ts-commons/lib/numbers";
import { ActivityResult, success } from "../utils/activity";
import { errorsToError } from "../utils/conversions";
import { deleteCardExpiration } from "../utils/table_storage";
Expand All @@ -12,6 +13,7 @@ import {
toTransientFailure,
trackFailure
} from "../utils/errors";
import { extractCgnExpirationDate } from "../utils/cgn_checks";

export const ActivityInput = t.interface({
fiscalCode: FiscalCode
Expand All @@ -22,6 +24,7 @@ export type ActivityInput = t.TypeOf<typeof ActivityInput>;
export const getDeleteCgnExpirationActivityHandler = (
tableService: TableService,
cgnExpirationTableName: NonEmptyString,
cgnUpperBoundAge: NonNegativeInteger,
logPrefix: string = "DeleteCgnExpirationActivity"
) => (context: Context, input: unknown): Promise<ActivityResult> => {
const fail = trackFailure(context, logPrefix);
Expand All @@ -40,9 +43,17 @@ export const getDeleteCgnExpirationActivityHandler = (
),
TE.chain(activityInput =>
pipe(
deleteCgnExpirationTask(activityInput.fiscalCode),
TE.mapLeft(err =>
toTransientFailure(err, "Cannot delete CGN expiration tuple")
extractCgnExpirationDate(activityInput.fiscalCode, cgnUpperBoundAge),
TE.mapLeft(e =>
toPermanentFailure(e, "Cannot extract CGN expirationDate")
),
TE.chain(expirationDate =>
pipe(
deleteCgnExpirationTask(activityInput.fiscalCode, expirationDate),
TE.mapLeft(err =>
toTransientFailure(err, "Cannot delete CGN expiration tuple")
)
)
)
)
),
Expand Down
3 changes: 2 additions & 1 deletion DeleteCgnExpirationActivity/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ const tableService = createTableService(config.CGN_STORAGE_CONNECTION_STRING);

const deleteCgnExpirationActivityHandler = getDeleteCgnExpirationActivityHandler(
tableService,
config.CGN_EXPIRATION_TABLE_NAME
config.CGN_EXPIRATION_TABLE_NAME,
config.CGN_UPPER_BOUND_AGE
);

export default deleteCgnExpirationActivityHandler;
31 changes: 29 additions & 2 deletions DeleteEycaExpirationActivity/__test__/handler.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import * as TE from "fp-ts/lib/TaskEither";
import { FiscalCode, NonEmptyString } from "@pagopa/ts-commons/lib/strings";
import { pipe } from "fp-ts/lib/function";
import { toError } from "fp-ts/lib/Either";
import { NonNegativeInteger } from "@pagopa/ts-commons/lib/numbers";
import { context } from "../../__mocks__/durable-functions";
import * as tableUtils from "../../utils/table_storage";
import {
Expand All @@ -24,14 +25,17 @@ const anActivityInput: ActivityInput = {
fiscalCode: aFiscalCode
};

const anEycaUpperBoundAge = 30 as NonNegativeInteger;

describe("DeleteEycaExpirationActivity", () => {
beforeEach(() => {
jest.clearAllMocks();
});
it("should throw if an error occurs during EycaExpiration delete", async () => {
const deleteEycaExpirationActivityHandler = getDeleteEycaExpirationActivityHandler(
tableServiceMock as any,
expiredEycaTableName
expiredEycaTableName,
anEycaUpperBoundAge
);

deleteEycaExpirationMock.mockImplementationOnce(_ =>
Expand All @@ -51,10 +55,33 @@ describe("DeleteEycaExpirationActivity", () => {
)();
});

it("should return a permanent failure if extractExpirationDate fails", async () => {
const deleteEycaExpirationActivityHandler = getDeleteEycaExpirationActivityHandler(
tableServiceMock as any,
expiredEycaTableName,
anEycaUpperBoundAge
);

deleteEycaExpirationMock.mockImplementationOnce(_ =>
jest.fn(() => TE.of({}))
);
const response = await deleteEycaExpirationActivityHandler(context, {
...anActivityInput,
fiscalCode: "RODFDSL2S10H501T" as FiscalCode
});
expect(response.kind).toBe("FAILURE");
if (response.kind === "FAILURE") {
expect(response.reason).toContain(
"PERMANENT FAILURE|ERROR=Cannot extract EYCA expirationDate"
);
}
});

it("should return success if a delete of EycaExpiration succeded", async () => {
const deleteEycaExpirationActivityHandler = getDeleteEycaExpirationActivityHandler(
tableServiceMock as any,
expiredEycaTableName
expiredEycaTableName,
anEycaUpperBoundAge
);

deleteEycaExpirationMock.mockImplementationOnce(_ =>
Expand Down
18 changes: 15 additions & 3 deletions DeleteEycaExpirationActivity/handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { flow, pipe } from "fp-ts/lib/function";
import * as TE from "fp-ts/lib/TaskEither";
import * as t from "io-ts";
import { FiscalCode, NonEmptyString } from "@pagopa/ts-commons/lib/strings";
import { NonNegativeInteger } from "@pagopa/ts-commons/lib/numbers";
import { ActivityResult, success } from "../utils/activity";
import { errorsToError } from "../utils/conversions";
import { deleteCardExpiration } from "../utils/table_storage";
Expand All @@ -12,6 +13,7 @@ import {
toTransientFailure,
trackFailure
} from "../utils/errors";
import { extractEycaExpirationDate } from "../utils/cgn_checks";

export const ActivityInput = t.interface({
fiscalCode: FiscalCode
Expand All @@ -26,6 +28,7 @@ export type ActivityInput = t.TypeOf<typeof ActivityInput>;
export const getDeleteEycaExpirationActivityHandler = (
tableService: TableService,
eycaExpirationTableName: NonEmptyString,
eycaUpperBoundAge: NonNegativeInteger,
logPrefix: string = "DeleteCgnExpirationActivity"
) => (context: Context, input: unknown): Promise<ActivityResult> => {
const fail = trackFailure(context, logPrefix);
Expand All @@ -44,9 +47,18 @@ export const getDeleteEycaExpirationActivityHandler = (
),
TE.chain(activityInput =>
pipe(
deleteEycaExpirationTask(activityInput.fiscalCode),
TE.mapLeft(err =>
toTransientFailure(err, "Cannot delete EYCA expiration tuple")
extractEycaExpirationDate(activityInput.fiscalCode, eycaUpperBoundAge),
TE.fromEither,
TE.mapLeft(e =>
toPermanentFailure(e, "Cannot extract EYCA expirationDate")
),
TE.chain(expirationDate =>
pipe(
deleteEycaExpirationTask(activityInput.fiscalCode, expirationDate),
TE.mapLeft(err =>
toTransientFailure(err, "Cannot delete EYCA expiration tuple")
)
)
)
)
),
Expand Down
3 changes: 2 additions & 1 deletion DeleteEycaExpirationActivity/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ const tableService = createTableService(config.CGN_STORAGE_CONNECTION_STRING);

const deleteEycaExpirationActivityHandler = getDeleteEycaExpirationActivityHandler(
tableService,
config.EYCA_EXPIRATION_TABLE_NAME
config.EYCA_EXPIRATION_TABLE_NAME,
config.EYCA_UPPER_BOUND_AGE
);

export default deleteEycaExpirationActivityHandler;
6 changes: 5 additions & 1 deletion utils/table_storage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -133,12 +133,16 @@ export const insertCardExpiration = (
export const deleteCardExpiration = (
tableService: TableService,
cardExpirationTableName: NonEmptyString
) => (fiscalCode: FiscalCode): TE.TaskEither<Error, ServiceResponse> => {
) => (
fiscalCode: FiscalCode,
expirationDate: Date
): TE.TaskEither<Error, ServiceResponse> => {
const eg = TableUtilities.entityGenerator;
return TE.taskify<Error, ServiceResponse>(cb =>
tableService.deleteEntity(
cardExpirationTableName,
{
PartitionKey: eg.String(date_fns.format(expirationDate, "yyyy-MM-dd")),
RowKey: eg.String(fiscalCode)
},
cb
Expand Down

0 comments on commit cb30a99

Please sign in to comment.