adding order redirect entity and action proto samples
diff --git a/.gitignore b/.gitignore index 0f245e8..edb9f61 100644 --- a/.gitignore +++ b/.gitignore
@@ -2,3 +2,9 @@ target bazel-* generated +target +dist +vendor +build +go.mod +go.sum \ No newline at end of file
diff --git a/order-redirect/go/action/action.go b/order-redirect/go/action/action.go new file mode 100644 index 0000000..e60cefd --- /dev/null +++ b/order-redirect/go/action/action.go
@@ -0,0 +1,76 @@ +/** +Example Action feed for Google Order Redirect. +**/ + +package main + +import ( + pb "feed/app/generated/google/madden/ingestion" + "fmt" + + "google.golang.org/protobuf/encoding/protojson" +) + +func main() { + feedJSON := createFeed() + fmt.Println(feedJSON) +} + +func createFeed() string { + // Create ActionDetail + // Example using one link for both delivery and takeout + merchantNameCombined := "merchant-1" + linkIDCombined := "merchant-1-takeout-delivery-action" + urlCombined := "http://provider.com/merchant-1" + actionCombined := &pb.ActionDetail{ + EntityId: &merchantNameCombined, + LinkId: &linkIDCombined, + Url: &urlCombined, + Actions: []*pb.Action{{ + ActionInfo: &pb.Action_FoodOrderingInfo{ + FoodOrderingInfo: &pb.FoodOrderingInfo{ + ServiceType: pb.FoodOrderingInfo_DELIVERY, + }, + }}, { + ActionInfo: &pb.Action_FoodOrderingInfo{ + FoodOrderingInfo: &pb.FoodOrderingInfo{ + ServiceType: pb.FoodOrderingInfo_TAKEOUT, + }, + }}, + }, + } + + // Example using a separate link for delivery + merchantNameDelivery := "merchant-2" + linkIDDelivery := "merchant-2-delivery-action" + urlDelivery := "http://provider.com/merchant-2/delivery" + actionDelivery := &pb.ActionDetail{ + EntityId: &merchantNameDelivery, + LinkId: &linkIDDelivery, + Url: &urlDelivery, + Actions: []*pb.Action{{ + ActionInfo: &pb.Action_FoodOrderingInfo{ + FoodOrderingInfo: &pb.FoodOrderingInfo{ + ServiceType: pb.FoodOrderingInfo_DELIVERY, + }, + }}, + }, + } + + // Create ActionFeed + feed := &pb.ActionFeed{ + Data: []*pb.ActionDetail{ + actionCombined, + actionDelivery, + }, + } + + // Serialize to JSON string + marshalOptions := protojson.MarshalOptions{ + UseProtoNames: true, + } + jsonBytes, _ := marshalOptions.Marshal(feed) + return string(jsonBytes) +} + +// [END create_feed]
diff --git a/order-redirect/go/entity/entity.go b/order-redirect/go/entity/entity.go new file mode 100644 index 0000000..035394b --- /dev/null +++ b/order-redirect/go/entity/entity.go
@@ -0,0 +1,55 @@ +/** +Example Entity feed for Google Order Redirect. +**/ + +package main + +import ( + pb "feed/app/generated/google/madden/ingestion" + "fmt" + + "google.golang.org/protobuf/encoding/protojson" +) + +func main() { + feedJSON := createFeed() + fmt.Println(feedJSON) +} + +func createFeed() string { + + // Create Entity + entity := &pb.Entity{ + EntityId: "merchant-id", + Name: "Mo's Dinner", + Telephone: "+14567891234", + Url: "http://moesdinner.com", + Location: &pb.GeoCoordinates{ + Latitude: 41.525588, + Longitude: -90.507067, + Addresses: &pb.GeoCoordinates_Address{ + Address: &pb.PostalAddress{ + Country: "US", + Locality: "Mountain View", + Region: "CA", + PostalCode: "94043", + StreetAddress: "1600 Amphitheatre Pkwy", + }, + }, + }, + } + + // Create EntityFeed + feed := &pb.EntityFeed{ + Data: []*pb.Entity{ + entity, + }, + } + + // Serialize to JSON string + marshalOptions := protojson.MarshalOptions{ + UseProtoNames: true, + } + jsonBytes, _ := marshalOptions.Marshal(feed) + return string(jsonBytes) +}
diff --git a/order-redirect/java/pom.xml b/order-redirect/java/pom.xml new file mode 100644 index 0000000..fdca852 --- /dev/null +++ b/order-redirect/java/pom.xml
@@ -0,0 +1,68 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>com.example.order_redirect</groupId> + <artifactId>feed</artifactId> + <version>1.0.0</version> + <properties> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> + <java.version>11.0</java.version> + <maven.compiler.source>11</maven.compiler.source> + <maven.compiler.target>11</maven.compiler.target> + <protobuf.version>3.22.0</protobuf.version> + </properties> + <dependencies> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + <version>4.12</version> + </dependency> + <dependency> + <groupId>com.google.protobuf</groupId> + <artifactId>protobuf-java</artifactId> + <version>${protobuf.version}</version> + </dependency> + <dependency> + <groupId>com.google.protobuf</groupId> + <artifactId>protobuf-java-util</artifactId> + <version>${protobuf.version}</version> + </dependency> + </dependencies> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <version>3.2.2</version> + <configuration> + <archive> + <manifest> + <addClasspath>true</addClasspath> + </manifest> + </archive> + </configuration> + </plugin> + <plugin> + <artifactId>maven-assembly-plugin</artifactId> + <configuration> + <descriptorRefs> + <descriptorRef>jar-with-dependencies</descriptorRef> + </descriptorRefs> + </configuration> + <executions> + <execution> + <id>make-assembly</id> <!-- this is used for inheritance merges --> + <phase>package</phase> <!-- bind to the packaging phase --> + <goals> + <goal>single</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> +</project> \ No newline at end of file
diff --git a/order-redirect/java/src/main/java/com/example/order_redirect/ActionFeedExample.java b/order-redirect/java/src/main/java/com/example/order_redirect/ActionFeedExample.java new file mode 100644 index 0000000..ee1e697 --- /dev/null +++ b/order-redirect/java/src/main/java/com/example/order_redirect/ActionFeedExample.java
@@ -0,0 +1,74 @@ +/** +Example Action feed for Google Order Redirect. +**/ + +package com.example.order_redirect; + +import com.google.protobuf.InvalidProtocolBufferException; +import com.google.protobuf.util.JsonFormat; +import com.google.madden.ingestion.ActionFeed; +import com.google.madden.ingestion.Action; +import com.google.madden.ingestion.ActionDetail; +import com.google.madden.ingestion.FoodOrderingInfo; + + +public class ActionFeedExample { + + public static void main(String[] args) throws InvalidProtocolBufferException { + ActionFeedExample feed = new ActionFeedExample(); + String feedJSON = feed.createActionFeed(); + System.out.println(feedJSON); + } + + public String createActionFeed() throws InvalidProtocolBufferException { + + // Create ActionFeed + ActionFeed.Builder actionFeed = ActionFeed.newBuilder(); + + // Create ActionDetail using one link for both takeout and delivery + ActionDetail actionDetailDeliveryTakeout = ActionDetail.newBuilder() + .setEntityId("merchant-1") + .setLinkId("merchant-1-takeout-delivery-action") + .setUrl("http://provider.com/merchant-1") + .addActions( + Action.newBuilder().setFoodOrderingInfo( + FoodOrderingInfo.newBuilder().setServiceType( + FoodOrderingInfo.ServiceType.DELIVERY + ) + ) + ) + .addActions( + Action.newBuilder().setFoodOrderingInfo( + FoodOrderingInfo.newBuilder().setServiceType( + FoodOrderingInfo.ServiceType.TAKEOUT + ) + ) + ).build(); + + // Add to feed data + actionFeed.addData(actionDetailDeliveryTakeout); + + // Create ActionDetail using a separate link for delivery + ActionDetail actionDetailDelivery = ActionDetail.newBuilder() + .setEntityId("merchant-2") + .setLinkId("merchant-2-delivery-action") + .setUrl("http://provider.com/merchant-2/delivery") + .addActions( + Action.newBuilder().setFoodOrderingInfo( + FoodOrderingInfo.newBuilder().setServiceType( + FoodOrderingInfo.ServiceType.DELIVERY + ) + ) + ).build(); + + // Add to feed data + actionFeed.addData(actionDetailDelivery); + + // Serialize feed to JSON string + return JsonFormat.printer() + .omittingInsignificantWhitespace() + .preservingProtoFieldNames() + .print(actionFeed); + } + +} \ No newline at end of file
diff --git a/order-redirect/java/src/main/java/com/example/order_redirect/EntityFeedExample.java b/order-redirect/java/src/main/java/com/example/order_redirect/EntityFeedExample.java new file mode 100644 index 0000000..085b4b3 --- /dev/null +++ b/order-redirect/java/src/main/java/com/example/order_redirect/EntityFeedExample.java
@@ -0,0 +1,56 @@ +/** +Example Entity feed for Google Order Redirect. +**/ + +package com.example.order_redirect; + +import com.google.protobuf.InvalidProtocolBufferException; +import com.google.protobuf.util.JsonFormat; +import com.google.madden.ingestion.EntityFeed; +import com.google.madden.ingestion.Entity; +import com.google.madden.ingestion.PostalAddress; +import com.google.madden.ingestion.GeoCoordinates; + +public class EntityFeedExample { + + public static void main(String[] args) throws InvalidProtocolBufferException { + EntityFeedExample feed = new EntityFeedExample(); + String feedJSON = feed.createEntityFeed(); + System.out.println(feedJSON); + } + + public String createEntityFeed() throws InvalidProtocolBufferException { + + // Create Entity + Entity entity = Entity.newBuilder() + .setEntityId("merchant-1") + .setName("Mo's Dinner") + .setTelephone("+14567891234") + .setUrl("http://moesdinner.com") + .setLocation( + GeoCoordinates.newBuilder() + .setLatitude(41.525588) + .setLongitude(-90.507067) + .setAddress( + PostalAddress.newBuilder() + .setCountry("US") + .setLocality("Mountain View") + .setRegion("CA") + .setPostalCode("94043") + .setStreetAddress("1600 Amphitheatre Pkwy") + .build() + ) + ).build(); + + + // Add to feed data + EntityFeed entityFeed = EntityFeed.newBuilder().addData(entity).build(); + + // Serialize feed to JSON string + return JsonFormat.printer() + .omittingInsignificantWhitespace() + .preservingProtoFieldNames() + .print(entityFeed); + } + +} \ No newline at end of file
diff --git a/order-redirect/java/src/test/java/com/example/order_redirect/ActionFeedExampleTest.java b/order-redirect/java/src/test/java/com/example/order_redirect/ActionFeedExampleTest.java new file mode 100644 index 0000000..cbe0574 --- /dev/null +++ b/order-redirect/java/src/test/java/com/example/order_redirect/ActionFeedExampleTest.java
@@ -0,0 +1,21 @@ +/** +Example Action feed for Google Order Redirect. +**/ + +package com.example.order_redirect; + +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +import com.example.order_redirect.ActionFeedExample; +import com.google.protobuf.InvalidProtocolBufferException; + +public class ActionFeedExampleTest { + + @Test + public void testCreateActionFeed() throws InvalidProtocolBufferException { + ActionFeedExample actionFeedExample = new ActionFeedExample(); + assertEquals(actionFeedExample.createActionFeed(),"{\"data\":[{\"actions\":[{\"food_ordering_info\":{\"service_type\":\"DELIVERY\"}},{\"food_ordering_info\":{\"service_type\":\"TAKEOUT\"}}],\"entity_id\":\"merchant-1\",\"link_id\":\"merchant-1-takeout-delivery-action\",\"url\":\"http://provider.com/merchant-1\"},{\"actions\":[{\"food_ordering_info\":{\"service_type\":\"DELIVERY\"}}],\"entity_id\":\"merchant-2\",\"link_id\":\"merchant-2-delivery-action\",\"url\":\"http://provider.com/merchant-2/delivery\"}]}"); + } + +} \ No newline at end of file
diff --git a/order-redirect/php/ActionFeedExample.php b/order-redirect/php/ActionFeedExample.php new file mode 100644 index 0000000..83558d2 --- /dev/null +++ b/order-redirect/php/ActionFeedExample.php
@@ -0,0 +1,59 @@ +<?php +/* +Example Action feed for Google Order Redirect. +*/ + +require dirname(__FILE__).'/vendor/autoload.php'; + +use Madden\Ingestion\ActionFeed; +use Madden\Ingestion\ActionDetail; +use Madden\Ingestion\Action; +use Madden\Ingestion\FoodOrderingInfo; +use Madden\Ingestion\FoodOrderingInfo\ServiceType; + +function createFeed() { + // Create ActionDetail by passing the fields to the constructor + $actions = array( + // Example using one link for both takeout and delivery + new ActionDetail([ + 'entity_id' => 'merchant-1', + 'link_id' => 'merchant-1-takeout-delivery-action', + 'actions' => array( + new Action([ + 'food_ordering_info' => new FoodOrderingInfo([ + 'service_type' => ServiceType::DELIVERY + ]) + ]), + new Action([ + 'food_ordering_info' => new FoodOrderingInfo([ + 'service_type' => ServiceType::TAKEOUT + ]) + ]) + ), + 'url' => 'http://provider.com/merchant-1' + ]), + // Example using a separate link for delivery + new ActionDetail([ + 'entity_id' => 'merchant-2', + 'link_id' => 'merchant-2-delivery-action', + 'actions' => array( + new Action([ + 'food_ordering_info' => new FoodOrderingInfo([ + 'service_type' => ServiceType::DELIVERY + ]) + ]) + ), + 'url' => 'http://provider.com/merchant-2/delivery' + ]) + ); + + // Add ActionDetail array to feed data + $feed = new ActionFeed(); + $feed->setData($actions); + + // Serialize to JSON + return $feed->serializeToJsonString(); +} + +$feedJSON = createFeed(); +echo $feedJSON;
diff --git a/order-redirect/php/EntityFeedExample.php b/order-redirect/php/EntityFeedExample.php new file mode 100644 index 0000000..f6ac3c8 --- /dev/null +++ b/order-redirect/php/EntityFeedExample.php
@@ -0,0 +1,43 @@ +<?php +/* +Example Entity feed for Google Order Redirect. +*/ + +require dirname(__FILE__).'/vendor/autoload.php'; + +use Madden\Ingestion\EntityFeed; +use Madden\Ingestion\Entity; +use Madden\Ingestion\GeoCoordinates; +use Madden\Ingestion\PostalAddress; + + +function createFeed() { + // Create Entity by using setter methods + $entity = new Entity(); + $entity->setEntityId("merchant-1"); + $entity->setName("Mo's Dinner"); + $entity->setTelephone("+14567891234"); + $entity->setUrl("http://moesdinner.com"); + $entityLocation = new GeoCoordinates(); + $entityLocation->setLatitude(41.525588); + $entityLocation->setLongitude(-90.507067); + $entity->setLocation($entityLocation); + $entityAddress = new PostalAddress(); + $entityAddress->setCountry("US"); + $entityAddress->setLocality("Mountain View"); + $entityAddress->setRegion("CA"); + $entityAddress->setPostalCode("94043"); + $entityAddress->setStreetAddress("1600 Amphitheatre Pkwy"); + $entityLocation->setAddress($entityAddress); + + # Add Entity to feed data + $feed = new EntityFeed(); + $feed->setData(array($entity)); + + # Serialize to JSON + return $feed->serializeToJsonString(); +} + +$feedJSON = createFeed(); +echo $feedJSON; +
diff --git a/order-redirect/php/composer.json b/order-redirect/php/composer.json new file mode 100644 index 0000000..8798557 --- /dev/null +++ b/order-redirect/php/composer.json
@@ -0,0 +1,15 @@ +{ + "name": "google-order-redirect/php-demo", + "description": "proto example for PHP", + "require": { + "google/protobuf": "^v3.12.2" + }, + "autoload": { + "psr-4": { + "Madden\\": "build/gen/Madden", + "GPBMetadata\\": "build/gen/GPBMetadata/", + "Food\\": "build/gen/Food", + "Google\\": "build/gen/Google" + } + } + } \ No newline at end of file
diff --git a/order-redirect/php/composer.lock b/order-redirect/php/composer.lock new file mode 100644 index 0000000..0eba1e6 --- /dev/null +++ b/order-redirect/php/composer.lock
@@ -0,0 +1,63 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "724b35a1604b000b76542b5f31d8cb69", + "packages": [ + { + "name": "google/protobuf", + "version": "v3.25.1", + "source": { + "type": "git", + "url": "https://github.com/protocolbuffers/protobuf-php.git", + "reference": "1fb247e72df401c863ed239c1660f981644af5db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/1fb247e72df401c863ed239c1660f981644af5db", + "reference": "1fb247e72df401c863ed239c1660f981644af5db", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": ">=5.0.0" + }, + "suggest": { + "ext-bcmath": "Need to support JSON deserialization" + }, + "type": "library", + "autoload": { + "psr-4": { + "Google\\Protobuf\\": "src/Google/Protobuf", + "GPBMetadata\\Google\\Protobuf\\": "src/GPBMetadata/Google/Protobuf" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "proto library for PHP", + "homepage": "https://developers.google.com/protocol-buffers/", + "keywords": [ + "proto" + ], + "support": { + "source": "https://github.com/protocolbuffers/protobuf-php/tree/v3.25.1" + }, + "time": "2023-11-15T21:36:03+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.6.0" +}
diff --git a/order-redirect/proto/action.proto b/order-redirect/proto/action.proto index 3ba4a59..b26cee7 100644 --- a/order-redirect/proto/action.proto +++ b/order-redirect/proto/action.proto
@@ -4,6 +4,10 @@ package madden.ingestion; +option java_multiple_files = true; +option java_package = "com.google.madden.ingestion"; +option go_package = "google/madden/ingestion"; + message ActionFeed { repeated ActionDetail data = 1; } @@ -11,7 +15,6 @@ message ActionDetail { // Reference to entity id optional string entity_id = 2; - // Link id for action detail optional string link_id = 3; // Deep link for action detail optional string url = 4; @@ -42,4 +45,3 @@ } ServiceType service_type = 1; } -
diff --git a/order-redirect/proto/entity.proto b/order-redirect/proto/entity.proto index 6df538f..451c639 100644 --- a/order-redirect/proto/entity.proto +++ b/order-redirect/proto/entity.proto
@@ -1,9 +1,12 @@ - // Feeds declaration syntax = "proto3"; package madden.ingestion; +option java_multiple_files = true; +option java_package = "com.google.madden.ingestion"; +option go_package = "google/madden/ingestion"; + message EntityFeed { repeated Entity data = 1; } @@ -65,5 +68,4 @@ string postal_code = 4; // The street address, e.g. "1600 Amphitheatre Pkwy". (required) string street_address = 5; -} - +} \ No newline at end of file
diff --git a/order-redirect/proto/food-service.proto b/order-redirect/proto/food-service.proto index 047cea2..e5151c9 100644 --- a/order-redirect/proto/food-service.proto +++ b/order-redirect/proto/food-service.proto
@@ -6,13 +6,14 @@ 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 "timeofday.proto"; -import "latlng.proto"; -import "money.proto"; -import "dayofweek.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 { @@ -168,7 +169,7 @@ // When advance ordering services, this is the time windows the orders can be // placed. - // Optional. Required when advance_hour is given. + // Required when advance_hour is given. Invalid when asap_hour is given. repeated TimeOfDayWindow orderable_time = 5 ; @@ -310,4 +311,3 @@ repeated string area_ids = 7 ; } -
diff --git a/order-redirect/proto/dayofweek.proto b/order-redirect/proto/google/type/dayofweek.proto similarity index 100% rename from order-redirect/proto/dayofweek.proto rename to order-redirect/proto/google/type/dayofweek.proto
diff --git a/order-redirect/proto/latlng.proto b/order-redirect/proto/google/type/latlng.proto similarity index 100% rename from order-redirect/proto/latlng.proto rename to order-redirect/proto/google/type/latlng.proto
diff --git a/order-redirect/proto/money.proto b/order-redirect/proto/google/type/money.proto similarity index 100% rename from order-redirect/proto/money.proto rename to order-redirect/proto/google/type/money.proto
diff --git a/order-redirect/proto/timeofday.proto b/order-redirect/proto/google/type/timeofday.proto similarity index 100% rename from order-redirect/proto/timeofday.proto rename to order-redirect/proto/google/type/timeofday.proto
diff --git a/order-redirect/python/action_feed.py b/order-redirect/python/action_feed.py deleted file mode 100644 index c2f19ea..0000000 --- a/order-redirect/python/action_feed.py +++ /dev/null
@@ -1,28 +0,0 @@ -import json -from generated import action_pb2 -from google.protobuf.json_format import MessageToDict - -#create feed -feed = action_pb2.ActionFeed() - -#create action -action = feed.data.add() -action.entity_id = 'merchant-1' -action.link_id = 'merchant-1-takeout-delivery-action' -action.actions.extend([ - action_pb2.Action( - food_ordering_info=action_pb2.FoodOrderingInfo( - service_type=action_pb2.FoodOrderingInfo.ServiceType.DELIVERY - ) - ), - action_pb2.Action( - food_ordering_info=action_pb2.FoodOrderingInfo( - service_type=action_pb2.FoodOrderingInfo.ServiceType.TAKEOUT - ) - ) -]) -action.url = "http://provider.com/merchant-1" - -feedJSON = json.dumps(MessageToDict(feed, preserving_proto_field_name=True)) -print(feedJSON) -
diff --git a/order-redirect/python/action_feed_example.py b/order-redirect/python/action_feed_example.py new file mode 100644 index 0000000..8e3027e --- /dev/null +++ b/order-redirect/python/action_feed_example.py
@@ -0,0 +1,58 @@ +''' +Example Action feed for Google Order Redirect. +''' + +import json +from generated import action_pb2 +from google.protobuf.json_format import MessageToDict + +def create_feed() -> str: + # Create ActionFeed + feed = action_pb2.ActionFeed() + + # Create ActionDetail by passing fields to the constructor + # Example using the same link for delivery and takeout + action_detail_combined = action_pb2.ActionDetail( + entity_id='merchant-1', + link_id='merchant-1-takeout-delivery-action', + url='http://provider.com/merchant-1', + actions=[ + action_pb2.Action( + food_ordering_info=action_pb2.FoodOrderingInfo( + service_type=action_pb2.FoodOrderingInfo.ServiceType.DELIVERY + ) + ), + action_pb2.Action( + food_ordering_info=action_pb2.FoodOrderingInfo( + service_type=action_pb2.FoodOrderingInfo.ServiceType.TAKEOUT + ) + ) + ] + ) + + # Add ActionDetail to data + feed.data.append(action_detail_combined) + + # Example using separate link for delivery + action_detail_delivery = action_pb2.ActionDetail( + entity_id='merchant-2', + link_id='merchant-2-delivery-action', + url='http://provider.com/merchant-2/delivery', + actions=[ + action_pb2.Action( + food_ordering_info=action_pb2.FoodOrderingInfo( + service_type=action_pb2.FoodOrderingInfo.ServiceType.DELIVERY + ) + ) + ] + ) + + # Add ActionDetail to feed data + feed.data.append(action_detail_delivery) + + # Serialize feed to JSON string + return json.dumps(MessageToDict(feed, preserving_proto_field_name=True)) + +feedJSON = create_feed() +print(feedJSON) +
diff --git a/order-redirect/python/entity_feed.py b/order-redirect/python/entity_feed.py deleted file mode 100644 index 044247a..0000000 --- a/order-redirect/python/entity_feed.py +++ /dev/null
@@ -1,30 +0,0 @@ -import json -from generated import entity_pb2 -from google.protobuf.json_format import MessageToDict - -#create feed -feed = entity_pb2.EntityFeed() - -#create entity -entity = feed.data.add() -entity.entity_id = 'merchant-1' -entity.name = "Mo's Dinner" -entity.telephone = '+14567891234' -entity.url = 'http://moesdinner.com' - -#create location -location = entity.location -location.latitude = 41.525588 -location.longitude = -90.507067 - -#create address -address = location.address -address.country = 'US' -address.locality = 'Mountain View' -address.region = 'CA' -address.postal_code = '94043' -address.street_address = '1600 Amphitheatre Pkwy' - -feedJSON = json.dumps(MessageToDict(feed, preserving_proto_field_name=True)) -print(feedJSON) -
diff --git a/order-redirect/python/entity_feed_example.py b/order-redirect/python/entity_feed_example.py new file mode 100644 index 0000000..a67f775 --- /dev/null +++ b/order-redirect/python/entity_feed_example.py
@@ -0,0 +1,38 @@ +''' +Example Action feed for Google Order Redirect. +''' + +import json +from generated import entity_pb2 +from google.protobuf.json_format import MessageToDict + +def create_feed() -> str: + # Create feeds + feed = entity_pb2.EntityFeed() + + # Create entity and add to feed data + entity = feed.data.add() + entity.entity_id = 'merchant-1' + entity.name = "Mo's Dinner" + entity.telephone = '+14567891234' + entity.url = 'http://moesdinner.com' + + # Create location + location = entity.location + location.latitude = 41.525588 + location.longitude = -90.507067 + + # Create address + address = location.address + address.country = 'US' + address.locality = 'Mountain View' + address.region = 'CA' + address.postal_code = '94043' + address.street_address = '1600 Amphitheatre Pkwy' + + # Serialize feed to JSON string + return json.dumps(MessageToDict(feed, preserving_proto_field_name=True)) + +feedJSON = create_feed() +print(feedJSON) +
diff --git a/order-redirect/python/service_feed.py b/order-redirect/python/service_feed.py deleted file mode 100644 index 98aaf1c..0000000 --- a/order-redirect/python/service_feed.py +++ /dev/null
@@ -1,90 +0,0 @@ -import json -from generated import food_service_pb2 -from generated import timeofday_pb2 -from google.protobuf.json_format import MessageToDict - -#create feed -feed = food_service_pb2.FoodServiceFeed() - -#create food_service -service_data = feed.data.add() -service_data.service.service_id = 'merchant-1-service-delivery' -service_data.service.service_type = food_service_pb2.FoodOrderingService.ServiceType.DELIVERY -service_data.service.parent_entity_id = 'merchant-1' -service_data.service.lead_time.min_lead_time_duration.seconds = 1200 -service_data.service.action_link_id = 'merchant-1-takeout-delivery-action' - -#create fee -fee_data = feed.data.add() -fee_data.fee.fee_id = 'merchant-1-fee-delivery' -fee_data.fee.fee_type = food_service_pb2.Fee.FeeType.DELIVERY -fee_data.fee.fixed_amount.currency_code = 'USD' -fee_data.fee.fixed_amount.units = 2 -fee_data.fee.service_ids.append('merchant-1-service-delivery') - -#create asap service hours -asap_hours_data = feed.data.add() -asap_hours_data.service_hours.hours_id = 'merchant-1-asap-hours-delivery' -asap_hours_data.service_hours.service_ids.append('merchant-1-service-delivery') -asap_hours = asap_hours_data.service_hours.asap_hours.add() -asap_hours.time_windows.MergeFrom(food_service_pb2.TimeOfDayWindow( - time_windows=food_service_pb2.TimeOfDayRange( - open_time=timeofday_pb2.TimeOfDay( - hours=11, - minutes=00 - ), - close_time=timeofday_pb2.TimeOfDay( - hours=22, - minutes=30 - ) - ) - ) -) -asap_hours.lead_time.min_lead_time_duration.seconds = 2400 - -#create advance service hours -advance_hours_data = feed.data.add() -advance_hours_data.service_hours.hours_id = 'merchant-1-advance-hours-delivery' -advance_hours_data.service_hours.service_ids.append('merchant-1-service-delivery') -advance_hours = advance_hours_data.service_hours.advance_hours.add() -advance_hours.time_windows.MergeFrom(food_service_pb2.TimeOfDayWindow( - time_windows=food_service_pb2.TimeOfDayRange( - open_time=timeofday_pb2.TimeOfDay( - hours=11, - minutes=00 - ), - close_time=timeofday_pb2.TimeOfDay( - hours=22, - minutes=00 - ) - ) - ) -) -advance_hours.advance_booking_interval.min_offset.seconds = 60*60 -advance_hours.advance_booking_interval.max_offset.seconds = 60*60*24*3 - -orderable_time = advance_hours_data.service_hours.orderable_time.append( - food_service_pb2.TimeOfDayWindow( - time_windows=food_service_pb2.TimeOfDayRange( - open_time=timeofday_pb2.TimeOfDay( - hours=00, - minutes=00 - ), - close_time=timeofday_pb2.TimeOfDay( - hours=23, - minutes=59 - ) - ) - ) -) - -#create service area -service_area_data = feed.data.add() -service_area_data.service_area.area_id = 'merchant-1-area-delivery' -service_area_data.service_area.service_ids.append('merchant-1-service-delivery') -service_area_data.service_area.circle.center.latitude = 37.4215576 -service_area_data.service_area.circle.center.longitude = -122.0951056 -service_area_data.service_area.circle.radius = 5000 - -feedJSON = json.dumps(MessageToDict(feed, preserving_proto_field_name=True)) -print(feedJSON) \ No newline at end of file
diff --git a/order-redirect/python/service_feed_example.py b/order-redirect/python/service_feed_example.py new file mode 100644 index 0000000..32f92d6 --- /dev/null +++ b/order-redirect/python/service_feed_example.py
@@ -0,0 +1,99 @@ +''' +Example Service feed for Google Order Redirect. +''' + +import json +from generated import food_service_pb2 +from generated.google.type import timeofday_pb2 +from google.protobuf.json_format import MessageToDict + +def create_feed() -> str: + # Create feed + feed = food_service_pb2.FoodServiceFeed() + + # Create delivery service + delivery_service_data = feed.data.add() + delivery_service_data.service.service_id = 'merchant-1-service-delivery' + delivery_service_data.service.service_type = food_service_pb2.FoodOrderingService.ServiceType.DELIVERY + delivery_service_data.service.parent_entity_id = 'merchant-1' + delivery_service_data.service.lead_time.min_lead_time_duration.seconds = 60*20 + delivery_service_data.service.lead_time.min_lead_time_duration.seconds = 60*30 + delivery_service_data.service.action_link_id = 'merchant-1-takeout-delivery-action' + + # Create fee + fee_data = feed.data.add() + fee_data.fee.fee_id = 'merchant-1-fee-delivery' + fee_data.fee.fee_type = food_service_pb2.Fee.FeeType.DELIVERY + fee_data.fee.fixed_amount.currency_code = 'USD' + fee_data.fee.fixed_amount.units = 2 + fee_data.fee.service_ids.append('merchant-1-service-delivery') + + # Create asap service hours + asap_hours_data = feed.data.add() + asap_hours_data.service_hours.hours_id = 'merchant-1-asap-hours-delivery' + asap_hours_data.service_hours.service_ids.append('merchant-1-service-delivery') + asap_hours = asap_hours_data.service_hours.asap_hours.add() + asap_hours.time_windows.CopyFrom(food_service_pb2.TimeOfDayWindow( + time_windows=food_service_pb2.TimeOfDayRange( + open_time=timeofday_pb2.TimeOfDay( + hours=11, + minutes=0 + ), + close_time=timeofday_pb2.TimeOfDay( + hours=22, + minutes=30 + ) + ) + ) + ) + asap_hours.lead_time.min_lead_time_duration.seconds = 2400 + + # Create advance service hours + advance_hours_data = feed.data.add() + advance_hours_data.service_hours.hours_id = 'merchant-1-advance-hours-delivery' + advance_hours_data.service_hours.service_ids.append('merchant-1-service-delivery') + advance_hours = advance_hours_data.service_hours.advance_hours.add() + advance_hours.time_windows.CopyFrom(food_service_pb2.TimeOfDayWindow( + time_windows=food_service_pb2.TimeOfDayRange( + open_time=timeofday_pb2.TimeOfDay( + hours=11, + minutes=0 + ), + close_time=timeofday_pb2.TimeOfDay( + hours=22, + minutes=0 + ) + ) + ) + ) + advance_hours.advance_booking_interval.min_offset.seconds = 60*60 + advance_hours.advance_booking_interval.max_offset.seconds = 60*60*24*3 + # Create advance hour orderable time + orderable_time = advance_hours_data.service_hours.orderable_time.append( + food_service_pb2.TimeOfDayWindow( + time_windows=food_service_pb2.TimeOfDayRange( + open_time=timeofday_pb2.TimeOfDay( + hours=0, + minutes=0 + ), + close_time=timeofday_pb2.TimeOfDay( + hours=23, + minutes=59 + ) + ) + ) + ) + + # Create service area + service_area_data = feed.data.add() + service_area_data.service_area.area_id = 'merchant-1-area-delivery' + service_area_data.service_area.service_ids.append('merchant-1-service-delivery') + service_area_data.service_area.circle.center.latitude = 37.4215576 + service_area_data.service_area.circle.center.longitude = -122.0951056 + service_area_data.service_area.circle.radius = 5000 + + # Serialize to JSON string + return json.dumps(MessageToDict(feed, preserving_proto_field_name=True)) + +feedJSON = create_feed() +print(feedJSON) \ No newline at end of file
diff --git a/order-redirect/typescript/package-lock.json b/order-redirect/typescript/package-lock.json new file mode 100644 index 0000000..769773f --- /dev/null +++ b/order-redirect/typescript/package-lock.json
@@ -0,0 +1,333 @@ +{ + "name": "typescript", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "typescript", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "ts-proto": "^1.165.0" + }, + "devDependencies": { + "typescript": "^5.3.2" + } + }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@types/node": { + "version": "20.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.1.tgz", + "integrity": "sha512-T2qwhjWwGH81vUEx4EXmBKsTJRXFXNZTL4v0gi01+zyBmCwzE6TyHszqX01m+QHTEq+EZNo13NeJIdEqf+Myrg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/case-anything": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.13.tgz", + "integrity": "sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dprint-node": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/dprint-node/-/dprint-node-1.0.8.tgz", + "integrity": "sha512-iVKnUtYfGrYcW1ZAlfR/F59cUVL8QIhWoBJoSjkkdua/dkWIgjZfiLMeTjiB06X0ZLkQ0M2C1VbUj/CxkIf1zg==", + "dependencies": { + "detect-libc": "^1.0.3" + } + }, + "node_modules/long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "node_modules/protobufjs": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", + "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/ts-poet": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-6.6.0.tgz", + "integrity": "sha512-4vEH/wkhcjRPFOdBwIh9ItO6jOoumVLRF4aABDX5JSNEubSqwOulihxQPqai+OkuygJm3WYMInxXQX4QwVNMuw==", + "dependencies": { + "dprint-node": "^1.0.7" + } + }, + "node_modules/ts-proto": { + "version": "1.165.0", + "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-1.165.0.tgz", + "integrity": "sha512-s7+RR/hcCXq8E4jDzwsaq0RXyVpu2pQ4XkT7meBA19xRrHWC32gfwMupcQrnpzoaR7n/F69AvK6FUyW7R+jYZQ==", + "dependencies": { + "case-anything": "^2.1.13", + "protobufjs": "^7.2.4", + "ts-poet": "^6.5.0", + "ts-proto-descriptors": "1.15.0" + }, + "bin": { + "protoc-gen-ts_proto": "protoc-gen-ts_proto" + } + }, + "node_modules/ts-proto-descriptors": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-1.15.0.tgz", + "integrity": "sha512-TYyJ7+H+7Jsqawdv+mfsEpZPTIj9siDHS6EMCzG/z3b/PZiphsX+mWtqFfFVe5/N0Th6V3elK9lQqjnrgTOfrg==", + "dependencies": { + "long": "^5.2.3", + "protobufjs": "^7.2.4" + } + }, + "node_modules/typescript": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + } + }, + "dependencies": { + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "@types/node": { + "version": "20.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.1.tgz", + "integrity": "sha512-T2qwhjWwGH81vUEx4EXmBKsTJRXFXNZTL4v0gi01+zyBmCwzE6TyHszqX01m+QHTEq+EZNo13NeJIdEqf+Myrg==", + "requires": { + "undici-types": "~5.26.4" + } + }, + "case-anything": { + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.13.tgz", + "integrity": "sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==" + }, + "dprint-node": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/dprint-node/-/dprint-node-1.0.8.tgz", + "integrity": "sha512-iVKnUtYfGrYcW1ZAlfR/F59cUVL8QIhWoBJoSjkkdua/dkWIgjZfiLMeTjiB06X0ZLkQ0M2C1VbUj/CxkIf1zg==", + "requires": { + "detect-libc": "^1.0.3" + } + }, + "long": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" + }, + "protobufjs": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.5.tgz", + "integrity": "sha512-gGXRSXvxQ7UiPgfw8gevrfRWcTlSbOFg+p/N+JVJEK5VhueL2miT6qTymqAmjr1Q5WbOCyJbyrk6JfWKwlFn6A==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + } + }, + "ts-poet": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/ts-poet/-/ts-poet-6.6.0.tgz", + "integrity": "sha512-4vEH/wkhcjRPFOdBwIh9ItO6jOoumVLRF4aABDX5JSNEubSqwOulihxQPqai+OkuygJm3WYMInxXQX4QwVNMuw==", + "requires": { + "dprint-node": "^1.0.7" + } + }, + "ts-proto": { + "version": "1.165.0", + "resolved": "https://registry.npmjs.org/ts-proto/-/ts-proto-1.165.0.tgz", + "integrity": "sha512-s7+RR/hcCXq8E4jDzwsaq0RXyVpu2pQ4XkT7meBA19xRrHWC32gfwMupcQrnpzoaR7n/F69AvK6FUyW7R+jYZQ==", + "requires": { + "case-anything": "^2.1.13", + "protobufjs": "^7.2.4", + "ts-poet": "^6.5.0", + "ts-proto-descriptors": "1.15.0" + } + }, + "ts-proto-descriptors": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/ts-proto-descriptors/-/ts-proto-descriptors-1.15.0.tgz", + "integrity": "sha512-TYyJ7+H+7Jsqawdv+mfsEpZPTIj9siDHS6EMCzG/z3b/PZiphsX+mWtqFfFVe5/N0Th6V3elK9lQqjnrgTOfrg==", + "requires": { + "long": "^5.2.3", + "protobufjs": "^7.2.4" + } + }, + "typescript": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.2.tgz", + "integrity": "sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==", + "dev": true + }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + } + } +}
diff --git a/order-redirect/typescript/package.json b/order-redirect/typescript/package.json new file mode 100644 index 0000000..354d635 --- /dev/null +++ b/order-redirect/typescript/package.json
@@ -0,0 +1,18 @@ +{ + "name": "google-order-redirect-typescript-demo", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "build": "tsc --build", + "clean": "tsc --build --clean" + }, + "author": "", + "license": "ISC", + "devDependencies": { + "typescript": "^5.3.2" + }, + "dependencies": { + "ts-proto": "^1.165.0" + } +}
diff --git a/order-redirect/typescript/src/action_feed_example.ts b/order-redirect/typescript/src/action_feed_example.ts new file mode 100644 index 0000000..7526eaa --- /dev/null +++ b/order-redirect/typescript/src/action_feed_example.ts
@@ -0,0 +1,53 @@ +/* +Example Action feed for Google Order Redirect. +*/ + +import { + ActionFeed, ActionDetail, FoodOrderingInfo_ServiceType +} from './generated/action'; + +function createFeed() : string { + // Create ActionDetail using one link for both delivery and takeout + const actionDetailCombined: ActionDetail = { + entity_id: 'merchant-1', + link_id: 'merchant-1-takeout-delivery-action', + actions: [ + { + food_ordering_info: { + service_type: FoodOrderingInfo_ServiceType.DELIVERY + } + }, + { + food_ordering_info: { + service_type: FoodOrderingInfo_ServiceType.TAKEOUT + } + } + ], + url: 'http://provider.com/merchant-1' + }; + + // Create ActionDetail using a separate link for delivery + const actionDetailDelivery: ActionDetail = { + entity_id: 'merchant-2', + link_id: 'merchant-2-delivery-action', + actions: [ + { + food_ordering_info: { + service_type: FoodOrderingInfo_ServiceType.DELIVERY + } + } + ], + url: 'http://provider.com/merchant-2/delivery' + }; + + // Add ActionDetail to feed data array + const feed: ActionFeed = { + data:[actionDetailCombined, actionDetailDelivery] + }; + + // Serialize feed to JSON + return JSON.stringify(feed); +} + +const feedJSON = createFeed(); +console.log(feedJSON);
diff --git a/order-redirect/typescript/src/entity_feed_example.ts b/order-redirect/typescript/src/entity_feed_example.ts new file mode 100644 index 0000000..0c043a9 --- /dev/null +++ b/order-redirect/typescript/src/entity_feed_example.ts
@@ -0,0 +1,39 @@ +/* +Example Entity feed for Google Order Redirect. +*/ + +import { + EntityFeed, Entity +} from './generated/entity'; + +function createFeed() : string { + // Create Entity + const entity: Entity = { + entity_id: 'merchant-1', + name: "Mo's Dinner", + telephone: '+14567891234', + url: 'http://moesdinner.com', + location: { + latitude: 41.525588, + longitude: -90.507067, + address: { + country: 'US', + locality: 'Mountain View', + region: 'CA', + postal_code: '94043', + street_address: '1600 Amphitheatre Pkwy' + } + } + }; + + // Add Entity to feed data array + const feed: EntityFeed = { + data: [entity] + }; + + // Serialize feed to JSON + return JSON.stringify(feed); +} + +const feedJSON = createFeed(); +console.log(feedJSON);
diff --git a/order-redirect/typescript/tsconfig.json b/order-redirect/typescript/tsconfig.json new file mode 100644 index 0000000..b9cbb66 --- /dev/null +++ b/order-redirect/typescript/tsconfig.json
@@ -0,0 +1,15 @@ +{ + "include": ["src/**/*"], + "compilerOptions": { + "outDir": "dist", + "rootDir": "src", + "allowJs": true, + "target": "ES2020", + "module": "commonjs", + "declaration": false, + "sourceMap": true, + "strict": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + } +} \ No newline at end of file