import * as E from "fp-ts/Either";
import { pipe } from "fp-ts/lib/function";
import * as TE from "fp-ts/TaskEither";
import {
saveResponseError,
SaveResponseError,
SaveResponseSuccess,
successfulSaveResponse,
} from "@lambdas/kyc/singpass/types";
import Database from "../database";
import { InfrastructureError } from "../errors";
import { SingpassKycResponse } from "../models";
import { databaseSaveRecordError, DatabaseSaveRecordError } from "../types";
import { SingpassKycDbModel } from "./models/SingpassKycDbModel";
import { EntityManager } from "typeorm";
export class SingpassKycRepository {
constructor(private database: Database) {}
public create(
singpassKycResponse: SingpassKycResponse,
entityManager: EntityManager
): TE.TaskEither<
DatabaseSaveRecordError | InfrastructureError,
void
> {
return pipe(
TE.tryCatch(
() => entityManager.insert(SingpassKycDbModel, singpassKycResponse),
(err) => databaseSaveRecordError(E.toError(err))
),
TE.map(() => undefined)
);
}
private readSingpassKycResponse(
record: SingpassKycDbModel
): Pick<
SingpassKycResponse,
| "userId"
| "uinfin"
| "name"
| "sex"
| "dob"
| "nationality"
| "email"
| "regadd"
> {
return {
userId: record.userId,
uinfin: record.uinfin,
name: record.name!,
sex: record.sex!,
dob: record.dob!,
nationality: record.nationality!,
email: record.email!,
regadd: record.regadd!,
};
}
public safeCreate(
singpassKycResponse: SingpassKycResponse,
entityManager: EntityManager
): TE.TaskEither<SaveResponseError, SaveResponseSuccess> {
return pipe(
TE.tryCatch(
() => this.create(singpassKycResponse, entityManager)(),
(err) =>
saveResponseError(singpassKycResponse, E.toError(JSON.stringify(err)))
),
TE.map(() => successfulSaveResponse())
);
}
}