У меня есть модели Order
и OrderItems
, где, когда я добавляю заказ, также должны добавляться элементы заказа. Элементы заказа добавляются, но столбец внешнего ключа пуст
Объект заказа
@Entity('orders')
export class OrderEntity {
@PrimaryGeneratedColumn('uuid') order_id: string
@Column('text') customer_email: string
@CreateDateColumn() created_date: Date
@Column('text') status: string
@Column('decimal') amount: number
@Column('integer') quantity: number
@Column({ type: 'integer', nullable: true }) previous_quantity: number
@OneToMany(type => InventoryEntity, inventory => inventory.order) inventories: InventoryEntity[];
@OneToMany(type => OrderItemEntity, order_item => order_item.order) order_items: OrderItemEntity[];
}
Элемент элементов заказа
@Entity('orders_items')
export class OrderItemEntity {
@PrimaryGeneratedColumn('uuid') order_item_id: string
@CreateDateColumn() created_date: Date
@Column('integer') quantity: number
@Column({ type: 'integer', nullable: true }) previous_quantity: number
@ManyToOne(type => OrderEntity, order => order.order_items)
@JoinColumn({ name: 'order_id' })
order: OrderEntity[];
}
Служба заказа
export class OrderService {
constructor(
@InjectRepository(OrderEntity) private orderRepository: Repository<OrderEntity>,
private inventoryService: InventoryService,
private orderItemService: OrderItemService) { }
/**
* Add order item
* @param data Object
*/
async add(data: OrderDTO) {
const inventoryItems = []
let quantityOfAllItemsRequested = 0;
let priceOfAllItemsRequested = 0;
// extract req data
const { inventories, customer_email } = data
// loop through all inventory items and put them into an array
await Promise.each(inventories, async item => {
const { name, quantity } = item
// get inventory info for the specified item
const inventoryItem = await this.inventoryService.getOneByName(name)
// check if there is enough inventory to make order
if (inventoryItem.quantity_available <= 0 || quantity > inventoryItem.quantity_available) {
throw new Error(`Cannot add ${name} to order, insufficient quantities!`)
}
// add item to array
if (inventoryItem) {
inventoryItems.push(inventoryItem)
}
const amountForOneItem = inventoryItem.price * quantity
priceOfAllItemsRequested += amountForOneItem
quantityOfAllItemsRequested += quantity
})
// new order object
const newOrder = {
status: 'created',
customer_email,
amount: priceOfAllItemsRequested,
quantity: quantityOfAllItemsRequested,
inventories: inventoryItems,
}
// create new order
const createdOrder = await this.orderRepository.create(newOrder)
await this.orderRepository.save(createdOrder)
// if the order was succesfully created, update inventory
if (createdOrder) {
// loop through each item and update the inventory entity
await Promise.each(createdOrder.inventories, async updatedItem => {
await Promise.each(inventories, async originalItem => {
// calculate new quantity available
const updatedInventoryItemQuantity = updatedItem.quantity_available - originalItem.quantity
// create order item
await this.orderItemService.add({
quantity: originalItem.quantity,
previous_quantity: 0,
order_id: createdOrder.order_id,
})
// update inventory
await this.inventoryService.edit(updatedItem.inventory_id, {
quantity_available: updatedInventoryItemQuantity,
})
})
})
}
// save created order changes to database
await this.orderRepository.save(createdOrder)
return createdOrder
}
}
Служба заказа товара
async add(data: OrderItemDTO) {
const orderItem = await this.orderItemRepository.create(data)
await this.orderItemRepository.save(orderItem)
return orderItem
}
Может кто-нибудь увидеть проблему?