agmission/Development/server/controllers/vehicle.js

96 lines
2.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'),
{ 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
}