public async Task<LightsResponse> HandleRequestAsync(LightsRequest request) { var now = _dateTimeProvider.UtcNow(); var metric = new Metric { TimestampUtc = now, RequestText = request.Text, Source = request.Source, From = request.From }; var lightDisplay = await _lightDisplayParser.ParseAsync(request.Text); if (lightDisplay.Colours.Count == 0) { await _metricWriter.SendAsync(metric); return LightsResponse.Failure(); } var scheduledEnqueueTimeUtc = _lastRequestUtc.AddMinutes(1); if (now > scheduledEnqueueTimeUtc || (request.From == _lastRequestUser && !_isScheduleActive)) { _lastRequestUtc = now; _isScheduleActive = false; await _busPublisher.PublishAsync(lightDisplay); } else { _isScheduleActive = true; _lastRequestUtc = scheduledEnqueueTimeUtc; await _busPublisher.PublishAsync(lightDisplay, scheduledEnqueueTimeUtc); } _lastRequestUser = request.From; metric.IsValidCommand = true; metric.DisplayType = lightDisplay.GetType().Name; metric.Command = lightDisplay; metric.IsScheduled = _isScheduleActive; metric.ScheduledAtUtc = _isScheduleActive ? (DateTime?) scheduledEnqueueTimeUtc : null; metric.ScheduledDelaySecs = _isScheduleActive ? (double?)(scheduledEnqueueTimeUtc - now).TotalSeconds : null; await _metricWriter.SendAsync(metric); return _isScheduleActive ? LightsResponse.Scheduled(scheduledEnqueueTimeUtc) : LightsResponse.Success(); }
public async Task SendAsync(Metric metric) { await _elasticClient.IndexAsync(metric); }