76 lines
2.3 KiB
TypeScript
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;
|