From 4bf034e6e30996b77db0f6cfbc0e2338205a9a09 Mon Sep 17 00:00:00 2001 From: Nathaniel Moschkin Date: Wed, 6 Dec 2023 14:52:30 -0500 Subject: [PATCH] add /voyagesByCrew route --- app/controllers/api.controller.ts | 23 ++++++++++++++++++ app/logic/api.ts | 12 +++++++++- app/logic/telemetry.ts | 40 +++++++++++++++++++++++++++++++ 3 files changed, 74 insertions(+), 1 deletion(-) diff --git a/app/controllers/api.controller.ts b/app/controllers/api.controller.ts index 0b07cb4..91d4db1 100644 --- a/app/controllers/api.controller.ts +++ b/app/controllers/api.controller.ts @@ -174,6 +174,29 @@ router.post('/telemetry', async (req: Request, res: Response, next) => { }); +router.get('/voyagesByCrew', async (req: Request, res: Response, next) => { + req.query.days ??= "31"; + if (!req.query || !req.query.days || !req.query.crew) { + res.status(400).send('Whaat?'); + return; + } + + try { + let cstr = req.query.crew.toString(); + let dstr = req.query.days.toString(); + if (!cstr?.length) { + res.status(400).send('Whaat?'); + return; + } + let crew = cstr.split(","); + let days = Number.parseInt(dstr); + + let apiResult = await DataCoreAPI.getVoyages(crew, days); + res.status(apiResult.Status).send(apiResult.Body); + } catch (e) { + next(e); + } +}); // Export the express.Router() instance to be used by server.ts export const ApiController: Router = router; diff --git a/app/logic/api.ts b/app/logic/api.ts index 207a315..c9ba4fe 100644 --- a/app/logic/api.ts +++ b/app/logic/api.ts @@ -6,7 +6,7 @@ import { sign, verify } from 'jsonwebtoken'; import { Logger, LogData } from './logger'; import { uploadProfile, loadProfileCache, loginUser, getDBIDbyDiscord } from './profiletools'; import { loadCommentsDB, saveCommentDB } from './commenttools'; -import { recordTelemetryDB, getTelemetryDB } from './telemetry'; +import { recordTelemetryDB, getTelemetryDB, voyageRawByDays } from './telemetry'; import { getSTTToken } from './stttools'; require('dotenv').config(); @@ -303,6 +303,16 @@ export class ApiClass { Body: result } } + + async getVoyages(crew: string[], days: number) { + if (days <= 0 || days > 31) days = 31; + Logger.info('Get voyages', { crew, days }); + let result = await voyageRawByDays(days, crew) + return { + Status: 200, + Body: result + } + } } export let DataCoreAPI = new ApiClass(); diff --git a/app/logic/telemetry.ts b/app/logic/telemetry.ts index 4b65bfa..eb7153a 100644 --- a/app/logic/telemetry.ts +++ b/app/logic/telemetry.ts @@ -105,6 +105,46 @@ export async function createStats(force?: boolean) { setTimeout(() => createStats(), 1000 * 60 * 30); } +export async function voyageRawByDays(days: number, crewMatch?: string[]) { + let endDate = new Date(); + let startDate = new Date(); + startDate.setDate(startDate.getDate() - days); + + return voyageRawByRange(startDate, endDate, crewMatch); +} + +export async function voyageRawByRange(startDate?: Date, endDate?: Date, crewMatch?: string[]) { + endDate ??= new Date(); + if (!startDate) { + startDate = new Date(endDate.getTime()); + startDate.setDate(startDate.getDate() - 7); + } + + const where = { + voyageDate: [ + { [Op.gte]: startDate }, + { [Op.lte]: endDate } + ], + crew: undefined as any + }; + + if (crewMatch) { + where.crew = { [Op.or]: [] as any[] }; + for (let crew of crewMatch) { + where.crew[Op.or].push({ [Op.like]: `%"${crew}"%`}) + } + } + else { + delete where.crew; + } + + let results = await Voyage.findAll({ + where + }); + + return results; +} + async function getVoyageStats() { const one80DaysAgo = new Date(Date.now() - 180 * 24 * 60 * 60 * 1000);