-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathorder.service.ts
88 lines (73 loc) · 2.73 KB
/
order.service.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import { Injectable } from '@nestjs/common';
import { OrderInfoDto } from './dto/order-info.dto';
import { Order } from './entities/order.entity';
import { UnavailablePastryError } from './unavailable-pastry.error'
import { Pastry } from '../pastry/pastry.dto';
import { PastryService } from '../pastry/pastry.service';
import { OrderEventPublisher } from './order-event.publisher';
import { OrderEvent } from './dto/order-event.dto';
import { OrderNotFoundException } from './order-not-found.error';
@Injectable()
export class OrderService {
orderEventsRepository: Map<string, OrderEvent[]> = new Map<string, OrderEvent[]>();
constructor(private readonly pastryService: PastryService,
private readonly orderEventPublisher: OrderEventPublisher) {}
/**
*
* @param orderInfo
* @returns
* @throws {UnavailablePastryError}
*/
async create(orderInfo: OrderInfoDto): Promise<Order> {
let pastryPromises: Promise<Pastry>[] = [];
for (var i=0; i<orderInfo.productQuantities.length; i++) {
let productQuantitiy = orderInfo.productQuantities[i];
pastryPromises.push(this.pastryService.getPastry(productQuantitiy.productName));
}
let pastries: PromiseSettledResult<Pastry>[] = await Promise.allSettled(pastryPromises)
for (var i=0; i<pastries.length; i++) {
let pastry = pastries[i];
if (pastry.status === 'fulfilled') {
if (pastry.value.status != 'available') {
throw new UnavailablePastryError("Pastry " + pastry.value.name + " is not available", pastry.value.name);
}
}
}
let result = new Order();
result.customerId = orderInfo.customerId;
result.productQuantities = orderInfo.productQuantities;
result.totalPrice = orderInfo.totalPrice;
// Persist and publish creation event.
let orderEvent = new OrderEvent();
orderEvent.timestamp = Date.now();
orderEvent.order = result;
orderEvent.changeReason = 'Creation';
this.persistOrderEvent(orderEvent);
this.orderEventPublisher.publishOrderCreated(orderEvent)
return result;
}
/**
*
* @param id
* @returns
* @throws {OrderNotFoundException}
*/
getOrder(id: string): Order {
let orderEvents = this.orderEventsRepository.get(id);
if (orderEvents != undefined) {
return orderEvents[orderEvents.length - 1].order;
}
throw new OrderNotFoundException(id);
}
updateReviewedOrder(event: OrderEvent): void {
this.persistOrderEvent(event);
}
private persistOrderEvent(event: OrderEvent): void {
let orderEvents = this.orderEventsRepository.get(event.order.id);
if (orderEvents == undefined) {
orderEvents = [];
}
orderEvents.push(event);
this.orderEventsRepository.set(event.order.id, orderEvents);
}
}