mirror of
https://github.com/ckaczor/HomeMonitor.git
synced 2026-01-13 17:22:54 -05:00
Add API to get most recent reading
This commit is contained in:
25
Weather/Service/Controllers/ReadingsController.cs
Normal file
25
Weather/Service/Controllers/ReadingsController.cs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
using ChrisKaczor.HomeMonitor.Weather.Models;
|
||||||
|
using ChrisKaczor.HomeMonitor.Weather.Service.Data;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace ChrisKaczor.HomeMonitor.Weather.Service.Controllers
|
||||||
|
{
|
||||||
|
[Route("[controller]")]
|
||||||
|
[ApiController]
|
||||||
|
public class ReadingsController : ControllerBase
|
||||||
|
{
|
||||||
|
private readonly Database _database;
|
||||||
|
|
||||||
|
public ReadingsController(Database database)
|
||||||
|
{
|
||||||
|
_database = database;
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet("recent")]
|
||||||
|
public async Task<ActionResult<WeatherReading>> GetRecent()
|
||||||
|
{
|
||||||
|
return await _database.GetRecentReading();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
|
|
||||||
namespace ChrisKaczor.HomeMonitor.Weather.Service.Controllers
|
|
||||||
{
|
|
||||||
[Route("[controller]")]
|
|
||||||
[ApiController]
|
|
||||||
public class ValuesController : ControllerBase
|
|
||||||
{
|
|
||||||
[HttpGet]
|
|
||||||
public ActionResult<IEnumerable<string>> Get()
|
|
||||||
{
|
|
||||||
return new[] { "value1", "value2" };
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
using Dapper;
|
using Dapper;
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using System.Data.SqlClient;
|
using System.Data.SqlClient;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace ChrisKaczor.HomeMonitor.Weather.Service.Data
|
namespace ChrisKaczor.HomeMonitor.Weather.Service.Data
|
||||||
{
|
{
|
||||||
@@ -24,32 +25,31 @@ namespace ChrisKaczor.HomeMonitor.Weather.Service.Data
|
|||||||
InitialCatalog = "master"
|
InitialCatalog = "master"
|
||||||
};
|
};
|
||||||
|
|
||||||
using (var connection = new SqlConnection(connectionStringBuilder.ConnectionString))
|
using var connection = new SqlConnection(connectionStringBuilder.ConnectionString);
|
||||||
|
|
||||||
|
var command = new SqlCommand { Connection = connection };
|
||||||
|
|
||||||
|
connection.Open();
|
||||||
|
|
||||||
|
// Check to see if the database exists
|
||||||
|
command.CommandText = $"SELECT CAST(1 as bit) from sys.databases WHERE name='{_configuration["Weather:Database:Name"]}'";
|
||||||
|
var databaseExists = (bool?)command.ExecuteScalar();
|
||||||
|
|
||||||
|
// Create database if needed
|
||||||
|
if (!databaseExists.GetValueOrDefault(false))
|
||||||
{
|
{
|
||||||
var command = new SqlCommand { Connection = connection };
|
command.CommandText = $"CREATE DATABASE {_configuration["Weather:Database:Name"]}";
|
||||||
|
|
||||||
connection.Open();
|
|
||||||
|
|
||||||
// Check to see if the database exists
|
|
||||||
command.CommandText = $"SELECT CAST(1 as bit) from sys.databases WHERE name='{_configuration["Weather:Database:Name"]}'";
|
|
||||||
var databaseExists = (bool?)command.ExecuteScalar();
|
|
||||||
|
|
||||||
// Create database if needed
|
|
||||||
if (!databaseExists.GetValueOrDefault(false))
|
|
||||||
{
|
|
||||||
command.CommandText = $"CREATE DATABASE {_configuration["Weather:Database:Name"]}";
|
|
||||||
command.ExecuteNonQuery();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Switch to the database now that we're sure it exists
|
|
||||||
connection.ChangeDatabase(_configuration["Weather:Database:Name"]);
|
|
||||||
|
|
||||||
var schema = ResourceReader.GetString("ChrisKaczor.HomeMonitor.Weather.Service.Data.Resources.Schema.sql");
|
|
||||||
|
|
||||||
// Make sure the database is up to date
|
|
||||||
command.CommandText = schema;
|
|
||||||
command.ExecuteNonQuery();
|
command.ExecuteNonQuery();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Switch to the database now that we're sure it exists
|
||||||
|
connection.ChangeDatabase(_configuration["Weather:Database:Name"]);
|
||||||
|
|
||||||
|
var schema = ResourceReader.GetString("ChrisKaczor.HomeMonitor.Weather.Service.Data.Resources.Schema.sql");
|
||||||
|
|
||||||
|
// Make sure the database is up to date
|
||||||
|
command.CommandText = schema;
|
||||||
|
command.ExecuteNonQuery();
|
||||||
}
|
}
|
||||||
|
|
||||||
private SqlConnection CreateConnection()
|
private SqlConnection CreateConnection()
|
||||||
@@ -70,12 +70,20 @@ namespace ChrisKaczor.HomeMonitor.Weather.Service.Data
|
|||||||
|
|
||||||
public void StoreWeatherData(WeatherMessage weatherMessage)
|
public void StoreWeatherData(WeatherMessage weatherMessage)
|
||||||
{
|
{
|
||||||
using (var connection = CreateConnection())
|
using var connection = CreateConnection();
|
||||||
{
|
|
||||||
var query = ResourceReader.GetString("ChrisKaczor.HomeMonitor.Weather.Service.Data.Resources.CreateReading.sql");
|
|
||||||
|
|
||||||
connection.Query(query, weatherMessage);
|
var query = ResourceReader.GetString("ChrisKaczor.HomeMonitor.Weather.Service.Data.Resources.CreateReading.sql");
|
||||||
}
|
|
||||||
|
connection.Query(query, weatherMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<WeatherReading> GetRecentReading()
|
||||||
|
{
|
||||||
|
await using var connection = CreateConnection();
|
||||||
|
|
||||||
|
var query = ResourceReader.GetString("ChrisKaczor.HomeMonitor.Weather.Service.Data.Resources.GetRecentReading.sql");
|
||||||
|
|
||||||
|
return await connection.QueryFirstOrDefaultAsync<WeatherReading>(query);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
17
Weather/Service/Data/Resources/GetRecentReading.sql
Normal file
17
Weather/Service/Data/Resources/GetRecentReading.sql
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
SELECT TOP 1 Timestamp,
|
||||||
|
WindDirection,
|
||||||
|
WindSpeed,
|
||||||
|
Humidity,
|
||||||
|
HumidityTemperature,
|
||||||
|
Rain,
|
||||||
|
Pressure,
|
||||||
|
PressureTemperature,
|
||||||
|
BatteryLevel,
|
||||||
|
LightLevel,
|
||||||
|
Latitude,
|
||||||
|
Longitude,
|
||||||
|
Altitude,
|
||||||
|
SatelliteCount,
|
||||||
|
GpsTimestamp
|
||||||
|
FROM Reading
|
||||||
|
ORDER BY Timestamp DESC
|
||||||
@@ -33,11 +33,16 @@ namespace ChrisKaczor.HomeMonitor.Weather.Service
|
|||||||
|
|
||||||
public Task StartAsync(CancellationToken cancellationToken)
|
public Task StartAsync(CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
|
var host = _configuration["Weather:Queue:Host"];
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(host))
|
||||||
|
return Task.CompletedTask;
|
||||||
|
|
||||||
WriteLog("MessageHandler: Start");
|
WriteLog("MessageHandler: Start");
|
||||||
|
|
||||||
var factory = new ConnectionFactory
|
var factory = new ConnectionFactory
|
||||||
{
|
{
|
||||||
HostName = _configuration["Weather:Queue:Host"],
|
HostName = host,
|
||||||
UserName = _configuration["Weather:Queue:User"],
|
UserName = _configuration["Weather:Queue:User"],
|
||||||
Password = _configuration["Weather:Queue:Password"]
|
Password = _configuration["Weather:Queue:Password"]
|
||||||
};
|
};
|
||||||
@@ -64,8 +69,8 @@ namespace ChrisKaczor.HomeMonitor.Weather.Service
|
|||||||
|
|
||||||
_hubConnection?.StopAsync(cancellationToken).Wait(cancellationToken);
|
_hubConnection?.StopAsync(cancellationToken).Wait(cancellationToken);
|
||||||
|
|
||||||
_queueModel.Close();
|
_queueModel?.Close();
|
||||||
_queueConnection.Close();
|
_queueConnection?.Close();
|
||||||
|
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,16 +10,18 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Remove="Data\Resources\CreateReading.sql" />
|
<None Remove="Data\Resources\CreateReading.sql" />
|
||||||
|
<None Remove="Data\Resources\GetRecentReading.sql" />
|
||||||
<None Remove="Data\Resources\Schema.sql" />
|
<None Remove="Data\Resources\Schema.sql" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<EmbeddedResource Include="Data\Resources\GetRecentReading.sql" />
|
||||||
<EmbeddedResource Include="Data\Resources\CreateReading.sql" />
|
<EmbeddedResource Include="Data\Resources\CreateReading.sql" />
|
||||||
<EmbeddedResource Include="Data\Resources\Schema.sql" />
|
<EmbeddedResource Include="Data\Resources\Schema.sql" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="ChrisKaczor.HomeMonitor.Weather.Models" Version="1.0.9" />
|
<PackageReference Include="ChrisKaczor.HomeMonitor.Weather.Models" Version="1.0.10" />
|
||||||
<PackageReference Include="Dapper" Version="1.60.6" />
|
<PackageReference Include="Dapper" Version="1.60.6" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="3.0.0-preview7.19365.7" />
|
<PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="3.0.0-preview7.19365.7" />
|
||||||
<PackageReference Include="RabbitMQ.Client" Version="5.1.0" />
|
<PackageReference Include="RabbitMQ.Client" Version="5.1.0" />
|
||||||
|
|||||||
Reference in New Issue
Block a user