public async Task <IActionResult> UpdateSubscription(long restaurant,
                                                             [FromForm] UpdateSubscriptionRequest request)
        {
            var command = new UpdateSubscriptionCommand(restaurant, request.Subscription);

            return(await HandleActionResultFor(command));
        }
        public async Task SendNotification([ServiceBusTrigger(ApplicationSettings.JobMessagesQueue)] Guid id, TextWriter log)
        {
            try
            {
                await log.WriteLineAsync($"Sending notifications for {id}");

                var query = new SubscriptionQuery(_settings, _connectionFactory);

                var subscription = await query.GetSubscriptionById(id);

                if (subscription == null || subscription.ConfirmationSentOn.HasValue)
                {
                    return;
                }

                var mailMessage = _messageFactory.CreateConfirmationMessage(subscription);

                subscription.ConfirmationSentOn = DateTime.UtcNow;

                var update = new UpdateSubscriptionCommand(_settings, _connectionFactory);

                await update.Update(subscription, async (s, c, t) =>
                {
                    var updateStats = new UpdateStatisticCommands(_settings, _connectionFactory);

                    await updateStats.AddOrUpdateDomainCount(subscription.GetDomain(), c, t);

                    using (var smtpClient = new SmtpClient())
                    {
                        await smtpClient.SendMailAsync(mailMessage);
                    }
                });

                await log.WriteLineAsync($"Sent email to {subscription.EmailAddress}");
            }
            catch (Exception e)
            {
                log.Write($"GUID: {id}, Error: {e.Message}");
                throw;
            }
        }
        public async Task <string> UpdateAsync(SubscriptionUpdateOptions options, string database = null, CancellationToken token = default)
        {
            if (options == null)
            {
                throw new ArgumentNullException($"Cannot update a subscription if {nameof(options)} is null");
            }

            if (string.IsNullOrEmpty(options.Name) && options.Id == null)
            {
                throw new ArgumentNullException($"Cannot update a subscription if both {nameof(options)}.{nameof(options.Name)} and {nameof(options)}.{nameof(options.Id)} are null");
            }

            var requestExecutor = _store.GetRequestExecutor(database);

            using (requestExecutor.ContextPool.AllocateOperationContext(out JsonOperationContext context))
            {
                var command = new UpdateSubscriptionCommand(options);
                await requestExecutor.ExecuteAsync(command, context, sessionInfo : null, token : token).ConfigureAwait(false);

                return(command.Result.Name);
            }
        }
        public static async Task ProcessMissingConfirmationEmails(TextWriter log)
        {
            await log.WriteLineAsync("Starting resend of missing confirmation emails");

            var settings = new ApplicationSettings("");

            var connectionFactory = new SqlConnectionFactory();

            var query = new SubscriptionQuery(settings, connectionFactory);

            var subscriptions = await query.GetSubscriptionsWithMissingConfirmations();

            var messageFactory = new MessageFactory(settings);

            var updater = new UpdateSubscriptionCommand(settings, connectionFactory);

            foreach (var subscription in subscriptions.Where(s => s.CreatedOn > DateTime.UtcNow.Date))
            {
                await log.WriteLineAsync($"Sending confirmation email to {subscription.EmailAddress}");

                subscription.ConfirmationSentOn = DateTime.UtcNow;

                await updater.Update(subscription, async (s, c, t) =>
                {
                    using (var smtpClient = new SmtpClient())
                    {
                        var updateStats = new UpdateStatisticCommands(settings, connectionFactory);

                        await updateStats.AddOrUpdateDomainCount(subscription.GetDomain(), c, t);

                        await smtpClient.SendMailAsync(messageFactory.CreateConfirmationMessage(s));
                    }
                });
            }

            await log.WriteLineAsync("Completed resend of missing confirmation emails");
        }