Frontend can now filter with timespan
This commit is contained in:
@@ -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' });
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user