Start adding API endpoints

This commit is contained in:
2024-02-01 17:56:33 -05:00
parent 6460430a69
commit d8f6e170dd
9 changed files with 103 additions and 12 deletions

View File

@@ -0,0 +1,35 @@
using ChrisKaczor.HomeMonitor.Environment.Service.Data;
using ChrisKaczor.HomeMonitor.Environment.Service.Models;
using Microsoft.AspNetCore.Mvc;
namespace ChrisKaczor.HomeMonitor.Environment.Service.Controllers;
[Route("[controller]")]
[ApiController]
public class ReadingsController(Database database) : ControllerBase
{
[HttpGet("recent")]
public async Task<ActionResult<IEnumerable<Readings>>> GetRecent([FromQuery] string? tz)
{
var recentReadings = await database.GetRecentReadings();
if (string.IsNullOrWhiteSpace(tz))
return Ok(recentReadings);
try
{
var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById(tz);
foreach (var recentReading in recentReadings)
{
recentReading.Time = recentReading.Time.ToOffset(timeZoneInfo.GetUtcOffset(recentReading.Time));
}
}
catch (Exception e)
{
return BadRequest(e.Message);
}
return Ok(recentReadings);
}
}

View File

@@ -1,7 +1,9 @@
using Dapper;
using ChrisKaczor.HomeMonitor.Environment.Service.Models;
using Dapper;
using DbUp;
using Npgsql;
using System.Reflection;
using ChrisKaczor.HomeMonitor.Environment.Service.Models.Indoor;
namespace ChrisKaczor.HomeMonitor.Environment.Service.Data;
@@ -41,7 +43,7 @@ public class Database(IConfiguration configuration)
return connection;
}
public async Task StoreMessageAsync(Message message)
public async Task StoreMessageAsync(DeviceMessage message)
{
await using var connection = CreateConnection();
@@ -49,4 +51,13 @@ public class Database(IConfiguration configuration)
await connection.QueryAsync(query, message);
}
public async Task<IEnumerable<Readings>> GetRecentReadings()
{
await using var connection = CreateConnection();
var query = ResourceReader.GetString("ChrisKaczor.HomeMonitor.Environment.Service.Data.Queries.GetRecentReadings.sql");
return await connection.QueryAsync<Readings>(query).ConfigureAwait(false);
}
}

View File

@@ -0,0 +1,16 @@
SELECT DISTINCT ON (name)
time,
name,
model,
temperature,
pressure,
humidity,
luminance,
gas_resistance AS gasResistance,
color_temperature AS colorTemperature,
air_quality_index AS airQualityIndex
FROM
reading
ORDER BY
name,
time DESC

View File

@@ -1,6 +1,9 @@
@Environment_HostAddress = http://localhost:5234
@Environment_HostAddress = http://localhost:5000
GET {{Environment_HostAddress}}/weatherforecast/
GET {{Environment_HostAddress}}/readings/recent
Accept: application/json
###
GET {{Environment_HostAddress}}/readings/recent?tz=America/New_York
Accept: application/json

View File

@@ -1,5 +1,6 @@
using System.Text.Json;
using ChrisKaczor.HomeMonitor.Environment.Service.Data;
using ChrisKaczor.HomeMonitor.Environment.Service.Models.Indoor;
using Microsoft.AspNetCore.SignalR.Client;
using MQTTnet;
using MQTTnet.Client;
@@ -66,7 +67,7 @@ public class MessageHandler : IHostedService
WriteLog($"Topic: {topic} = {payload}");
var message = JsonSerializer.Deserialize<Message>(payload);
var message = JsonSerializer.Deserialize<DeviceMessage>(payload);
if (message == null)
return;
@@ -76,7 +77,7 @@ public class MessageHandler : IHostedService
await SendMessage(message);
}
private async Task SendMessage(Message message)
private async Task SendMessage(DeviceMessage message)
{
try
{

View File

@@ -1,8 +1,8 @@
using System.Text.Json.Serialization;
namespace ChrisKaczor.HomeMonitor.Environment.Service;
namespace ChrisKaczor.HomeMonitor.Environment.Service.Models.Indoor;
public class Message
public class DeviceMessage
{
[JsonPropertyName("model")]
public required string Model { get; set; }
@@ -11,7 +11,7 @@ public class Message
public required string Name { get; set; }
[JsonPropertyName("readings")]
public required Readings Readings { get; set; }
public required DeviceReadings Readings { get; set; }
[JsonPropertyName("timestamp")]
public required DateTimeOffset Timestamp { get; set; }

View File

@@ -1,10 +1,10 @@
using System.Text.Json.Serialization;
using JetBrains.Annotations;
namespace ChrisKaczor.HomeMonitor.Environment.Service;
namespace ChrisKaczor.HomeMonitor.Environment.Service.Models.Indoor;
[UsedImplicitly]
public class Readings
public class DeviceReadings
{
[JsonPropertyName("aqi")]
public decimal AirQualityIndex { get; set; }

View File

@@ -0,0 +1,24 @@
namespace ChrisKaczor.HomeMonitor.Environment.Service.Models;
public class Readings
{
public DateTimeOffset Time { get; set; }
public string? Name { get; set; }
public string? Model { get; set; }
public decimal AirQualityIndex { get; set; }
public decimal ColorTemperature { get; set; }
public decimal GasResistance { get; set; }
public decimal Humidity { get; set; }
public decimal Luminance { get; set; }
public decimal Pressure { get; set; }
public decimal Temperature { get; set; }
}

View File

@@ -11,10 +11,12 @@
<ItemGroup>
<None Remove="Data\Queries\CreateReading.sql" />
<None Remove="Data\Queries\GetRecentReadings.sql" />
<None Remove="Data\Schema\1-Initial Schema.sql" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="Data\Queries\GetRecentReadings.sql" />
<EmbeddedResource Include="Data\Queries\CreateReading.sql" />
<EmbeddedResource Include="Data\Schema\1-Initial Schema.sql" />
</ItemGroup>
@@ -29,7 +31,6 @@
</ItemGroup>
<ItemGroup>
<Folder Include="Controllers\" />
<Folder Include="Properties\" />
</ItemGroup>