27 Commits
v0.1.3 ... main

Author SHA1 Message Date
4ab05ba738 Adjust declarations and remove uses of the allOf function to assist with type generation
All checks were successful
Generate and Release Protos / release (push) Successful in 38s
2026-02-27 20:18:57 +00:00
06e6bceb59 Final Draft of 16schedule.json
All checks were successful
Generate and Release Protos / release (push) Successful in 36s
2026-02-25 16:21:40 +00:00
315be1af57 Lost in schema translation! 2026-02-24 21:23:16 +00:00
c9f328bb58 Ensure that data_kind it not optinal
All checks were successful
Generate and Release Protos / release (push) Successful in 30s
2026-02-24 11:56:53 +00:00
355494fc97 Add payload key to MessageEnvelope
All checks were successful
Generate and Release Protos / release (push) Successful in 30s
2026-02-24 11:50:00 +00:00
76281bacfb Wrap schedule message into envelope
All checks were successful
Generate and Release Protos / release (push) Successful in 33s
2026-02-24 11:36:51 +00:00
aff523a038 Add bool for 'pass'
All checks were successful
Generate and Release Protos / release (push) Successful in 30s
2026-02-23 20:42:52 +00:00
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
10 changed files with 770 additions and 222 deletions

View File

@@ -78,22 +78,24 @@ jobs:
ZIP_ROOT="/tmp/go_upload" ZIP_ROOT="/tmp/go_upload"
FULL_PATH="$ZIP_ROOT/$MOD_NAME@$VERSION" FULL_PATH="$ZIP_ROOT/$MOD_NAME@$VERSION"
# 1. Prepare
cd gen/go cd gen/go
go mod init $MOD_NAME
go mod tidy # 2. Initialize the module
go mod init "$MOD_NAME"
# 3. Create the structure
mkdir -p "$FULL_PATH" mkdir -p "$FULL_PATH"
cp -r . "$FULL_PATH/"
# 4. Copy the CONTENTS of models to the root of the module
pushd "$ZIP_ROOT" # This flattens the structure so the .go files are next to go.mod
# -D suppresses directory entries (fixes the "unexpected file" error) cp -r models/* "$FULL_PATH/"
# -q is quiet (optional) cp go.mod "$FULL_PATH/"
# 5. Zip and Upload
cd "$ZIP_ROOT"
zip -r -D "$GITHUB_WORKSPACE/module.zip" . zip -r -D "$GITHUB_WORKSPACE/module.zip" .
popd
# Optional: Verify zip content in logs before upload
unzip -l "$GITHUB_WORKSPACE/module.zip"
curl -f --user "owlbot:${{ secrets.PACKAGE_PUSH }}" \ curl -f --user "owlbot:${{ secrets.PACKAGE_PUSH }}" \
--upload-file "$GITHUB_WORKSPACE/module.zip" \ --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"

View File

@@ -20,7 +20,21 @@ 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 ### 2. Typescript Services

View File

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

View 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"],
"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": {}
},
"required": ["service_name", "service_id", "data_type", "data_kind", "sent_timestamp"],
"additionalProperties": false
}

View File

@@ -8,23 +8,27 @@
"type": "string", "type": "string",
"description": "Name of the service submitting the update" "description": "Name of the service submitting the update"
}, },
"update_type": { "service_id": {
"type": "string",
"description": "ID of the service sending the message - usually a hostname"
},
"data_type": {
"type": "string", "type": "string",
"enum": ["file"], "enum": ["file"],
"description": "The method of update application" "description": "The type of data contained in this message object"
}, },
"sent_timestamp": { "sent_timestamp": {
"type": "integer", "type": "integer",
"description": "Unix timestamp representing the time the message was sent" "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": { "payload": {
"type": "object", "type": "object",
"properties": { "properties": {
"kind": {
"type": "string",
"enum": ["pis"],
"description": "The type of data provided in the update"
},
"version": { "version": {
"type": "string", "type": "string",
"description": "The version string from the package source" "description": "The version string from the package source"
@@ -34,9 +38,10 @@
"description": "The full path to the file, including protocol (eg. s3://) where appropriate" "description": "The full path to the file, including protocol (eg. s3://) where appropriate"
} }
}, },
"required": ["kind", "version", "filepath"] "required": ["version", "filepath"],
"additionalProperties": false
} }
}, },
"required": ["service_name", "update_type", "payload"], "required": ["service_name", "service_id", "data_type", "sent_timestamp", "data_kind", "payload"],
"additionalProperties": false "additionalProperties": false
} }

