public async Task <IActionResult> PublishRoutineAsync( [HttpTrigger(AuthorizationLevel.Function, HttpVerbs.Post, Route = "routines/{routineId}/publish")] HttpRequest req, Guid routineId, ExecutionContext context, [ServiceBus(GymLogTopicKey)] IAsyncCollector <ServiceBusMessage> collector, ILogger log) { var request = await req.ToRequestMessageAsync <PublishRequestMessage>().ConfigureAwait(false); var eventId = context.InvocationId; var spanId = request.SpanId; var correlationId = request.CorrelationId; var upn = request.Upn; var @interface = request.Interface; log.LogData(LogLevel.Information, request, EventType.PublishRequestReceived, EventStatusType.Succeeded, eventId, SpanType.Publisher, SpanStatusType.PublisherInProgress, spanId, @interface, correlationId); if (routineId != request.RoutineId) { log.LogData(LogLevel.Error, request, EventType.InvalidPublishRequest, EventStatusType.Failed, eventId, SpanType.Publisher, SpanStatusType.PublisherInProgress, spanId, @interface, correlationId, message: EventType.InvalidPublishRequest.ToDisplayName()); return(new BadRequestResult()); } var entity = new RoutineEntity() { PartitionKey = correlationId.ToString(), RowKey = eventId.ToString(), Upn = upn, CorrelationId = correlationId, SpanId = spanId, Interface = @interface, EventId = eventId, EventName = EventType.RoutineCompleted.ToDisplayName(), RoutineId = routineId, Routine = request.Routine, }; var res = default(ObjectResult); try { if (this._settings.ForceError.Publisher.Publish) { throw new ErrorEnforcementException("Error Enforced!"); } await this._client.CreateTableIfNotExistsAsync(this._settings.GymLog.StorageAccount.Table.TableName).ConfigureAwait(false); var table = this._client.GetTableClient(this._settings.GymLog.StorageAccount.Table.TableName); var records = await table.QueryAsync <ExerciseEntity>(p => p.PartitionKey == correlationId.ToString() && p.SpanId == spanId) .ToListAsync() .ConfigureAwait(false); records = records.Where(p => !p.Exercise.IsNullOrWhiteSpace()) .ToList(); if (!records.Any()) { res = records.ToPublishResponseMessage(request, eventId); log.LogData(LogLevel.Error, res.Value, EventType.RecordNotFound, EventStatusType.Failed, eventId, SpanType.Publisher, SpanStatusType.PublisherInProgress, spanId, request.Interface, correlationId, message: EventType.RecordNotFound.ToDisplayName()); return(res); } var entities = records.GroupBy(p => p.Exercise) .Select(g => new ExerciseEntityGroup() { Exercise = g.Key, Entity = g.OrderByDescending(q => q.Timestamp).First() }) .Select(p => p.Entity) .OrderByDescending(p => p.Timestamp) .ToList(); res = entities.ToPublishResponseMessage(request, eventId); log.LogData(LogLevel.Information, res.Value, EventType.RecordPopulated, EventStatusType.Succeeded, eventId, SpanType.Publisher, SpanStatusType.PublisherInProgress, spanId, @interface, correlationId, message: EventType.RecordPopulated.ToDisplayName()); var messageId = Guid.NewGuid(); var subSpanId = Guid.NewGuid(); var timestamp = DateTimeOffset.UtcNow; var message = (RoutineQueueMessage)(PublishResponseMessage)res.Value; var msg = new ServiceBusMessage(message.ToJson()) { CorrelationId = correlationId.ToString(), MessageId = messageId.ToString(), ContentType = ContentTypes.ApplicationJson, }; msg.ApplicationProperties.Add("pubSpanId", spanId); msg.ApplicationProperties.Add("subSpanId", subSpanId); msg.ApplicationProperties.Add("interface", @interface.ToString()); msg.ApplicationProperties.Add("timestamp", timestamp.ToString(CultureInfo.InvariantCulture)); await collector.AddAsync(msg).ConfigureAwait(false); log.LogData(LogLevel.Information, msg, EventType.MessagePublished, EventStatusType.Succeeded, eventId, SpanType.Publisher, SpanStatusType.PublisherInProgress, spanId, @interface, correlationId, messageId: messageId.ToString(), message: EventType.MessagePublished.ToDisplayName()); var response = await table.UpsertEntityAsync(entity).ConfigureAwait(false); var r = response.ToRoutineResponseMessage(request, eventId, entity.RoutineId); log.LogData(response.Status.ToLogLevel(), r.Value, response.Status.ToRoutineCompletedEventType(), response.Status.ToEventStatusType(), eventId, SpanType.Publisher, SpanStatusType.PublisherCompleted, spanId, @interface, correlationId, clientRequestId: response.ClientRequestId, message: response.Status.ToResponseMessage(r)); } catch (Exception ex) { res = new InternalServerErrorObjectResult() { Upn = upn, CorrelationId = correlationId, Interface = @interface, SpanId = spanId, EventId = eventId, Message = ex.Message, }; log.LogData(LogLevel.Error, res.Value, EventType.MessageNotPublished, EventStatusType.Failed, eventId, SpanType.Publisher, SpanStatusType.PublisherCompleted, spanId, @interface, correlationId, ex: ex, message: ex.Message); } return(res); }
public async Task <IActionResult> CreateRoutineAsync( [HttpTrigger(AuthorizationLevel.Function, HttpVerbs.Post, Route = "routines")] HttpRequest req, ExecutionContext context, ILogger log) { var request = await req.ToRequestMessageAsync <RoutineRequestMessage>().ConfigureAwait(false); var eventId = context.InvocationId; var spanId = request.SpanId; var correlationId = request.CorrelationId; var upn = request.Upn; var @interface = request.Interface; log.LogData(LogLevel.Information, request, EventType.RoutineReceived, EventStatusType.Succeeded, eventId, SpanType.Publisher, SpanStatusType.PublisherInitiated, spanId, @interface, correlationId); var routineId = Guid.NewGuid(); var entity = new RoutineEntity() { PartitionKey = correlationId.ToString(), RowKey = eventId.ToString(), Upn = upn, CorrelationId = correlationId, SpanId = spanId, Interface = @interface, EventId = eventId, EventName = EventType.RoutineCreated.ToDisplayName(), RoutineId = routineId, Routine = request.Routine, Targets = request.Targets.ToJson(), }; var res = default(ObjectResult); try { if (this._settings.ForceError.Publisher.Routine) { throw new ErrorEnforcementException("Error Enforced!"); } await this._client.CreateTableIfNotExistsAsync(this._settings.GymLog.StorageAccount.Table.TableName).ConfigureAwait(false); var table = this._client.GetTableClient(this._settings.GymLog.StorageAccount.Table.TableName); var response = await table.UpsertEntityAsync(entity).ConfigureAwait(false); res = response.ToRoutineResponseMessage(request, entity.EventId, entity.RoutineId); log.LogData(response.Status.ToLogLevel(), res.Value, response.Status.ToRoutineCreatedEventType(), response.Status.ToEventStatusType(), eventId, SpanType.Publisher, SpanStatusType.PublisherInProgress, spanId, @interface, correlationId, clientRequestId: response.ClientRequestId, message: response.Status.ToResponseMessage(res)); } catch (Exception ex) { res = new InternalServerErrorObjectResult() { Upn = upn, CorrelationId = correlationId, Interface = @interface, SpanId = spanId, EventId = eventId, Message = ex.Message, }; log.LogData(LogLevel.Error, res.Value, EventType.RoutineNotCreated, EventStatusType.Failed, eventId, SpanType.Publisher, SpanStatusType.PublisherInProgress, spanId, @interface, correlationId, ex: ex, message: ex.Message); } return(res); }