| |
| // Feeds declaration |
| syntax = "proto3"; |
| |
| package food.ordering.service.v1; |
| |
| option go_package = "google/food/ordering/services/v1"; |
| option java_package = "com.google.food.ordering.services.v1"; |
| option java_multiple_files = true; |
| |
| import "google/protobuf/duration.proto"; |
| import "google/protobuf/timestamp.proto"; |
| import "google/type/timeofday.proto"; |
| import "google/type/latlng.proto"; |
| import "google/type/money.proto"; |
| import "google/type/dayofweek.proto"; |
| |
| // Food Ordering Team's EPA Service Feeds Spec. |
| message FoodServiceFeed { |
| // Service feed entity data. |
| repeated ServiceData data = 1; |
| } |
| |
| // Service feed entity data. |
| message ServiceData { |
| oneof type { |
| FoodOrderingService service = 1; |
| ServiceHours service_hours = 2; |
| ServiceArea service_area = 3; |
| Fee fee = 4; |
| } |
| } |
| |
| message FoodOrderingService { |
| // Unique identifier of the provided service. |
| // Required. |
| string service_id = 1 |
| ; |
| enum ServiceType { |
| SERVICE_TYPE_UNKNOWN = 0; |
| DELIVERY = 1; |
| TAKEOUT = 2; |
| } |
| // The type of the service. |
| // Required and cannot be SERVICE_TYPE_UNKNOWN. |
| ServiceType service_type = 2 |
| ; |
| // The parent entity’s ID. |
| // Required. |
| string parent_entity_id = 3 |
| ; |
| // Indicates if the entity is disabled. |
| // Optional. |
| optional bool disabled = 4; |
| // The lead time given in the service entity will apply to all |
| // the service hours unless an overridden property is set in the |
| // service hours entity. |
| // Required. |
| ETA lead_time = 5 |
| ; |
| |
| // Parent action detail's link ID. |
| // Required. |
| string action_link_id = 6 |
| ; |
| } |
| |
| // Lead time range [min, max). At least one of min or max needs to be provided. |
| // In the case of only one field is given, the lead time is treated as a fixed |
| // value instead of a range. |
| message ETA { |
| // Indicates a range of ETA duration. |
| google.protobuf.Duration min_lead_time_duration = 1 |
| ; |
| google.protobuf.Duration max_lead_time_duration = 2 |
| ; |
| } |
| |
| // A closed-open time range. |
| message TimeOfDayRange { |
| // A Time indicating the beginning time of the day of the range (inclusive). |
| // Required. If not given, we assume 00:00:00. |
| google.type.TimeOfDay open_time = 1; |
| // A Time indicating the ending time of the day of the range (exclusive). |
| // Required. If not given, we assume 23:59:59. |
| google.type.TimeOfDay close_time = 2; |
| } |
| |
| // A closed-open duration range. |
| message DurationInterval { |
| // The minimum duration (inclusive). |
| // Required. |
| google.protobuf.Duration min_offset = 1 |
| ; |
| // The maximum duration (exclusive). |
| // Required. |
| google.protobuf.Duration max_offset = 2 |
| ; |
| } |
| |
| // A closed-open timestamp range. |
| message ValidityRange { |
| // The beginning time of the range (inclusive). |
| // Optional. |
| google.protobuf.Timestamp valid_from_time = 1 |
| ; |
| // The ending time of the range (exclusive). |
| // Optional. |
| google.protobuf.Timestamp valid_through_time = 2 |
| ; |
| } |
| |
| // The TimeWindow object is a composite entity that describes a list |
| // of windows the user's order can be either placed or fulfilled. |
| message TimeOfDayWindow { |
| // The time window the order can be placed/fulfilled. |
| // Required. |
| TimeOfDayRange time_windows = 1 |
| ; |
| // The list of days in a week the windows are applied. |
| // Required. If not given, we assume 7 days a week. |
| repeated google.type.DayOfWeek day_of_week = 2 |
| ; |
| } |
| |
| message AsapTimeWindow { |
| // A time window the ASAP order can be placed and fulfilled. |
| // Required. |
| TimeOfDayWindow time_windows = 1 |
| ; |
| |
| // Indicates the lead time, specific to service_time, the service can |
| // be fulfilled. |
| // Optional. |
| ETA lead_time = 2; |
| } |
| |
| // The fulfillment time window for advance orders. |
| message AdvanceTimeWindow { |
| // A time window the advance order can be fulfilled. |
| // Required. |
| TimeOfDayWindow time_windows = 1 |
| ; |
| // a window that an advance order can be placed. For example, an advance |
| // order must be placed at least 60 minutes ahead and not exceeding 2 |
| // days, the interval would be [PT60M, P2D). |
| // Optional. |
| DurationInterval advance_booking_interval = 2; |
| } |
| |
| // Service hours entity for ASAP/Advance orders. |
| message ServiceHours { |
| // Unique identifier of the provided advance service hours. |
| // Required. |
| string hours_id = 1 |
| ; |
| |
| // The unique identifier of the Service entity correlated to this ServiceHours |
| // entity. |
| // Required. |
| repeated string service_ids = 2 |
| ; |
| // The hours the orders can be fulfilled. For ASAP services, this is also |
| // orderable time. |
| // One of the fields (asap_hours/advance_hours) is required to be set. |
| repeated AsapTimeWindow asap_hours = 3 |
| ; |
| repeated AdvanceTimeWindow advance_hours = 4; |
| |
| // When advance ordering services, this is the time windows the orders can be |
| // placed. |
| // Required when advance_hour is given. Invalid when asap_hour is given. |
| repeated TimeOfDayWindow orderable_time = 5 |
| ; |
| |
| // Indicates if the service hours are for special occasions |
| // (e.g. Thanksgiving/...) |
| // Optional |
| optional bool special_hour = 6; |
| // A timestamp window indicating the validity of the special hours. |
| // Optional. Required if it's special hours. |
| ValidityRange validity_range = 7 |
| ; |
| } |
| |
| // Geographical circular area described by a point and radius. |
| message GeoCircle { |
| // Geographical center of the area. |
| // Required. |
| google.type.LatLng center = |
| 1 |
| ; |
| |
| // Radius for the circular area, in meters. Must be greater than 0. |
| // Required. |
| double radius = 2 |
| ; |
| } |
| |
| // Geolocation of interests. |
| message Locality { |
| string country_code = 1 |
| ; |
| |
| // Postal code in the country's local format in string. |
| string postal_code = |
| 2 |
| ; |
| } |
| |
| // Represents a loop of geo coordinates. This should be a valid S2Loop. |
| message Loop { |
| // Points making the boundary of loop. |
| repeated google.type.LatLng point = |
| 1 |
| ; |
| } |
| |
| // Represents a polygon shaped region. |
| message Polygon { |
| reserved 1; |
| |
| // List of S2Loops which defines a polygon. A point is considered in the |
| // polygon if it is contained in odd number of loops. |
| repeated Loop loops = 2 |
| ; |
| } |
| |
| message ServiceArea { |
| // Unique identifier. |
| // Required. |
| string area_id = 1 |
| ; |
| // Identifier to the parent service entity. |
| // Required. |
| repeated string service_ids = 2 |
| ; |
| // One of the following needs to be provided to define the service area. |
| // Required. |
| oneof region { |
| |
| GeoCircle circle = 3; |
| Locality locality = 4; |
| Polygon polygon = 5; |
| } |
| |
| // Sets to true if the assigned area is excluded from serving. |
| // Optional. |
| optional bool excluded_area = 6; |
| } |
| |
| // Wrapper for a range of monetary amount that could be bounded or unbounded. |
| // At least one of min_amount or max_amount is required. |
| message MoneyRange { |
| // Minimum amount. |
| google.type.Money min_amount = 1 |
| ; |
| // Maximum amount. |
| google.type.Money max_amount = 2 |
| ; |
| } |
| |
| // Variable fee which changes based on the price of the order. |
| message PercentageBasedFee { |
| // Optional, base fee not including the variable percentage based fee. |
| google.type.Money base_value = 1 |
| ; |
| |
| // Optional, overall range of possible values of the PercentageBasedFee. |
| optional MoneyRange range = 2; |
| |
| // Optional, percentage representing an additional variable fee based on |
| // the cart subtotal. E.g. 15.0 represents a fee of 15% of the cart. |
| optional double percentage_of_cart_value = 3 |
| ; |
| } |
| |
| message Fee { |
| // Unique identifier to the Fee entity. |
| // Required. |
| string fee_id = 1 |
| ; |
| enum FeeType { |
| FEE_TYPE_UNKNOWN = 0; |
| DELIVERY = 1; |
| SERVICE = 2; |
| } |
| // Indicates the nature of the service, e.g. delivery fee/service fee. |
| // Required. |
| FeeType fee_type = 2 |
| ; |
| |
| oneof amount { |
| |
| // A fixed amount of fees to be collected. |
| google.type.Money fixed_amount = 3; |
| // A range of fees that could be collected. Will mirror |
| // madden.ingestion.MoneyRange for the starting point. |
| MoneyRange range_amount = 4; |
| // Fees in terms of amount percentage. Will mirror |
| // madden.ingestion.QuantitativeValue for the starter. |
| PercentageBasedFee cart_percentage = 5; |
| } |
| // Service association needs to be provided. |
| // Required. |
| repeated string service_ids = 6 |
| ; |
| // Service area can be provided to further restrict eligibility of the |
| // fee. |
| // Optional. |
| repeated string area_ids = 7 |
| ; |
| } |