public static string Run(
            [ActivityTrigger] OrdiniAcquistoModel ordiniAcquisto,
            [OrchestrationClient] DurableOrchestrationClient starter,
            [SendGrid(ApiKey = "SendGridApiKey")]
            out Mail message)
        {
            string currentInstance = Guid.NewGuid().ToString("N");

            Log.Information($"InviaMailOrdineCliente : {currentInstance}");

            string toMail   = Utility.GetEnvironmentVariable("SendGridTo");
            string fromMail = Utility.GetEnvironmentVariable("SendGridFrom");

            Log.Information($"Invio ordine {ordiniAcquisto.IdOrdine} a {ordiniAcquisto.ClienteCorrente.NumeroTelefono}.");
            message = new Mail
            {
                Subject = $"GlobalAzureBootcamp 2018"
            };
            var personalization = new Personalization();

            personalization.AddTo(new Email(toMail));
            Content content = new Content
            {
                Type  = "text/html",
                Value = $@"L'ordine {ordiniAcquisto.IdOrdine} è stato preso in carico
                <br><a href='{Utility.GetEnvironmentVariable("PublicUrl")}/ApprovaOrdine?ordineId={ordiniAcquisto.IdOrdine}'>Conferma ordine</a>"
            };

            message.From = new Email(fromMail);
            message.AddContent(content);
            message.AddPersonalization(personalization);

            return(currentInstance);
        }
Exemple #2
0
        public static string Run(
            [ActivityTrigger] OrdiniAcquistoModel ordiniAcquisto,
            [OrchestrationClient] DurableOrchestrationClient starter,
            [SendGrid(ApiKey = "SendGridApiKey")] ICollector <SendGridMessage> messageCollector)
        {
            string toMail   = Utility.GetEnvironmentVariable("SendGridTo");
            string fromMail = Utility.GetEnvironmentVariable("SendGridFrom");
            var    message  = new SendGridMessage {
                Subject = $"WPC 2018"
            };

            message.AddTo(toMail);
            Content content = new Content
            {
                Type  = "text/html",
                Value = $@"L'ordine {ordiniAcquisto.IdOrdine} è stato preso in carico
                <br><a href='{Utility.GetEnvironmentVariable("PublicUrl")}/ApprovaOrdine?ordineId={ordiniAcquisto.IdConfirmation}'>Conferma ordine</a>"
            };

            message.From = new EmailAddress(fromMail);
            message.AddContents(new [] { content }.ToList());
            messageCollector.Add(message);

            return(Guid.NewGuid().ToString("N"));
        }
Exemple #3
0
        public static async Task Run(
            [OrchestrationTrigger] DurableOrchestrationContext context)
        {
            OrdiniAcquistoModel ordineAcquisto = context.GetInput <OrdiniAcquistoModel>();

            // Utilizzo un Id di esempio.
            ordineAcquisto.IdOrdine = context.InstanceId;

            // Invia notifica ordine via SMS
            string smsInstance = await context.CallActivityAsync <string>(
                Workflow.NotificaSmsOrdineCliente,
                ordineAcquisto);

            // Il SubOrchestrator non è necessario, è un esempio
            await context.CallSubOrchestratorAsync(Workflow.AttendiOrdineCliente, ordineAcquisto);

            // Utilizzo l'orario di start della funzione
            DateTime startManagerDatetime = context.CurrentUtcDateTime;
            await context.CallActivityAsync(Workflow.OrdineConfermato, new OrdiniAcquistoTable
            {
                PartitionKey             = ordineAcquisto.IdOrdine,
                RowKey                   = $"{smsInstance}-{context.InstanceId}",
                Ordine                   = ordineAcquisto,
                NotificaSmsOrdineCliente = smsInstance,
                InviaMailOrdineCliente   = context.InstanceId,
                Elaborazione             = startManagerDatetime
            });
        }
Exemple #4
0
        /// <summary>
        /// Invia notifica ordine via Mail
        /// </summary>
        /// <param name="context"></param>
        /// <param name="ordineAcquisto"></param>
        /// <returns></returns>
        private static async Task SendMail(DurableOrchestrationContext context, OrdiniAcquistoModel ordineAcquisto)
        {
            string mailInstance = await context.CallActivityWithRetryAsync <string>(Workflow.InviaMailOrdineCliente,
                                                                                    new RetryOptions(TimeSpan.FromSeconds(5), 10),
                                                                                    new OrdiniAcquistoModel
            {
                IdConfirmation  = context.InstanceId,
                IdOrdine        = ordineAcquisto.IdOrdine,
                Articoli        = ordineAcquisto.Articoli,
                ClienteCorrente = ordineAcquisto.ClienteCorrente
            });

            Log.Information($"OrdineClienteManager: MailInstance {mailInstance}");
        }
