diff --git a/protos/rail_backend/v1/schedule_payload.proto b/protos/rail_backend/v1/schedule_payload.proto deleted file mode 100644 index c9088b9..0000000 --- a/protos/rail_backend/v1/schedule_payload.proto +++ /dev/null @@ -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; -} \ No newline at end of file diff --git a/schemas/data-ingress/pushport/schedule.json b/schemas/data-ingress/pushport/schedule.json index 1a891cb..bb1111c 100644 --- a/schemas/data-ingress/pushport/schedule.json +++ b/schemas/data-ingress/pushport/schedule.json @@ -3,56 +3,239 @@ "$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": { + "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": { - "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"} + "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 } \ No newline at end of file