diff --git a/Controller/SensorReadingsController.cs b/Controller/SensorReadingsController.cs new file mode 100644 index 0000000..c3079f1 --- /dev/null +++ b/Controller/SensorReadingsController.cs @@ -0,0 +1,29 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.OData.Query; +using Microsoft.AspNetCore.OData.Results; +using Microsoft.AspNetCore.OData.Routing.Controllers; + +public class SensorReadingsController : ODataController +{ + private readonly AppDbContext _db; + public SensorReadingsController(AppDbContext db) => _db = db; + + // GET /odata/SensorReadings + [EnableQuery] + public IQueryable Get() + => _db.SensorReadings; + + // GET /odata/SensorReadings(ts=...,location='...') + [EnableQuery] + public SingleResult Get([FromRoute] DateTimeOffset ts, [FromRoute] string location) + => SingleResult.Create(_db.SensorReadings.Where(x => x.Ts == ts && x.Location == location)); + + // POST /odata/SensorReadings + public async Task Post([FromBody] SensorReading sensorReading) + { + _db.SensorReadings.Add(sensorReading); + await _db.SaveChangesAsync(); + + return Created(sensorReading); + } +} diff --git a/Data/DbContext.cs b/Data/DbContext.cs index 8e0846d..ea77f5e 100644 --- a/Data/DbContext.cs +++ b/Data/DbContext.cs @@ -7,4 +7,11 @@ public DbSet HololiveSchedule => Set(); public DbSet PixivImages => Set(); + public DbSet SensorReadings => Set(); + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.Entity() + .HasKey(x => new { x.Ts, x.Location }); + } } diff --git a/Data/SensorReading.cs b/Data/SensorReading.cs new file mode 100644 index 0000000..ffa2da6 --- /dev/null +++ b/Data/SensorReading.cs @@ -0,0 +1,88 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +[Table("SensorReadings", Schema = "dbo")] +public class SensorReading +{ + [Column("ts")] + public DateTimeOffset Ts { get; set; } + + [Column("location")] + [MaxLength(64)] + public string Location { get; set; } = null!; + + [Column("temperature_c")] + public double? TemperatureC { get; set; } + + [Column("humidity_rh")] + public double? HumidityRh { get; set; } + + [Column("ambient_light")] + public double? AmbientLight { get; set; } + + [Column("pressure_hpa")] + public double? PressureHpa { get; set; } + + [Column("noise_db")] + public double? NoiseDb { get; set; } + + [Column("etvoc_ppb")] + public double? EtvocPpb { get; set; } + + [Column("eco2_ppm")] + public double? Eco2Ppm { get; set; } + + [Column("discomfort_index")] + public double? DiscomfortIndex { get; set; } + + [Column("heatstroke_index")] + public double? HeatstrokeIndex { get; set; } + + [Column("vibration_info")] + public byte? VibrationInfo { get; set; } + + [Column("si_value")] + public double? SiValue { get; set; } + + [Column("pga_gal")] + public double? PgaGal { get; set; } + + [Column("seismic_intensity")] + public double? SeismicIntensity { get; set; } + + [Column("temperature_flag")] + public byte? TemperatureFlag { get; set; } + + [Column("humidity_flag")] + public byte? HumidityFlag { get; set; } + + [Column("ambient_light_flag")] + public byte? AmbientLightFlag { get; set; } + + [Column("pressure_flag")] + public byte? PressureFlag { get; set; } + + [Column("noise_flag")] + public byte? NoiseFlag { get; set; } + + [Column("etvoc_flag")] + public byte? EtvocFlag { get; set; } + + [Column("eco2_flag")] + public byte? Eco2Flag { get; set; } + + [Column("discomfort_flag")] + public byte? DiscomfortFlag { get; set; } + + [Column("heatstroke_flag")] + public byte? HeatstrokeFlag { get; set; } + + [Column("si_flag")] + public byte? SiFlag { get; set; } + + [Column("pga_flag")] + public byte? PgaFlag { get; set; } + + [Column("seismic_intensity_flag")] + public byte? SeismicIntensityFlag { get; set; } +} diff --git a/Program.cs b/Program.cs index a0ad811..59881a7 100644 --- a/Program.cs +++ b/Program.cs @@ -11,6 +11,9 @@ var odataBuilder = new ODataConventionModelBuilder(); odataBuilder.EntitySet("HololiveSchedule"); odataBuilder.EntitySet("PixivImages"); +odataBuilder.EntitySet("SensorReadings") + .EntityType + .HasKey(x => new { x.Ts, x.Location }); builder.Services.AddControllers() .AddOData(opt =>