Exemple #5
0
        public static async Task Run(
            [OrchestrationTrigger] DurableOrchestrationContext context,
            [Table("ApprovaOrdineCliente")] CloudTable approvaOrdineTables,
            Microsoft.Extensions.Logging.ILogger logger)
        {
            logger.UseSerilog();
            Log.Information($"SubOrchestrator Instance: {context.InstanceId}");
            OrdiniAcquistoModel ordineAcquisto = context.GetInput <OrdiniAcquistoModel>();

            Log.Information($"Pending Order {ordineAcquisto.IdOrdine}");
            await SendMail(context, ordineAcquisto);

            string status = string.Empty;

            using (var timeoutCts = new CancellationTokenSource())
            {
                DateTime dueTime        = context.CurrentUtcDateTime.AddHours(5);
                Task     durableTimeout = context.CreateTimer(dueTime, timeoutCts.Token);

                Task <bool> approvalTask = context.WaitForExternalEvent <bool>(Workflow.EventoApprova);
                //Attendo un evento o un timer
                if (approvalTask == await Task.WhenAny(approvalTask, durableTimeout))
                {
                    timeoutCts.Cancel();
                    if (await approvalTask)
                    {
                        status = "Approvato";
                    }
                }
                else
                {
                    timeoutCts.Cancel();
                    status = "TempoScaduto";
                }
                Log.Warning(status);
            }

            var approvaOrdine = new ApprovaOrdineTable
            {
                PartitionKey   = context.InstanceId,
                RowKey         = "PendingApproval",
                OrdineId       = ordineAcquisto.IdOrdine,
                IdConfirmation = context.InstanceId,
                Status         = status
            };

            TableOperation insertOperation = TableOperation.InsertOrReplace(approvaOrdine);
            await approvaOrdineTables.ExecuteAsync(insertOperation);
        }
Exemple #6
0
        public static async Task <string> Run(
            [ActivityTrigger] OrdiniAcquistoModel ordiniAcquisto,
            [TwilioSms(AccountSidSetting = "TwilioAccountSid",
                       AuthTokenSetting = "TwilioAuthToken")]
            IAsyncCollector <CreateMessageOptions> message,
            Microsoft.Extensions.Logging.ILogger logger)
        {
            string currentInstance = Guid.NewGuid().ToString("N");
            await message.AddAsync(new CreateMessageOptions(new PhoneNumber(ordiniAcquisto.ClienteCorrente.NumeroTelefono))
            {
                Body = $"L'ordine {ordiniAcquisto.IdOrdine} è preso in carico. Conferma la mail",
                From = new PhoneNumber("+447533003163")
            });

            await message.FlushAsync();

            return(currentInstance);
        }
Exemple #7
0
        public static async Task <HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, methods: "post", Route = "OrdineCliente")] HttpRequestMessage req,
            [OrchestrationClient] DurableOrchestrationClient starter,
            Microsoft.Extensions.Logging.ILogger logger)
        {
            // Registrazione del tracewriter su Serilog
            logger.UseSerilog();

            OrdiniAcquistoModel ordiniAcquisto = await req.Content.ReadAsAsync <OrdiniAcquistoModel>();

            string instanceId = await starter.StartNewAsync(Workflow.OrdineClienteManager, ordiniAcquisto);

            // Verifica completamento lavoro...
            Log.Information($"Inizio Orchestratore con ID = '{instanceId}'.");
            var res = starter.CreateCheckStatusResponse(req, instanceId);

            res.Headers.RetryAfter = new RetryConditionHeaderValue(TimeSpan.FromMinutes(10));
            return(res);
        }
        public static string Run(
            [ActivityTrigger] OrdiniAcquistoModel ordiniAcquisto,
            [TwilioSms(AccountSidSetting = "TwilioAccountSid",
                       AuthTokenSetting = "TwilioAuthToken",
                       From = "%TwilioPhoneNumber%")]
            out SMSMessage message)
        {
            string currentInstance = Guid.NewGuid().ToString("N");

            Log.Information($"NotificaSmsOrdineCliente : {currentInstance}");
            // Get a random number generator with a random seed (not time-based)

            Log.Information($"Invio ordine {ordiniAcquisto.IdOrdine} a {ordiniAcquisto.ClienteCorrente.NumeroTelefono}.");
            message = new SMSMessage
            {
                To   = ordiniAcquisto.ClienteCorrente.NumeroTelefono,
                Body = $"L'ordine {ordiniAcquisto.IdOrdine} è preso in carico. Conferma la mail"
            };
            return(currentInstance);
        }
        public static async Task <OrdiniAcquistoTable> Run(
            [OrchestrationTrigger] DurableOrchestrationContext context)
        {
            OrdiniAcquistoModel ordineAcquisto = context.GetInput <OrdiniAcquistoModel>();

            // Se è un nuovo tentativo, imposto l'IdOrdine
            if (!context.IsReplaying)
            {
                ordineAcquisto.IdOrdine = context.InstanceId;
            }

            // TODO: Salva l'ordine in un DB.
            string mailInstance;
            string smsInstance;


            smsInstance = await context.CallActivityAsync <string>(Workflow.NotificaSmsOrdineCliente, ordineAcquisto);

            Log.Information($"OrdineClienteManager: SmsInstance {smsInstance}");
            mailInstance = await context.CallActivityAsync <string>(Workflow.InviaMailOrdineCliente, ordineAcquisto);

            Log.Information($"OrdineClienteManager: MailInstance {mailInstance}");

            //TODO: abilitare Human Interaction
            //if (!string.IsNullOrEmpty(mailInstance))
            //{
            //    await context.CallSubOrchestratorAsync(Workflow.AttendiOrdineCliente, ordineAcquisto.IdOrdine);
            //}

            return(new OrdiniAcquistoTable
            {
                PartitionKey = ordineAcquisto.IdOrdine,
                RowKey = $"{smsInstance}-{mailInstance}",
                Ordine = ordineAcquisto,
                NotificaSmsOrdineCliente = smsInstance,
                InviaMailOrdineCliente = mailInstance,
                Elaborazione = DateTimeOffset.UtcNow
            });
        }