Separate input validation and extend PIS functions

This commit is contained in:
Fred Boniface 2025-03-12 15:33:37 +00:00
parent 071328bdd0
commit d20d981190
4 changed files with 64 additions and 6 deletions

View File

@ -1,5 +1,6 @@
import { BaseOwlBoardClient } from "./client";
import { ValidationError } from "../errors";
import { PisV2_Long, PisV2_Short } from "../types/pis/PisTypesV2";
import { validateCrs, validatePisCode, validateTiploc } from "../inputValidation/inputValidation";
export class PisClientV2 {
private client: BaseOwlBoardClient;
@ -8,12 +9,26 @@ export class PisClientV2 {
this.client = client;
}
async getStopsByPis(code: string): Promise<any> {
const codeRegex = /^\d{4}$/;
if (!codeRegex.test(code)) {
throw new ValidationError("Invalid input: code must be a four-character string consisting of only numerals")
}
async getStopsByPis(code: string): Promise<PisV2_Long> {
validatePisCode(code);
const path = `/api/v2/pis/byCode/${code}`
return this.client.makeRequest("GET", path);
}
//* >> This feature is not currently exposed by the API << //
async getPisByTiplocList(tiploc_list: string[]): Promise<PisV2_Short> {
for (const tiploc in tiploc_list) {
validateTiploc(tiploc);
}
const path = `/api/v2/pis/byTiplocList/${tiploc_list}`
return this.client.makeRequest("GET", path);
}
//*/
async getPisByStartEndCRS(startCrs: string, endCrs: string): Promise<PisV2_Short> {
validateCrs(startCrs);
validateCrs(endCrs);
const path = `/api/v2/pis/byStartEnd/${startCrs}/${endCrs}`
return this.client.makeRequest("GET", path);
}
}

View File

@ -0,0 +1,25 @@
import { ValidationError } from "../errors";
export function validatePisCode(code: string): boolean {
const codeRegex = /^\d{4}$/;
if (!codeRegex.test(code)) {
throw new ValidationError("Invalid input: code must be a four-character string consisting of only numerals");
}
return true;
}
export function validateTiploc(tiploc: string): boolean {
const tiplocRegex = /[a-zA-z0-9]{4,7}/;
if (!tiplocRegex.test(tiploc)) {
throw new ValidationError("Invalid input: TIPLOC must be between four and seven characters");
}
return true;
}
export function validateCrs(crs: string): boolean {
const crsRegex = /[a-zA-z]{3}/;
if (!crsRegex.test(crs)) {
throw new ValidationError("Invalid input: CRS/3ALPHA must be exactly three letters")
}
return true;
}

5
src/types/README.md Normal file
View File

@ -0,0 +1,5 @@
This directory contains TS source files describing TS types which
are returned by the OwlBoard API.
Files are organised in directories, one for each category - in each directory
there is a file for each version.

View File

@ -0,0 +1,13 @@
export interface PisV2_Short {
code: string;
toc: string;
skipCount: number;
skipType?: string;
}
export interface PisV2_Long {
code: string;
stops: string[];
toc: string;
tiplocs?: string;
}