Compare commits
36 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 76281bacfb | |||
| aff523a038 | |||
| e0a7c5f56e | |||
| 9a9fc59e22 | |||
| d103314350 | |||
| 5c16b17aea | |||
| 71e04b93d5 | |||
| 423bb9fc34 | |||
| eb7c3a18d8 | |||
| fe68c038de | |||
| 776263c068 | |||
| 87ed1d01d5 | |||
| 057f5ed777 | |||
| 93df742c7d | |||
| f20f2f83ec | |||
| 770ee003e7 | |||
| a5675b1442 | |||
| a927ccc732 | |||
| 817c338745 | |||
| af3c82518c | |||
| 9511db8ee9 | |||
| fc92331238 | |||
| a4e6386fd1 | |||
| 3199037c5a | |||
| a78e749d55 | |||
| fb4d7b2ed6 | |||
| 3d750b1b18 | |||
| f9463f3d29 | |||
| 7fe1be9b48 | |||
| c8731caadd | |||
| 20cb7b101c | |||
| ac3124ff14 | |||
| b29f42c004 | |||
| 051721ce02 | |||
| 04ed0ede29 | |||
| a17e7a5290 |
@@ -16,89 +16,86 @@ jobs:
|
|||||||
- name: Get Version
|
- name: Get Version
|
||||||
id: get_version
|
id: get_version
|
||||||
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
|
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- uses: bufbuild/buf-action@v1.3
|
|
||||||
with:
|
|
||||||
setup_only: true
|
|
||||||
version: '1.63.0'
|
|
||||||
|
|
||||||
- uses: actions/setup-go@v5
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: '1.23'
|
go-version: '1.24'
|
||||||
|
|
||||||
- uses: actions/setup-node@v6
|
- uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: '18.18.x'
|
node-version: '18.18.x'
|
||||||
registry-url: 'https://git.fjla.uk/api/packages/owlboard/npm'
|
registry-url: 'https://git.fjla.uk/api/packages/owlboard/npm'
|
||||||
scope: '@owlboard'
|
scope: '@owlboard'
|
||||||
|
|
||||||
- name: Install Go Protoc Plugin
|
- name: Install Generators
|
||||||
run: |
|
run: |
|
||||||
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
|
npm install -g json-schema-to-typescript typescript
|
||||||
|
go install github.com/atombender/go-jsonschema@latest
|
||||||
echo "$(go env GOPATH)/bin" >> $GITHUB_PATH
|
echo "$(go env GOPATH)/bin" >> $GITHUB_PATH
|
||||||
|
|
||||||
- name: Install TS-Proto Plugin
|
- run: bash scripts/build.sh
|
||||||
run: |
|
|
||||||
npm install ts-proto typescript
|
|
||||||
echo "$PATH:$(pwd)/ts-proto" >> $GITHUB_PATH
|
|
||||||
|
|
||||||
- name: Generate Code
|
|
||||||
run: buf generate
|
|
||||||
|
|
||||||
- name: Build and Publish TS
|
- name: Build and Publish TS
|
||||||
working-directory: gen/ts
|
working-directory: gen/ts
|
||||||
run: |
|
run: |
|
||||||
npm init -y
|
npm init -y
|
||||||
|
|
||||||
# 1. Create a dynamic index.ts using Namespace exports
|
# Build index.ts
|
||||||
# This converts 'rail_backend/v1/pis_mapping.ts'
|
echo "// Auto-generated" > index.ts
|
||||||
# into 'export * as PisMapping from "./rail_backend/v1/pis_mapping";'
|
find . -maxdepth 1 -name "*.ts" -not -name "index.ts" | sed 's|^\./||; s|\.ts$||' | awk '{
|
||||||
# We use awk to handle the naming conversion (snake_case to PascalCase-ish)
|
# Use gsub to turn hyphens into underscores so we can split easily
|
||||||
find . -name "*.ts" -not -name "index.ts" | sed 's|^\./||; s|\.ts$||' | awk -F'/' '{
|
clean = $0;
|
||||||
name=$NF;
|
gsub(/-/, "_", clean);
|
||||||
gsub(/_/, "", name);
|
|
||||||
printf "export * as %s from \"./%s\";\n", toupper(substr(name,1,1)) substr(name,2), $0
|
n = split(clean, parts, "_");
|
||||||
}' > index.ts
|
name = "";
|
||||||
|
for (i=1; i<=n; i++) {
|
||||||
|
if (length(parts[i]) > 0) {
|
||||||
|
name = name toupper(substr(parts[i],1,1)) substr(parts[i],2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# name will now be 'DataIngressPisData' (valid TS)
|
||||||
|
printf "export * as %s from \"./%s.js\";\n", name, $0
|
||||||
|
}' >> index.ts
|
||||||
|
|
||||||
# 2. Update package.json
|
VERSION="${{ steps.get_version.outputs.VERSION }}"
|
||||||
jq '.name = "@owlboard/backend-data-contracts" |
|
jq --arg ver "$VERSION" \
|
||||||
.version = "${{ steps.get_version.outputs.VERSION }}" |
|
--arg name "@owlboard/backend-data-contracts" \
|
||||||
.type = "module" |
|
'.name = $name | .version = $ver | .type = "module" | .main = "./dist/index.js" | .types = "./dist/index.d.ts"' \
|
||||||
.main = "./dist/index.js" |
|
package.json > package.json.new && mv package.json.new package.json
|
||||||
.types = "./dist/index.d.ts" |
|
|
||||||
.publishConfig = { "registry": "https://git.fjla.uk/api/packages/owlboard/npm" }' \
|
|
||||||
package.json > temp.json && mv temp.json package.json
|
|
||||||
|
|
||||||
# 3. Compile
|
# Compile
|
||||||
npx tsc index.ts --declaration --module esnext --target es2022 --moduleResolution node --outDir dist/
|
npx tsc index.ts --declaration --module nodenext --target es2022 --moduleResolution nodenext --outDir dist/ --skipLibCheck true
|
||||||
|
|
||||||
|
# Publish
|
||||||
|
npm config set //git.fjla.uk/api/packages/owlboard/npm/:_authToken ${{ secrets.PACKAGE_PUSH }}
|
||||||
npm publish
|
npm publish
|
||||||
env:
|
|
||||||
NODE_AUTH_TOKEN: ${{ secrets.PACKAGE_PUSH }}
|
|
||||||
|
|
||||||
- name: Publish Go
|
- name: Publish Go
|
||||||
run: |
|
run: |
|
||||||
# 1. Setup variables
|
VERSION="v${{ steps.get_version.outputs.VERSION }}"
|
||||||
VERSION="${{ steps.get_version.outputs.VERSION }}"
|
|
||||||
MOD_NAME="git.fjla.uk/owlboard/backend-data-contracts"
|
MOD_NAME="git.fjla.uk/owlboard/backend-data-contracts"
|
||||||
# Create a temporary directory structure that matches Go proxy requirements
|
ZIP_ROOT="/tmp/go_upload"
|
||||||
DEST_DIR="temp_zip/$MOD_NAME@$VERSION"
|
FULL_PATH="$ZIP_ROOT/$MOD_NAME@$VERSION"
|
||||||
|
|
||||||
# 2. Generate go.mod and tidy
|
# 1. Prepare
|
||||||
cd gen/go
|
cd gen/go
|
||||||
go mod init $MOD_NAME
|
|
||||||
go mod tidy
|
|
||||||
|
|
||||||
# 3. Move files into the required nested structure
|
# 2. Initialize the module
|
||||||
mkdir -p "../../$DEST_DIR"
|
go mod init "$MOD_NAME"
|
||||||
cp -r . "../../$DEST_DIR/"
|
|
||||||
|
|
||||||
# 4. Zip from the temp root so the internal paths are correct
|
# 3. Create the structure
|
||||||
cd ../../temp_zip
|
mkdir -p "$FULL_PATH"
|
||||||
zip -r ../module.zip .
|
|
||||||
|
|
||||||
# 5. Upload with the explicit version
|
# 4. Copy the CONTENTS of models to the root of the module
|
||||||
cd ..
|
# This flattens the structure so the .go files are next to go.mod
|
||||||
curl -f -v --user "owlbot:${{ secrets.PACKAGE_PUSH }}" \
|
cp -r models/* "$FULL_PATH/"
|
||||||
--upload-file module.zip \
|
cp go.mod "$FULL_PATH/"
|
||||||
|
|
||||||
|
# 5. Zip and Upload
|
||||||
|
cd "$ZIP_ROOT"
|
||||||
|
zip -r -D "$GITHUB_WORKSPACE/module.zip" .
|
||||||
|
|
||||||
|
curl -f --user "owlbot:${{ secrets.PACKAGE_PUSH }}" \
|
||||||
|
--upload-file "$GITHUB_WORKSPACE/module.zip" \
|
||||||
"${{ github.server_url }}/api/packages/owlboard/go/upload?version=$VERSION"
|
"${{ github.server_url }}/api/packages/owlboard/go/upload?version=$VERSION"
|
||||||
54
README.md
54
README.md
@@ -1,32 +1,18 @@
|
|||||||
# backend-data-contracts
|
# backend-data-contracts
|
||||||
|
|
||||||
This repository is the single source of truth for all Protocol Buffer (Protobuf) schema definitions used across the Owlboard Rail Ingress and Processing microservices. It follows a **Contract-First** approach, where language-specific code (Go, TypeScript) is generated and distributed via private registries.
|
This repository is the single source of truth for all schema definitions used across the Owlboard backend communication and storage services. Language specific types are generated here and published to the Gitea package repository linked to the repo.
|
||||||
|
|
||||||
## Purpose
|
|
||||||
|
|
||||||
The Protobuf files defined here serve as the immutable data contract for:
|
|
||||||
1. **Ingress Logic:** Ensuring the Node.js and Go inregrate properly by sharing types.
|
|
||||||
2. **Message Payloads:** Defining messages for cross-service communication.
|
|
||||||
3. **Persistence:** Defining the expected structure of documents in MongoDB for the Go processing services.
|
|
||||||
|
|
||||||
## Directory Structure
|
## Directory Structure
|
||||||
|
|
||||||
| Path | Description | Contents |
|
| Path | Description |
|
||||||
| :--- | :--- | :--- |
|
| :--- | :--- |
|
||||||
| `proto/` | **Source of Truth.** Contains the Protobuf schema definitions. | `rail_backend/v1/*.proto` |
|
| `schemas` | JSON Schema files organised into clear subfolders |
|
||||||
| `buf.yaml` | **Workspace Config.** Defines linting and breaking change rules (Buf v2). | Workspace settings |
|
| `scripts` | Workflow Scripts |
|
||||||
| `buf.gen.yaml` | **Generation Config.** Defines how Go and TS code is built. | Plugin & Managed Mode settings |
|
|
||||||
| `gen/` | **Transient Output.** Generated code resides here during CI/CD. | `.pb.go`, `.js`, `.d.ts` (**Git Ignored**) |
|
|
||||||
|
|
||||||
## Code Generation and Publishing Workflow
|
## Code Generation and Publishing Workflow
|
||||||
|
|
||||||
The generation and release process is automated via Gitea Actions. It is triggered whenever a new **SemVer tag** (e.g., `v1.0.0`) is pushed to this repository.
|
The generation and release process is automated via Gitea Actions. It is triggered whenever a new **SemVer tag** (e.g., `v1.0.0`) is pushed to this repository.
|
||||||
|
|
||||||
1. **Validation:** `buf lint` ensures schemas follow best practices.
|
|
||||||
2. **Generation:** `buf generate` creates Go and TypeScript code using local plugins.
|
|
||||||
3. **TS Release:** Compiles `.ts` to `.js` and publishes to the Gitea NPM Registry as `@owlboard/backend-data-contracts`.
|
|
||||||
4. **Go Release:** Initializes a `go.mod`, zips the artifacts, and pushes them to the Gitea Go Package Registry.
|
|
||||||
|
|
||||||
## To Consume the Contracts
|
## To Consume the Contracts
|
||||||
|
|
||||||
### 1. Go Services
|
### 1. Go Services
|
||||||
@@ -34,4 +20,32 @@ Since the package is hosted in the Gitea Package Registry, you must configure yo
|
|||||||
|
|
||||||
**Setup:**
|
**Setup:**
|
||||||
```bash
|
```bash
|
||||||
export GOPROXY=[https://git.fjla.uk/api/packages/owlboard/go,https://proxy.golang.org,direct](https://git.fjla.uk/api/packages/owlboard/go,https://proxy.golang.org,direct)
|
# Set the proxy to check our Gitea instance first
|
||||||
|
go env -w GOPROXY="https://git.fjla.uk/api/packages/OwlBoard/go,https://proxy.golang.org,direct"
|
||||||
|
|
||||||
|
# Trust our internal domain and skip the public Google checksum database
|
||||||
|
go env -w GONOSUMDB="git.fjla.uk"
|
||||||
|
```
|
||||||
|
|
||||||
|
The, you can simply run go get, as usual.
|
||||||
|
|
||||||
|
#### Container Usage
|
||||||
|
```bash
|
||||||
|
ARG GOPROXY=https://git.fjla.uk/api/packages/OwlBoard/go,https://proxy.golang.org,direct
|
||||||
|
ARG GONOSUMDB=git.fjla.uk
|
||||||
|
ENV GOPROXY=$GOPROXY
|
||||||
|
ENV GONOSUMDB=$GONOSUMDB
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Typescript Services
|
||||||
|
You will need to configure .npmrc in your projects root directory to point to the correct repo:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
@owlboard:registry=https://git.fjla.uk/api/packages/OwlBoard/npm/
|
||||||
|
```
|
||||||
|
|
||||||
|
Then you can install as usual:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install @owlboard/backend-data-contracts@0.1.0
|
||||||
|
```
|
||||||
17
buf.gen.yaml
17
buf.gen.yaml
@@ -1,17 +0,0 @@
|
|||||||
version: v2
|
|
||||||
managed:
|
|
||||||
enabled: true
|
|
||||||
override:
|
|
||||||
- file_option: go_package_prefix
|
|
||||||
value: github.com/owlboard/backend-data-contracts
|
|
||||||
plugins:
|
|
||||||
- local: protoc-gen-go
|
|
||||||
out: gen/go
|
|
||||||
opt: paths=source_relative
|
|
||||||
- local: ./node_modules/ts-proto/protoc-gen-ts_proto
|
|
||||||
out: gen/ts
|
|
||||||
opt:
|
|
||||||
- esModuleInterop=true
|
|
||||||
- outputJsonMethods=true
|
|
||||||
- forceLong=string
|
|
||||||
- importSuffix=.js
|
|
||||||
9
buf.yaml
9
buf.yaml
@@ -1,9 +0,0 @@
|
|||||||
version: v2
|
|
||||||
modules:
|
|
||||||
- path: protos
|
|
||||||
lint:
|
|
||||||
use:
|
|
||||||
- DEFAULT
|
|
||||||
breaking:
|
|
||||||
use:
|
|
||||||
- FILE
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
syntax = "proto3";
|
|
||||||
|
|
||||||
package rail_backend.v1;
|
|
||||||
|
|
||||||
message Metadata {
|
|
||||||
int64 push_to_queue_time = 1;
|
|
||||||
int64 data_fetch_time = 2;
|
|
||||||
map<string, string> tags = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
syntax = "proto3";
|
|
||||||
|
|
||||||
package rail_backend.v1;
|
|
||||||
|
|
||||||
message PisReferenceList {
|
|
||||||
repeated PisMapping entries = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
message PisMapping {
|
|
||||||
string code = 1;
|
|
||||||
string toc = 2;
|
|
||||||
repeated string crsStops = 3;
|
|
||||||
fixed64 crsHash = 4; // XXH4 Hash for fast lookup of exact match
|
|
||||||
repeated string tiplocStops = 5;
|
|
||||||
fixed64 tiplocHash = 6;
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
syntax = "proto3";
|
|
||||||
|
|
||||||
package rail_backend.v1;
|
|
||||||
|
|
||||||
import "rail_backend/v1/common.proto";
|
|
||||||
import "rail_backend/v1/schedule_payload.proto";
|
|
||||||
|
|
||||||
message IngressMessage {
|
|
||||||
string correlation_id = 1;
|
|
||||||
Metadata tracking_data = 2;
|
|
||||||
oneof payload {
|
|
||||||
UrlReference url_ref = 5;
|
|
||||||
SchedulePayload schedule_payload = 6;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
message UrlReference {
|
|
||||||
string kind = 1;
|
|
||||||
string url = 2;
|
|
||||||
}
|
|
||||||
@@ -1,198 +0,0 @@
|
|||||||
syntax = "proto3";
|
|
||||||
|
|
||||||
package rail_backend.v1;
|
|
||||||
|
|
||||||
enum SchedulePayloadType {
|
|
||||||
VSTP_MESSAGE_TYPE_UNSPECIFIED = 0;
|
|
||||||
Create = 1;
|
|
||||||
Delete = 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
message RunsOnDays {
|
|
||||||
bool sunday = 1;
|
|
||||||
bool monday = 2;
|
|
||||||
bool tuesday = 3;
|
|
||||||
bool wednesday = 4;
|
|
||||||
bool thursday = 5;
|
|
||||||
bool friday = 6;
|
|
||||||
bool saturday = 7;
|
|
||||||
bool bank_holidays = 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum TrainStatus {
|
|
||||||
TRAIN_STATUS_UNSPECIFIED = 0;
|
|
||||||
PERMANENT_BUS = 1;
|
|
||||||
PERMANENT_FREIGHT = 2;
|
|
||||||
PERMANENT_PASSENGER_OR_PARCELS = 3;
|
|
||||||
PERMANENT_SHIP = 4;
|
|
||||||
PERMANENT_TRIP = 5;
|
|
||||||
STP_PASSENGER_ORPARCELS = 6;
|
|
||||||
STP_FREIGHT = 7;
|
|
||||||
STP_TRIP = 8;
|
|
||||||
STP_SHIP = 9;
|
|
||||||
STP_BUS = 10;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum TrainCategory {
|
|
||||||
TRAIN_CATEGORY_UNSPECIFIED = 0;
|
|
||||||
METRO_SERVICE = 1;
|
|
||||||
UNADVERTISED_PASSENGER_TRAIN = 2;
|
|
||||||
ORDINARY_PASSENGER_TRAIN = 3;
|
|
||||||
STAFF_TRAIN = 4;
|
|
||||||
MIXED_TRAIN = 5;
|
|
||||||
CHANNEL_TUNNEL_TRAIN = 6;
|
|
||||||
EUROPEAN_SLEEPER_TRAIN = 7;
|
|
||||||
INTERNATIONAL_PASSENGER_TRAIN = 8;
|
|
||||||
MOTORAIL_SERVICE = 9;
|
|
||||||
UNADVERTISED_EXPRESS_TRAIN = 10;
|
|
||||||
EXPRESS_PASSENGER_TRAIN = 11;
|
|
||||||
SLEEPER_SERVICE = 12;
|
|
||||||
REPLACEMENT_BUS_SERVICE = 13;
|
|
||||||
BUS_SERVICE = 14;
|
|
||||||
SHIP = 15;
|
|
||||||
EMPTY_COACHING_STOCK = 16;
|
|
||||||
EMPTY_METRO_SERVICE = 17;
|
|
||||||
METRO_STAFF_SERVICE = 18;
|
|
||||||
POSTAL_TRAIN = 19;
|
|
||||||
POST_OFFICE_PARCELS_TRAIN = 20;
|
|
||||||
EMPTY_NON_PASSENGER_STOCK = 21;
|
|
||||||
DEPARTMENTAL_TRAIN = 22;
|
|
||||||
CIVIL_ENGINEER_TRAIN = 23;
|
|
||||||
MECHANICAL_AND_ELECTRICAL_ENGINEER_TRAIN = 24;
|
|
||||||
STORES_TRAIN = 25;
|
|
||||||
TEST_TRAIN = 26;
|
|
||||||
SIGNAL_AND_TELECOMMUNICATIONS_ENGINEER_TRAIN = 27;
|
|
||||||
LOCOMOTIVE_AND_BRAKE_VAN = 28;
|
|
||||||
LIGHT_LOCOMOTIVE = 29;
|
|
||||||
AUTOMOTIVE_COMPONENTS_TRAIN = 30;
|
|
||||||
AUTOMOTIVE_VEHICLE_TRAIN = 31;
|
|
||||||
EDIBLE_PRODUCTS_TRAIN = 32;
|
|
||||||
INDUSTRIAL_MINERALS_TRAIN = 33;
|
|
||||||
CHEMICAL_TRAIN = 34;
|
|
||||||
BUILDING_MATERIALS_TRAIN = 35;
|
|
||||||
GENERAL_MERCHANDISE_TRAIN = 36;
|
|
||||||
EUROPEAN_RAILFREIGHT = 37;
|
|
||||||
FREIGHTLINER_CONTRACTS = 38;
|
|
||||||
FREIGHTLINER_OTHER = 39;
|
|
||||||
COAL_TRAIN = 40;
|
|
||||||
COAL_POWER_STATION_TRAIN = 41;
|
|
||||||
COAL_OR_NUCLEAR_TRAIN = 42;
|
|
||||||
METALS_TRAIN = 43;
|
|
||||||
AGGREGATES_TRAIN = 44;
|
|
||||||
DOMESTIC_AND_INDUSTRIAL_WASTE_TRAIN = 45;
|
|
||||||
TRAINLOAD_BUILDING_MATERIALS_TRAIN = 46;
|
|
||||||
PETROLEUM_PRODUCTS_TRAIN = 47;
|
|
||||||
MIXED_FREIGHT_CHANNEL_TUNNEL_TRAIN = 48;
|
|
||||||
INTERMODAL_CHANNEL_TUNNEL_TRAIN = 49;
|
|
||||||
AUTOMOTIVE_FREIGHT_CHANNEL_TUNNEL_TRAIN = 50;
|
|
||||||
CONTRACT_FREIGHT_CHANNEL_TUNNEL_TRAIN = 51;
|
|
||||||
HAULMARK_FREIGHT_CHANNEL_TUNNEL_TRAIN = 52;
|
|
||||||
JOINT_VENTURE_CHANNEL_TUNNEL_FREIGHT_TRAIN = 53;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum PowerType {
|
|
||||||
POWER_TYPE_UNSPECIFIED = 0;
|
|
||||||
DIESEL = 1;
|
|
||||||
DIESEL_MULTIPLE_UNIT = 2;
|
|
||||||
DISEL_MECHANICAL_MULTIPLE_UNIT = 3;
|
|
||||||
ELECTRIC = 4;
|
|
||||||
ELECTRO_DIESEL = 5;
|
|
||||||
EMU_PLUS_LOCOMOTIVE = 6;
|
|
||||||
ELECTRIC_MULTIPLE_UNIT = 7;
|
|
||||||
HIGH_SPEED_TRAIN = 8;
|
|
||||||
}
|
|
||||||
|
|
||||||
message OperatingCharacteristics {
|
|
||||||
bool vacuum_braked = 1; // B
|
|
||||||
bool timed_at_100mph = 2; // C
|
|
||||||
bool driver_only_operated = 3; // D
|
|
||||||
bool conveys_mk4_coaches = 4; // E
|
|
||||||
bool guard_required = 5; // G
|
|
||||||
bool timed_at_110mph = 6; // M
|
|
||||||
bool push_pull_train = 7; // P
|
|
||||||
bool runs_as_required = 8; // Q
|
|
||||||
bool air_conditioned_with_pa = 9;//R
|
|
||||||
bool steam_heated = 10;
|
|
||||||
bool runs_to_terminals_as_required = 11; // Y
|
|
||||||
bool may_convey_sb1c_gauge = 12; // Z
|
|
||||||
}
|
|
||||||
|
|
||||||
enum SleepingAccommodation {
|
|
||||||
NO_SLEEPING_ACCOMMODATION = 0;
|
|
||||||
FIRST_AND_STANDARD = 1;
|
|
||||||
FIRST_ONLY = 2;
|
|
||||||
STANDARD_ONLY = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
message Reservations {
|
|
||||||
bool reservations_available = 1;
|
|
||||||
bool reservations_compulsory = 2;
|
|
||||||
bool bike_reservations_essential = 3;
|
|
||||||
bool reservations_from_any_station = 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
message Catering {
|
|
||||||
bool buffet_service = 1;
|
|
||||||
bool first_class_restaurant = 2;
|
|
||||||
bool hot_food_available = 3;
|
|
||||||
bool first_class_meal_included = 4;
|
|
||||||
bool restaurant_available = 5;
|
|
||||||
bool trolley_service = 6;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum STPIndicator {
|
|
||||||
STP_INDICATOR_NOT_SPECIFIED = 0;
|
|
||||||
C = 1;
|
|
||||||
N = 2;
|
|
||||||
O = 3;
|
|
||||||
P = 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum RecordIdentity {
|
|
||||||
RECORD_IDENTITY_NOT_SPECIFIED = 0;
|
|
||||||
ORIGIN = 1;
|
|
||||||
INTERMEDIATE = 2;
|
|
||||||
TERMINATING = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
message ScheduleLocation {
|
|
||||||
RecordIdentity record_identity = 1;
|
|
||||||
string tiploc = 2;
|
|
||||||
int32 tiploc_instance = 3;
|
|
||||||
int32 arrival_offset_seconds = 4; // Seconds after midnight
|
|
||||||
int32 departure_offset_seconds = 5;
|
|
||||||
int32 pass_offset_seconds = 6;
|
|
||||||
int32 public_arrival_offset_seconds = 7;
|
|
||||||
int32 public_departure_offset_seconds = 8;
|
|
||||||
string platform = 9;
|
|
||||||
string line = 10;
|
|
||||||
string path = 11;
|
|
||||||
int32 engineering_allowance_seconds = 12;
|
|
||||||
int32 performance_allowance_seconds = 13;
|
|
||||||
}
|
|
||||||
|
|
||||||
message SchedulePayload {
|
|
||||||
string train_uid = 1;
|
|
||||||
SchedulePayloadType transaction_type = 2;
|
|
||||||
int32 schedule_start_date = 3; // Literal int of date: eg. 20251216
|
|
||||||
int32 schedule_end_date = 4;
|
|
||||||
RunsOnDays runs_on_day_of_week = 5;
|
|
||||||
TrainStatus train_status = 6;
|
|
||||||
TrainCategory train_category = 7;
|
|
||||||
string headcode = 8; // signalling_id
|
|
||||||
string nrs_code = 9; // CIF_headcode
|
|
||||||
string train_service_code = 10;
|
|
||||||
string portion_id = 11; // CIF_business_sector
|
|
||||||
PowerType power_type = 12;
|
|
||||||
string timing_load = 13; // Pretty String in Ingress Service
|
|
||||||
OperatingCharacteristics operating_characteristics = 14;
|
|
||||||
bool first_class_available = 15;
|
|
||||||
SleepingAccommodation sleeping_accommodation = 16;
|
|
||||||
Reservations reservations = 17;
|
|
||||||
Catering catering_code = 18;
|
|
||||||
bool is_eurostar = 19;
|
|
||||||
STPIndicator stp_indicator = 20;
|
|
||||||
string uic_code = 21;
|
|
||||||
string toc_code = 22; // Maybe ENUM but subject to frequent-ish change
|
|
||||||
repeated ScheduleLocation schedule_location = 23;
|
|
||||||
}
|
|
||||||
32
schemas/data-ingress/message-envelope.json
Normal file
32
schemas/data-ingress/message-envelope.json
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"$id": "https://schema.owlboard.info/data-ingress/message-envelope.schema.json",
|
||||||
|
"$schema": "https://json-schema.org/draft-07/schema#",
|
||||||
|
"title": "MessageEnvelope",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"service_name": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Name of the service submitting the update"
|
||||||
|
},
|
||||||
|
"service_id": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "ID of the service sending the message - usually a hostname"
|
||||||
|
},
|
||||||
|
"data_type": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["file"],
|
||||||
|
"description": "The type of data contained in this message object"
|
||||||
|
},
|
||||||
|
"sent_timestamp": {
|
||||||
|
"type": "integer",
|
||||||
|
"description": "Unix timestamp representing the time the message was sent"
|
||||||
|
},
|
||||||
|
"data_kind": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["pis", "timetable", "knowledgebase", "darwin_schedule", "darwin_ts", "darwin_ref"],
|
||||||
|
"description": "The data type contained in the message. Currently supported PIS: PIS Data, Timetable: CIF or VSTP Data, Knowledgebase: Station Data"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["service_name", "service_id", "data_type", "sent_timestamp"],
|
||||||
|
"additionalProperties": true
|
||||||
|
}
|
||||||
47
schemas/data-ingress/mq-file-update.json
Normal file
47
schemas/data-ingress/mq-file-update.json
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
{
|
||||||
|
"$id": "https://schema.owlboard.info/data-ingress/mq-file-update.schema.json",
|
||||||
|
"$schema": "https://json-schema.org/draft-07/schema#",
|
||||||
|
"title": "MQFileUpdate",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"service_name": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Name of the service submitting the update"
|
||||||
|
},
|
||||||
|
"service_id": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "ID of the service sending the message - usually a hostname"
|
||||||
|
},
|
||||||
|
"data_type": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["file"],
|
||||||
|
"description": "The type of data contained in this message object"
|
||||||
|
},
|
||||||
|
"sent_timestamp": {
|
||||||
|
"type": "integer",
|
||||||
|
"description": "Unix timestamp representing the time the message was sent"
|
||||||
|
},
|
||||||
|
"data_kind": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["pis", "timetable", "knowledgebase"],
|
||||||
|
"description": "The data type contained in the file. Currently supported PIS: PIS Data, Timetable: CIF or VSTP Data, Knowledgebase: Station Data"
|
||||||
|
},
|
||||||
|
"payload": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"version": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "The version string from the package source"
|
||||||
|
},
|
||||||
|
"filepath": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "The full path to the file, including protocol (eg. s3://) where appropriate"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["version", "filepath"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["service_name", "service_id", "data_type", "sent_timestamp", "data_kind", "payload"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
54
schemas/data-ingress/pis-data.json
Normal file
54
schemas/data-ingress/pis-data.json
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"$id": "https://schema.owlboard.info/data-ingress/pis-data.schema.json",
|
||||||
|
"$schema": "https://json-schema.org/draft-07/schema#",
|
||||||
|
"title": "PisObjects",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"code": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "PIS Code - Code that is entered in to the PIS system"
|
||||||
|
},
|
||||||
|
"toc": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 2,
|
||||||
|
"maxLength": 2,
|
||||||
|
"pattern": "^[a-zA-Z]+$",
|
||||||
|
"description": "Two letter TOC Code"
|
||||||
|
},
|
||||||
|
"crsStops": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 3,
|
||||||
|
"maxLength": 3,
|
||||||
|
"pattern": "^[a-zA-Z]+$"
|
||||||
|
},
|
||||||
|
"description": "List of 3ALPHA/CRS Codes"
|
||||||
|
},
|
||||||
|
"crsHash": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1,
|
||||||
|
"maxLength": 64,
|
||||||
|
"pattern": "^[0-9]+$",
|
||||||
|
"description": "Stringified 64-bit hash"
|
||||||
|
},
|
||||||
|
"tiplocStops": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 4,
|
||||||
|
"maxLength": 7,
|
||||||
|
"pattern": "^[a-zA-Z0-9]+$"
|
||||||
|
},
|
||||||
|
"description": "List of TIPLOC Codes"
|
||||||
|
},
|
||||||
|
"tiplocHash": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 1,
|
||||||
|
"maxLength": 64,
|
||||||
|
"pattern": "^[0-9]+$"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["code", "toc", "crsStops", "crsHash", "tiplocStops", "tiplocHash"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
241
schemas/data-ingress/pushport/schedule.json
Normal file
241
schemas/data-ingress/pushport/schedule.json
Normal file
@@ -0,0 +1,241 @@
|
|||||||
|
{
|
||||||
|
"$id": "https://schema.owlboard.info/data-ingress/pushport-schedule.schema.json",
|
||||||
|
"$schema": "https://json-schema.org/draft-07/schema#",
|
||||||
|
"title": "PushPortSchedule",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"service_name": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Name of the service submitting the update"
|
||||||
|
},
|
||||||
|
"service_id": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "ID of the service sending the message - usually a hostname"
|
||||||
|
},
|
||||||
|
"data_type": {
|
||||||
|
"type": "string",
|
||||||
|
"const": "PushPortSchedule",
|
||||||
|
"description": "The type of data contained in this message object"
|
||||||
|
},
|
||||||
|
"sent_timestamp": {
|
||||||
|
"type": "integer",
|
||||||
|
"description": "Unix timestamp representing the time the message was sent"
|
||||||
|
},
|
||||||
|
"data_kind": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"pis",
|
||||||
|
"timetable",
|
||||||
|
"knowledgebase",
|
||||||
|
"darwin_schedule",
|
||||||
|
"darwin_ts",
|
||||||
|
"darwin_ref"
|
||||||
|
],
|
||||||
|
"description": "The data type contained in the message. Currently supported PIS: PIS Data, Timetable: CIF or VSTP Data, Knowledgebase: Station Data"
|
||||||
|
},
|
||||||
|
"payload": {
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"rid",
|
||||||
|
"uid",
|
||||||
|
"trainId",
|
||||||
|
"ssd",
|
||||||
|
"toc",
|
||||||
|
"locations"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"rid": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Unique service ID"
|
||||||
|
},
|
||||||
|
"uid": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Unique schedule ID - maps to NR CIF"
|
||||||
|
},
|
||||||
|
"trainId": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Train Headcode"
|
||||||
|
},
|
||||||
|
"ssd": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "date",
|
||||||
|
"description": "Schedule Start Date (When the service commences)"
|
||||||
|
},
|
||||||
|
"toc": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 2,
|
||||||
|
"maxLength": 2,
|
||||||
|
"description": "TOC Code"
|
||||||
|
},
|
||||||
|
"isPassenger": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "If service is for passengers",
|
||||||
|
"default": true
|
||||||
|
},
|
||||||
|
"isCharter": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "If train is charter service",
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"train",
|
||||||
|
"bus",
|
||||||
|
"ship"
|
||||||
|
],
|
||||||
|
"default": "train"
|
||||||
|
},
|
||||||
|
"isDelayedDelivery": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "If message is sent as part of Darwin service recovery"
|
||||||
|
},
|
||||||
|
"cancelReason": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
],
|
||||||
|
"description": "Reason code for cancellation"
|
||||||
|
},
|
||||||
|
"isDeleted": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Whether schedule should be deleted",
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
|
"locations": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"tpl",
|
||||||
|
"seq"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"tpl": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "TIPLOC of location"
|
||||||
|
},
|
||||||
|
"seq": {
|
||||||
|
"type": "integer",
|
||||||
|
"description": "The order of the stop for sorting and handling repeated TIPLOCs"
|
||||||
|
},
|
||||||
|
"wta": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"wtd": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"wtp": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"pta": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"ptd": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"plat": {
|
||||||
|
"type": [
|
||||||
|
"string",
|
||||||
|
"null"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"isCancelled": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
|
"isSupressed": {
|
||||||
|
"type": "boolean",
|
||||||
|
"default": false,
|
||||||
|
"description": "Defines whether the service should be hidden to the public"
|
||||||
|
},
|
||||||
|
"activities": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"pass": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Indicates that the train does not stop, it only passes this location"
|
||||||
|
},
|
||||||
|
"pickUpDropOff": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Indicates the train stops for passengers to board and alight"
|
||||||
|
},
|
||||||
|
"requestStop": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Indicates if the train stops only when required"
|
||||||
|
},
|
||||||
|
"pickUpOnly": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Indicated the service picks up passengers only"
|
||||||
|
},
|
||||||
|
"dropOffOnly": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Indicates the service drops off passengers only"
|
||||||
|
},
|
||||||
|
"tokenExchange": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Indicates if the train stops for exhanging a token/staff or similar"
|
||||||
|
},
|
||||||
|
"vehiclesAttached": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Indicates if vehicles are attached at this location"
|
||||||
|
},
|
||||||
|
"vehiclesDetached": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Indicates if vehicles are detached at this location"
|
||||||
|
},
|
||||||
|
"trainCrewChange": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Indicates if train stops to exchange crew at this location"
|
||||||
|
},
|
||||||
|
"changeLocomotive": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Indicates if train stops to exchange locomotive at this location"
|
||||||
|
},
|
||||||
|
"changeEnds": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Indicates if the train reverses or driver changes ends at this location"
|
||||||
|
},
|
||||||
|
"staffStop": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Indicates that the train stops for staff use only"
|
||||||
|
},
|
||||||
|
"unadvertised": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Indicates that the stop is not advertised to the public"
|
||||||
|
},
|
||||||
|
"passesAnotherTrain": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Indicates if the train stops to pass another train on a single line crossing point"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"service_name",
|
||||||
|
"service_id",
|
||||||
|
"data_type",
|
||||||
|
"sent_timestamp"
|
||||||
|
],
|
||||||
|
"additionalProperties": true
|
||||||
|
}
|
||||||
39
schemas/data-ingress/pushport/ts.json.txt
Normal file
39
schemas/data-ingress/pushport/ts.json.txt
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
{
|
||||||
|
"$id": "https://schema.owlboard.info/data-ingress/pushport-ts.schema.json",
|
||||||
|
"$schema": "https://json-schema.org/draft-07/schema#",
|
||||||
|
"title": "PushPortTS",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"rid": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Unique ID for the train service (eg. 2026022217610103)",
|
||||||
|
"pattern": "^[0-9]{15}$"
|
||||||
|
},
|
||||||
|
"uid": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Schedule ID - The permanent ID for the schedule in the static timetable"
|
||||||
|
},
|
||||||
|
"ssd": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "date",
|
||||||
|
"description": "Scheduled Start Data, the date the train service started its journey"
|
||||||
|
},
|
||||||
|
"isDelayed": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Indicated if the message is delayed due to PushPort service disruption"
|
||||||
|
},
|
||||||
|
"lateReason": {
|
||||||
|
"type": "integer",
|
||||||
|
"description": "Reason the train is late (Maps to textual reason)"
|
||||||
|
},
|
||||||
|
"cancelReason": {
|
||||||
|
"type": "integer",
|
||||||
|
"description": "Reason the train is cancelled (Maps to textual reason)"
|
||||||
|
},
|
||||||
|
"locations": {
|
||||||
|
"type": "array",
|
||||||
|
"description": "A list of one or more locations where the train has recorded a movement or forecast",
|
||||||
|
"items": { "$ref": "https://schema.owlboard.info/data-ingress/pushport-ts-location.schema.json" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
51
schemas/data-ingress/pushport/ts_location.json.txt
Normal file
51
schemas/data-ingress/pushport/ts_location.json.txt
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
{
|
||||||
|
"$id": "https://schema.owlboard.info/data-ingress/pushport-ts-location.schema.json",
|
||||||
|
"$schema": "https://json-schema.org/draft-07/schema#",
|
||||||
|
"title": "PushPortTSLocation",
|
||||||
|
"type": "object",
|
||||||
|
"required": ["tpl"],
|
||||||
|
"definitions": {
|
||||||
|
"TSTime": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"at": {"type": "string", "description": "Actual time"},
|
||||||
|
"et": {"type": "string", "description": "Estimated time"},
|
||||||
|
"wet": {"type": "string", "description": "Working estimated time"},
|
||||||
|
"src": {"type": "string", "description": "Data source (TD/Darwin/etc)"},
|
||||||
|
"atClass": {"type": "string", "description": "Time source Automatic/Manual"},
|
||||||
|
"delayed": {"type": "boolean", "description": "is train delayed with no estimated time"},
|
||||||
|
"srcInst": {"type": "string", "description": "Source instance (what caused the update)"},
|
||||||
|
"atRemoved": {"type": "boolean", "description": "Whether a previous 'at' was reported in error and should be removed"}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"properties": {
|
||||||
|
"tpl": {"type": "string", "description": "TIPLOC for the location"},
|
||||||
|
"wta": {"type": "string", "description": "Scheduled working time arrival"},
|
||||||
|
"wtd": {"type": "string", "description": "Scheduled working time departure"},
|
||||||
|
"wtp": {"type": "string", "description": "Scheduled working time pass"},
|
||||||
|
"pta": {"type": "string", "description": "Scheduled public arrival time"},
|
||||||
|
"ptd": {"type": "string", "description": "Scheduled public departure time"},
|
||||||
|
"arr": {"$ref": "#/definitions/TSTime"},
|
||||||
|
"dep": {"$ref": "#/definitions/TSTime"},
|
||||||
|
"pass": {"$ref": "#/definitions/TSTime"},
|
||||||
|
"plat": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "Platform data",
|
||||||
|
"properties": {
|
||||||
|
"value": {"type": "string", "description": "Platform number/letter"},
|
||||||
|
"platsrc": {"type": "string", "enum": ["A", "M", "P"], "description": "Source of data Automatic/Manual/Planned"},
|
||||||
|
"platsup": {"type": "boolean", "description": "Is platform suppressed from public display"},
|
||||||
|
"cisPlatsup": {"type": "boolean", "description": "Whether CIS or Darwin Workstation has supressed the platform"},
|
||||||
|
"conf": {"type": "boolean", "description": "Whether platform has been confirmed by the local CIS"}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"suppr": {"type": "boolean", "description": "Whether location is supressed"},
|
||||||
|
"length": {"type": "integer", "description": "Train length (no. of coaches)"},
|
||||||
|
"detachFront": {"type": "boolean","description": "Indicated if coaches will detatch from front"},
|
||||||
|
"detachRead": {"type": "boolean", "description": "Indicates if coaches will detatch from rear"},
|
||||||
|
"attachFront": {"type": "boolean", "description": "Indicates if coaches will attach to front"},
|
||||||
|
"attachRear": {"type": "boolean", "description": "Indicates if coaches will be attached to rear"},
|
||||||
|
"adhoc": {"type": "boolean", "description": "Whether this is an ad-hoc stop"}
|
||||||
|
}
|
||||||
|
}
|
||||||
25
scripts/build.sh
Normal file
25
scripts/build.sh
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Create clean output directories
|
||||||
|
rm -rf gen && mkdir -p gen/ts gen/go/models
|
||||||
|
|
||||||
|
# Find all .json files
|
||||||
|
FILES=$(find schemas -name "*.json")
|
||||||
|
|
||||||
|
# Initialize the TypeScript Barrel File
|
||||||
|
echo "// Auto-generated barrel file" > gen/ts/index.ts
|
||||||
|
|
||||||
|
for file in $FILES; do
|
||||||
|
# Get a clean name (e.g., data-ingress_pis-mapping)
|
||||||
|
clean_name=$(echo "${file#schemas/}" | sed 's/\//_/g' | sed 's/\.json//g')
|
||||||
|
|
||||||
|
# OGenerate TS
|
||||||
|
npx --yes json-schema-to-typescript "$file" > "gen/ts/${clean_name}.ts"
|
||||||
|
|
||||||
|
# Generate Go
|
||||||
|
go-jsonschema -p contracts "$file" > "gen/go/models/${clean_name}.go"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "✅ Generated single TS package in gen/ts"
|
||||||
|
echo "✅ Generated single Go package in gen/go/models"
|
||||||
Reference in New Issue
Block a user