diff --git a/backend/src/order/interface/order-service.interface.ts b/backend/src/order/interface/order-service.interface.ts index 6b28a038..d9128c6f 100644 --- a/backend/src/order/interface/order-service.interface.ts +++ b/backend/src/order/interface/order-service.interface.ts @@ -1,16 +1,12 @@ -import { Audit, Result } from 'src/domain'; +import { Types } from 'mongoose'; +import { Result } from 'src/domain'; +import { OrderNote } from 'src/order_notes/order_note'; import { CreateCartItemsDTO, CreateOrderDTO } from '../dto/create-order.dto'; -import { IOrderResponseDTO } from '../order-response.dto'; import { Order } from '../order'; -import { Types } from 'mongoose'; -import { IOrderNoteResponseDTO } from 'src/order_notes/dto/order-note-response'; +import { IOrderResponseDTO } from '../order-response.dto'; export interface IOrderService { createOrder(orderSummary: CreateOrderDTO): Promise>; getOrders(): Promise>; - createOrderNotes( - cartItems: CreateCartItemsDTO[], - orderId: Types.ObjectId, - audit: Audit, - ): Promise; + createOrderNotes(cartItems: CreateCartItemsDTO[], orderId: Types.ObjectId): Promise; } diff --git a/backend/src/order/order.module.ts b/backend/src/order/order.module.ts index 119f4b13..4d7f4788 100644 --- a/backend/src/order/order.module.ts +++ b/backend/src/order/order.module.ts @@ -37,6 +37,7 @@ import { OrderStatusMapper } from 'src/order_statuses/order_status.mapper'; import { OrderNoteMapper } from 'src/order_notes/order_note.mapper'; import { OrderNoteRepository } from 'src/infrastructure/data_access/repositories/order-note.repository'; import { OrderNoteModel, OrderNoteSchema } from 'src/infrastructure/data_access/repositories/schemas/order-note.schema'; +import { OrderNoteService } from 'src/order_notes/order_note.service'; @Module({ imports: [ @@ -60,6 +61,7 @@ import { OrderNoteModel, OrderNoteSchema } from 'src/infrastructure/data_access/ { provide: TYPES.IValidateUser, useClass: ValidateUser }, { provide: TYPES.IOrderStatusRepository, useClass: OrderStatusRepository }, { provide: TYPES.IOrderNoteRepository, useClass: OrderNoteRepository }, + { provide: TYPES.IOrderNoteService, useClass: OrderNoteService }, MerchantRepository, CartItemRepository, SelectedCartItemRepository, diff --git a/backend/src/order/order.parser.ts b/backend/src/order/order.parser.ts index a4530a96..02ad773d 100644 --- a/backend/src/order/order.parser.ts +++ b/backend/src/order/order.parser.ts @@ -1,10 +1,11 @@ -import { IOrderNoteResponseDTO } from 'src/order_notes/dto/order-note-response'; +import { OrderNote } from 'src/order_notes/order_note'; +import { OrderNoteParser } from 'src/order_notes/order_note_parser'; import { AuditParser } from './../audit/audit.parser'; import { Order } from './order'; import { IOrderResponseDTO } from './order-response.dto'; export class OrderParser { - static createOrderResponse(order: Order, notes?: IOrderNoteResponseDTO[]): IOrderResponseDTO { + static createOrderResponse(order: Order, notes?: OrderNote[]): IOrderResponseDTO { const { id, state, type, merchantId, customerId, total, discount, orderManagerId, audit } = order; return { id, @@ -15,7 +16,7 @@ export class OrderParser { total, discount, orderManagerId, - notes, + notes: OrderNoteParser.createOrderNotesResponse(notes), ...AuditParser.createAuditResponse(audit), }; } diff --git a/backend/src/order/order.service.ts b/backend/src/order/order.service.ts index 551e14ed..8321863c 100644 --- a/backend/src/order/order.service.ts +++ b/backend/src/order/order.service.ts @@ -1,17 +1,22 @@ import { OrderNoteMapper } from 'src/order_notes/order_note.mapper'; import { HttpStatus, Inject } from '@nestjs/common'; +import { Types } from 'mongoose'; import { TYPES } from 'src/application'; import { CartItem } from 'src/cart/cart-item'; import { SelectedCartItem } from 'src/cart/selectedItems/selectedCartItem'; import { Audit, Result } from 'src/domain'; import { Context, IContextService, MerchantRepository } from 'src/infrastructure'; import { ICartItemRepository } from 'src/infrastructure/data_access/repositories/interfaces/cart-item-repository.interface'; +import { IOrderNoteRespository } from 'src/infrastructure/data_access/repositories/interfaces/order-note.repository'; import { IOrderRepository } from 'src/infrastructure/data_access/repositories/interfaces/order-repository.interface'; +import { IOrderStatusRespository } from 'src/infrastructure/data_access/repositories/interfaces/order-status.repository'; import { CartItemDataModel } from 'src/infrastructure/data_access/repositories/schemas/cartItem.schema'; import { OrderDataModel } from 'src/infrastructure/data_access/repositories/schemas/order.schema'; import { SelectedCartItemRepository } from 'src/infrastructure/data_access/repositories/selected-cart-item.repository'; import { throwApplicationError } from 'src/infrastructure/utilities/exception-instance'; import { IMerchantService, Merchant } from 'src/merchant'; +import { IOrderNoteService } from 'src/order_notes/interface/order-note-service.interface'; +import { OrderNote } from 'src/order_notes/order_note'; import { CartItemMapper } from './../cart/cart-item.mapper'; import { SelectedCartItemMapper } from './../cart/selectedItems/selected-cart-item.mapper'; import { CreateCartItemsDTO, CreateOrderDTO } from './dto/create-order.dto'; @@ -20,12 +25,6 @@ import { Order } from './order'; import { IOrderResponseDTO } from './order-response.dto'; import { OrderMapper } from './order.mapper'; import { OrderParser } from './order.parser'; -import { IOrderStatusRespository } from 'src/infrastructure/data_access/repositories/interfaces/order-status.repository'; -import { OrderNote } from 'src/order_notes/order_note'; -import { IOrderNoteRespository } from 'src/infrastructure/data_access/repositories/interfaces/order-note.repository'; -import { OrderNoteParser } from 'src/order_notes/order_note_parser'; -import { IOrderNoteResponseDTO } from 'src/order_notes/dto/order-note-response'; -import { Types } from 'mongoose'; export class OrderService implements IOrderService { private context: Context; @@ -43,6 +42,7 @@ export class OrderService implements IOrderService { @Inject(TYPES.ICartItemRepository) private readonly cartItemRepository: ICartItemRepository, @Inject(TYPES.IOrderStatusRepository) private readonly orderStatusRespository: IOrderStatusRespository, @Inject(TYPES.IOrderNoteRepository) private readonly orderNoteRepository: IOrderNoteRespository, + @Inject(TYPES.IOrderNoteService) private readonly orderNoteService: IOrderNoteService, ) { this.context = this.contextService.getContext(); } @@ -116,13 +116,11 @@ export class OrderService implements IOrderService { const insertedItems: Result = await this.selectedCartItemRepository.insertMany( selectedCartItemsDataModel, ); - let response: IOrderResponseDTO | undefined; - const notes = await this.createOrderNotes(cartItems, orderId, audit); - if (insertedItems.isSuccess) { - response = OrderParser.createOrderResponse(savedOrder, notes); - } else { + const notes = await this.createOrderNotes(cartItems, orderId); + if (!insertedItems.isSuccess) { throwApplicationError(HttpStatus.INTERNAL_SERVER_ERROR, `Could not create an order`); } + const response: IOrderResponseDTO | undefined = OrderParser.createOrderResponse(savedOrder, notes); const savedSelectedItems = insertedItems.getValue(); const savedItemsMap = savedSelectedItems.reduce((map, item) => { const cartItemIdToString = this.cartItemRepository.objectIdToString(item.cartItemId); @@ -150,29 +148,15 @@ export class OrderService implements IOrderService { return await this.orderRepository.find({}); } - async createOrderNotes( - cartItems: CreateCartItemsDTO[], - orderId: Types.ObjectId, - audit: Audit, - ): Promise { - try { - const orderNotes = cartItems.map((item) => { - return { - menuId: item.menuId, - note: item.note ? item.note : '', - orderId: orderId, - }; - }); - const createOrderNotes: OrderNote[] = orderNotes.map((note) => OrderNote.create({ ...note, audit })); - const notesToBeSaved = createOrderNotes.map((note) => this.orderNoteMapper.toPersistence(note)); - const result: Result = await this.orderNoteRepository.insertMany(notesToBeSaved); - let response: IOrderNoteResponseDTO[] | undefined; - if (result.isSuccess) { - response = OrderNoteParser.createOrderStatusResponses(result.getValue()); - } - return response; - } catch (error) { - console.error(error); - } + async createOrderNotes(cartItems: CreateCartItemsDTO[], orderId: Types.ObjectId): Promise { + const orderNotes = cartItems.map((item) => { + return { + menuId: item.menuId, + note: item.note ? item.note : '', + orderId: orderId, + }; + }); + const notes = this.orderNoteService.createNotes(orderNotes); + return notes; } } diff --git a/backend/src/order_notes/interface/order-note-service.interface.ts b/backend/src/order_notes/interface/order-note-service.interface.ts index 68c7a908..c7675d6c 100644 --- a/backend/src/order_notes/interface/order-note-service.interface.ts +++ b/backend/src/order_notes/interface/order-note-service.interface.ts @@ -1,9 +1,9 @@ import { Result } from 'src/domain'; import { CreateOrderNoteDTO } from '../dto/create-order_note.dto'; -import { IOrderNoteResponseDTO } from '../dto/order-note-response'; import { OrderNote } from '../order_note'; export interface IOrderNoteService { - createOrderNote(props: CreateOrderNoteDTO): Promise>; + createOrderNote(props: CreateOrderNoteDTO): Promise; getOrderNotes(): Promise>; + createNotes(props: CreateOrderNoteDTO[]): Promise; } diff --git a/backend/src/order_notes/order_note.service.ts b/backend/src/order_notes/order_note.service.ts index d30eab8c..ab60bce3 100644 --- a/backend/src/order_notes/order_note.service.ts +++ b/backend/src/order_notes/order_note.service.ts @@ -1,13 +1,12 @@ -import { Inject, Injectable } from '@nestjs/common'; +import { HttpStatus, Inject, Injectable } from '@nestjs/common'; import { TYPES } from 'src/application'; import { Audit, Result } from 'src/domain'; import { Context, IContextService } from 'src/infrastructure'; import { IOrderNoteRespository } from 'src/infrastructure/data_access/repositories/interfaces/order-note.repository'; -import { OrderNote } from './order_note'; -import { OrderNoteParser } from './order_note_parser'; +import { throwApplicationError } from 'src/infrastructure/utilities/exception-instance'; import { CreateOrderNoteDTO } from './dto/create-order_note.dto'; -import { IOrderNoteResponseDTO } from './dto/order-note-response'; import { IOrderNoteService } from './interface/order-note-service.interface'; +import { OrderNote } from './order_note'; @Injectable() export class OrderNoteService implements IOrderNoteService { @@ -19,13 +18,24 @@ export class OrderNoteService implements IOrderNoteService { ) { this.context = this.contextService.getContext(); } - async createOrderNote(props: CreateOrderNoteDTO): Promise> { + async createOrderNote(props: CreateOrderNoteDTO): Promise { const audit: Audit = Audit.createInsertContext(this.context); const orderNoteEntity = OrderNote.create({ ...props, audit }); const result = await this.orderNoteRepository.createOrderNote(orderNoteEntity); + if (!result) { + throwApplicationError(HttpStatus.INTERNAL_SERVER_ERROR, `Could not create order note`); + } const orderNote = result.getValue(); - const response: IOrderNoteResponseDTO = OrderNoteParser.createResponse(orderNote); - return Result.ok(response); + return orderNote; + } + + async createNotes(props: CreateOrderNoteDTO[]): Promise { + const notes = props.map((note) => this.createOrderNote(note)); + const result = await Promise.all(notes); + if (!result) { + throwApplicationError(HttpStatus.INTERNAL_SERVER_ERROR, `Could not create order notes`); + } + return result; } getOrderNotes(): Promise> { diff --git a/backend/src/order_notes/order_note_parser.ts b/backend/src/order_notes/order_note_parser.ts index b1edde53..c97b788a 100644 --- a/backend/src/order_notes/order_note_parser.ts +++ b/backend/src/order_notes/order_note_parser.ts @@ -7,7 +7,7 @@ export class OrderNoteParser { return { id, note, orderId, ...AuditParser.createAuditResponse(audit) }; } - static createOrderStatusResponses(orderNote: OrderNote[]): IOrderNoteResponseDTO[] { + static createOrderNotesResponse(orderNote: OrderNote[]): IOrderNoteResponseDTO[] { return orderNote.map((note) => { return this.createResponse(note); }); diff --git a/backend/src/order_processing_queue/interface/order-processing-queue-service.interface.ts b/backend/src/order_processing_queue/interface/order-processing-queue-service.interface.ts index 32042feb..8aaf1fbf 100644 --- a/backend/src/order_processing_queue/interface/order-processing-queue-service.interface.ts +++ b/backend/src/order_processing_queue/interface/order-processing-queue-service.interface.ts @@ -1,9 +1,8 @@ import { Result } from 'src/domain'; import { CreateOrderProcessingQueueDTO } from '../dto/create-order_processing_queue.dto'; -import { IOrderProcessingQueueResponseDTO } from '../dto/order-processing-queue.reponse'; import { OrderProcessingQueue } from '../order_processing_queue'; export interface IOrderProcessingQueueService { - createOrderProcessingQueue(props: CreateOrderProcessingQueueDTO): Promise>; + createOrderProcessingQueue(props: CreateOrderProcessingQueueDTO): Promise; getOrderProcessingQueues(): Promise>; } diff --git a/backend/src/order_processing_queue/order_processing_queue.service.ts b/backend/src/order_processing_queue/order_processing_queue.service.ts index ce0ad13c..60a8dc2f 100644 --- a/backend/src/order_processing_queue/order_processing_queue.service.ts +++ b/backend/src/order_processing_queue/order_processing_queue.service.ts @@ -1,13 +1,12 @@ -import { Inject, Injectable } from '@nestjs/common'; +import { HttpStatus, Inject, Injectable } from '@nestjs/common'; import { TYPES } from 'src/application'; import { Audit, Result } from 'src/domain'; import { Context, IContextService } from 'src/infrastructure'; +import { IOrderProcessingQueueRespository } from 'src/infrastructure/data_access/repositories/interfaces/order-processing-queue-repository.interface'; import { CreateOrderProcessingQueueDTO } from './dto/create-order_processing_queue.dto'; -import { IOrderProcessingQueueResponseDTO } from './dto/order-processing-queue.reponse'; import { IOrderProcessingQueueService } from './interface/order-processing-queue-service.interface'; import { OrderProcessingQueue } from './order_processing_queue'; -import { IOrderProcessingQueueRespository } from 'src/infrastructure/data_access/repositories/interfaces/order-processing-queue-repository.interface'; -import { OrderProcessingQueuewParser } from './order_processing_queue_parser'; +import { throwApplicationError } from 'src/infrastructure/utilities/exception-instance'; @Injectable() export class OrderProcessingQueueService implements IOrderProcessingQueueService { @@ -20,15 +19,23 @@ export class OrderProcessingQueueService implements IOrderProcessingQueueService ) { this.context = this.contextService.getContext(); } - async createOrderProcessingQueue( - props: CreateOrderProcessingQueueDTO, - ): Promise> { + async createOrderProcessingQueue(props: CreateOrderProcessingQueueDTO): Promise { const audit: Audit = Audit.createInsertContext(this.context); const orderProcessingQueueEntity = OrderProcessingQueue.create({ ...props, audit }); const result = await this.orderProcessingQueueRepository.createOrderProcessingQueue(orderProcessingQueueEntity); - const orderProcessingQueue = result.getValue(); - const response: IOrderProcessingQueueResponseDTO = OrderProcessingQueuewParser.createResponse(orderProcessingQueue); - return Result.ok(response); + if (!result) { + throwApplicationError(HttpStatus.INTERNAL_SERVER_ERROR, `Could not create order status queue`); + } + return result.getValue(); + } + + async createOrderProcessingQueues(props: CreateOrderProcessingQueueDTO[]): Promise { + const statusQueues = props.map((queue) => this.createOrderProcessingQueue(queue)); + const result = await Promise.all(statusQueues); + if (!result) { + throwApplicationError(HttpStatus.INTERNAL_SERVER_ERROR, `Could not create order status queue`); + } + return result; } getOrderProcessingQueues(): Promise> {