156 lines
4.9 KiB
JavaScript
156 lines
4.9 KiB
JavaScript
'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 : [ <unitId: string> ], 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: [ <id: objectid in string> ], 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
|
|
} |