Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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());
        }