Initial commit of java client example for maps booking api
diff --git a/BookingNotification.java b/BookingNotification.java
new file mode 100644
index 0000000..3a4f523
--- /dev/null
+++ b/BookingNotification.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
+import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
+import com.google.api.client.http.HttpTransport;
+import com.google.api.client.json.JsonFactory;
+import com.google.api.client.json.jackson2.JacksonFactory;
+import com.google.api.services.mapsbooking.v1alpha.GoogleMapsBookingAPI;
+import com.google.api.services.mapsbooking.v1alpha.model.Booking;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Collections;
+
+/**
+ * Java client example using the Booking Notification API to notify Google of changes to an existing
+ * booking
+ */
+public class BookingNotification {
+
+ private static final String MAPS_BOOKING_SCOPE = "https://www.googleapis.com/auth/mapsbooking";
+
+ private static HttpTransport httpTransport;
+
+ private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
+
+ private static GoogleMapsBookingAPI googleMapsBookingAPI;
+
+ // TODO(partner): step1. put your partner_id here
+ private static final String PARTNER_ID = "{your partner_id}";
+
+ public static void main(String[] args) {
+ try {
+ try {
+ // get Credential through your Service Account
+ // TODO(partner): step2. put the path&file of your private key (JSON format) that you
+ // obtained from your service account into 'FileInputStream'
+ GoogleCredential credential =
+ GoogleCredential.fromStream(new FileInputStream("src/your-private-key.json"))
+ .createScoped(Collections.singleton(MAPS_BOOKING_SCOPE));
+
+ // get the service object to make requests to the API service
+ httpTransport = GoogleNetHttpTransport.newTrustedTransport();
+
+ // TODO(partner): step3. put your application name into 'setApplicationName'
+ googleMapsBookingAPI =
+ new GoogleMapsBookingAPI.Builder(httpTransport, JSON_FACTORY, credential)
+ .setApplicationName("PartnerBookingNotificationExample")
+ .build();
+
+ // TODO(partner): step5. call the methods you implement below to make
+ // booking changes notificatons
+ updateBooking();
+ } catch (IOException e) {
+ System.err.println(e.getMessage());
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ System.exit(1);
+ }
+
+ // TODO(partner): step4. implement this method with your data to make the updateBooking call
+ public static void updateBooking() throws IOException {
+ // example -> cancel a booking:
+ Booking updatedBooking = new Booking()
+ .setName("partners/" + PARTNER_ID + "/bookings/" + "{your booking id}")
+ .setMerchantId("{your merchant Id}")
+ .setServiceId("{your service Id}")
+ .setStatus("CANCELED")
+ .setStartTime("2018-01-02T10:00:00Z")
+ .setDuration("3600s")
+ .setClientInformation(...);
+
+ Booking testUpdatedBooking = updateBooking(updatedBooking, "status");
+
+ System.out.println("updated booking:");
+ System.out.println(testUpdatedBooking);
+ }
+
+ /**
+ * Updates an existing Booking.
+ *
+ * @param content The booking object contains the updated booking content. @Param updateMask The
+ * specific fields to update for the booking.
+ * @return the updated instance of Booking.
+ */
+ private static Booking updateBooking(Booking content, String updateMask) throws IOException {
+
+ String name = content.getName();
+
+ return googleMapsBookingAPI
+ .notification()
+ .partners()
+ .bookings()
+ .patch(name, content)
+ .setUpdateMask(updateMask)
+ .execute();
+ }
+}
diff --git a/InventoryUpdate.java b/InventoryUpdate.java
new file mode 100644
index 0000000..42bd954
--- /dev/null
+++ b/InventoryUpdate.java
@@ -0,0 +1,479 @@
+/*
+ * Copyright 2018, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
+import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
+import com.google.api.client.http.HttpTransport;
+import com.google.api.client.json.JsonFactory;
+import com.google.api.client.json.jackson2.JacksonFactory;
+import com.google.api.services.mapsbooking.v1alpha.GoogleMapsBookingAPI;
+import com.google.api.services.mapsbooking.v1alpha.model.BatchReplaceServiceAvailabilityRequest;
+import com.google.api.services.mapsbooking.v1alpha.model.BatchReplaceServiceAvailabilityResponse;
+import com.google.api.services.mapsbooking.v1alpha.model.Empty;
+import com.google.api.services.mapsbooking.v1alpha.model.ExtendedServiceAvailability;
+import com.google.api.services.mapsbooking.v1alpha.model.Merchant;
+import com.google.api.services.mapsbooking.v1alpha.model.ReplaceServiceAvailabilityRequest;
+import com.google.api.services.mapsbooking.v1alpha.model.Service;
+import com.google.api.services.mapsbooking.v1alpha.model.ServiceAvailability;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Java client example using the Inventory Update API to provide real-time updates for invenotry
+ * changes
+ */
+public class InventoryUpdate {
+
+ private static final String MAPS_BOOKING_SCOPE = "https://www.googleapis.com/auth/mapsbooking";
+
+ private static HttpTransport httpTransport;
+
+ private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
+
+ private static GoogleMapsBookingAPI googleMapsBookingAPI;
+
+ // TODO(partner): step1. put your partner_id here
+ private static final String PARTNER_ID = "{your partner_id}";
+
+ public static void main(String[] args) {
+ try {
+ try {
+ // get Credential via your Service Account
+
+ // TODO(partner): step2. put the path&file of your private key (JSON format) that you
+ // obtained from your service account into 'FileInputStream'
+ GoogleCredential credential =
+ GoogleCredential.fromStream(new FileInputStream("src/your-private-key.json"))
+ .createScoped(Collections.singleton(MAPS_BOOKING_SCOPE));
+
+ // get the service object to make requests to the API service
+ httpTransport = GoogleNetHttpTransport.newTrustedTransport();
+
+ // TODO(partner): step3. put your application name into 'setApplicationName'
+ googleMapsBookingAPI =
+ new GoogleMapsBookingAPI.Builder(httpTransport, JSON_FACTORY, credential)
+ .setApplicationName("PartnerInventoryUpdateExample")
+ .build();
+
+ // TODO(partner): step12. call the methods you implement below to make inventory updates
+
+ createMerchant();
+ createService();
+
+ updateMerchant();
+ updateService();
+
+ updateAvailability();
+ batchUpdateAvailability();
+
+ deleteService();
+ deleteMerchant();
+
+ } catch (IOException e) {
+ System.err.println(e.getMessage());
+ }
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
+ System.exit(1);
+ }
+
+ // TODO(partner): step4. implement this method with your data to make the createMerchant call
+ public static void createMerchant() throws IOException {
+ // for example
+ PostalAddress postalAddress = new PostalAddress()
+ .setAddressCountry("US")
+ .setAddressLocality("WA")
+ .setAddressRegion("Kirkland")
+ .setPostalCode("98XXX")
+ .setStreetAddress("1111 11th Ave NE");
+
+ GeoCoordinates geo = new GeoCoordinates()
+ .setLatitude(47.67)
+ .setLongitude(-122.21)
+ .setAddress(postalAddress);
+
+ TaxRate taxRate = new TaxRate().setMicroPercent(0);
+
+ String merchantId = "sampleMerchant1";
+
+ Merchant merchant = new Merchant()
+ .setName("partners/" + PARTNER_ID + "/merchants/" + merchantId)
+ .setMerchantName("Test Create Merchant")
+ .setTelephone("206-888-8888")
+ .setUrl("www.****.com")
+ .setGeo(geo)
+ .setCategory("Fitness")
+ .setNumBookings30d((long)1000.00)
+ .setTaxRate(taxRate);
+
+ Merchant CreatedMerchant = createMerchant(merchant);
+
+ System.out.println("created merchant:");
+ System.out.println(CreatedMerchant);
+ }
+
+ // TODO(partner): step5. implement this method with your data to make the updateMerchant call
+ public static void updateMerchant() throws IOException {
+ // for example
+ PostalAddress postalAddress = new PostalAddress()
+ .setAddressCountry("US")
+ .setAddressLocality("WA")
+ .setAddressRegion("Kirkland")
+ .setPostalCode("98XXX")
+ .setStreetAddress("1111 11th Ave NE");
+
+ GeoCoordinates geo = new GeoCoordinates()
+ .setLatitude(47.67)
+ .setLongitude(-122.21)
+ .setAddress(postalAddress);
+
+ TaxRate taxRate = new TaxRate().setMicroPercent(0);
+
+ String merchantId = "sampleMerchant1";
+
+ Merchant merchantUpdate = new Merchant()
+ .setName("partners/" + PARTNER_ID + "/merchants/" + merchantId)
+ .setMerchantName("Test Update Merchant")
+ .setTelephone("206-666-6666")
+ .setUrl("www.****.com")
+ .setGeo(geo)
+ .setCategory("Fitness")
+ .setNumBookings30d((long)1000.00)
+ .setTaxRate(taxRate);
+
+ Merchant updatedMerchant =
+ updateMerchant(merchantUpdate, "merchantName,telephone");
+
+ System.out.println("updated merchant:");
+ System.out.println(updatedMerchant);
+ }
+
+ // TODO(partner): step6. implement this method with your data to make the deleteMerchant call
+ public static void deleteMerchant() throws IOException {
+ // for example
+ String merchantId = "sampleMerchant1";
+
+ Empty deletedMerchant = deleteMerchant(merchantId);
+
+ System.out.println("deleted merchant:");
+ System.out.println(deletedMerchant);
+ }
+
+ // TODO(partner): step7. implement this method with your data to make the createService call
+ public static void createService() throws IOException {
+ //for example
+ String merchantId = "sampleMerchant1";
+ String serviceId = "sampleService1";
+ Service service = new Service()
+ .setName("partners/" + PARTNER_ID + "/merchants/" + merchantId + "/services/" + serviceId)
+ .setServiceName("Yoga 101")
+ .setDescription("The entry-level Yoga course");
+
+ Service CreatedService = createService(service);
+
+ System.out.println("created service:");
+ System.out.println(CreatedService);
+ }
+
+ // TODO(partner): step8. implement this method with your data to make the updateService call
+ public static void updateService() throws IOException {
+ //for example
+ String merchantId = "sampleMerchant1";
+ String serviceId = "sampleService1";
+ Service service = new Service()
+ .setName("partners/" + PARTNER_ID + "/merchants/" + merchantId + "/services/" + serviceId)
+ .setServiceName("Yoga 201")
+ .setDescription("The mid-level Yoga course");
+
+ Service updatedService = updateService(service, "");
+
+ System.out.println("updated service:");
+ System.out.println(updatedService);
+ }
+
+ // TODO(partner): step9. implement this method with your data to make the deleteService call
+ public static void deleteService() throws IOException {
+ // for example
+ String merchantId = "sampleMerchant1";
+ String serviceId = "sampleService1";
+
+ Empty deletedService = deleteService(merchantId, serviceId);
+
+ System.out.println("deleted service:");
+ System.out.println(deletedService);
+ }
+
+ // TODO(partner): step10. implement this method with your data to make the
+ // replaceServiceAvailability call
+ public static void updateAvailability() throws IOException {
+ // for example
+ String merchantId = "sampleMerchant1";
+ String serviceId = "sampleService1";
+
+ Availability availability1 = new Availability()
+ .setStartTime("2018-01-02T09:00:00Z")
+ .setDuration("3600s")
+ .setSpotsTotal((long) 30)
+ .setSpotsOpen((long) 20);
+
+ Availability availability2 = new Availability()
+ .setStartTime("2018-01-02T13:00:00Z")
+ .setDuration("3600s")
+ .setSpotsTotal((long) 30)
+ .setSpotsOpen((long) 25);
+
+ List<Availability> availabilities1 = new ArrayList<Availability>();
+
+ availabilities1.add(availability1);
+ availabilities1.add(availability2);
+
+ ServiceAvailability serviceAvailability = new ServiceAvailability()
+ .setName("partners/" + PARTNER_ID + "/merchants/" + merchantId + "/services/" + serviceId)
+ .setAvailability(availabilities1)
+ .setStartTimeRestrict("2018-01-02T00:00:00Z")
+ .setEndTimeRestrict("2018-01-02T23:30:00Z");
+
+ ServiceAvailability updatedAvailability = replaceServiceAvailability(serviceAvailability);
+
+ System.out.println("updated availability:");
+ System.out.println(updatedAvailability);
+ }
+
+ // TODO(partner): step11. implement this method with your data to make the
+ // batchReplaceServiceAvailability call
+ public static void batchUpdateAvailability() throws IOException {
+ // for example
+ String merchantId1 = "sampleMerchant1";
+ String merchantId2 = "sampleMerchant2";
+ String serviceId1 = "sampleService1";
+ String serviceId2 = "sampleService2";
+
+ List<Availability> availabilities1 = // {your first batch of availabilities};
+ List<Availability> availabilities2 = // {your second batch of availabilities};
+
+ ExtendedServiceAvailability extendedServiceAvailability1 = new ExtendedServiceAvailability()
+ .setMerchantId(merchantId1)
+ .setServiceId(serviceId1)
+ .setAvailability(availabilities1)
+ .setStartTimeRestrict("2018-01-02T00:00:00Z")
+ .setEndTimeRestrict("2018-01-03T23:30:00Z");
+
+ ExtendedServiceAvailability extendedServiceAvailability2 = new ExtendedServiceAvailability()
+ .setMerchantId(merchantId2)
+ .setServiceId(serviceId2)
+ .setAvailability(availabilities2)
+ .setStartTimeRestrict("2018-01-02T00:00:00Z");
+
+ List<ExtendedServiceAvailability> extendedServiceAvailabilities =
+ new ArrayList<ExtendedServiceAvailability>();
+ extendedServiceAvailabilities.add(extendedServiceAvailability1);
+ extendedServiceAvailabilities.add(extendedServiceAvailability2);
+
+ BatchReplaceServiceAvailabilityResponse batchUpdatedAvailability =
+ batchReplaceServiceAvailability(extendedServiceAvailabilities);
+
+ System.out.println("batch updated availabilities:");
+ System.out.println(batchUpdatedAvailability);
+ }
+
+ /**
+ * Creates a new Merchant managed by the specified partner, and returns it.
+ *
+ * @param content The merchant object to create.
+ * @return the newly created instance of Merchant.
+ */
+ private static Merchant createMerchant(Merchant content) throws IOException {
+
+ String merchantId = content.getName().split("/")[3];
+
+ String parent = "partners/" + PARTNER_ID;
+
+ return googleMapsBookingAPI
+ .inventory()
+ .partners()
+ .merchants()
+ .create(parent, content)
+ .setMerchantId(merchantId)
+ .execute();
+ }
+
+ /**
+ * Deletes an existing Merchant managed by the specified partner. All the merchant's services and
+ * availability will be disabled.
+ *
+ * @param merchantId The merchant_id of the merchant to delete.
+ * @return the empty object.
+ */
+ private static Empty deleteMerchant(String merchantId) throws IOException {
+
+ String name = "partners/" + PARTNER_ID + "/merchants/" + merchantId;
+
+ return googleMapsBookingAPI.inventory().partners().merchants().delete(name).execute();
+ }
+
+ /**
+ * Updates an existing Merchant managed by the specified partner, and returns it.
+ *
+ * @param content The merchant object contains the updated merchant content. @Param updateMask The
+ * specific fields to update for the merchant.
+ * @return the updated instance of Merchant.
+ */
+ private static Merchant updateMerchant(Merchant content, String updateMask) throws IOException {
+
+ String name = content.getName();
+
+ return googleMapsBookingAPI
+ .inventory()
+ .partners()
+ .merchants()
+ .patch(name, content)
+ .setUpdateMask(updateMask)
+ .execute();
+ }
+
+ /**
+ * Creates a new Service of a merchant managed by the specified partner, and returns it.
+ *
+ * @param content The service object to create.
+ * @return the newly created instance of Service.
+ */
+ private static Service createService(Service content) throws IOException {
+
+ String[] name = content.getName().split("/");
+ String merchantId = name[3];
+ String serviceId = name[5];
+ String parent = "partners/" + PARTNER_ID + "/merchants/" + merchantId;
+
+ return googleMapsBookingAPI
+ .inventory()
+ .partners()
+ .merchants()
+ .services()
+ .create(parent, content)
+ .setServiceId(serviceId)
+ .execute();
+ }
+
+ /**
+ * Deletes an existing Service of a merchant managed by the specified partner. All the service's
+ * availablity will be disabled.
+ *
+ * @param merchantId The merchant_id of the merchant who provides the to be deleted service.
+ * @param serviceId The service_id of the service to delete.
+ * @return the empty object.
+ */
+ private static Empty deleteService(String merchantId, String serviceId) throws IOException {
+
+ String name = "partners/" + PARTNER_ID + "/merchants/" + merchantId + "/services/" + serviceId;
+
+ return googleMapsBookingAPI
+ .inventory()
+ .partners()
+ .merchants()
+ .services()
+ .delete(name)
+ .execute();
+ }
+
+ /**
+ * Updates an existing Service of a merchant managed by the specified partner, and returns it.
+ *
+ * @param content The service object contains the updated service content. @Param updateMask The
+ * specific fields to update for the service.
+ * @return the updated instance of Service.
+ */
+ private static Service updateService(Service content, String updateMask) throws IOException {
+
+ String name = content.getName();
+
+ return googleMapsBookingAPI
+ .inventory()
+ .partners()
+ .merchants()
+ .services()
+ .patch(name, content)
+ .setUpdateMask(updateMask)
+ .execute();
+ }
+
+ /**
+ * Replaces the Availability of an existing Service of a merchant managed by the specified
+ * partner, and returns it.
+ *
+ * @param serviceAvailability The service availability that is used to replace the existing ones.
+ * @return the successfully updated ServiceAvailability.
+ */
+ private static ServiceAvailability replaceServiceAvailability(
+ ServiceAvailability serviceAvailability) throws IOException {
+
+ String name = serviceAvailability.getName();
+
+ ReplaceServiceAvailabilityRequest replaceServiceAvailabilityRequest =
+ new ReplaceServiceAvailabilityRequest().setServiceAvailability(serviceAvailability);
+
+ return googleMapsBookingAPI
+ .inventory()
+ .partners()
+ .merchants()
+ .services()
+ .availability()
+ .replace(name, replaceServiceAvailabilityRequest)
+ .execute();
+ }
+
+ /**
+ * Replaces the Availability of existing Services. This batch call does not guarantee atomicity.
+ * Only successfully updated availability slots will be returned.
+ *
+ * @param extendedServiceAvailabilities The list of extended service availability that is used to
+ * replace the existing availability slots.
+ * @return response containing successfully updated availability slots.
+ */
+ private static BatchReplaceServiceAvailabilityResponse batchReplaceServiceAvailability(
+ List<ExtendedServiceAvailability> extendedServiceAvailabilities) throws IOException {
+
+ String parent = "partners/" + PARTNER_ID;
+
+ BatchReplaceServiceAvailabilityRequest batchReplaceServiceAvailabilityRequest =
+ new BatchReplaceServiceAvailabilityRequest()
+ .setExtendedServiceAvailability(extendedServiceAvailabilities);
+
+ return googleMapsBookingAPI
+ .inventory()
+ .partners()
+ .availability()
+ .replace(parent, batchReplaceServiceAvailabilityRequest)
+ .execute();
+ }
+}
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..904003c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,57 @@
+# Java client example for real-time updates using RESTful calls
+
+### Prerequisite:
+
+Have your service account created, download your private key.
+
+### Get started:
+
+1. Download the [Java client
+ library](https://dl.google.com/mapsbooking/apiclients/v1alpha/mapsbooking_java_public.zip)
+ , unzip the file to get the 'mapsbooking' package.
+
+2. Create a java project in your IDE, download the sample codes
+ (InventoryUpdate.java & BookingNotification.java), import them into your
+ java project under src directory.
+
+3. Make a copy of your private key (JSON file) to the src directory.
+
+4. Add the Java Client Library to the dependencies of your project
+
+5. In both java files, follow the TODOs to complete your implementations
+
+More detail about the REST API can be found
+[here.](https://developers.google.com/maps-booking/reference/maps-booking-api/rest/)
+
+### Troubleshooting:
+
+1. Create a merchant/service with existing merchantId/serviceId, your will get
+ following error message: 409 Conflict { "code" : 409, "errors" : \[ {
+ "domain" : "global", "message" : "Requested entity already exists",
+ "reason" : "alreadyExists", "debugInfo" : "detail: \"\[ORIGINAL ERROR\]
+ generic::already_exists: ..."\n" } \], "message" : "Requested entity already
+ exists", "status" : "ALREADY_EXISTS" }
+
+2. Update/Delete with wrong merchantId/serviceId (update with wrong bookingId),
+ your will get following error message: 404 Not Found { "code" : 404,
+ "errors" : \[ { "domain" : "global", "message" : "Requested entity was not
+ found.", "reason" : "notFound", "debugInfo" : "detail: \"\[ORIGINAL ERROR\]
+ spanner::Row not found:...\"\n" } \], "message" : "Requested entity was not
+ found.", "status" : "NOT_FOUND" }
+
+3. In all update functions, the parameter 'updateMask' must be in
+ [FieldMask](https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#fieldmask)
+ format to specify the fields to update. The API is required to only change
+ the values of the fields as specified in the mask and leave the others
+ untouched. If you pass the wrong updateMask string, the update will not take
+ effect. If a field mask is not present on update, the operation applies to
+ all fields (as if a field mask of all fields has been specified). So if you
+ want to update all fields, just set the updateMask empty.
+
+4. Since an Availability Slot is not associated with a merchant_id/service_id,
+ if you make the replace availability calls with invalid
+ merchant_id/service_id, you will be able to make the REST call without any
+ issue, but your request will not be served in the production due to the
+ invalid merchant_id/service_id.
+
+5. Any field that has a zero value is not shown in the response.