Add API to get most recent reading

This commit is contained in:
2019-08-07 18:39:59 -04:00
parent ef073a500b
commit f4da45f4bb
6 changed files with 89 additions and 48 deletions

View 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();
}
}
}

View File

@@ -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" };
}
}
}

View File

@@ -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);
} }
} }
} }

View 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

View File

@@ -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;
} }

View File

@@ -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" />