blob: 62689d85ec2555d6c37a39ef7a41e921b29dfc7f [file] [log] [blame]
// Feeds declaration
syntax = "proto3";
package food.menu.v1;
import "google/protobuf/timestamp.proto";
import "money.proto";
import "localized_text.proto";
option go_package = "food/menu/v1/proto";
message FoodMenuFeed {
repeated MenuComponent data = 1;
}
message MenuComponent {
oneof type {
food.menu.v1.Menu menu = 1;
food.menu.v1.MenuSection section = 2;
food.menu.v1.MenuItem item = 3;
food.menu.v1.MenuItemOption option = 4;
}
}
// Top-level catalog of food items offered by a Food establishment. Menu
// contains a list of merchant ids and the menu that apply to those merchants.
// A Menu can be used to represent single merchant with the menu, or multiple
// merchants (typically chain restaurants) with the menus.
message Menu {
// An opaque string from a partner which uniquely identifies the Menu within
// the partner feed.
// Required.
string menu_id = 1;
// The merchants to whom the menu apply.
// Note: This field is repeated so chain restaurants can share the same menu
// across multiple locations, each of which is a separate merchant.
// Required.
repeated string merchant_ids = 2;
// The name that can identify the Menu when a user is browsing the menu.
// Optional.
TextField display_name = 3;
// The default language code associated with the text labels contained in the
// menu. Expects BCP-47 language code, such as "en-US" or "sr-Latn".
//
// For more information, see
// http://www.unicode.org/reports/tr35/#Unicode_locale_identifier.
// Optional.
string language = 4;
// Disclaimer to be shown to the user for the menu. For example, nutritional
// information disclosure and allergen disclosure.
// Optional.
Disclaimer disclaimer = 5;
// IDs of items contained within this menu. Expects first-level menu items
// only.
// Optional.
repeated string menu_item_ids = 6;
// IDs of sections contained within this menu. Expects first-level menu
// sections only.
// Optional.
repeated string menu_section_ids = 7;
// Timestamp when this Menu or any of its contents was last updated by the
// restaurant; i.e. a date to be associated with the phrase “accurate as of
// date”.
// Optional.
google.protobuf.Timestamp last_merchant_update_time = 8;
}
// A menu section is a grouping of items on a menu. Separate MenuSections are
// usually created for each logical grouping of items on a menu. For example,
// meal course type (Appetizer, Main, Dessert) and food categories (Burgers,
// Drinks) are typical sections.
message MenuSection {
// An opaque string from an partner which uniquely identifies the MenuSection
// within the partner feed.
// Required.
string menu_section_id = 1;
// The name that can identify the MenuSection when a user is browsing the
// menu.
// Required.
TextField display_name = 2;
// A description of the menu section.
// Optional.
TextField description = 3;
// Image(s) of the menu section.
// Optional.
repeated Image images = 4;
// IDs of MenuItem entities that correspond to this MenuSection entity. A
// section is expected to have at least 1 item if it does not contain any
// sub-sections.
// Optional.
repeated string menu_item_ids = 6;
// Child MenuSections (sub-sections) that correspond to this MenuSection
// entity.
// Optional.
repeated string menu_section_ids = 7;
}
// Represents a single food or drink item offered by a Food establishment.
message MenuItem {
// An opaque string from an partner which uniquely identifies the MenuItem
// within the partner feed.
// Required.
string menu_item_id = 1;
// The name that can identify the MenuItem when a user is browsing the menu.
// Required.
TextField display_name = 2;
// A description of the menu item.
// Optional.
TextField description = 3;
// Image(s) of the menu item.
// Optional.
repeated Image images = 4;
// Container that specifies a list of options available on an item.
message MenuItemOptionSet {
// IDs of menu item options that are applicable to this menu item.
// Required.
repeated string menu_item_option_ids = 1;
}
// The menu item must either have a price, or a set of menu item options.
// Required.
oneof pricing {
// Available offers to purchase this food item.
OfferSet offer_set = 6;
// Available options for this menu item.
MenuItemOptionSet menu_item_option_set = 7;
}
// Attributes about this menu item.
// Optional.
MenuItemAttributes item_attributes = 8;
}
// Describes choices that a user would be required to make when selecting a
// dish / combo. The user must select an option, otherwise the order is
// considered invalid (e.g. the user must choose small, medium, or large for a
// pizza).
message MenuItemOption {
// An opaque string from an partner which uniquely identifies the
// MenuItemOption within the partner feed.
// Required.
string menu_item_option_id = 9;
// Option property and value e.g. Size: Small.
// Required.
MenuItemOptionProperty value = 2;
// Available offers to purchase this menu item option.
// Required.
OfferSet offer_set = 4;
// Attributes about this menu item option.
// Optional.
MenuItemAttributes item_attributes = 5;
}
// Describes attributes about a particular menu item or option.
message MenuItemAttributes {
// Number of servings available in a given menu item.
// Optional.
optional int32 number_of_servings = 1;
// Describes all the nutritional information of the item, e.g. calories, fat
// content.
// Optional.
NutritionInformation nutrition_information = 2;
// The dietary restrictions that this menu item complies with.
// Optional.
repeated DietaryRestriction suitable_diets = 3;
// Additives of this menu item.
// Optional.
repeated Additive additive = 4;
// Allergens of this menu item.
// Optional.
repeated Allergen allergen = 5;
// Packaging and recycling information of this menu item.
// Optional.
DepositInfo packaging_deposit_info = 6;
}
// Container for a list of offers available on a menu item / option.
// Only one offer should be applicable/valid at one particular time.
// For example, a drink can have 2 offers where one is applicable in the morning
// while the other is applicable in the evening during happy hours.
message OfferSet {
// List of possible offers.
// Required.
repeated Offer offers = 1;
}
// Represents pricing and availability information for MenuItems and
// MenuItemOptions.
message Offer {
// Monetary value of the menu item/option on sale. Can be 0 to represent free.
// Required.
google.type.Money price = 1;
}
// Partner provided disclaimer shown to the user. Contains a text disclaimer
// along with an optional URL for more information.
// Some example include: associated medical risks/warnings, any additional
// fees/gratutity, etc.
message Disclaimer {
// Body of the disclaimer text to be shown to the user.
// Required.
TextField text = 1;
// URL containing more information about the disclaimer.
// Optional.
string uri = 2;
}
// A text payload that contains one or more localized values.
message TextField {
// Per-locale text values.
//
// If there is only one desired locale support, then the language_code within
// each text is not required to be set and the language will be inferred from
// the default language of the menu.
//
// If there are multiple texts across different locales, then the
// language_code must be set for each text. The first text in the list is
// considered the preferred representation.
// Required.
repeated google.type.LocalizedText text = 1;
}
// Represents an image associated with a menu entity.
message Image {
// URL containing the raw pixels of the image.
// Required.
string uri = 1;
}
// Describes the property of a menu item option and its value.
message MenuItemOptionProperty {
// Types of property that the option is for.
enum PropertyType {
// Do not use. The property type is not explicitly specified.
UNKNOWN_PROPERTY_TYPE = 0;
// A generic menu item option property, which is not one of the more
// specific types below. Use this if the property is not of type
// SIZE or PIZZA_SIDE.
OPTION = 1;
// Denotes the menu item option property of size (e.g. small, medium, or
// large).
SIZE = 2;
// Property specific to pizzas. For example: this MenuItemOption is only
// valid for a portion/whole pizza, such as mushroom toppings on the left
// side, right side, or whole pizza).
PIZZA_SIDE = 3;
}
// Well-defined values for the option property.
enum PropertyValue {
// Do not use. The property value is not explicitly specified.
UNKNOWN_PROPERTY_VALUE = 0;
// The MenuItemOption applies only to the left side of a pizza.
PIZZA_SIDE_LEFT = 1;
// The MenuItemOption applies only to the right side of a pizza.
PIZZA_SIDE_RIGHT = 2;
// The MenuItemOption applies to the entire pizza.
PIZZA_SIDE_WHOLE = 3;
}
// The type of this option property.
// Required.
PropertyType property_type = 1;
// Required.
oneof value {
// A well-defined value for the option property. Currently only expected
// if the property_type is PIZZA_SIDE.
PropertyValue property_val = 2;
// A free-form text for the value of the property. Expected for
// property_type OPTION and SIZE.
TextField text_val = 3;
}
}
// Describes all the nutritional measurements of a MenuItem or add-on.
message NutritionInformation {
// Describes a single nutritional measurement of the serving of food.
message NutritionValue {
// Describes a closed range for the nutrition value. E.g. "100-150 cal"
message Range {
// The minimum amount of nutrition value.
// Required.
double min = 1;
// The maximum amount of nutrition value.
// Required.
double max = 2;
}
// Required oneof.
oneof value {
// A single number representing the amount of nutritional value.
double amount = 1;
// A range representing the amount of nutritional value.
Range range = 3;
}
// The unit associated with the amount as specified from the partner. We
// will validate the feed so that the unit for each type of nutrition value
// is expected for that type of value. For example, only ENERGY_CALORIES
// and ENERGY_KILOJOULES are expected on energy property of
// NutritionalInformation.
// Required.
NutritionValueUnit unit = 2;
}
// The amount of nutritional energy of the serving of food. Can be defined
// in Calories or kilojoules.
// Optional.
NutritionValue energy = 1;
// The amount of sodium content, measured in grams or milligrams.
// Optional.
NutritionValue sodium_content = 2;
// The number of servings the nutrition value applies to.
// Optional.
optional int32 serving_size = 3;
// Nutrition information in free text. For example "Contains preservatives".
// Optional.
TextField description = 4;
}
// Indicates a dietary restriction or guideline adhered to during
// food preparation.
enum DietaryRestriction {
// Do not use. The dietary restriction is not explicitly specified.
DIET_UNSPECIFIED = 0;
DIET_DIABETIC = 1;
DIET_GLUTEN_FREE = 2;
DIET_HALAL = 3;
DIET_HINDU = 4;
DIET_KOSHER = 5;
DIET_LOW_CALORIE = 6;
DIET_LOW_FAT = 7;
DIET_LOW_LACTOSE = 8;
DIET_LOW_SALT = 9;
DIET_VEGAN = 10;
DIET_VEGETARIAN = 11;
}
// Additive shown to the user on the MenuItem. An additive preserves or enhances
// the quality of the food.
message Additive {
// Descriptive text of the additive, e.g. "preservatives".
// Required.
TextField name = 1;
// Whether the MenuItem contains, may contain, or is free from this additive.
// Defaults to contains.
// Optional.
optional ContainmentLevelCode containment_level_code = 2;
}
// Allergen shown to the user on the MenuItem. An allergen relates to qualities
// of food that causes allergic reactions.
message Allergen {
// Type of allergen.
// Required.
AllergenTypeCode allergen_type_code = 1;
// Whether the MenuItem contains, may contain, or is free from this allergen.
// Defaults to contains.
// Optional.
optional ContainmentLevelCode containment_level_code = 2;
}
// Allergen type derived from GS1: http://gs1.org/voc/AllergenTypeCode
enum AllergenTypeCode {
// Do not use. The allergen type code is not explicitly specified.
ALLERGEN_TYPE_CODE_UNSPECIFIED = 0;
ALLERGEN_TYPE_CODE_ALMONDS = 1;
ALLERGEN_TYPE_CODE_ALPHA_ISOMETHYL_IONONE = 2;
ALLERGEN_TYPE_CODE_ALCOHOL = 3;
ALLERGEN_TYPE_CODE_AMYL_CINNAMAL = 4;
ALLERGEN_TYPE_CODE_ANISE_ALCOHOL = 5;
ALLERGEN_TYPE_CODE_BARLEY = 6;
ALLERGEN_TYPE_CODE_BENZYL_ALCOHOL = 7;
ALLERGEN_TYPE_CODE_BENZYL_BENZOATE = 8;
ALLERGEN_TYPE_CODE_BENZYL_CINNAMATE = 9;
ALLERGEN_TYPE_CODE_BENZYL_SALICYLATE = 10;
ALLERGEN_TYPE_CODE_BRAZIL_NUTS = 11;
ALLERGEN_TYPE_CODE_BUTYLPHENYL_METHYLPROPIONATE = 12;
ALLERGEN_TYPE_CODE_CARROTS = 13;
ALLERGEN_TYPE_CODE_CASHEW_NUTS = 14;
ALLERGEN_TYPE_CODE_CELERY = 15;
ALLERGEN_TYPE_CODE_CEREALS_CONTAINING_GLUTEN = 16;
ALLERGEN_TYPE_CODE_CINNAMAL = 17;
ALLERGEN_TYPE_CODE_CINNAMYL_ALCOHOL = 18;
ALLERGEN_TYPE_CODE_CITRAL = 19;
ALLERGEN_TYPE_CODE_CITRONELLOL = 20;
ALLERGEN_TYPE_CODE_COCOA = 21;
ALLERGEN_TYPE_CODE_CORIANDER = 22;
ALLERGEN_TYPE_CODE_CORN = 23;
ALLERGEN_TYPE_CODE_COUMARIN = 24;
ALLERGEN_TYPE_CODE_CRUSTACEANS = 25;
ALLERGEN_TYPE_CODE_EGGS = 26;
ALLERGEN_TYPE_CODE_EUGENOL = 27;
ALLERGEN_TYPE_CODE_EVERNIA_FURFURACEA = 28;
ALLERGEN_TYPE_CODE_EVERNIA_PRUNASTRI = 29;
ALLERGEN_TYPE_CODE_FARNESOL = 30;
ALLERGEN_TYPE_CODE_FISH = 31;
ALLERGEN_TYPE_CODE_GERANIOL = 32;
ALLERGEN_TYPE_CODE_GLUTEN = 33;
ALLERGEN_TYPE_CODE_HAZELNUTS = 34;
ALLERGEN_TYPE_CODE_HEXYL_CINNAMAL = 35;
ALLERGEN_TYPE_CODE_HYDROXYCITRONELLAL = 36;
ALLERGEN_TYPE_CODE_HYDROXYISOHEXYL_3_CYCLOHEXENE_CARBOXALDEHYDE_ISOEUGENOL_LIMONENE_LINAL =
37;
ALLERGEN_TYPE_CODE_KAMUT = 38;
ALLERGEN_TYPE_CODE_LACTOSE = 39;
ALLERGEN_TYPE_CODE_LUPINE = 40;
ALLERGEN_TYPE_CODE_MACADAMIA_NUTS = 41;
ALLERGEN_TYPE_CODE_METHYL_2_OCTYNOATE = 42;
ALLERGEN_TYPE_CODE_MILK = 43;
ALLERGEN_TYPE_CODE_MOLLUSCS = 44;
ALLERGEN_TYPE_CODE_MUSTARD = 45;
ALLERGEN_TYPE_CODE_NO_DECLARED_ALLERGENS = 46;
ALLERGEN_TYPE_CODE_OAT = 47;
ALLERGEN_TYPE_CODE_PEANUTS = 48;
ALLERGEN_TYPE_CODE_PEAS = 49;
ALLERGEN_TYPE_CODE_PECAN_NUTS = 50;
ALLERGEN_TYPE_CODE_PISTACHIOS = 51;
ALLERGEN_TYPE_CODE_POD_FRUITS = 52;
ALLERGEN_TYPE_CODE_QUEENSLAND_NUTS = 53;
ALLERGEN_TYPE_CODE_RYE = 54;
ALLERGEN_TYPE_CODE_SESAME_SEEDS = 55;
ALLERGEN_TYPE_CODE_SOYBEANS = 56;
ALLERGEN_TYPE_CODE_SPELT = 57;
ALLERGEN_TYPE_CODE_SULPHUR_DIOXIDE = 58;
ALLERGEN_TYPE_CODE_TREE_NUTS = 59;
ALLERGEN_TYPE_CODE_TREE_NUT_TRACES = 60;
ALLERGEN_TYPE_CODE_WALNUTS = 61;
ALLERGEN_TYPE_CODE_WHEAT = 62;
}
// Partner provided deposit info to instruct the user how to deposit a food item
// or bottle and the value of such deposit.
message DepositInfo {
// The deposit strategy to employ, e.g. "reusable".
// Optional.
optional DepositCode deposit_code = 1;
// Value refunded for depositing the item properly.
// Optional.
google.type.Money deposit_value = 2;
}
enum NutritionValueUnit {
// Do not use. The nutrition value unit is not explicitly set.
NUTRITION_VALUE_UNIT_UNSPECIFIED = 0;
// Units used to express the amount of energy in a menu item.
ENERGY_CALORIES = 1;
ENERGY_KILOJOULES = 2;
// Units used to express the amount in weight a substance is present in the
// menu item.
WEIGHT_MILLIGRAMS = 3;
WEIGHT_GRAMS = 4;
}
// Indicates the level of containment a food item has of a certain attribute,
// such as allergens or additives.
enum ContainmentLevelCode {
// Do not use. The containment level code is not explicitly specified.
CONTAINMENT_LEVEL_CODE_UNSPECIFIED = 0;
CONTAINMENT_LEVEL_CODE_CONTAINS = 1;
CONTAINMENT_LEVEL_CODE_DOES_NOT_CONTAIN = 2;
CONTAINMENT_LEVEL_CODE_MAY_CONTAIN = 3;
}
// Indicates how to properly deposit a food item or bottle.
enum DepositCode {
// Do not use. The deposite code is not explicitly specified.
DEPOSIT_CODE_UNSPECIFIED = 0;
DEPOSIT_CODE_REUSABLE = 1;
DEPOSIT_CODE_RECYCLABLE = 2;
}