public async Task Report(Reading reading) { if (reading == null) { throw new ArgumentNullException(nameof(reading)); } await context.Entry(reading).Reference(r => r.Sensor).LoadAsync(); await context.Entry(reading.Sensor).Reference(s => s.Alert).LoadAsync(); Alert alert = reading.Sensor.Alert; if (alert == null) { return; } bool isAlert = alert.Check(reading.Value); if (isAlert != alert.IsNotified) { alert.IsNotified = !alert.IsNotified; await context.SaveChangesAsync(); string subject = FormatSubject(isAlert); string message = FormatMessage(isAlert, reading); await emailSender.SendEmailAsync(alert.Email, subject, message); } }
public async Task <IActionResult> Post([FromBody][Bind("DeviceId,SensorId,Value")] Reading reading) { using (var transaction = await context.Database.BeginTransactionAsync()) { try { if (ModelState.IsValid) { Device device = await context.Devices.FindAsync(reading.DeviceId); if (device == null) { device = new Device() { DeviceId = reading.DeviceId }; await context.Devices.AddAsync(device); } Sensor sensor = await context.Sensors.FindAsync(reading.DeviceId, reading.SensorId); if (sensor == null) { sensor = new Sensor() { DeviceId = reading.DeviceId, SensorId = reading.SensorId }; await context.Sensors.AddAsync(sensor); } await context.Readings.AddAsync(reading); await context.SaveChangesAsync(); transaction.Commit(); lastValues.SetSensorLastValue(reading.DeviceId, reading.SensorId, reading.Value); await alertReporter.Report(reading); return(Ok(device.DelaySeconds)); } } catch (Exception) { transaction.Rollback(); } } return(BadRequest()); }