Files
TREK/server/src/nest/route-usage/route-usage.controller.ts
T

44 lines
1.6 KiB
TypeScript

import { Body, Controller, Delete, Get, HttpCode, Post, UseGuards } from '@nestjs/common';
import type { RouteUsageReportResult, RouteUsageSummaryResult } from '@trek/shared';
import { AdminGuard } from '../auth/admin.guard';
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
import { RouteUsageReportDto } from './route-usage.dto';
import { RouteUsageService } from './route-usage.service';
/**
* /api/route-usage — how much routing this instance does.
*
* Reporting is open to any signed-in user, because every signed-in user is the one
* generating the load; reading is admin only, because the totals are everybody's
* routing and the person entitled to see that is the person running the instance.
* Nothing here leaves the instance on its own.
*/
@Controller('api/route-usage')
@UseGuards(JwtAuthGuard)
export class RouteUsageController {
constructor(private readonly usage: RouteUsageService) {}
/**
* 200 with `{ recorded: false }` when counting is off, rather than a 403. The
* client flushes and moves on; a rejection would be a permanent error in the
* console of every install that switched the counters off.
*/
@Post('report')
@HttpCode(200)
async report(@Body() body: RouteUsageReportDto): Promise<RouteUsageReportResult> {
return { recorded: await this.usage.record(body) };
}
@Get('summary')
@UseGuards(JwtAuthGuard, AdminGuard)
async summary(): Promise<RouteUsageSummaryResult> {
return await this.usage.summary();
}
@Delete()
@UseGuards(JwtAuthGuard, AdminGuard)
async clear(): Promise<{ removed: number }> {
return { removed: await this.usage.clear() };
}
}