refactor(ScanController, ResponseScanIntake, RunnerKV): Rename totalDistance to distance for consistency

This commit is contained in:
2026-02-20 22:56:34 +01:00
parent 70d6091a6a
commit 1be8836df1
3 changed files with 12 additions and 12 deletions

View File

@@ -1,14 +1,11 @@
import type { Request } from "express"; import type { Request } from "express";
import { Authorized, Body, Delete, Get, HttpError, JsonController, OnUndefined, Param, Post, Put, QueryParam, Req, UseBefore } from 'routing-controllers'; import { Authorized, Body, Delete, Get, HttpError, JsonController, OnUndefined, Param, Post, Put, QueryParam, Req, UseBefore } from 'routing-controllers';
import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi'; import { OpenAPI, ResponseSchema } from 'routing-controllers-openapi';
import { Repository, getConnection, getConnectionManager } from 'typeorm'; import { getConnection, getConnectionManager, Repository } from 'typeorm';
import { RunnerNotFoundError } from '../errors/RunnerErrors'; import { RunnerNotFoundError } from '../errors/RunnerErrors';
import { ScanIdsNotMatchingError, ScanNotFoundError } from '../errors/ScanErrors'; import { ScanIdsNotMatchingError, ScanNotFoundError } from '../errors/ScanErrors';
import { ScanStationNotFoundError } from '../errors/ScanStationErrors'; import { ScanStationNotFoundError } from '../errors/ScanStationErrors';
import ScanAuth from '../middlewares/ScanAuth'; import ScanAuth from '../middlewares/ScanAuth';
import { deleteCardEntry, getCardEntry, setCardEntry } from '../nats/CardKV';
import { deleteRunnerEntry, getRunnerEntry, RunnerKVEntry, setRunnerEntry, warmRunner } from '../nats/RunnerKV';
import { getStationEntryById } from '../nats/StationKV';
import { CreateScan } from '../models/actions/create/CreateScan'; import { CreateScan } from '../models/actions/create/CreateScan';
import { CreateTrackScan } from '../models/actions/create/CreateTrackScan'; import { CreateTrackScan } from '../models/actions/create/CreateTrackScan';
import { UpdateScan } from '../models/actions/update/UpdateScan'; import { UpdateScan } from '../models/actions/update/UpdateScan';
@@ -20,6 +17,9 @@ import { ResponseEmpty } from '../models/responses/ResponseEmpty';
import { ResponseScan } from '../models/responses/ResponseScan'; import { ResponseScan } from '../models/responses/ResponseScan';
import { ResponseScanIntake, ResponseScanIntakeRunner } from '../models/responses/ResponseScanIntake'; import { ResponseScanIntake, ResponseScanIntakeRunner } from '../models/responses/ResponseScanIntake';
import { ResponseTrackScan } from '../models/responses/ResponseTrackScan'; import { ResponseTrackScan } from '../models/responses/ResponseTrackScan';
import { getCardEntry, setCardEntry } from '../nats/CardKV';
import { deleteRunnerEntry, getRunnerEntry, RunnerKVEntry, setRunnerEntry, warmRunner } from '../nats/RunnerKV';
import { getStationEntryById } from '../nats/StationKV';
@JsonController('/scans') @JsonController('/scans')
@OpenAPI({ security: [{ "AuthToken": [] }, { "RefreshTokenCookie": [] }] }) @OpenAPI({ security: [{ "AuthToken": [] }, { "RefreshTokenCookie": [] }] })
export class ScanController { export class ScanController {
@@ -145,12 +145,12 @@ export class ScanController {
// Compute // Compute
const lapTime = entry.latestTimestamp === 0 ? 0 : now - entry.latestTimestamp; const lapTime = entry.latestTimestamp === 0 ? 0 : now - entry.latestTimestamp;
const valid = minimumLapTime === 0 || lapTime > minimumLapTime; const valid = minimumLapTime === 0 || lapTime > minimumLapTime;
const newDistance = entry.totalDistance + (valid ? trackDistance : 0); const newDistance = entry.distance + (valid ? trackDistance : 0);
const newTimestamp = valid ? now : entry.latestTimestamp; const newTimestamp = valid ? now : entry.latestTimestamp;
const updated: RunnerKVEntry = { const updated: RunnerKVEntry = {
displayName: entry.displayName, displayName: entry.displayName,
totalDistance: newDistance, distance: newDistance,
latestTimestamp: newTimestamp, latestTimestamp: newTimestamp,
}; };
@@ -174,7 +174,7 @@ export class ScanController {
const runnerInfo = new ResponseScanIntakeRunner(); const runnerInfo = new ResponseScanIntakeRunner();
runnerInfo.displayName = entry.displayName; runnerInfo.displayName = entry.displayName;
runnerInfo.totalDistance = newDistance; runnerInfo.distance = newDistance;
response = new ResponseScanIntake(); response = new ResponseScanIntake();
response.accepted = true; response.accepted = true;

View File

@@ -11,7 +11,7 @@ export class ResponseScanIntakeRunner {
displayName: string; displayName: string;
@IsInt() @IsInt()
totalDistance: number; distance: number;
} }
export class ResponseScanIntake { export class ResponseScanIntake {

View File

@@ -14,7 +14,7 @@ export interface RunnerKVEntry {
/** "Firstname Lastname" — middlename omitted. */ /** "Firstname Lastname" — middlename omitted. */
displayName: string; displayName: string;
/** Sum of all valid scan distances in metres. */ /** Sum of all valid scan distances in metres. */
totalDistance: number; distance: number;
/** Unix seconds timestamp of the last valid scan. 0 if none. */ /** Unix seconds timestamp of the last valid scan. 0 if none. */
latestTimestamp: number; latestTimestamp: number;
} }
@@ -93,7 +93,7 @@ export async function deleteRunnerEntry(runnerId: number): Promise<void> {
* scan timestamp from the database, writes the result to KV, and returns it. * scan timestamp from the database, writes the result to KV, and returns it.
* *
* Called on any KV cache miss during the scan intake flow. * Called on any KV cache miss during the scan intake flow.
* Also handles the first-scan-ever case — latestTimestamp=0, totalDistance=0. * Also handles the first-scan-ever case — latestTimestamp=0, distance=0.
*/ */
export async function warmRunner(runnerId: number): Promise<RunnerKVEntry> { export async function warmRunner(runnerId: number): Promise<RunnerKVEntry> {
const connection = getConnection(); const connection = getConnection();
@@ -119,7 +119,7 @@ export async function warmRunner(runnerId: number): Promise<RunnerKVEntry> {
const entry: RunnerKVEntry = { const entry: RunnerKVEntry = {
displayName, displayName,
totalDistance: parseInt(distanceResult?.total ?? '0', 10), distance: parseInt(distanceResult?.total ?? '0', 10),
latestTimestamp: latestScan?.timestamp ?? 0, latestTimestamp: latestScan?.timestamp ?? 0,
}; };
@@ -180,7 +180,7 @@ export async function warmAll(): Promise<void> {
const writePromises = runners.map((runner) => { const writePromises = runners.map((runner) => {
const entry: RunnerKVEntry = { const entry: RunnerKVEntry = {
displayName: `${runner.firstname} ${runner.lastname}`, displayName: `${runner.firstname} ${runner.lastname}`,
totalDistance: distanceMap.get(runner.id) ?? 0, distance: distanceMap.get(runner.id) ?? 0,
latestTimestamp: latestMap.get(runner.id) ?? 0, latestTimestamp: latestMap.get(runner.id) ?? 0,
}; };
return setRunnerEntry(runner.id, entry); return setRunnerEntry(runner.id, entry);