Compare commits
77 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e574358ea9 | |||
| 698248487a | |||
| b8eaad4bbd | |||
| a1aeb7e79f | |||
| a734dea17a | |||
| e7f307f243 | |||
| 727641f49f | |||
| b17efa3e5d | |||
| 56aae55f16 | |||
| 91abe29b62 | |||
| c22f3c7230 | |||
| 311ff3798f | |||
| a869935241 | |||
| 6cf6ea8aef | |||
| 50824255f8 | |||
| e1950c0ef3 | |||
| 1a9b68ce41 | |||
| 817baa7d66 | |||
| 072902be59 | |||
| 2452e17faa | |||
| f2a9b7ffdc | |||
| 4ab05ba738 | |||
| 06e6bceb59 | |||
| 315be1af57 | |||
| c9f328bb58 | |||
| 355494fc97 | |||
| 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 | |||
| aab04bb194 | |||
| 1e0b3cc574 | |||
| cf2609f624 | |||
| ab31c84913 | |||
| 018190f76b | |||
| affdb052b2 | |||
| 90fe8be81d | |||
| 9c27e46bfb | |||
| e3877bc7c0 | |||
| c876637720 | |||
| 7fd7d94572 | |||
| d6c5750d5e | |||
| 2068a4335b | |||
| 7e2361015a | |||
| 59e405d2c4 |
@@ -16,59 +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-setup-action@v1
|
|
||||||
|
|
||||||
- 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
|
|
||||||
echo "$PATH:$(pwd)/ts-proto" >> $GITHUB_PATH
|
|
||||||
|
|
||||||
- name: Generate Code
|
- name: Build and Publish TS
|
||||||
run: buf generate
|
|
||||||
|
|
||||||
- name: Publish TS
|
|
||||||
working-directory: gen/ts
|
working-directory: gen/ts
|
||||||
run: |
|
run: |
|
||||||
npm init -y
|
npm init -y
|
||||||
jq '.name = "@owlboard/backend-data-contracts" |
|
|
||||||
.version = "${{ steps.get_version.outputs.VERSION }}" |
|
# Build index.ts
|
||||||
.description = "Generated Protobuf types for data ingress services" |
|
echo "// Auto-generated" > index.ts
|
||||||
.repository = {
|
find . -maxdepth 1 -name "*.ts" -not -name "index.ts" | sed 's|^\./||; s|\.ts$||' | awk '{
|
||||||
"type": "git",
|
# Use gsub to turn hyphens into underscores so we can split easily
|
||||||
"url": "git+https://${{ github.server_url }}/${{ github.repository }}.git"
|
clean = $0;
|
||||||
} |
|
gsub(/-/, "_", clean);
|
||||||
.bugs = {
|
|
||||||
"url": "https://${{ github.server_url }}/${{ github.repository }}/issues"
|
n = split(clean, parts, "_");
|
||||||
} |
|
name = "";
|
||||||
.homepage = "https://${{ github.server_url }}/${{ github.repository }}#readme"' \
|
for (i=1; i<=n; i++) {
|
||||||
package.json > temp.json && mv temp.json package.json
|
if (length(parts[i]) > 0) {
|
||||||
npm publish
|
name = name toupper(substr(parts[i],1,1)) substr(parts[i],2);
|
||||||
env:
|
}
|
||||||
NODE_AUTH_TOKEN: ${{ secrets.PACKAGE_PUSH }}
|
}
|
||||||
|
# name will now be 'DataIngressPisData' (valid TS)
|
||||||
|
printf "export * as %s from \"./%s.js\";\n", name, $0
|
||||||
|
}' >> index.ts
|
||||||
|
|
||||||
- name: Commit Generated Go
|
VERSION="${{ steps.get_version.outputs.VERSION }}"
|
||||||
|
jq --arg ver "$VERSION" \
|
||||||
|
--arg name "@owlboard/backend-data-contracts" \
|
||||||
|
'.name = $name | .version = $ver | .type = "module" | .main = "./dist/index.js" | .types = "./dist/index.d.ts"' \
|
||||||
|
package.json > package.json.new && mv package.json.new package.json
|
||||||
|
|
||||||
|
# Compile
|
||||||
|
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
|
||||||
|
|
||||||
|
- name: Publish Go
|
||||||
run: |
|
run: |
|
||||||
git config user.name "owlbot"
|
VERSION="v${{ steps.get_version.outputs.VERSION }}"
|
||||||
git config user.email "owlbot@owlboard.info"
|
MOD_NAME="git.fjla.uk/owlboard/backend-data-contracts"
|
||||||
git add gen/go/*.go
|
ZIP_ROOT="/tmp/go_upload"
|
||||||
git commit -m "OwlBot: Generated go types for ${{ steps.get_version.outputs.VERSION }}"
|
FULL_PATH="$ZIP_ROOT/$MOD_NAME@$VERSION"
|
||||||
git diff-index --quiet HEAD || git commit -m "OwlBot: Generated go types for ${{ steps.get_version.outputs.VERSION }}"
|
|
||||||
git push origin HEAD:refs/tags/${{ github.ref_name }} --force
|
# 1. Prepare
|
||||||
env:
|
cd gen/go
|
||||||
GITHUB_TOKEN: ${{ secrets.REPO_PUSH }}
|
|
||||||
|
# 2. Initialize the module
|
||||||
|
go mod init "$MOD_NAME"
|
||||||
|
|
||||||
|
# 3. Create the structure
|
||||||
|
mkdir -p "$FULL_PATH"
|
||||||
|
|
||||||
|
# 4. Copy the CONTENTS of models to the root of the module
|
||||||
|
# This flattens the structure so the .go files are next to go.mod
|
||||||
|
cp -r models/* "$FULL_PATH/"
|
||||||
|
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"
|
||||||
65
README.md
65
README.md
@@ -1,34 +1,51 @@
|
|||||||
# data-contracts
|
# backend-data-contracts
|
||||||
|
|
||||||
This repository is the single source of truth for all Protocol Buffer (Protobuf) schema definitions used across the Rail Ingress and Processing microservices.
|
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
|
## Directory Structure
|
||||||
|
|
||||||
The Protobuf files defined here serve as the immutable data contract for:
|
| Path | Description |
|
||||||
1. **Message Queue Payloads:** Defining messages pushed to the Artemis queue (Go Process Service consumption).
|
| :--- | :--- |
|
||||||
2. **Database Schemas:** Defining the expected structure of documents in MongoDB (Go Process and TypeScript API service consumption).
|
| `schemas` | JSON Schema files organised into clear subfolders |
|
||||||
3. **Cross-Service Communication:** Ensuring type-safe data exchange between all polyglot services (Go, TypeScript).
|
| `scripts` | Workflow Scripts |
|
||||||
|
|
||||||
## Directory Structure and Artifacts
|
## Code Generation and Publishing Workflow
|
||||||
|
|
||||||
| Path | Description | Contents |
|
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.
|
||||||
| :--- | :--- | :--- |
|
|
||||||
| `protos/rail/v1/` | **Source Code.** Contains all source `.proto` files. **Only these files reside on the `main` branch.** | `.proto` files |
|
|
||||||
| `ts/` | **Generated TypeScript/JavaScript code.** Used as the root for the NPM package publish. **Not committed to Git.** | `package.json`, generated `.js`, `.d.ts` |
|
|
||||||
| `go.mod` | Defines the Go Module path: `git.fjla.uk/owlboard/backend-data-contracts`. | Go Module definition |
|
|
||||||
|
|
||||||
## Code Generation and Publishing Workflow (Gitea Action)
|
## To Consume the Contracts
|
||||||
|
|
||||||
The generation process is automated via a Gitea Action (`.gitea/workflows/generate_contracts.yml`), which runs when a change is pushed to a source `.proto` file.
|
### 1. Go Services
|
||||||
|
Since the package is hosted in the Gitea Package Registry, you must configure your environment to use the Gitea instance as a proxy.
|
||||||
|
|
||||||
The action performs the following steps:
|
**Setup:**
|
||||||
1. Generates all Go and TypeScript/JavaScript artifacts.
|
```bash
|
||||||
2. **Go Artifacts:** Commits the generated `*.pb.go` files to a **new Git tag** (e.g., `v1.0.1`), ensuring the `main` branch remains clean.
|
# Set the proxy to check our Gitea instance first
|
||||||
3. **TypeScript Artifacts:** Packages the generated files and publishes the corresponding version (e.g., `1.0.1`) to the internal NPM registry.
|
go env -w GOPROXY="https://git.fjla.uk/api/packages/OwlBoard/go,https://proxy.golang.org,direct"
|
||||||
|
|
||||||
### To Consume the Contract:
|
# Trust our internal domain and skip the public Google checksum database
|
||||||
|
go env -w GONOSUMDB="git.fjla.uk"
|
||||||
|
```
|
||||||
|
|
||||||
| Language | Artifact | Consumption Method |
|
The, you can simply run go get, as usual.
|
||||||
| :--- | :--- | :--- |
|
|
||||||
| **Go** | Source Code (`*.pb.go`) | **Requires a Git Tag.** Update your service's `go.mod` file to reference the desired tag: `git.fjla.uk/owlboard/backend-data-contracts v1.0.1`. |
|
#### Container Usage
|
||||||
| **TypeScript** | NPM Package | Update the version in your `package.json` file and install: `"@owlboard/contracts": "1.0.1"`. |
|
```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
|
||||||
|
```
|
||||||
12
buf.gen.yaml
12
buf.gen.yaml
@@ -1,12 +0,0 @@
|
|||||||
version: v1
|
|
||||||
plugins:
|
|
||||||
- plugin: go
|
|
||||||
out: gen/go
|
|
||||||
opt: paths=source_relative
|
|
||||||
- plugin: ts-proto
|
|
||||||
path: ./node_modules/ts-proto/protoc-gen-ts_proto
|
|
||||||
out: gen/ts
|
|
||||||
opt:
|
|
||||||
- esModuleInterop=true
|
|
||||||
- outputJsonMethods=true
|
|
||||||
- forceLong=string
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
# buf.work.yaml
|
|
||||||
version: v1
|
|
||||||
directories:
|
|
||||||
- protos
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
syntax = "proto3";
|
|
||||||
|
|
||||||
package rail.v1;
|
|
||||||
option go_package = "git.fjla.uk/owlboard/generated/go/rail/v1";
|
|
||||||
|
|
||||||
message Metadata {
|
|
||||||
int64 push_to_queue_time = 1;
|
|
||||||
int64 data_fetch_time = 2;
|
|
||||||
map<string, string> tags = 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
syntax = "proto3";
|
|
||||||
|
|
||||||
package rail.v1;
|
|
||||||
option go_package = "git.fjla.uk/owlboard/backend-data-contracts";
|
|
||||||
|
|
||||||
message PisReferenceList {
|
|
||||||
repeated PisMapping entries = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
message PisMapping {
|
|
||||||
string code = 1;
|
|
||||||
string operator = 2;
|
|
||||||
repeated string stops = 3;
|
|
||||||
fixed64 stops_xxh4 = 4; // XXH4 Hash for fast lookup of exact match
|
|
||||||
}
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
syntax = "proto3";
|
|
||||||
|
|
||||||
package rail.v1;
|
|
||||||
option go_package = "git.fjla.uk/owlboard/generated/go/rail/v1";
|
|
||||||
|
|
||||||
|
|
||||||
import "rail/v1/common.proto";
|
|
||||||
import "rail/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,199 +0,0 @@
|
|||||||
syntax = "proto3";
|
|
||||||
|
|
||||||
package rail.v1;
|
|
||||||
option go_package = "git.fjla.uk/owlboard/generated/go/rail/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;
|
|
||||||
}
|
|
||||||
118
schemas/data-ingress/darwin-data/darwin-association.json
Normal file
118
schemas/data-ingress/darwin-data/darwin-association.json
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
{
|
||||||
|
"$id": "https://schema.owlboard.info/data-ingress/darwin/association.schema.json",
|
||||||
|
"$schema": "https://json-schema.org/draft-07/schema#",
|
||||||
|
"title": "DarwinAssocData",
|
||||||
|
"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": "raw",
|
||||||
|
"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",
|
||||||
|
"const": "darwin-association",
|
||||||
|
"description": "The data type contained in the message. Currently supported PIS: PIS Data, Timetable: CIF or VSTP Data, Knowledgebase: Station Data"
|
||||||
|
},
|
||||||
|
"payload": {
|
||||||
|
"type": "array",
|
||||||
|
"additionalItems": false,
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"mr",
|
||||||
|
"ar",
|
||||||
|
"t",
|
||||||
|
"c",
|
||||||
|
"s",
|
||||||
|
"mt",
|
||||||
|
"at"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"mr": {
|
||||||
|
"type": "string",
|
||||||
|
"name": "Main RID",
|
||||||
|
"description": "The main RID of this association object"
|
||||||
|
},
|
||||||
|
"ar": {
|
||||||
|
"type": "string",
|
||||||
|
"name": "Associated RID",
|
||||||
|
"description": "The associated RID of this association object"
|
||||||
|
},
|
||||||
|
"t": {
|
||||||
|
"type": "string",
|
||||||
|
"name": "TIPLOC",
|
||||||
|
"description": "The location at which this association applies"
|
||||||
|
},
|
||||||
|
"c": {
|
||||||
|
"enum": ["JJ", "VV", "LK", "NP"],
|
||||||
|
"name": "Category",
|
||||||
|
"description": "The type of association"
|
||||||
|
},
|
||||||
|
"s": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "date",
|
||||||
|
"name": "SSD",
|
||||||
|
"description": "SSD Generated from the Main RID"
|
||||||
|
},
|
||||||
|
"mt": {
|
||||||
|
"name": "Main Times",
|
||||||
|
"description": "Timings that apply to the main RID",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"wta": { "type": "string" },
|
||||||
|
"wtd": { "type": "string" },
|
||||||
|
"wtp": { "type": "string" },
|
||||||
|
"pta": { "type": "string" },
|
||||||
|
"ptd": { "type": "string" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"at": {
|
||||||
|
"name": "Associated Times",
|
||||||
|
"description": "Timings that apply to the associated RID",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"wta": { "type": "string" },
|
||||||
|
"wtd": { "type": "string" },
|
||||||
|
"wtp": { "type": "string" },
|
||||||
|
"pta": { "type": "string" },
|
||||||
|
"ptd": { "type": "string" }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"can": {
|
||||||
|
"name": "Cancelled",
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Whether this association is cancelled"
|
||||||
|
},
|
||||||
|
"del": {
|
||||||
|
"name": "Deleted",
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Whether this association is deleted"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"service_name",
|
||||||
|
"service_id",
|
||||||
|
"data_type",
|
||||||
|
"data_kind",
|
||||||
|
"sent_timestamp",
|
||||||
|
"payload"
|
||||||
|
],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
209
schemas/data-ingress/darwin-data/darwin-schedule.json
Normal file
209
schemas/data-ingress/darwin-data/darwin-schedule.json
Normal file
@@ -0,0 +1,209 @@
|
|||||||
|
{
|
||||||
|
"$id": "https://schema.owlboard.info/data-ingress/darwin/schedule.schema.json",
|
||||||
|
"$schema": "https://json-schema.org/draft-07/schema#",
|
||||||
|
"title": "DarwinScheduleData",
|
||||||
|
"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": "raw",
|
||||||
|
"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",
|
||||||
|
"const": "darwin-schedule",
|
||||||
|
"description": "The data type contained in the message. Currently supported PIS: PIS Data, Timetable: CIF or VSTP Data, Knowledgebase: Station Data"
|
||||||
|
},
|
||||||
|
"payload": {
|
||||||
|
"type": "array",
|
||||||
|
"additionalItems": false,
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"additionalProperties": false,
|
||||||
|
"required": [
|
||||||
|
"rid",
|
||||||
|
"uid",
|
||||||
|
"ssd",
|
||||||
|
"tid",
|
||||||
|
"toc",
|
||||||
|
"isp",
|
||||||
|
"isc",
|
||||||
|
"l"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"rid": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Service RID",
|
||||||
|
"maxLength": 16
|
||||||
|
},
|
||||||
|
"uid": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Service UID",
|
||||||
|
"maxLength": 10
|
||||||
|
},
|
||||||
|
"ssd": {
|
||||||
|
"type": "string",
|
||||||
|
"format": "date",
|
||||||
|
"description": "Date on which the service commences"
|
||||||
|
},
|
||||||
|
"tid": {
|
||||||
|
"name": "train_id",
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 4,
|
||||||
|
"maxLength": 4,
|
||||||
|
"description": "The signalling headcode of the service"
|
||||||
|
},
|
||||||
|
"toc": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 2,
|
||||||
|
"maxLength": 2,
|
||||||
|
"description": "The two character code for the operating TOC"
|
||||||
|
},
|
||||||
|
"sts": {
|
||||||
|
"type": "string",
|
||||||
|
"maxLength": 1,
|
||||||
|
"name": "status",
|
||||||
|
"description": "The 'status' of the service"
|
||||||
|
},
|
||||||
|
"qt": {
|
||||||
|
"name": "qtrain",
|
||||||
|
"description": "qtrain?",
|
||||||
|
"type": "boolean",
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
|
"d": {
|
||||||
|
"name": "deleted",
|
||||||
|
"description": "Whether the schedule is deleted",
|
||||||
|
"type": "boolean",
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
|
"isp": {
|
||||||
|
"name": "is_passenger",
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Whether the service is a passenger service"
|
||||||
|
},
|
||||||
|
"isc": {
|
||||||
|
"name": "is_charter",
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Whether the service is a charter service"
|
||||||
|
},
|
||||||
|
"sid": {
|
||||||
|
"name": "rsid",
|
||||||
|
"type": ["string", "null"],
|
||||||
|
"maxLength": 10
|
||||||
|
},
|
||||||
|
"q": {
|
||||||
|
"name": "qtrain",
|
||||||
|
"description": "True if the service is scheduled but not activated (if not activated, presumed not running)",
|
||||||
|
"type": "boolean",
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
|
"cr": {
|
||||||
|
"name": "cancel_reason",
|
||||||
|
"type": ["integer", "null"],
|
||||||
|
"description": "The reason code for the services cancellation"
|
||||||
|
},
|
||||||
|
"cl": {
|
||||||
|
"name": "cancel_location",
|
||||||
|
"type": "string",
|
||||||
|
"description": "The location at which the service was cancelled"
|
||||||
|
},
|
||||||
|
"l": {
|
||||||
|
"type": "array",
|
||||||
|
"minItems": 2,
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"required": ["tpl", "lr", "s"],
|
||||||
|
"properties": {
|
||||||
|
"tpl": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "The locations TIPLOC",
|
||||||
|
"maxLength": 7,
|
||||||
|
"minLength": 4
|
||||||
|
},
|
||||||
|
"lr": {
|
||||||
|
"name": "loc_role",
|
||||||
|
"description": "The role of the location (Orig, Call, Pass, Dest)",
|
||||||
|
"enum": ["ORIG", "CALL", "PASS", "DEST"]
|
||||||
|
},
|
||||||
|
"s": {
|
||||||
|
"name": "seq",
|
||||||
|
"description": "The sequence in the service at which this location occours",
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": 1,
|
||||||
|
"maximum": 32767
|
||||||
|
},
|
||||||
|
"pta": {
|
||||||
|
"description": "Public timetable arrival",
|
||||||
|
"type": "string",
|
||||||
|
"format": "date-time"
|
||||||
|
},
|
||||||
|
"ptd": {
|
||||||
|
"description": "Public timetable departure",
|
||||||
|
"type": "string",
|
||||||
|
"format": "date-time"
|
||||||
|
},
|
||||||
|
"wta": {
|
||||||
|
"description": "Working timetable arrival",
|
||||||
|
"type": "string",
|
||||||
|
"format": "date-time"
|
||||||
|
},
|
||||||
|
"wtd": {
|
||||||
|
"description": "Working timetable arrival",
|
||||||
|
"type": "string",
|
||||||
|
"format": "date-time"
|
||||||
|
},
|
||||||
|
"wtp": {
|
||||||
|
"description": "Working timetable pass",
|
||||||
|
"type": "string",
|
||||||
|
"format": "date-time"
|
||||||
|
},
|
||||||
|
"c": {
|
||||||
|
"name": "can",
|
||||||
|
"description": "Whether the service is cancelled at this location",
|
||||||
|
"default": false,
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
"a": {
|
||||||
|
"name": "activities",
|
||||||
|
"type": "string",
|
||||||
|
"maxLength": 12
|
||||||
|
},
|
||||||
|
"fid": {
|
||||||
|
"description": "Unique formation indentifier (Maps to formation feed)",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"al": {
|
||||||
|
"name": "avg_loading",
|
||||||
|
"description": "Average loading at this location",
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"service_name",
|
||||||
|
"service_id",
|
||||||
|
"data_type",
|
||||||
|
"data_kind",
|
||||||
|
"sent_timestamp",
|
||||||
|
"payload"
|
||||||
|
],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
{
|
||||||
|
"$id": "https://schema.owlboard.info/data-ingress/darwin/ref/stations.schema.json",
|
||||||
|
"$schema": "https://json-schema.org/draft-07/schema#",
|
||||||
|
"title": "DarwinStationsNames",
|
||||||
|
"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": "raw",
|
||||||
|
"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",
|
||||||
|
"const": "ref-darwin-station-names",
|
||||||
|
"description": "The data type contained in the message. Currently supported PIS: PIS Data, Timetable: CIF or VSTP Data, Knowledgebase: Station Data"
|
||||||
|
},
|
||||||
|
"payload": {
|
||||||
|
"type": "array",
|
||||||
|
"additionalItems": false,
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"required": ["c", "n"],
|
||||||
|
"properties": {
|
||||||
|
"c": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "CRS of the location"
|
||||||
|
},
|
||||||
|
"n": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "The display name of this location"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["service_name", "service_id", "data_type", "data_kind", "sent_timestamp"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
{
|
||||||
|
"$id": "https://schema.owlboard.info/data-ingress/darwin/ref/tiplocs.schema.json",
|
||||||
|
"$schema": "https://json-schema.org/draft-07/schema#",
|
||||||
|
"title": "DarwinTiplocData",
|
||||||
|
"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": "raw",
|
||||||
|
"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",
|
||||||
|
"const": "ref-darwin-tiplocs",
|
||||||
|
"description": "The data type contained in the message. Currently supported PIS: PIS Data, Timetable: CIF or VSTP Data, Knowledgebase: Station Data"
|
||||||
|
},
|
||||||
|
"payload": {
|
||||||
|
"type": "array",
|
||||||
|
"additionalItems": false,
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"required": ["t", "n"],
|
||||||
|
"properties": {
|
||||||
|
"c": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "CRS of the location"
|
||||||
|
},
|
||||||
|
"t": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "TIPLOC assigned to the location"
|
||||||
|
},
|
||||||
|
"n": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "The display name of this location"
|
||||||
|
},
|
||||||
|
"l": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "The NLC of this location"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["service_name", "service_id", "data_type", "data_kind", "sent_timestamp"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
{
|
||||||
|
"$id": "https://schema.owlboard.info/data-ingress/darwin/ref/via-text.schema.json",
|
||||||
|
"$schema": "https://json-schema.org/draft-07/schema#",
|
||||||
|
"title": "DarwinViaText",
|
||||||
|
"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": "raw",
|
||||||
|
"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",
|
||||||
|
"const": "ref-darwin-via-text",
|
||||||
|
"description": "The data type contained in the message. Currently supported PIS: PIS Data, Timetable: CIF or VSTP Data, Knowledgebase: Station Data"
|
||||||
|
},
|
||||||
|
"payload": {
|
||||||
|
"type": "array",
|
||||||
|
"additionalItems": false,
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"required": ["a", "d", "l1", "v"],
|
||||||
|
"properties": {
|
||||||
|
"a": {
|
||||||
|
"name": "at",
|
||||||
|
"type": "string",
|
||||||
|
"description": "The CRS defining where the text should be displayed"
|
||||||
|
},
|
||||||
|
"d": {
|
||||||
|
"name": "destination",
|
||||||
|
"type": "string",
|
||||||
|
"description": "The text should apply to trains to this destination"
|
||||||
|
},
|
||||||
|
"l1": {
|
||||||
|
"name": "location-one",
|
||||||
|
"type": "string",
|
||||||
|
"description": "Message triggered if loc1 & loc2 (if present) are listed as stops"
|
||||||
|
},
|
||||||
|
"l2": {
|
||||||
|
"name": "location-two",
|
||||||
|
"type": "string",
|
||||||
|
"description": "Message triggered if loc1 & loc2 (if present) are listed as stops"
|
||||||
|
},
|
||||||
|
"v": {
|
||||||
|
"name": "viaText",
|
||||||
|
"description": "The text that should be displayed",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["service_name", "service_id", "data_type", "data_kind", "sent_timestamp"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
{
|
||||||
|
"$id": "https://schema.owlboard.info/data-ingress/darwin/ref/loading-category.schema.json",
|
||||||
|
"$schema": "https://json-schema.org/draft-07/schema#",
|
||||||
|
"title": "DarwinLoadingCatData",
|
||||||
|
"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": "raw",
|
||||||
|
"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",
|
||||||
|
"const": "ref-darwin-loading-category",
|
||||||
|
"description": "The data type contained in the message. Currently supported PIS: PIS Data, Timetable: CIF or VSTP Data, Knowledgebase: Station Data"
|
||||||
|
},
|
||||||
|
"payload": {
|
||||||
|
"type": "array",
|
||||||
|
"additionalItems": false,
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"required": ["c", "n"],
|
||||||
|
"properties": {
|
||||||
|
"c": {
|
||||||
|
"name": "code",
|
||||||
|
"type": "string",
|
||||||
|
"description": "The 'code' for the 'category'"
|
||||||
|
},
|
||||||
|
"t": {
|
||||||
|
"name": "typicalDescription",
|
||||||
|
"type": "string",
|
||||||
|
"description": "The 'typicalDescription' of the category"
|
||||||
|
},
|
||||||
|
"e": {
|
||||||
|
"name": "expectedDescription",
|
||||||
|
"type": "string",
|
||||||
|
"description": "The 'expectedDescription' of the category"
|
||||||
|
},
|
||||||
|
"d": {
|
||||||
|
"name": "definition",
|
||||||
|
"description": "The 'definition' of the category",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"n": {
|
||||||
|
"name": "name",
|
||||||
|
"description": "The 'name' of the category",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"i": {
|
||||||
|
"name": "image",
|
||||||
|
"description": "The 'image' for the category",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"o": {
|
||||||
|
"name": "TOC",
|
||||||
|
"description": "The 'toc' for the category",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["service_name", "service_id", "data_type", "data_kind", "sent_timestamp"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
57
schemas/data-ingress/darwin-reference-data/reason-code.json
Normal file
57
schemas/data-ingress/darwin-reference-data/reason-code.json
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
{
|
||||||
|
"$id": "https://schema.owlboard.info/data-ingress/darwin/ref/reasons.schema.json",
|
||||||
|
"$schema": "https://json-schema.org/draft-07/schema#",
|
||||||
|
"title": "DarwinReasonCodeData",
|
||||||
|
"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": "raw",
|
||||||
|
"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",
|
||||||
|
"const": "ref-darwin-reason-code",
|
||||||
|
"description": "The data type contained in the message. Currently supported PIS: PIS Data, Timetable: CIF or VSTP Data, Knowledgebase: Station Data"
|
||||||
|
},
|
||||||
|
"payload": {
|
||||||
|
"type": "array",
|
||||||
|
"additionalItems": false,
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"required": ["c"],
|
||||||
|
"properties": {
|
||||||
|
"c": {
|
||||||
|
"type": "integer",
|
||||||
|
"name": "code",
|
||||||
|
"description": "The 'code' that the late/cancel reason maps to"
|
||||||
|
},
|
||||||
|
"lr": {
|
||||||
|
"type": "string",
|
||||||
|
"name": "Late Reason",
|
||||||
|
"description": "The lateReason string for the item"
|
||||||
|
},
|
||||||
|
"cr": {
|
||||||
|
"type": "string",
|
||||||
|
"name": "Cancellation Reason",
|
||||||
|
"description": "The cancelReason string for the item"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["service_name", "service_id", "data_type", "data_kind", "sent_timestamp"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
57
schemas/data-ingress/darwin-reference-data/toc.json
Normal file
57
schemas/data-ingress/darwin-reference-data/toc.json
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
{
|
||||||
|
"$id": "https://schema.owlboard.info/data-ingress/darwin/ref/tocs.schema.json",
|
||||||
|
"$schema": "https://json-schema.org/draft-07/schema#",
|
||||||
|
"title": "DarwinTocData",
|
||||||
|
"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": "raw",
|
||||||
|
"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",
|
||||||
|
"const": "ref-darwin-toc",
|
||||||
|
"description": "The data type contained in the message. Currently supported PIS: PIS Data, Timetable: CIF or VSTP Data, Knowledgebase: Station Data"
|
||||||
|
},
|
||||||
|
"payload": {
|
||||||
|
"type": "array",
|
||||||
|
"additionalItems": false,
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"required": ["c", "n"],
|
||||||
|
"properties": {
|
||||||
|
"c": {
|
||||||
|
"name": "ATOC Code",
|
||||||
|
"type": "string",
|
||||||
|
"description": "The ATOC 'code' for the TOC"
|
||||||
|
},
|
||||||
|
"n": {
|
||||||
|
"name": "TOC Name",
|
||||||
|
"type": "string",
|
||||||
|
"description": "The name of the TOC"
|
||||||
|
},
|
||||||
|
"u": {
|
||||||
|
"name": "URL",
|
||||||
|
"type": "string",
|
||||||
|
"description": "URL for TOC Information"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["service_name", "service_id", "data_type", "data_kind", "sent_timestamp"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
119
schemas/data-ingress/knowledgebase/kb-stations.json
Normal file
119
schemas/data-ingress/knowledgebase/kb-stations.json
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
{
|
||||||
|
"$id": "https://schema.owlboard.info/data-ingress/knowledgebase/stations.schema.json",
|
||||||
|
"$schema": "https://json-schema.org/draft-07/schema#",
|
||||||
|
"title": "KnowledgebaseStations",
|
||||||
|
"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": "raw",
|
||||||
|
"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",
|
||||||
|
"const": "kb-stations"
|
||||||
|
},
|
||||||
|
"payload": {
|
||||||
|
"type": "array",
|
||||||
|
"additionalItems": false,
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"c",
|
||||||
|
"mc",
|
||||||
|
"l",
|
||||||
|
"o",
|
||||||
|
"p",
|
||||||
|
"a",
|
||||||
|
"r",
|
||||||
|
"d"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"c": {
|
||||||
|
"type": "string",
|
||||||
|
"name": "CRS Code",
|
||||||
|
"description": "Station CRS (Primary Key)"
|
||||||
|
},
|
||||||
|
"n": {
|
||||||
|
"type": "string",
|
||||||
|
"name": "NLC Code",
|
||||||
|
"description": "Station NLC Code"
|
||||||
|
},
|
||||||
|
"mc": {
|
||||||
|
"type": "number",
|
||||||
|
"name": "Minimum Connection Time",
|
||||||
|
"description": "The minimum connection time at this station"
|
||||||
|
},
|
||||||
|
"a": {
|
||||||
|
"type": "string",
|
||||||
|
"name": "Address",
|
||||||
|
"description": "The address of the station"
|
||||||
|
},
|
||||||
|
"p": {
|
||||||
|
"type": "string",
|
||||||
|
"name": "Postcode",
|
||||||
|
"description": "The public postcode of the station"
|
||||||
|
},
|
||||||
|
"l": {
|
||||||
|
"type": "object",
|
||||||
|
"name": "Location",
|
||||||
|
"description": "LatLon of the station",
|
||||||
|
"required": ["lt", "ln"],
|
||||||
|
"properties": {
|
||||||
|
"lt": {
|
||||||
|
"type": "number",
|
||||||
|
"name": "Latitude",
|
||||||
|
"description": "Stations Latitude"
|
||||||
|
},
|
||||||
|
"ln": {
|
||||||
|
"type": "number",
|
||||||
|
"name": "Longitude",
|
||||||
|
"description": "Stations Longitude"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"o": {
|
||||||
|
"type": "string",
|
||||||
|
"name": "Operator",
|
||||||
|
"description": "The two character code denoting the stations operator"
|
||||||
|
},
|
||||||
|
"m": {
|
||||||
|
"type": "string",
|
||||||
|
"name": "Map URL"
|
||||||
|
},
|
||||||
|
"r": {
|
||||||
|
"name": "Request",
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Denotes whether station is Request Stop"
|
||||||
|
},
|
||||||
|
"d": {
|
||||||
|
"name": "Defibrillator",
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Denotes whether defibrillator is available"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"service_name",
|
||||||
|
"service_id",
|
||||||
|
"data_type",
|
||||||
|
"data_kind",
|
||||||
|
"sent_timestamp",
|
||||||
|
"payload"
|
||||||
|
],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
33
schemas/data-ingress/message-envelope.json
Normal file
33
schemas/data-ingress/message-envelope.json
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"$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", "raw"],
|
||||||
|
"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", "kb-stations", "PushPort16Schedule", "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": {}
|
||||||
|
},
|
||||||
|
"required": ["service_name", "service_id", "data_type", "data_kind", "sent_timestamp"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
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
|
||||||
|
}
|
||||||
30
schemas/data-ingress/network-rail/networkRailCorpus.json
Normal file
30
schemas/data-ingress/network-rail/networkRailCorpus.json
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"$id": "https://schema.owlboard.info/data-ingress/network-rail/networkRailCorpus.schema.json",
|
||||||
|
"$schema": "https://json-schema.org/draft-07/schema#",
|
||||||
|
"title": "networkRailCorpus",
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"t",
|
||||||
|
"n"
|
||||||
|
],
|
||||||
|
"additionalProperties": false,
|
||||||
|
"properties": {
|
||||||
|
"t": {
|
||||||
|
"type": "string",
|
||||||
|
"name": "TIPLOC",
|
||||||
|
"description": "The TIPLOC Code of the location"
|
||||||
|
},
|
||||||
|
"n": {
|
||||||
|
"type": "string",
|
||||||
|
"name": "Name",
|
||||||
|
"description": "The human readable name of the location"
|
||||||
|
},
|
||||||
|
"nc": {
|
||||||
|
"type": "integer",
|
||||||
|
"name": "NLC",
|
||||||
|
"description": "The national location code of the location",
|
||||||
|
"minimum": 0,
|
||||||
|
"maximum": 999999
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
41
schemas/data-ingress/pis-data.json
Normal file
41
schemas/data-ingress/pis-data.json
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
{
|
||||||
|
"$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"
|
||||||
|
},
|
||||||
|
"tiplocStops": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 4,
|
||||||
|
"maxLength": 7,
|
||||||
|
"pattern": "^[a-zA-Z0-9]+$"
|
||||||
|
},
|
||||||
|
"description": "List of TIPLOC Codes"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["code", "toc", "crsStops", "tiplocStops"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
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