public void CreateOrUpdateAzureStoreSubscription(AzureStoreSubscription subscription)
        {
            using (AccountDataContext context = new AccountDataContext(ConfigurationDataProvider.AccountDataProviderConnectionString))
            {
                if (subscription.id_AzureStoreSubscriptionId == Guid.Empty)
                {
                    context.Entry(subscription).State = EntityState.Added;
                    subscription.dt_CreatedTime       = DateTime.UtcNow;
                    subscription.dt_ChangedTime       = DateTime.UtcNow;
                }
                else
                {
                    context.Entry(subscription).State = EntityState.Modified;
                    subscription.dt_ChangedTime       = DateTime.UtcNow;
                }

                AccountDataProvider.RetryPolicy.ExecuteAction(() =>
                {
                    context.SaveChanges();
                });
            }
        }
        public void CreateOrUpdateAzureStoreSubscription(AzureStoreSubscription subscription)
        {
            using (AccountDataContext context = new AccountDataContext(ConfigurationDataProvider.AccountDataProviderConnectionString))
            {
                if (subscription.id_AzureStoreSubscriptionId == Guid.Empty)
                {
                    context.Entry(subscription).State = EntityState.Added;
                    subscription.dt_CreatedTime = DateTime.UtcNow;
                    subscription.dt_ChangedTime = DateTime.UtcNow;
                }
                else
                {
                    context.Entry(subscription).State = EntityState.Modified;
                    subscription.dt_ChangedTime = DateTime.UtcNow;
                }

                AccountDataProvider.RetryPolicy.ExecuteAction(() =>
                {
                    context.SaveChanges();
                });
            }
        }
        public HttpResponseMessage HandleSubscriptionEvent(string subscriptionId)
        {
            if (!AzureStoreAuthorization.AuthorizeRequest(this.Request.GetClientCertificate()))
            {
                throw new HttpResponseException(HttpStatusCode.Forbidden);
            }

            EntityEvent entityEvent = null;
            try
            {
                entityEvent = Request.Content.ReadAsAsync<EntityEvent>().Result;

                using (var provider = AccountDataProvider.Instance)
                {
                    var resourceType        = entityEvent.GetProperty("ResourceType");
                    var email               = entityEvent.GetProperty("EMail");
                    var optIn               = entityEvent.GetProperty("OptIn");

                    var subscription = provider.GetAzureStoreSubscriptionBySubscriptionId(subscriptionId);
                    if (subscription == null)
                    {
                        if (entityEvent.EntityState != EntityState.Registered)
                        {
                            Logger.ErrorFormat("HandleSubscriptionEvent: Event '{1}' received for unknown Azure store subscription {0}. Raw data:\n{2}\n", subscriptionId, entityEvent.EntityState, entityEvent.AsJson());
                            return Request.CreateResponse(HttpStatusCode.BadRequest);
                        }

                        if (String.IsNullOrEmpty(email))
                        {
                            Logger.ErrorFormat("HandleSubscriptionEvent: Failed to register new Azure store subscription {0}. Subscription doesn't have associated email. Raw data:\n{1}\n", subscriptionId, entityEvent.AsJson());
                            return Request.CreateResponse(HttpStatusCode.BadRequest);
                        }

                        Guid tenantId = provider.FindOrCreateTenantForUser(
                            userEmail               : email,
                            tenantName              : String.Format("Tenant for {0} {1} (via azure store)", email, subscriptionId)
                        );

                        subscription = new AzureStoreSubscription
                        {
                            nvc_SubscriptionId      = subscriptionId,
                            id_TenantId             = tenantId
                        };
                    }

                    subscription.nvc_EntityState    = entityEvent.EntityState.ToString();
                    subscription.nvc_ResourceType   = resourceType ?? subscription.nvc_ResourceType;
                    subscription.nvc_Email          = email ?? subscription.nvc_Email;
                    subscription.nvc_OptIn          = optIn ?? subscription.nvc_OptIn;
                    subscription.nvc_RawData        = entityEvent.AsJson();

                    provider.CreateOrUpdateAzureStoreSubscription(subscription);

                    Logger.InfoFormat("HandleSubscriptionEvent: Azure store subscription {0} updated. Raw data:\n{1}\n", subscriptionId, entityEvent.AsJson());
                    return Request.CreateResponse(HttpStatusCode.OK);
                }
            }
            catch (Exception ex)
            {
                if (Utils.IsFatalException(ex) || ex is HttpResponseException)
                {
                    throw;
                }

                Logger.Error(
                    message     : String.Format(
                        "HandleSubscriptionEvent: Unable to update Azure store subscription {0}. Raw data:\n{1}\n",
                        subscriptionId,
                        entityEvent != null ? entityEvent.AsJson() : "<null>"
                    ),
                    exception   : ex
                );

                return Request.CreateResponse(HttpStatusCode.InternalServerError);
            }
        }