Search pagination

This commit is contained in:
Selim Mustafaev 2021-01-07 16:46:01 +03:00
parent f34a3039c5
commit 3f9517c542
6 changed files with 61 additions and 8 deletions

View File

@ -16,8 +16,6 @@ const dotenvExpand = require('dotenv-expand');
let dotenvConf = dotenv.config(); let dotenvConf = dotenv.config();
dotenvExpand(dotenvConf); dotenvExpand(dotenvConf);
console.log(process.env);
app.use(compression()); app.use(compression());
app.use(bodyParser.json()); app.use(bodyParser.json());
app.use(expressMongoDb(process.env.MONGO_CONNECTION_STRING)); app.use(expressMongoDb(process.env.MONGO_CONNECTION_STRING));

27
migration.js Normal file
View File

@ -0,0 +1,27 @@
const MongoClient = require('mongodb').MongoClient;
const dotenv = require('dotenv');
const dotenvExpand = require('dotenv-expand');
let dotenvConf = dotenv.config();
dotenvExpand(dotenvConf);
async function addUpdatedDate() {
let client = await MongoClient.connect(process.env.MONGO_CONNECTION_STRING, { useUnifiedTopology: true });
let db = client.db('autocatdev');
let collection = db.collection('vehicles');
let vehicles = await collection.find().toArray();
for(let vehicle of vehicles) {
let updatedDate = vehicle.addedDate;
if(vehicle.events.length > 0) {
let lastEvent = vehicle.events.reduce((acc, cur) => acc.date > cur.date ? acc : cur);
updatedDate = Math.max(1000*lastEvent.date, vehicle.addedDate);
}
console.log(updatedDate);
await collection.updateOne({ _id: vehicle._id }, { $set: { updatedDate } });
}
}
(async () => {
await addUpdatedDate();
console.log('====== Done ======');
})();

View File

@ -59,6 +59,7 @@ class Vehicle {
v.isJapanese = report.is_japanese_vehicle; v.isJapanese = report.is_japanese_vehicle;
v.addedDate = Date.now(); v.addedDate = Date.now();
v.updatedDate = v.addedDate;
v.events = []; v.events = [];
v.debugInfo = { v.debugInfo = {
@ -102,6 +103,7 @@ class Vehicle {
}); });
v.addedDate = Date.now(); v.addedDate = Date.now();
v.updatedDate = v.addedDate;
v.events = []; v.events = [];
v.debugInfo = { v.debugInfo = {
@ -163,6 +165,7 @@ class Vehicle {
}); });
v.addedDate = Date.now(); v.addedDate = Date.now();
v.updatedDate = v.addedDate;
v.events = []; v.events = [];
v.debugInfo = { v.debugInfo = {

View File

@ -4,7 +4,8 @@
"description": "AutoCat app backend", "description": "AutoCat app backend",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"server": "node --async-stack-traces --trace-warnings index.js", "server": "node --async-stack-traces --trace-warnings index.js",
"migration": "node --async-stack-traces --trace-warnings migration.js",
"test": "echo \"Error: no test specified\" && exit 1" "test": "echo \"Error: no test specified\" && exit 1"
}, },
"author": "Selim Mustafaev", "author": "Selim Mustafaev",

View File

