Your IP : 216.73.216.220


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

import { Model } from 'mongoose';
import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Route, RouteDocument } from './route.schema';
import { Params } from 'src/common/interfaces/params';
import { Filter } from 'src/common/interfaces/filter';
import { Order, OrderDocument } from '../orders/order.schema';

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

  async create(route: Route): Promise<Route> {
    const createdRoute = new this.routeModel(route);
    return createdRoute.save();
  }

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

  async update(id: string, route: Route): Promise<Route> {
    return await this.routeModel.findByIdAndUpdate(id, route, {
      new: true,
    });
  }

  async readAll(params: Params): Promise<Route[]> {
    const filter: Filter = {};
    // populate carrier filter
    if (params.carrier) {
      filter.carrier = params.carrier;
    }
    // populate date filter
    if (params.date) {
      const date = new Date(params.date);
      // return exception if the date is not correct
      if (isNaN(date.getTime())) {
        throw new HttpException(
          {
            status: HttpStatus.UNPROCESSABLE_ENTITY,
            error: 'Date must have this format YYYY-MM-DD',
          },
          HttpStatus.UNPROCESSABLE_ENTITY,
        );
      }
      const startDate = new Date(
        date.getFullYear(),
        date.getMonth(),
        date.getDate(),
      );
      const endDate = new Date(
        date.getFullYear(),
        date.getMonth(),
        date.getDate() + 1,
      );
      filter.createdAt = { $gte: startDate, $lte: endDate };
    }

    const routes = await this.routeModel
      .find(filter)
      .populate('addresses.deliverOrders addresses.pickupOrders')
      .exec();

    // populate 'addresses.deliverOrders' and 'addresses.pickupOrders'
    for (const route of routes) {
      for (const address of route.addresses) {
        for (let i = 0; i < address.deliverOrders.length; i++) {
          address.deliverOrders[i] = await this.orderModel.findById(
            address.deliverOrders[i],
          );
        }
        for (let i = 0; i < address.pickupOrders.length; i++) {
          address.pickupOrders[i] = await this.orderModel.findById(
            address.pickupOrders[i],
          );
        }
      }
    }
    return routes;
  }

  async readById(id: string): Promise<Route> {
    return await this.routeModel
      .findById(id)
      .populate('addresses.deliverOrders addresses.pickupOrders')
      .exec();
  }
}