49 Commits

Author SHA1 Message Date
e0a7c5f56e Add boolean for passesAnotherTrain
All checks were successful
Generate and Release Protos / release (push) Successful in 32s
2026-02-23 20:30:05 +00:00
9a9fc59e22 Add booleans to describe service activities and whether the service is supressed 2026-02-23 20:29:10 +00:00
d103314350 Rename problematic files
All checks were successful
Generate and Release Protos / release (push) Successful in 29s
2026-02-23 19:20:29 +00:00
5c16b17aea Try passing '$id' as ref
Some checks failed
Generate and Release Protos / release (push) Failing after 23s
2026-02-23 19:17:39 +00:00
71e04b93d5 Try relpath from repo root!
Some checks failed
Generate and Release Protos / release (push) Failing after 26s
2026-02-23 19:14:54 +00:00
423bb9fc34 Try path from repo root
Some checks failed
Generate and Release Protos / release (push) Failing after 25s
2026-02-23 19:13:33 +00:00
eb7c3a18d8 Try rel path
Some checks failed
Generate and Release Protos / release (push) Failing after 23s
2026-02-23 19:11:53 +00:00
fe68c038de Fix ref to schema file
Some checks failed
Generate and Release Protos / release (push) Failing after 23s
2026-02-23 19:09:37 +00:00
776263c068 Add Schedule type for Darwin PushPort
Some checks failed
Generate and Release Protos / release (push) Failing after 25s
2026-02-23 19:07:31 +00:00
87ed1d01d5 Add late & canel reason keys 2026-02-22 01:48:26 +00:00
057f5ed777 Add 'atRemoved' field to TSTime definition 2026-02-22 01:32:03 +00:00
93df742c7d Add schemas for PushPort TS Message type 2026-02-22 01:29:50 +00:00
f20f2f83ec Update readme to exlpain installing the package with Go. 2026-01-14 19:16:51 +00:00
770ee003e7 Add message-envelope type
All checks were successful
Generate and Release Protos / release (push) Successful in 27s
2026-01-14 18:51:14 +00:00
a5675b1442 Add 'service_id' field. Used to include the message senders hostname
All checks were successful
Generate and Release Protos / release (push) Successful in 26s
2026-01-13 18:54:10 +00:00
a927ccc732 Add additional file types ready for declaration
All checks were successful
Generate and Release Protos / release (push) Successful in 30s
2026-01-13 18:40:16 +00:00
817c338745 Update data_type and data_kind fields 2026-01-13 18:38:14 +00:00
af3c82518c Change go package name
All checks were successful
Generate and Release Protos / release (push) Successful in 26s
2026-01-08 23:30:56 +00:00
9511db8ee9 Set correct package name for Go package generation
All checks were successful
Generate and Release Protos / release (push) Successful in 26s
2026-01-08 23:15:48 +00:00
fc92331238 Try and fix AGAIN
All checks were successful
Generate and Release Protos / release (push) Successful in 26s
2026-01-08 23:06:45 +00:00
a4e6386fd1 Attempt to fix internal ZIP structure again?
All checks were successful
Generate and Release Protos / release (push) Successful in 26s
2026-01-08 22:55:15 +00:00
3199037c5a Fix structure of internal ZIP file for the Go release
All checks were successful
Generate and Release Protos / release (push) Successful in 25s
2026-01-08 22:47:30 +00:00
a78e749d55 Fix the Go version string
All checks were successful
Generate and Release Protos / release (push) Successful in 28s
2026-01-08 22:38:59 +00:00
fb4d7b2ed6 Remove translates proto files 2026-01-07 20:13:02 +00:00
3d750b1b18 Add MQFileIpdate schema (Currently supporting PIS only) 2026-01-07 20:09:10 +00:00
f9463f3d29 Update README 2026-01-07 18:46:15 +00:00
7fe1be9b48 Workflow fix
All checks were successful
Generate and Release Protos / release (push) Successful in 25s
2026-01-07 18:36:32 +00:00
c8731caadd Fix again
Some checks failed
Generate and Release Protos / release (push) Failing after 22s
2026-01-07 18:28:34 +00:00
20cb7b101c Try fix workflow
Some checks failed
Generate and Release Protos / release (push) Failing after 23s
2026-01-07 18:25:43 +00:00
ac3124ff14 Adjust workflow for correct module generation
Some checks failed
Generate and Release Protos / release (push) Failing after 23s
2026-01-07 18:23:17 +00:00
b29f42c004 Fix script call
Some checks failed
Generate and Release Protos / release (push) Failing after 25s
2026-01-07 17:29:01 +00:00
051721ce02 Fix go module installation
Some checks failed
Generate and Release Protos / release (push) Failing after 32s
2026-01-07 17:26:49 +00:00
04ed0ede29 Switch to JSON Schema rather than protobuf
Some checks failed
Generate and Release Protos / release (push) Failing after 9s
2026-01-07 17:23:56 +00:00
a17e7a5290 Update buf.gen.yaml
All checks were successful
Generate and Release Protos / release (push) Successful in 22s
2026-01-07 15:59:19 +00:00
aab04bb194 Fix import difficulties in typescript
All checks were successful
Generate and Release Protos / release (push) Successful in 23s
2026-01-07 15:46:51 +00:00
1e0b3cc574 Update Go Publishing step
All checks were successful
Generate and Release Protos / release (push) Successful in 22s
2026-01-07 14:40:30 +00:00
cf2609f624 Add verbose logging for curl output in the Publish Go job
Some checks failed
Generate and Release Protos / release (push) Failing after 21s
2026-01-07 14:30:57 +00:00
ab31c84913 Fix Go publishing step to handle URL properly
All checks were successful
Generate and Release Protos / release (push) Successful in 21s
2026-01-07 14:07:56 +00:00
018190f76b Fix NPM Step
Some checks failed
Generate and Release Protos / release (push) Failing after 22s
2026-01-07 14:04:45 +00:00
affdb052b2 Try and update npm build & publish step
Some checks failed
Generate and Release Protos / release (push) Failing after 21s
2026-01-07 13:52:38 +00:00
90fe8be81d Update tsc command
Some checks failed
Generate and Release Protos / release (push) Failing after 20s
2026-01-07 13:37:56 +00:00
9c27e46bfb Update tsc command
Some checks failed
Generate and Release Protos / release (push) Failing after 20s
2026-01-07 13:34:21 +00:00
e3877bc7c0 Update path to protoc-gen-go
Some checks failed
Generate and Release Protos / release (push) Failing after 18s
2026-01-07 13:32:12 +00:00
c876637720 Update buildbuf version
Some checks failed
Generate and Release Protos / release (push) Failing after 19s
2026-01-07 13:29:11 +00:00
7fd7d94572 Set specific big version
Some checks failed
Generate and Release Protos / release (push) Failing after 5s
2026-01-07 13:27:19 +00:00
d6c5750d5e Move to new buf-action
Some checks failed
Generate and Release Protos / release (push) Failing after 9s
2026-01-07 13:25:07 +00:00
2068a4335b Update directory name to cover the correct package name
Some checks failed
Generate and Release Protos / release (push) Failing after 23s
2026-01-07 13:17:02 +00:00
7e2361015a Ugrade generation steps to use bufv2, and Gitea Go package registry. 2026-01-07 13:15:14 +00:00
59e405d2c4 Update package name 2026-01-06 21:05:31 +00:00
16 changed files with 413 additions and 132 deletions

View File

@@ -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"

View File

@@ -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
```

View File

@@ -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

View File

@@ -1,4 +0,0 @@
# buf.work.yaml
version: v1
directories:
- protos

3
go.mod
View File

@@ -1,3 +0,0 @@
module git.fjla.uk/owlboard/backend-data-contracts
go 1.24.10

View File

@@ -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;
}

View File

@@ -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
}

View File

@@ -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;
}

View File

@@ -1,7 +1,6 @@
syntax = "proto3"; syntax = "proto3";
package rail.v1; package rail_backend.v1;
option go_package = "git.fjla.uk/owlboard/generated/go/rail/v1";
enum SchedulePayloadType { enum SchedulePayloadType {
VSTP_MESSAGE_TYPE_UNSPECIFIED = 0; VSTP_MESSAGE_TYPE_UNSPECIFIED = 0;

View 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
}

View 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
}

View 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
}

View File

@@ -0,0 +1,57 @@
{
"$id": "https://schema.owlboard.info/data-ingress/pushport-schedule.schema.json",
"$schema": "https://json-schema.org/draft-07/schema#",
"title": "PushPortSchedule",
"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": {
"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"}
}
}
}
}
}
}
}

View 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" }
}
}
}

View 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
View 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"