@ -12,6 +12,7 @@ router.post('/', async (req, res) => {
event.id = uuidv4(); event.id = uuidv4();
let collection = req.db.collection('vehicles'); let collection = req.db.collection('vehicles');
await collection.updateOne({ number }, { $push: { events: event } }); await collection.updateOne({ number }, { $push: { events: event } });
await collection.updateOne({ number }, { $set: { updatedDate: Date.now() } });
let vehicle = await collection.findOne({ number }); let vehicle = await collection.findOne({ number });
if(vehicle) { if(vehicle) {
res.send({ success: true, data: vehicle }); res.send({ success: true, data: vehicle });
@ -34,7 +35,7 @@ router.delete('/', async (req, res) => {
let index = vehicle.events.findIndex(e => e.id == eventId); let index = vehicle.events.findIndex(e => e.id == eventId);
if(index >= 0) { if(index >= 0) {
vehicle.events.splice(index, 1); vehicle.events.splice(index, 1);
await collection.updateOne({ number: vehicle.number }, { $set: { events: vehicle.events } }); await collection.updateOne({ number: vehicle.number }, { $set: { events: vehicle.events, updatedDate: Date.now() } });
} }
res.send({ success: true, data: vehicle }); res.send({ success: true, data: vehicle });
} else { } else {
@ -56,7 +57,7 @@ router.put('/', async (req, res) => {
let index = vehicle.events.findIndex(e => e.id == event.id); let index = vehicle.events.findIndex(e => e.id == event.id);
if(index >= 0) { if(index >= 0) {
vehicle.events[index] = event; vehicle.events[index] = event;
await collection.updateOne({ number: vehicle.number }, { $set: { events: vehicle.events } }); await collection.updateOne({ number: vehicle.number }, { $set: { events: vehicle.events, updatedDate: Date.now() } });
res.send({ success: true, data: vehicle }); res.send({ success: true, data: vehicle });
} else { } else {
res.send(makeError('Event not found')); res.send(makeError('Event not found'));

View File

@ -8,6 +8,7 @@ const { regions } = require('../data_providers/constants');
const RsaProvider = require('../data_providers/rsa'); const RsaProvider = require('../data_providers/rsa');
const NomerogramProvider = require('../data_providers/nomerogram'); const NomerogramProvider = require('../data_providers/nomerogram');
const Utils = require('../utils'); const Utils = require('../utils');
const ObjectId = require('mongodb').ObjectID;
const makeError = error => ({ success: false, error }); const makeError = error => ({ success: false, error });
@ -81,6 +82,7 @@ router.post('/check', async (req, res) => {
// In case of force update of existing vehicle, transfer all events to the new DB record // In case of force update of existing vehicle, transfer all events to the new DB record
if (vehicles.length > 0) { if (vehicles.length > 0) {
vehicle.addedDate = vehicles[0].addedDate;
vehicle.events = vehicles[0].events; vehicle.events = vehicles[0].events;
vehicle.osagoContracts = vehicles[0].osagoContracts; vehicle.osagoContracts = vehicles[0].osagoContracts;
} }
@ -95,14 +97,35 @@ router.post('/check', async (req, res) => {
}); });
router.get('/', async (req, res) => { router.get('/', async (req, res) => {
const { limit } = req.query;
const { email } = req.user; const { email } = req.user;
const { pageToken } = req.query;
const pageSize = 50;
try { try {
let finalQuery = Utils.makeVehiclesSearchQuery(req.query, email); let finalQuery = Utils.makeVehiclesSearchQuery(req.query, email);
let collection = req.db.collection('vehicles'); let collection = req.db.collection('vehicles');
let vehicles = await collection.find(finalQuery).sort({ addedDate: -1 }).limit(parseInt(limit ?? 0)).toArray();
res.send({ success: true, data: vehicles }); let response = {};
if(!pageToken) {
response.count = await collection.countDocuments(finalQuery);
} else {
let lastVehicle = await collection.findOne({ _id: ObjectId(pageToken) });
finalQuery.$or = [
{ updatedDate: { $lt: lastVehicle.updatedDate } },
{
updatedDate: lastVehicle.updatedDate,
_id: { $lt: ObjectId(pageToken) }
}
];
}
let vehicles = await collection.find(finalQuery).sort({ updatedDate: -1 }).limit(pageSize).toArray();
if(vehicles.length == pageSize) {
response.pageToken = vehicles[vehicles.length - 1]._id;
}
response.items = vehicles;
res.send({ success: true, data: response });
} catch(ex) { } catch(ex) {
res.send(makeError('Error reading vehicles from DB')); res.send(makeError('Error reading vehicles from DB'));
console.error(ex); console.error(ex);