From 3948b9185d732c4d0fc755bd7df8727ea3775234 Mon Sep 17 00:00:00 2001 From: Steve Ramage Date: Fri, 29 Dec 2023 08:22:13 -0800 Subject: [PATCH] Resolves #385 - Customer cart association support --- external/browser/browser.go | 3 + external/resources/resources_schema.json | 12 +- external/resources/yaml/resources.yaml | 22 +++- .../customer-cart-associations.epcc.yml | 117 ++++++++++++++++++ 4 files changed, 146 insertions(+), 8 deletions(-) create mode 100644 external/runbooks/customer-cart-associations.epcc.yml diff --git a/external/browser/browser.go b/external/browser/browser.go index 3b93670..0ea0399 100644 --- a/external/browser/browser.go +++ b/external/browser/browser.go @@ -7,6 +7,9 @@ import ( ) func OpenUrl(url string) error { + if url == "" { + return fmt.Errorf("No url available") + } switch runtime.GOOS { case "linux": exec.Command("xdg-open", url).Start() diff --git a/external/resources/resources_schema.json b/external/resources/resources_schema.json index 0b4fd31..9584275 100644 --- a/external/resources/resources_schema.json +++ b/external/resources/resources_schema.json @@ -30,12 +30,12 @@ "suppress-reset-warning": { "type": "boolean" }, - "docs": { "type": "string", "pattern": "^https://" }, + "docs": { "type": "string", "pattern": "^https?://" }, "get-collection": { "type": "object", "additionalProperties": false, "properties" : { - "docs": { "type": "string", "pattern": "^https://" }, + "docs": { "type": "string", "pattern": "^https?://" }, "url": { "type": "string" }, "content-type": { "type": "string" }, "parent_resource_value_overrides": { "type": "object" }, @@ -46,7 +46,7 @@ "get-entity": { "type": "object", "properties" : { - "docs": { "type": "string", "pattern": "^https://" }, + "docs": { "type": "string", "pattern": "^https?://" }, "url": { "type": "string" }, "content-type": { "type": "string" }, "parent_resource_value_overrides": { "type": "object" }, @@ -57,7 +57,7 @@ "update-entity": { "type": "object", "properties" : { - "docs": { "type": "string", "pattern": "^https://" }, + "docs": { "type": "string", "pattern": "^https?://" }, "url": { "type": "string" }, "content-type": { "type": "string" }, "parent_resource_value_overrides": { "type": "object" } @@ -67,7 +67,7 @@ "create-entity": { "type": "object", "properties" : { - "docs": { "type": "string", "pattern": "^https://" }, + "docs": { "type": "string", "pattern": "^https?://" }, "url": { "type": "string" }, "content-type": { "type": "string" }, "parent_resource_value_overrides": { "type": "object" } @@ -77,7 +77,7 @@ "delete-entity": { "type": "object", "properties" : { - "docs": { "type": "string", "pattern": "^https://" }, + "docs": { "type": "string", "pattern": "^https?://" }, "url": { "type": "string" }, "min": { "type": "integer" } }, diff --git a/external/resources/yaml/resources.yaml b/external/resources/yaml/resources.yaml index 8b48400..0de7673 100644 --- a/external/resources/yaml/resources.yaml +++ b/external/resources/yaml/resources.yaml @@ -219,7 +219,7 @@ carts: json-api-format: "legacy" docs: "https://documentation.elasticpath.com/commerce-cloud/docs/api/carts-and-orders/carts/index.html" get-collection: - docs: "https://documentation.elasticpath.com/commerce-cloud/docs/api/carts-and-orders/carts/associations/get-customer-carts.html" + docs: "https://elasticpath.dev/docs/commerce-cloud/carts/customer-cart-associations/get-customer-carts#get-get-all-carts" url: "/v2/carts" get-entity: docs: "https://documentation.elasticpath.com/commerce-cloud/docs/api/carts-and-orders/carts/get-a-cart.html" @@ -491,6 +491,24 @@ customers: autofill: FUNC:Email password: type: STRING +customer-cart-associations: + singular-name: customer-cart-association + json-api-type: customer-cart-relationship + json-api-format: "legacy" + no-wrapping: true + docs: "https://elasticpath.dev/docs/commerce-cloud/carts/customer-cart-associations/customer-cart-associations-overview" + delete-entity: + docs: "https://elasticpath.dev/docs/commerce-cloud/carts/customer-cart-associations/delete-an-association" + url: "/v2/carts/{carts}/relationships/customers" + create-entity: + docs: "https://elasticpath.dev/docs/commerce-cloud/carts/customer-cart-associations/create-an-association" + url: "/v2/carts/{carts}/relationships/customers" + content-type: application/json + attributes: + data[n].id: + type: RESOURCE_ID:customer + data[n].type: + type: ENUM:customer customer-addresses: singular-name: "customer-address" json-api-type: "address" @@ -797,7 +815,7 @@ entries-relationship: data.id: type: RESOURCE_ID:* data.type: - type: SINGULAR_RESOURCE_TYPE + type: JSON_API_TYPE integration-jobs: singular-name: "integration-job" json-api-type: "integration-job" diff --git a/external/runbooks/customer-cart-associations.epcc.yml b/external/runbooks/customer-cart-associations.epcc.yml new file mode 100644 index 0000000..a610d19 --- /dev/null +++ b/external/runbooks/customer-cart-associations.epcc.yml @@ -0,0 +1,117 @@ +name: "customer-cart-associations" +description: + long: "Sample commands for using customer cart association" + short: "Sample commands for using customer cart association" +actions: + create-prerequisites: + description: + short: "Create necessary prerequisites" + commands: + - epcc create pcm-hierarchy name "Major Appliances" description "Free standing appliances" slug "Major-Appliances-MA0" + - epcc create pcm-node name=Major_Appliances name "Ranges" description "All stoves and ovens" slug "Ranges-MA1" + - | + epcc create pcm-node name=Major_Appliances name "Electric Ranges" description "Electric stoves and ovens" slug "Electric-Ranges-MA2" relationships.parent.data.type node relationships.parent.data.id name=Ranges + epcc create pcm-node name=Major_Appliances name "Gas Ranges" description "Gas stoves and ovens" slug "Gas-Ranges-MA2" relationships.parent.data.type node relationships.parent.data.id name=Ranges + - epcc create pcm-product name "BestEver Electric Range" sku "BE-Electric-Range-1a1a" slug "bestever-range-1a1a" description "This electric model offers an induction heating element and convection oven." status live commodity_type physical upc_ean \"111122223333\" mpn BE-R-1111-aaaa-1a1a + - epcc create pcm-node-product name=Major_Appliances name=Electric_Ranges data[0].type product data[0].id name=BestEver_Electric_Range + - epcc create pcm-product name "BestEver Gas Range" sku "BE-Gas-Range-2b2b" slug "bestever-range-2b2b" description "This gas model includes a convection oven." status live commodity_type physical upc_ean \"222233334444\" mpn BE-R-2222-bbbb-2b2b + - epcc create pcm-node-product name=Major_Appliances name=Gas_Ranges data[0].type product data[0].id name=BestEver_Gas_Range + - epcc get -s currencies + - epcc create currency --if-alias-does-not-exist code=GBP code GBP exchange_rate 1 format £{price} decimal_point "." thousand_separator , decimal_places 2 default false enabled true + - epcc create pcm-pricebook name "Preferred Pricing" description "Catalog with pricing suitable for high-volume customers." + - | + epcc create pcm-product-price name=Preferred_Pricing currencies.USD.amount 300000 currencies.USD.includes_tax false currencies.GBP.amount 250000 currencies.GBP.includes_tax false sku BE-Electric-Range-1a1a + epcc create pcm-product-price name=Preferred_Pricing currencies.USD.amount 350000 currencies.USD.includes_tax false currencies.GBP.amount 300000 currencies.GBP.includes_tax false sku BE-Gas-Range-2b2b + - epcc create pcm-catalog name "Ranges Catalog" description "Ranges Catalog" pricebook_id name=Preferred_Pricing hierarchy_ids[0] name=Major_Appliances + - epcc create pcm-catalog-release --save-as-alias pxm-how-to-create-catalog-and-publish-release name=Ranges_Catalog + # Wait for Catalog to be Published + - epcc get pcm-catalog-release --retry-while-jq '.data.meta.release_status != "PUBLISHED"' name=Ranges_Catalog pxm-how-to-create-catalog-and-publish-release + create-customers-and-carts-with-product-items: + description: + short: "Create the customers and carts" + ignore_errors: true + commands: + - | + epcc create customer --auto-fill email "cust1@example.com" password test + epcc create customer --auto-fill email "cust2@example.com" password test + epcc create customer --auto-fill email "cust3@example.com" password test + epcc create cart name "Customer 1 Cart" id cust1_only description "Customer 1 Cart" + epcc create cart name "Customer 1&2 Shared Cart" id cust1_and_2 description "Customer 1 & 2 Cart" + epcc create cart name "No Customer Cart" id no_cust_cart description "No Customer Cart" + - epcc create customer-cart-association id=cust1_only data[0].type customer data[0].id email=cust1@example.com + - epcc create customer-cart-association id=cust1_and_2 data[0].type customer data[0].id email=cust1@example.com + - epcc create customer-cart-association id=cust1_and_2 data[0].type customer data[0].id email=cust2@example.com + - epcc create cart-product-item id=cust1_only sku sku=BE-Gas-Range-2b2b quantity 1 + - epcc create cart-product-item id=cust1_and_2 sku sku=BE-Gas-Range-2b2b quantity 2 + - epcc create cart-product-item no_cust_cart sku sku=BE-Gas-Range-2b2b quantity 3 + + create-customers-and-carts-with-custom-items: + description: + short: "Create the customers and carts" + ignore_errors: true + commands: + - | + epcc create customer --auto-fill email "cust1@example.com" password test + epcc create customer --auto-fill email "cust2@example.com" password test + epcc create customer --auto-fill email "cust3@example.com" password test + epcc create cart name "Customer 1 Cart" id cust1_only description "Customer 1 Cart" + epcc create cart name "Customer 1&2 Shared Cart" id cust1_and_2 description "Customer 1 & 2 Cart" + epcc create cart name "No Customer Cart" id no_cust_cart description "No Customer Cart" + - epcc create customer-cart-association id=cust1_only data[0].type customer data[0].id email=cust1@example.com + - epcc create customer-cart-association id=cust1_and_2 data[0].type customer data[0].id email=cust1@example.com + - epcc create customer-cart-association id=cust1_and_2 data[0].type customer data[0].id email=cust2@example.com + - epcc create cart-custom-item id=cust1_only sku sku=BE-Gas-Range-2b2b quantity 1 + - epcc create cart-custom-item id=cust1_and_2 sku sku=BE-Gas-Range-2b2b quantity 2 + - epcc create cart-custom-item no_cust_cart sku sku=BE-Gas-Range-2b2b quantity 3 + + + delete-customers-and-carts: + description: + short: "Delete all the customers and their carts" + commands: + - epcc get -s customers filter 'like(email,*@example.com)' + - | + epcc delete customer email=cust1@example.com + epcc delete customer email=cust2@example.com + epcc delete customer email=cust3@example.com + - epcc delete customer-cart-association id=cust1_only data[0].type customer data[0].id email=cust1@example.com + - epcc delete customer-cart-association id=cust1_and_2 data[0].type customer data[0].id email=cust1@example.com + - epcc delete customer-cart-association id=cust1_and_2 data[0].type customer data[0].id email=cust2@example.com + - | + epcc delete cart cust1_only + epcc delete cart cust1_and_2 + epcc delete cart no_cust_cart + + + reset: + description: + short: "Reset the store to the initial state" + ignore_errors: true + commands: + # Retrieve a bunch of data (not all), so that aliases can be populated + - | + epcc get -s pcm-products + epcc get -s pcm-catalogs + epcc get -s pcm-hierarchies + epcc get -s pcm-pricebooks + epcc get -s pcm-catalog-rules + epcc get -s customers filter 'like(email,*@example.com)' + - | + epcc get -s pcm-catalog-releases name=Ranges_Catalog + epcc get -s pcm-catalog-releases name=Ranges_Catalog_for_Special_Customers + - | + epcc delete customer email=cust1@example.com --if-alias-exists email=cust1@example.com + epcc delete customer email=cust2@example.com --if-alias-exists email=cust2@example.com + epcc delete customer email=cust3@example.com --if-alias-exists email=cust3@example.com + epcc delete currency code=GBP --if-alias-exists code=GBP + epcc delete pcm-catalog-release name=Ranges_Catalog name=Ranges_Catalog + epcc delete pcm-catalog-release name=Ranges_Catalog_for_Special_Customers name=Ranges_Catalog_for_Special_Customers + epcc delete pcm-catalog-rule name=Catalog_Rule_for_Civil_Servants --if-alias-exists name=Catalog_Rule_for_Civil_Servants + epcc delete pcm-product name=BestEver_Gas_Range --if-alias-exists name=BestEver_Gas_Range + epcc delete pcm-product name=BestEver_Electric_Range --if-alias-exists name=BestEver_Electric_Range + epcc delete pcm-hierarchy name=Major_Appliances --if-alias-exists name=Major_Appliances + epcc delete pcm-pricebook name=Preferred_Pricing --if-alias-exists name=Preferred_Pricing + epcc delete pcm-pricebook name=Loyal_Civil_Servants_Pricing --if-alias-exists name=Loyal_Civil_Servants_Pricing + - | + epcc delete pcm-catalog name=Ranges_Catalog_for_Special_Customers --if-alias-exists name=Ranges_Catalog_for_Special_Customers + epcc delete pcm-catalog name=Ranges_Catalog --if-alias-exists name=Ranges_Catalog