Frontend can now filter with timespan

This commit is contained in:
2020-10-23 22:08:54 +02:00
parent 13f8437f29
commit edaff8a3ec
29 changed files with 558 additions and 152 deletions

View File

@@ -92,6 +92,7 @@ async function run() {
/**
* Database connection
*/
mongoose.set('debug', true);
const connection = await mongoose.connect(MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true }).catch((err) => {
logger.crit("Database connection could not be made: ", err);
exit(1);

View File

@@ -1,30 +1,56 @@
import { Response } from "express";
import { logger } from "../app";
import { LivebeatRequest } from "../lib/request";
import { IBeat } from "../models/beat/beat.interface";
import { Beat } from "../models/beat/beat.model.";
import { Phone } from "../models/phone/phone.model";
export interface IFilter {
phone: string,
time: {
from: number,
to: number
},
max: number
}
export async function GetBeat(req: LivebeatRequest, res: Response) {
const filter: IFilter = req.body.filter as IFilter;
const from: number = Number(req.query.from);
const to: number = Number(req.query.to);
const preset: string = req.query.preset as string;
const phoneId = req.query.phoneId;
// If no filters are specified, we return the last 500 points. We take the first phone as default.
if (filter === undefined) {
const phone = await Phone.findOne({ user: req.user?._id });
logger.debug(`No filters were provided! Take ${phone?.displayName} as default.`);
const phone = req.query.phone === undefined ? await Phone.findOne({ user: req.user?._id }) : await Phone.findOne({ _id: phoneId, user: req.user?._id });
let beats: IBeat[] = []
if (phone !== undefined && phone !== null) {
logger.debug("Query for latest beats ...");
const beats = await Beat.find({ phone: phone._id }).limit(800).sort({ _id: -1 });
res.status(200).send(beats);
if (phone !== null) {
// If the battery preset is chosen, we only return documents where the battery status changed.
if (preset === 'battery') {
// Group documents under the battery percentage.
const batteryBeats = await Beat.aggregate([
{ $group: { _id: {battery: "$battery"}, uniqueIds: { $addToSet: "$_id" } } }
]).sort({ '_id.battery': -1 }).sort({ '_id.id': -1 });
// Loop though array and grab the first document where the battery percentage changed.
for (let i = 0; i < batteryBeats.length; i++) {
const firstId = batteryBeats[i].uniqueIds[0];
const firstBeat = await Beat.findById(firstId);
if (firstBeat !== null) {
beats.push(firstBeat);
}
}
} else {
// If no preset is chosen, get latest.
beats = await Beat.find({ phone: phone._id, createdAt: { $gte: new Date((from | 0) * 1000), $lte: new Date((to | Date.now() / 1000) * 1000) } }).sort({ _id: -1 });
}
// Check time
/*for (let i = 0; i < beats.length; i++) {
const beat = beats[i];
if (!isNaN(from) && !isNaN(to)) {
if (Math.floor(beat.createdAt!.getTime() / 1000) >= new Date(from).getTime() &&
Math.floor(beat.createdAt!.getTime() / 1000) <= new Date(to).getTime()) {}
else {
console.log(`${Math.floor(beat.createdAt!.getTime() / 1000)} is not in range`);
beats.splice(i, 1);
}
}
}*/
res.status(200).send(beats);
} else {
res.status(404).send({ message: 'Phone not found' });
}
}

View File

@@ -6,7 +6,8 @@ const schemaBeat = new Schema({
accuracy: { type: Number, required: false },
speed: { type: Number, required: false },
battery: { type: Number, required: false },
phone: { type: SchemaTypes.ObjectId, required: true, default: 'user' }
phone: { type: SchemaTypes.ObjectId, required: true, default: 'user' },
createdAt: { type: SchemaTypes.Date, required: false }
}, {
timestamps: {
createdAt: true

View File

@@ -158,6 +158,15 @@
"integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==",
"dev": true
},
"@types/moment": {
"version": "2.13.0",
"resolved": "https://registry.npmjs.org/@types/moment/-/moment-2.13.0.tgz",
"integrity": "sha1-YE69GJvDvDShVIaJQE5hoqSqyJY=",
"dev": true,
"requires": {
"moment": "*"
}
},
"@types/mongodb": {
"version": "3.5.28",
"resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.5.28.tgz",
@@ -1728,6 +1737,11 @@
"minimist": "^1.2.5"
}
},
"moment": {
"version": "2.29.1",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz",
"integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
},
"mongodb": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.2.tgz",

View File

@@ -26,6 +26,7 @@
"express": "^4.17.1",
"figlet": "^1.5.0",
"jsonwebtoken": "^8.5.1",
"moment": "^2.29.1",
"mongoose": "^5.10.9",
"ts-node": "^9.0.0",
"typescript": "^4.0.3",
@@ -45,6 +46,7 @@
"nodemon": "^2.0.5",
"@types/jsonwebtoken": "8.5.0",
"@types/amqplib": "0.5.14",
"@types/cors": "2.8.8"
"@types/cors": "2.8.8",
"@types/moment": "2.13.0"
}
}