Your IP : 216.73.216.220


Current Path : /home/deltalab/PMS/logistic-backend/src/models/orders/
Upload File :
Current File : //home/deltalab/PMS/logistic-backend/src/models/orders/order.service.ts

import { Model } from 'mongoose';
import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Order, OrderDocument } from './order.schema';
import { RouteService } from '../routes/route.service';
import { Route } from '../routes/route.schema';
import { Params } from 'src/common/interfaces/params';

@Injectable()
export class OrderService {
  constructor(
    private routeService: RouteService,
    @InjectModel(Order.name)
    private orderModel: Model<OrderDocument>,
  ) {}

  async create(order: Order): Promise<Order> {
    const createdCat = new this.orderModel(order);
    return createdCat.save();
  }

  async delete(id: string): Promise<Order> {
    return await this.orderModel.findByIdAndRemove(id);
  }

  async update(id: string, order: Order): Promise<Order> {
    return await this.orderModel.findByIdAndUpdate(id, order, {
      new: true,
    });
  }

  async updateMany(orders: Order[]) {
    const updatedOrderIds = [];
    const bulk = this.orderModel.collection.initializeUnorderedBulkOp();
    orders.forEach((order) => {
      const orderToUpdate = new this.orderModel(order);
      bulk.find({ _id: orderToUpdate._id }).updateOne({ $set: orderToUpdate });
      updatedOrderIds.push(orderToUpdate._id);
    });
    await bulk.execute();
    const updatedOrders = [];
    for (let i = 0; i < updatedOrderIds.length; i++) {
      const updatedOrder = await this.readById(updatedOrderIds[i]);
      updatedOrders.push(updatedOrder);
    }
    return updatedOrders;
  }

  async readAll(params: Params): Promise<Order[]> {
    // find all routes according to params
    const routes: Route[] = await this.routeService.readAll(params);
    // save all the order IDs from each route
    const orderIds = [];
    for (const route of routes) {
      for (const address of route.addresses) {
        for (const pickupOrder of address.pickupOrders) {
          if (orderIds.indexOf(pickupOrder) === -1) {
            orderIds.push(pickupOrder);
          }
        }
      }
    }
    // find orders using order IDs
    const orders: Order[] = [];
    for (const orderId of orderIds) {
      const order: Order = await this.orderModel.findById(orderId);
      orders.push(order);
    }

    return orders;
  }

  async readById(id: number): Promise<Order> {
    return await this.orderModel.findById(id).exec();
  }
}