View File

@@ -0,0 +1,361 @@
{
"$id": "https://schema.owlboard.info/data-ingress/pushport16-schedule.schema.json",
"$schema": "https://json-schema.org/draft-07/schema#",
"title": "PushPortSchedule",
"description": "Consolidated object definition for Darwin Schedule messages",
"definitions": {
"originPoint": {
"description": "Merged Origin (OR / OPOR). The starting point of the journey.",
"required": [
"wtd",
"tpl"
],
"type": "object",
"properties": {
"tpl": {
"type": "string",
"description": "TIPLOC"
},
"act": {
"type": "string",
"default": " ",
"description": "Current Activity Codes"
},
"planAct": {
"type": "string",
"description": "Planned Activity Codes"
},
"can": {
"type": "boolean",
"default": false,
"description": "Cancelled flag"
},
"fid": {
"type": "string",
"description": "Unique identifier of the formation data (v3) "
},
"pta": {
"type": "string",
"description": "Public Scheduled Time of Arrival"
},
"ptd": {
"type": "string",
"description": "Public Scheduled Time of Departure"
},
"avgLoading": {
"type": "string",
"description": "Average Loading value based on long-term averages (v3) "
},
"wta": {
"type": "string",
"description": "Working Scheduled Time of Arrival (Optional)"
},
"wtd": {
"type": "string",
"description": "Working Scheduled Time of Departure (Required)"
},
"fd": {
"type": "string",
"description": "False Destination TIPLOC (Passenger only)"
}
}
},
"callingPoint": {
"description": "Merged Intermediate Point (IP / OPIP). An intermediate stop requiring dwell time.",
"required": [
"wta",
"wtd",
"tpl"
],
"type": "object",
"properties": {
"tpl": {
"type": "string",
"description": "TIPLOC"
},
"act": {
"type": "string",
"default": " ",
"description": "Current Activity Codes"
},
"planAct": {
"type": "string",
"description": "Planned Activity Codes"
},
"can": {
"type": "boolean",
"default": false,
"description": "Cancelled flag"
},
"fid": {
"type": "string",
"description": "Unique identifier of the formation data (v3) "
},
"pta": {
"type": "string",
"description": "Public Scheduled Time of Arrival"
},
"ptd": {
"type": "string",
"description": "Public Scheduled Time of Departure"
},
"avgLoading": {
"type": "string",
"description": "Average Loading value based on long-term averages (v3) "
},
"wta": {
"type": "string",
"description": "Working Scheduled Time of Arrival (Required)"
},
"wtd": {
"type": "string",
"description": "Working Scheduled Time of Departure (Required)"
},
"rdelay": {
"type": "integer",
"default": 0,
"description": "Route delay value"
},
"fd": {
"type": "string",
"description": "False Destination (Passenger only)"
}
}
},
"passPoint": {
"description": "Intermediate Passing Point (PP). Purely operational.",
"required": [
"wtp",
"tpl"
],
"type": "object",
"properties": {
"tpl": {
"type": "string",
"description": "TIPLOC"
},
"act": {
"type": "string",
"default": " ",
"description": "Current Activity Codes"
},
"planAct": {
"type": "string",
"description": "Planned Activity Codes"
},
"can": {
"type": "boolean",
"default": false,
"description": "Cancelled flag"
},
"fid": {
"type": "string",
"description": "Unique identifier of the formation data (v3) "
},
"wtp": {
"type": "string",
"description": "Working Scheduled Time of Passing (Required)"
},
"rdelay": {
"type": "integer",
"default": 0,
"description": "Route delay value"
}
},
"additionalProperties": false
},
"destinationPoint": {
"description": "Merged Destination (DT / OPDT). The termination point of the journey.",
"required": [
"wta",
"tpl"
],
"type": "object",
"properties": {
"tpl": {
"type": "string",
"description": "TIPLOC"
},
"act": {
"type": "string",
"default": " ",
"description": "Current Activity Codes"
},
"planAct": {
"type": "string",
"description": "Planned Activity Codes"
},
"can": {
"type": "boolean",
"default": false,
"description": "Cancelled flag"
},
"fid": {
"type": "string",
"description": "Unique identifier of the formation data (v3) "
},
"pta": {
"type": "string",
"description": "Public Scheduled Time of Arrival"
},
"ptd": {
"type": "string",
"description": "Public Scheduled Time of Departure"
},
"avgLoading": {
"type": "string",
"description": "Average Loading value based on long-term averages (v3) "
},
"wta": {
"type": "string",
"description": "Working Scheduled Time of Arrival (Required)"
},
"wtd": {
"type": "string",
"description": "Working Scheduled Time of Departure (Optional)"
},
"rdelay": {
"type": "integer",
"default": 0,
"description": "Route delay value"
}
}
}
},
"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": "PushPort16Schedule",
"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": "PushPort16Schedule",
"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": "Rail Identifier - Unique value for the service"
},
"uid": {
"type": "string",
"description": "Unique ID - Unique value for the timetable entry - maps to Network Rail CIF schedules"
},
"ssd": {
"type": "string",
"format": "date",
"description": "Service Start Date - The date the service commences"
},
"trainId": {
"type": "string",
"description": "Headcode"
},
"toc": {
"type": "string",
"minLength": 2,
"maxLength": 2,
"description": "Train Operator (ATOC Code)"
},
"rsid": {
"type": "string",
"description": "Retail Service ID"
},
"status": {
"type": "string",
"default": "P",
"description": "P = Permanent, L = Long Term, S = Short Term"
},
"trainCat": {
"type": "string",
"default": "OO",
"description": "Train Category"
},
"isPassenger": {
"type": "boolean",
"default": true,
"description": "Declares the service as a passenger service"
},
"isActive": {
"type": "boolean",
"default": false,
"description": "UNKNOWN"
},
"isCharter": {
"type": "boolean",
"default": false,
"description": "Declares the service as a charter service"
},
"cancelReason": {
"type": "integer",
"description": "Cancellation Reason code"
},
"locations": {
"type": "object",
"additionalProperties": false,
"description": "Merged and flattened location objects",
"properties": {
"OR": {
"type": "array",
"description": "OR/OPOR Values - Trains Origin",
"items": {
"$ref": "#/definitions/originPoint"
}
},
"IP": {
"type": "array",
"description": "IP/OPIP Values - Intermediate Points",
"items": {
"$ref": "#/definitions/callingPoint"
}
},
"PP": {
"type": "array",
"description": "Passing Points (Non-stop)",
"items": {
"$ref": "#/definitions/passPoint"
}
},
"DT": {
"type": "array",
"description": "DT/OPDT Values - Trains Destination",
"items": {
"$ref": "#/definitions/destinationPoint"
}
}
}
}
}
}
},
"required": [
"service_name",
"service_id",
"data_type",
"sent_timestamp"
],
"additionalProperties": false
}

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

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

View File

@@ -18,7 +18,7 @@ for file in $FILES; do
npx --yes json-schema-to-typescript "$file" > "gen/ts/${clean_name}.ts" npx --yes json-schema-to-typescript "$file" > "gen/ts/${clean_name}.ts"
# Generate Go # Generate Go
go-jsonschema -p models "$file" > "gen/go/models/${clean_name}.go" go-jsonschema -p contracts "$file" > "gen/go/models/${clean_name}.go"
done done
echo "✅ Generated single TS package in gen/ts" echo "✅ Generated single TS package in gen/ts"