AutoCatBackend/routes/events.js

100 lines
2.8 KiB
JavaScript

const express = require('express');
const router = express.Router();
const { v4: uuidv4 } = require('uuid');
const Utils = require('../utils/utils');
const makeError = error => ({ success: false, error });
router.post('/', async (req, res) => {
const { number, event } = req.body;
try {
event.id = uuidv4();
let collection = req.db.collection('vehicles');
await collection.updateOne({ number }, { $push: { events: event } });
await collection.updateOne({ number }, { $set: { updatedDate: Date.now() } });
let vehicle = await collection.findOne({ number });
if(vehicle) {
res.send({ success: true, data: vehicle });
} else {
res.status(204).send(makeError('There is no vehicle with such plate number'));
}
} catch(ex) {
res.send(makeError(ex.message));
console.error(ex);
}
});
router.delete('/', async (req, res) => {
const { eventId } = req.body;
try {
let collection = req.db.collection('vehicles');
let vehicle = await collection.findOne({ 'events.id': eventId });
if(vehicle) {
let index = vehicle.events.findIndex(e => e.id == eventId);
if(index >= 0) {
vehicle.events.splice(index, 1);
await collection.updateOne({ number: vehicle.number }, { $set: { events: vehicle.events, updatedDate: Date.now() } });
}
res.send({ success: true, data: vehicle });
} else {
res.send(makeError('There is no vehicle with such event'));
}
} catch(ex) {
res.send(makeError(ex.message));
console.error(ex);
}
});
router.put('/', async (req, res) => {
const { event } = req.body;
try {
let collection = req.db.collection('vehicles');
let vehicle = await collection.findOne({ 'events.id': event.id });
if(vehicle) {
let index = vehicle.events.findIndex(e => e.id == event.id);
if(index >= 0) {
vehicle.events[index] = event;
await collection.updateOne({ number: vehicle.number }, { $set: { events: vehicle.events, updatedDate: Date.now() } });
res.send({ success: true, data: vehicle });
} else {
res.send(makeError('Event not found'));
}
} else {
res.send(makeError('There is no vehicle with such event'));
}
} catch(ex) {
res.send(makeError(ex.message));
console.error(ex);
}
});
router.get('/', async (req, res) => {
const { email } = req.user;
try {
let finalQuery = Utils.makeVehiclesSearchQuery(req.query, email);
let collection = req.db.collection('vehicles');
let vehicles = await collection.find(finalQuery, { number: 1, events: 1 }).toArray();
let events = [];
for(let vehicle of vehicles) {
if(!vehicle.events) {
continue;
}
for(let event of vehicle.events) {
event.number = vehicle.number;
}
events = events.concat(vehicle.events);
}
res.send({ success: true, data: events });
} catch(ex) {
res.send(makeError(ex.message));
console.error(ex);
}
});
module.exports = router;