'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'), { Errors, UserTypes } = 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 id = req.params.id; if (!ObjectId.isValid(id)) AppParamError.throw(); const vehicle = await Vehicle.findOne({ _id: ObjectId(id) }, null, { lean: true }); res.json(vehicle); } // Update vehicle (reuses user controller logic) async function updateVehicle_put(req, res) { if (!req.body.kind) { req.body.kind = UserTypes.DEVICE; } // Reuse the user controller's updateUser_put function directly return userCtl.updateUser_put(req, res); } async function deleteVehicle(req, res) { const id = req.params.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 updateVehicles_post(req, res) { const input = req.body; if (!input || utils.isEmptyArray(input)) res.json(null); const updateCmds = [], updatingIds = []; for (const vehicle of input) { const vehId = ObjectId(vehicle._id); updatingIds.push(vehId); delete vehicle._id; delete vehicle.__v; updateCmds.push({ updateOne: { filter: { _id: vehId }, update: vehicle } }); } await Vehicle.bulkWrite(updateCmds); const updatedVehicles = await Vehicle.find({ _id: { $in: updatingIds } }, '-password -v'); res.json(updatedVehicles); } 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); } module.exports = { createVehicle_post, getVehicle_get, updateVehicle_put, deleteVehicle, search_post, unitIdExists_post, updateVehicles_post }