Skip to content
This repository has been archived by the owner on Dec 18, 2024. It is now read-only.

Commit

Permalink
fix(guardian-signature): send email request for signature and fix types
Browse files Browse the repository at this point in the history
  • Loading branch information
AdrianAndersen committed Aug 13, 2024
1 parent 37db13e commit ec6d87b
Show file tree
Hide file tree
Showing 9 changed files with 34 additions and 95 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
"license": "ISC",
"dependencies": {
"@boklisten/bl-email": "^1.8.2",
"@boklisten/bl-model": "^0.26.2",
"@boklisten/bl-model": "^0.26.5",
"@boklisten/bl-post-office": "^0.5.56",
"@napi-rs/image": "^1.8.0",
"@sendgrid/mail": "^8.1.3",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { BlapiResponse, BlError, Order, UserDetail } from "@boklisten/bl-model";
import { BlapiResponse, BlError, UserDetail } from "@boklisten/bl-model";
import { CheckGuardianSignatureSpec } from "@boklisten/bl-model/signature/serialized-signature";
import { ObjectId } from "mongodb";

import { Operation } from "../../../operation/operation";
Expand All @@ -13,17 +14,12 @@ import {
} from "../helpers/signature.helper";
import { Signature, signatureSchema } from "../signature.schema";

export declare class CheckGuardianSignatureSpec {
customerId: string;
}

export class CheckGuardianSignatureOperation implements Operation {
private readonly _userDetailStorage: BlDocumentStorage<UserDetail>;
private readonly _signatureStorage: BlDocumentStorage<Signature>;

constructor(
signatureStorage?: BlDocumentStorage<Signature>,
orderStorage?: BlDocumentStorage<Order>,
userDetailStorage?: BlDocumentStorage<UserDetail>,
) {
this._signatureStorage =
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { BlapiResponse, BlError, Order, UserDetail } from "@boklisten/bl-model";
import { SerializedGuardianSignature } from "@boklisten/bl-model/signature/serialized-signature";
import { ObjectId } from "mongodb";

import { SystemUser } from "../../../auth/permission/permission.service";
Expand All @@ -16,12 +17,6 @@ import {
} from "../helpers/signature.helper";
import { Signature, signatureSchema } from "../signature.schema";

export declare class SerializedGuardianSignature {
customerId: string;
base64EncodedImage: string;
signingName: string;
}

export class GuardianSignatureOperation implements Operation {
private readonly _userDetailStorage: BlDocumentStorage<UserDetail>;
private readonly _orderStorage: BlDocumentStorage<Order>;
Expand Down
23 changes: 0 additions & 23 deletions src/messenger/email/email-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -543,29 +543,6 @@ export class EmailService implements MessengerService {
await this._emailHandler.sendPasswordReset(emailSetting, passwordResetUri);
}

public async requestGuardianSignature(
customerDetail: UserDetail,
branchName: string,
): Promise<void> {
if (!customerDetail.guardian?.email) {
throw new BlError("Guardian email is required").code(200);
}
const emailSetting: EmailSetting = {
toEmail: customerDetail.guardian?.email ?? "",
fromEmail: EMAIL_SETTINGS.types.guardianSignature.fromEmail,
subject: EMAIL_SETTINGS.types.guardianSignature.subject,
userId: customerDetail.id,
userFullName: customerDetail.name,
};
await this._emailHandler.sendGuardianSignatureRequest(
emailSetting,
assertEnv(BlEnvironment.CLIENT_URI) +
EMAIL_SETTINGS.types.guardianSignature.path +
customerDetail.id,
branchName,
);
}

private async sendMail(
emailSetting: EmailSetting,
templateId: string,
Expand Down
2 changes: 1 addition & 1 deletion src/messenger/email/email-settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export const EMAIL_SETTINGS = {
guardianSignature: {
fromEmail: "ikkesvar@boklisten.no",
subject: "Signer låneavtale hos Boklisten.no",
path: "u/sign-agreement/",
path: "/signering/",
},
deliveryInformation: {
fromEmail: "ikkesvar@boklisten.no",
Expand Down
44 changes: 25 additions & 19 deletions src/messenger/email/order-email/order-email-handler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,10 @@ import { BlCollectionName } from "../../../collections/bl-collection";
import { branchSchema } from "../../../collections/branch/branch.schema";
import { deliverySchema } from "../../../collections/delivery/delivery.schema";
import { paymentSchema } from "../../../collections/payment/payment.schema";
import { assertEnv, BlEnvironment } from "../../../config/environment";
import { DibsEasyPayment } from "../../../payment/dibs/dibs-easy-payment/dibs-easy-payment";
import { BlDocumentStorage } from "../../../storage/blDocumentStorage";
import { sendSMS } from "../../sms/sms-service";
import { EMAIL_SETTINGS } from "../email-settings";

export class OrderEmailHandler {
Expand Down Expand Up @@ -83,7 +85,8 @@ export class OrderEmailHandler {
};

if (withAgreement) {
this.sendToGuardianIfUserIsUnder18(customerDetail, emailOrder, emailUser);
const branch = await this._branchStorage?.get(branchId);
this.requestGuardianSignature(customerDetail, branch!.name);
}

if (this.paymentNeeded(order)) {
Expand Down Expand Up @@ -115,10 +118,12 @@ export class OrderEmailHandler {
});
}

private sendToGuardianIfUserIsUnder18(
/**
* sends out SMS and email to the guardian of a customer with a signature link if they are under 18
*/
private requestGuardianSignature(
customerDetail: UserDetail,
emailOrder: EmailOrder,
emailUser: EmailUser,
branchName: string,
) {
if (
moment(customerDetail.dob).isValid() &&
Expand All @@ -127,25 +132,26 @@ export class OrderEmailHandler {
) &&
customerDetail?.guardian?.email
) {
if (!customerDetail.guardian?.email) {
throw new BlError("Guardian email is required").code(200);
}
const emailSetting: EmailSetting = {
toEmail: customerDetail.guardian.email,
fromEmail: EMAIL_SETTINGS.types.receipt.fromEmail,
subject: EMAIL_SETTINGS.types.receipt.subject + ` #${emailOrder.id}`,
toEmail: customerDetail.guardian?.email ?? "",
fromEmail: EMAIL_SETTINGS.types.guardianSignature.fromEmail,
subject: EMAIL_SETTINGS.types.guardianSignature.subject,
userId: customerDetail.id,
userFullName: customerDetail.guardian.name,
userFullName: customerDetail.name,
};

emailSetting.textBlocks = [
{
text: `Du får denne e-posten fordi du er oppgitt som foresatt til ${customerDetail.name}. Vær vennlig å skriv under på kontrakten som ligger vedlagt og la eleven levere denne når bøkene skal leveres ut. Eleven vil ikke kunne hente ut bøker uten underskrift fra foresatt.`,
},
];

this._emailHandler.sendOrderReceipt(
this._emailHandler.sendGuardianSignatureRequest(
emailSetting,
emailOrder,
emailUser,
true,
assertEnv(BlEnvironment.CLIENT_URI) +
EMAIL_SETTINGS.types.guardianSignature.path +
customerDetail.id,
branchName,
);
sendSMS(
customerDetail.guardian.phone,
`Hei. ${customerDetail.name} har nylig bestilt bøker fra ${branchName} gjennom Boklisten.no. Siden ${customerDetail.name} er under 18 år, krever vi at du som foresatt signerer låneavtalen. Vi har derfor sendt en epost til ${customerDetail.guardian.email} med lenke til signering. Ta kontakt på info@boklisten.no om du har spørsmål. Mvh. Boklisten`,
);
}
}
Expand Down
4 changes: 0 additions & 4 deletions src/messenger/messenger-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,4 @@ export interface MessengerService {
pendingPasswordResetId: string,
resetToken: string,
): void;
requestGuardianSignature(
customerDetail: UserDetail,
branchName: string,
): void;
}
31 changes: 0 additions & 31 deletions src/messenger/messenger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -165,35 +165,4 @@ export class Messenger implements MessengerService {
resetToken,
);
}

/**
* sends out SMS and email to the guardian of a customer with a signature link if they are under 18
*/
public async requestGuardianSignature(
customerDetail: UserDetail,
branchName: string,
): Promise<void> {
const guardianPhone = customerDetail.guardian?.phone;
const guardianEmail = customerDetail.guardian?.email;

if (!guardianEmail || !guardianPhone) {
throw new Error("Guardian email and phone number is required");
}

if (
moment(customerDetail.dob).isValid() &&
moment(customerDetail.dob).isAfter(
moment(new Date()).subtract(18, "years"),
)
) {
await this._emailService.requestGuardianSignature(
customerDetail,
branchName,
);
await sendSMS(
guardianPhone,
`Hei. ${customerDetail.name} har nylig bestilt bøker fra ${branchName} gjennom Boklisten.no. Siden ${customerDetail.name} er under 18 år, krever vi at du som foresatt signerer låneavtalen. Vi har derfor sendt en epost til ${guardianEmail} med lenke til signering. Ta kontakt på info@boklisten.no om du har spørsmål. Mvh. Boklisten`,
);
}
}
}
8 changes: 4 additions & 4 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@
puppeteer "^9.1.1"
typescript "^2.6.2"

"@boklisten/bl-model@^0.26.2":
version "0.26.2"
resolved "https://registry.yarnpkg.com/@boklisten/bl-model/-/bl-model-0.26.2.tgz#ae1d75c9372c31a0b45dd8cc405a2021bc9bceeb"
integrity sha512-rjXuCkyo5N9d5prF+ODZTrOKvlJ9jb0Hmsx6XqLbHZUxDJAGGl9xPI1kvd5mtc2Si39SvpGUaXs8xvX0UKSI1A==
"@boklisten/bl-model@^0.26.5":
version "0.26.5"
resolved "https://registry.yarnpkg.com/@boklisten/bl-model/-/bl-model-0.26.5.tgz#d137de24cc873efc32b1b7f7ff67937f6b6cd7eb"
integrity sha512-RhPKI/Pff/3R/YsnzHcwZYZgIdzYYBNmQzo+udXxuXc7MvIbxwWENSmm9lxuxOQSNh7tdqHvd+m6oQiVeXcTTA==
dependencies:
typescript "^5.2.2"

Expand Down

0 comments on commit ec6d87b

Please sign in to comment.