From 84a358cfe6cf9aa92d703d6960ba3140dad6e60d Mon Sep 17 00:00:00 2001 From: Tijmen van Nesselrooij Date: Sun, 3 Sep 2023 11:56:49 +0200 Subject: [PATCH] Split Electricity API days endpoint --- .../Controllers/ElectricityLogController.cs | 25 +++++++++++++++---- .../Entities/ElectricityLog.cs | 7 ++++++ .../Extensions/DateTimeExtensions.cs | 7 ++++++ src/Electricity.Api/Models/Day.cs | 21 +++------------- src/Electricity.Api/Models/Minute.cs | 24 ++++++++++++++++++ .../Services/ElectricityService.cs | 4 +-- 6 files changed, 64 insertions(+), 24 deletions(-) create mode 100644 src/Electricity.Api/Extensions/DateTimeExtensions.cs create mode 100644 src/Electricity.Api/Models/Minute.cs diff --git a/src/Electricity.Api/Controllers/ElectricityLogController.cs b/src/Electricity.Api/Controllers/ElectricityLogController.cs index 3403ed5..405a709 100644 --- a/src/Electricity.Api/Controllers/ElectricityLogController.cs +++ b/src/Electricity.Api/Controllers/ElectricityLogController.cs @@ -23,23 +23,38 @@ public class ElectricityLogController : ControllerBase [HttpGet()] [Route("/day")] + public async Task> Get([FromQuery] string? date) + { + if (string.IsNullOrWhiteSpace(date) || !DateOnly.TryParseExact(date, Constants.isoDateFormat, out _)) + { + return BadDateParameter(nameof(date)); + } + + return await electricityService.GetDetailsFor(date); + } + + [HttpGet()] + [Route("/days")] public async Task> Get([FromQuery] string? start, [FromQuery] string? stop) { if (string.IsNullOrWhiteSpace(start) || !DateOnly.TryParseExact(start, Constants.isoDateFormat, out _)) { - return BadRequest(); + return BadDateParameter(nameof(start)); } - if (string.IsNullOrWhiteSpace(stop)) + if (string.IsNullOrWhiteSpace(stop) || !DateOnly.TryParseExact(stop, Constants.isoDateFormat, out _)) { - return await electricityService.GetDetailsFor(start); + return BadDateParameter(nameof(stop)); } - if (!DateOnly.TryParseExact(stop, Constants.isoDateFormat, out _) || string.Compare(start, stop) > 0) + if (string.Compare(start, stop) > 0) { - return BadRequest(); + return BadRequest($"The date argument of {nameof(stop)} must be greater or equal to the argument value of {nameof(start)}"); } return await electricityService.GetSummariesFor(start, stop); } + + private BadRequestObjectResult BadDateParameter(string parameterName) => + BadRequest($"The search parameter {parameterName} is missing or is not a valid ISO date ({Constants.isoDateFormat})."); } diff --git a/src/Electricity.Api/Entities/ElectricityLog.cs b/src/Electricity.Api/Entities/ElectricityLog.cs index d5427f5..f681641 100644 --- a/src/Electricity.Api/Entities/ElectricityLog.cs +++ b/src/Electricity.Api/Entities/ElectricityLog.cs @@ -12,5 +12,12 @@ public double TotalPowerReturnNight { get; set; } public long DayTarifEnabled { get; set; } public double GasConsumptionInCubicMeters { get; set; } + + public DateTime GetDateTime() => DateTime + .Parse( + $"{Date}T{TimeUtc}Z", + null, + System.Globalization.DateTimeStyles.AssumeUniversal) + .ToUniversalTime(); } } diff --git a/src/Electricity.Api/Extensions/DateTimeExtensions.cs b/src/Electricity.Api/Extensions/DateTimeExtensions.cs new file mode 100644 index 0000000..a83c536 --- /dev/null +++ b/src/Electricity.Api/Extensions/DateTimeExtensions.cs @@ -0,0 +1,7 @@ +namespace Electricity.Api.Extensions; + +public static class DateTimeExtensions +{ + public static uint ToEpoch(this DateTime dateTime) => + (uint)Math.Round((dateTime - DateTime.UnixEpoch).TotalSeconds); +} \ No newline at end of file diff --git a/src/Electricity.Api/Models/Day.cs b/src/Electricity.Api/Models/Day.cs index de86ef6..a51ff5b 100644 --- a/src/Electricity.Api/Models/Day.cs +++ b/src/Electricity.Api/Models/Day.cs @@ -1,3 +1,5 @@ +using Electricity.Api.Extensions; + namespace Electricity.Api.Models; public record Day(uint DateTime, double TotalPowerUse, double TotalPowerReturn, double TotalGasUse) @@ -5,32 +7,17 @@ public record Day(uint DateTime, double TotalPowerUse, double TotalPowerReturn, public static Day Empty(DateOnly date) { return new Day( - ConvertToEpoch(date.ToDateTime(new TimeOnly(0, 0), DateTimeKind.Utc)), + date.ToDateTime(new TimeOnly(0, 0), DateTimeKind.Utc).ToEpoch(), 0, 0, 0); } public static Day FromEntity(Entities.ElectricityLog entity) { return new Day( - DateTime: ConvertToEpoch(ParseEntityDateTime(entity.Date, entity.TimeUtc)), + DateTime: entity.GetDateTime().ToEpoch(), TotalPowerUse: entity.TotalPowerConsumptionDay + entity.TotalPowerConsumptionNight, TotalPowerReturn: entity.TotalPowerReturnDay + entity.TotalPowerReturnNight, TotalGasUse: entity.GasConsumptionInCubicMeters ); } - - private static DateTime ParseEntityDateTime(string date, string timeUtc) - { - return System.DateTime - .Parse( - $"{date}T{timeUtc}Z", - null, - System.Globalization.DateTimeStyles.AssumeUniversal) - .ToUniversalTime(); - } - - private static uint ConvertToEpoch(DateTime dateTime) - { - return (uint)Math.Round((dateTime - System.DateTime.UnixEpoch).TotalSeconds); - } }; \ No newline at end of file diff --git a/src/Electricity.Api/Models/Minute.cs b/src/Electricity.Api/Models/Minute.cs new file mode 100644 index 0000000..23865d6 --- /dev/null +++ b/src/Electricity.Api/Models/Minute.cs @@ -0,0 +1,24 @@ +using Electricity.Api.Extensions; + +namespace Electricity.Api.Models; + +public record Minute(uint DateTime, double CurrentPowerUsage, double TotalPowerUse, double TotalPowerReturn, double TotalGasUse) +{ + public static Minute Empty(DateOnly date) + { + return new Minute( + date.ToDateTime(new TimeOnly(0, 0), DateTimeKind.Utc).ToEpoch(), + 0, 0, 0, 0); + } + + public static Minute FromEntity(Entities.ElectricityLog entity) + { + return new Minute( + DateTime: entity.GetDateTime().ToEpoch(), + CurrentPowerUsage: entity.CurrentPowerUsage, + TotalPowerUse: entity.TotalPowerConsumptionDay + entity.TotalPowerConsumptionNight, + TotalPowerReturn: entity.TotalPowerReturnDay + entity.TotalPowerReturnNight, + TotalGasUse: entity.GasConsumptionInCubicMeters + ); + } +}; \ No newline at end of file diff --git a/src/Electricity.Api/Services/ElectricityService.cs b/src/Electricity.Api/Services/ElectricityService.cs index ed3bdbc..7fcea70 100644 --- a/src/Electricity.Api/Services/ElectricityService.cs +++ b/src/Electricity.Api/Services/ElectricityService.cs @@ -12,13 +12,13 @@ public class ElectricityService this.databaseContext = databaseContext; } - public async Task GetDetailsFor(string date) + public async Task GetDetailsFor(string date) { return (await databaseContext.ElectricityLogs .Where(l => l.Date == date) .OrderBy(l => l.TimeUtc) .ToArrayAsync()) - .Select(Day.FromEntity) + .Select(Minute.FromEntity) .ToArray(); }