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); }
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")); }
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 }); }
/// <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}"); }
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); }
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); }
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 }); }