Skip to content

Instantly share code, notes, and snippets.

@websterian
Created December 21, 2018 20:30
Show Gist options
  • Save websterian/92d231303ddf82ce614630b77179ad4e to your computer and use it in GitHub Desktop.
Save websterian/92d231303ddf82ce614630b77179ad4e to your computer and use it in GitHub Desktop.
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Azure.WebJobs.Host;
using Sitecore.Commerce.ServiceProxy;
using System;
using Sitecore.Commerce.Engine;
using Microsoft.OData.Client;
using System.Globalization;
using System.Security.Cryptography.X509Certificates;
using Newtonsoft.Json.Linq;
namespace Sitecore.Services.Examples.Azure.Functions
{
public static class CreateProductRequest
{
[FunctionName("CreateProductRequest")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequestMessage req, TraceWriter log)
{
log.Info("C# HTTP trigger function processed a request.");
// parse query parameter
var productid = req.GetQueryNameValuePairs()
.FirstOrDefault(q => string.Compare(q.Key, "productid", StringComparison.OrdinalIgnoreCase) == 0)
.Value;
var priceStr = req.GetQueryNameValuePairs()
.FirstOrDefault(q => string.Compare(q.Key, "price", StringComparison.OrdinalIgnoreCase) == 0)
.Value;
if (decimal.TryParse(priceStr, out var outPrice))
{
outPrice = System.Convert.ToDecimal(priceStr);
}
var productsArray = new JArray();
dynamic variant1 = new JObject();
variant1.variantid = productid + "-Variant1";
variant1.listprice = outPrice;
dynamic variant2 = new JObject();
variant2.variantid = productid + "-Variant2";
variant2.listprice = outPrice;
dynamic variant3 = new JObject();
variant3.variantid = productid + "-Variant3";
variant3.listprice = outPrice;
dynamic product = new JObject();
product.productid = productid;
product.listprice = outPrice;
product.name = "Product " + productid;
product.displayname = "Product " + productid;
product.description = "Product " + productid + " is the best!!!";
product.variants = new JArray(variant1, variant2, variant3);
productsArray.Add(product);
var o = new JObject
{
["products"] = productsArray
};
var products = o.ToString();
var re = GetContainer( System.Configuration.ConfigurationManager.AppSettings["defaultEnvironment"],
System.Configuration.ConfigurationManager.AppSettings["defaultShopName"],
string.Empty).CreateUpdateSellableItem(products);
var result = Proxy.GetValue(re);
return result == false
? req.CreateResponse(HttpStatusCode.BadRequest, "Failed to update or create")
: req.CreateResponse(HttpStatusCode.OK, "Created or updated " + productid );
}
public static Container GetContainer(string environment, string shopName, string userId, string customerId = "", string language = "", string currency = "", DateTime? effectiveDate = null)
{
return GetShopsContainer(environment, shopName, userId, customerId, language, currency, effectiveDate);
}
public static Container GetShopsContainer(string environment = "", string shopName = "", string userId = "", string customerId = "", string language = "", string currency = "", DateTime? effectiveDate = null)
{
var container = new Container(new Uri(System.Configuration.ConfigurationManager.AppSettings["shopsServiceUrl"]))
{
MergeOption = MergeOption.OverwriteChanges,
DisableInstanceAnnotationMaterialization = true
};
container.BuildingRequest += (s, e) => {
e.Headers.Add("ShopName", shopName);
e.Headers.Add("Environment", environment);
if (effectiveDate.HasValue)
{
DateTimeOffset value = effectiveDate.Value;
e.Headers.Add("EffectiveDate", value.ToString(CultureInfo.InvariantCulture));
}
e.Headers.Add("ShopperId", string.Empty);
e.Headers.Add("IsRegistered", string.Empty);
if (!string.IsNullOrEmpty(customerId))
{
e.Headers.Add("CustomerId", customerId);
}
if (!string.IsNullOrEmpty(language))
{
e.Headers.Add("Language", language);
}
if (!string.IsNullOrEmpty(currency))
{
e.Headers.Add("Currency", currency);
}
var certificate = GetCertificate();
if (certificate != null)
{
e.Headers.Add(System.Configuration.ConfigurationManager.AppSettings["certificateHeaderName"], certificate);
}
};
return container;
}
public static string GetCertificate()
{
var thumbPrint = System.Configuration.ConfigurationManager.AppSettings["certificateThumbprint"];
if (string.IsNullOrEmpty(thumbPrint))
{
return null;
}
//for azure change to User from LocalMachine
var x509Store = new X509Store(StoreName.My,StoreLocation.LocalMachine);
x509Store.Open(OpenFlags.ReadOnly);
var x509Certificate2Collection = x509Store.Certificates.Find(X509FindType.FindByThumbprint, thumbPrint, false);
if (x509Certificate2Collection.Count == 0)
{
return null;
}
var item = x509Certificate2Collection[0];
return item == null ? null : System.Convert.ToBase64String(item.Export(X509ContentType.Cert), Base64FormattingOptions.None);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment