gpstracker/src/routes/api/v1/GPSData.ts

76 lines
2.3 KiB
TypeScript

import { Request, Response } from 'express';
import { authenticate } from '../../../auth';
import { AuthInfo } from '../../../auth';
import { LocationRequest } from '../../../requests';
import { Optional } from '../../../types';
import { GPSPoint, RoleName } from '../../../models';
import ApiV1Route from './Route';
class GPSData extends ApiV1Route {
constructor() {
super('/gpsdata');
}
private validateOwnership = async (deviceIds: string[], auth: AuthInfo) => {
const user = auth.user;
const notOwnedDevices = (await $repos.userDevices.getAll(deviceIds))
.filter((d) => d.userId !== user.id);
if (notOwnedDevices.length > 0) {
authenticate([RoleName.Admin]);
}
};
@authenticate()
get = async (req: Request, res: Response) => {
let query: LocationRequest
try {
// TODO Limit to the points that the user has access to
query = new LocationRequest(req.query);
} catch (error) {
const e = `Error parsing query: ${error}`;
console.warn(e);
res.status(400).send(e);
return;
}
const gpsData = await $repos.location.getHistory(query);
res.json(gpsData);
}
@authenticate()
post = async (req: Request, res: Response, auth: Optional<AuthInfo>) => {
const deviceIds = req.body.map((p: any) => p.deviceId).filter((d: any) => !!d);
this.validateOwnership(deviceIds, auth!);
await $repos.location.createPoints(req.body);
res.status(201).send();
}
@authenticate()
patch = async (req: Request, res: Response, auth: Optional<AuthInfo>) => {
const points = (req.body as GPSPoint[]).map((p) => {
const descr = p.description?.trim()
p.description = descr?.length ? descr : null;
return p;
});
const deviceIds = points.map((p: any) => p.deviceId).filter((d: any) => !!d);
this.validateOwnership(deviceIds, auth!);
await $repos.location.updatePoints(points);
res.status(204).send();
}
@authenticate()
delete = async (req: Request, res: Response, auth: Optional<AuthInfo>) => {
const pointIds = req.body as number[];
const points = await $repos.location.getByIds(pointIds);
const deviceIds = points.map((p) => p.deviceId);
this.validateOwnership(deviceIds, auth!);
await $repos.location.deletePoints(pointIds);
res.status(204).send();
}
}
export default GPSData;