Skip to content

Commit b4325e8

Browse files
authored
Merge pull request #1155 from jboolean/orders-emails
Order shipped email
2 parents a0355c9 + 9217aa7 commit b4325e8

File tree

3 files changed

+47
-9
lines changed

3 files changed

+47
-9
lines changed

backend/src/business/email/templates/OrderEmailTemplateData.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
export interface OrderTemplateData {
22
ordersUrl: string;
3+
trackingUrl?: string;
34
}
45

56
export interface OrderMetadata {
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import EmailTemplate from '../EmailTemplate';
2+
import EmailStreamType from './EmailStreamType';
3+
import { OrderMetadata, OrderTemplateData } from './OrderEmailTemplateData';
4+
import Senders from './Senders';
5+
6+
class OrderShippedTemplate extends EmailTemplate<
7+
OrderTemplateData,
8+
OrderMetadata
9+
> {
10+
alias = 'order-shipped';
11+
from = Senders.SYSTEM;
12+
streamType = EmailStreamType.TRANSACTIONAL;
13+
}
14+
15+
export default new OrderShippedTemplate();

backend/src/business/merch/MerchOrderService.ts

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import MerchOrderState from '../../enum/MerchOrderState';
99
import MerchProvider from '../../enum/MerchProvider';
1010
import EmailService from '../email/EmailService';
1111
import OrderCustomizeTemplate from '../email/templates/OrderCustomizeTemplate';
12+
import { OrderTemplateData } from '../email/templates/OrderEmailTemplateData';
13+
import OrderShippedTemplate from '../email/templates/OrderShippedTemplate';
1214
import * as UserService from '../users/UserService';
1315
import absurd from '../utils/absurd';
1416
import isProduction from '../utils/isProduction';
@@ -19,6 +21,17 @@ const API_BASE = isProduction()
1921
? 'http://api.1940s.nyc'
2022
: 'http://dev.1940s.nyc:3000';
2123

24+
function createOrderEmailTemplateData(order: MerchOrder): OrderTemplateData {
25+
return {
26+
ordersUrl: UserService.createMagicLinkUrl(
27+
API_BASE,
28+
order.userId,
29+
'/orders'
30+
).toString(),
31+
trackingUrl: order.trackingUrl ?? undefined,
32+
};
33+
}
34+
2235
export async function createMerchOrder(
2336
userId: number,
2437
stripeCheckoutSessionId: string,
@@ -65,13 +78,7 @@ export async function createMerchOrder(
6578

6679
const orderCustomizeEmail = OrderCustomizeTemplate.createTemplatedEmail({
6780
to: user.email,
68-
templateContext: {
69-
ordersUrl: UserService.createMagicLinkUrl(
70-
API_BASE,
71-
userId,
72-
'/orders'
73-
).toString(),
74-
},
81+
templateContext: createOrderEmailTemplateData(order),
7582
metadata: {
7683
orderId: order.id.toString(),
7784
userId: user.id.toString(),
@@ -188,7 +195,7 @@ export async function onShipmentSent(
188195
trackingUrl: string
189196
): Promise<void> {
190197
const orderRepository = getRepository(MerchOrder);
191-
const order = await orderRepository.findOneBy({
198+
let order = await orderRepository.findOneBy({
192199
provider,
193200
providerOrderId,
194201
});
@@ -199,5 +206,20 @@ export async function onShipmentSent(
199206
}
200207

201208
order.trackingUrl = trackingUrl;
202-
await orderRepository.save(order);
209+
order = await orderRepository.save(order);
210+
211+
const user = await UserService.getUser(order.userId);
212+
213+
if (user.email) {
214+
const orderShippedEmail = OrderShippedTemplate.createTemplatedEmail({
215+
to: user.email,
216+
templateContext: createOrderEmailTemplateData(order),
217+
metadata: {
218+
orderId: order.id.toString(),
219+
userId: user.id.toString(),
220+
},
221+
});
222+
223+
await EmailService.sendTemplateEmail(orderShippedEmail);
224+
}
203225
}

0 commit comments

Comments
 (0)