'use strict'; const Job = require('../model/job'), Vehicle = require('../model/vehicle'), ObjectId = require('mongodb').ObjectId, userCtl = require('../controllers/user'), cache = require('../helpers/mem_cache'), utils = require('../helpers/utils'), moment = require('moment'), { Errors } = require('../helpers/constants'), { AppParamError, AppError } = require('../helpers/app_error'); async function createVehicle_post(req, res) { // Save/Create a vehicle const _vehicle = req.body; delete _vehicle._id; await userCtl.ensureParentExists(_vehicle); const newVehicle = new Vehicle(_vehicle); const vehicle = await newVehicle.save(); res.json(vehicle); } async function getVehicle_get(req, res) { const cId = req.params.vehicle_id; if (!ObjectId.isValid(cId)) AppParamError.throw(); const vehicle = await Vehicle.findOne({ _id: ObjectId(cId) }, null, { lean: true }); res.json(vehicle); } async function updateVehicle_put(req, res) { const _vehicle = req.body; if (!_vehicle || !utils.isObjectId(_vehicle._id)) AppParamError.throw(); if (utils.isBlank(_vehicle.username) && !utils.isBlank(_vehicle.password)); _vehicle.password = undefined; if (!_vehicle.hasOwnProperty('active')) _vehicle.active = true; const vehicle = await Vehicle.findOneAndUpdate({ _id: ObjectId(_vehicle._id) }, _vehicle, { runValidators: true, new: true, lean: true }) res.json(vehicle); } async function deleteVehicle(req, res) { const _id = req.params.vehicle_id; if (!utils.isObjectId(_id)) AppParamError.throw(); const nOfJobs = await Job.countDocuments({ 'vehicle': ObjectId(_id) }); if (nOfJobs) AppError.throw(Errors.HAS_REFERENCE); const vehicle = await Vehicle.findById(ObjectId(_id)); if (vehicle) await vehicle.removeFull(); cache.delete(_id); res.json({ ok: true }); } async function findVehiclesByPuid(puid) { if (utils.isObjectId(puid)) { return await Vehicle.find({ parent: ObjectId(puid), markedDelete: { $ne: true } }, "-password", { lean: true }); } return []; } async function search_post(req, res) { if (!req.body || !utils.isObjectId(req.body.byUserId)) AppParamError.throw(); const vehicles = await findVehiclesByPuid(req.body.byUserId); res.json(vehicles); } async function unitIdExists_post(req, res) { if (!req.body || !req.body.unitId) AppParamError.throw(); const user = await Vehicle.findOne({ unitId: { $regex: new RegExp(`^${req.body.unitId}$`, 'i') }, markedDelete: { $ne: true } }); res.json(user ? 1 : 0); } /** * Set enable Tracking for vehicles by UnitId. * @param {*} req { trackingUIds : [ ], deTrackingRest: boolean [default=false] } * @param {*} res List of (of the applicator) vehicles */ async function setTracking_post(req, res) { const input = req.body; const userInfo = req.userInfo; const updateCmds = []; const updatingIds = (!utils.isEmptyArray(input.trackingUIds)) ? input.trackingUIds : []; if (updatingIds.length) updateCmds.push({ updateMany: { filter: { parent: ObjectId(userInfo.puid), markedDelete: { $ne: true }, unitId: { $in: updatingIds } }, update: { tracking: true, trackonDate: new moment.utc().toDate() } } }); if (utils.stringToBoolean(input.deTrackingRest)) updateCmds.push({ updateMany: { filter: { parent: ObjectId(userInfo.puid), markedDelete: { $ne: true }, unitId: { $nin: updatingIds } }, update: { tracking: false } } }); updateCmds.length && (await Vehicle.bulkWrite(updateCmds)); const applVehicles = await findVehiclesByPuid(userInfo.puid); res.json(applVehicles); } /** * Set active vehicles by Id. * @param {*} req { activeIds: [ ], deActiveRest: boolean [default=false] } * @param {*} res List of (of the applicator) vehicles */ async function setActive_post(req, res) { const input = req.body; const userInfo = req.userInfo; const updateCmds = [], updatingIds = []; if (!utils.isEmptyArray(input.activeIds)) { for (let i = 0; i < input.activeIds.length; i++) { const uVeId = input.activeIds[i]; if (utils.isObjectId(uVeId)) updatingIds.push(ObjectId(uVeId)); } } if (updatingIds.length) updateCmds.push({ updateMany: { filter: { parent: ObjectId(userInfo.puid), markedDelete: { $ne: true }, _id: { $in: updatingIds } }, update: { active: true } } }); if (utils.stringToBoolean(input.deActiveRest)) updateCmds.push({ updateMany: { filter: { parent: ObjectId(userInfo.puid), markedDelete: { $ne: true }, _id: { $nin: updatingIds } }, update: { active: false } } }); updateCmds.length && (await Vehicle.bulkWrite(updateCmds)); const applVehicles = await findVehiclesByPuid(userInfo.puid); res.json(applVehicles); } module.exports = { createVehicle_post, getVehicle_get, updateVehicle_put, deleteVehicle, search_post, unitIdExists_post, setTracking_post, setActive_post }