diff --git a/api/App/Endpoints/LokEndpoints.cs b/api/App/Endpoints/LokEndpoints.cs index 5baf549..c2827f4 100644 --- a/api/App/Endpoints/LokEndpoints.cs +++ b/api/App/Endpoints/LokEndpoints.cs @@ -2,11 +2,18 @@ public static class LokEndpoints { public static void MapLokEndpoints(WebApplication app) { + app.MapPost("/lok/open-hours", async (LokOpenHours openHours, LokService lokService) => + { + var createdOpenHours = await lokService.InsertOpenHours(openHours); + return Results.Created("/lok/open-hours", createdOpenHours); + }) + .WithName("CreateLokOpenHours"); + app.MapGet("/lok/open-hours", async (LokService lokService) => { - var openHours = await lokService.GetOpenHoursAsync(); + var openHours = await lokService.GetOpenHours(); - if (openHours is null) + if (openHours.Count == 0) { return Results.NotFound(new { diff --git a/api/App/Models/LokOpenHours.cs b/api/App/Models/LokOpenHours.cs index 6ce109a..86d452c 100644 --- a/api/App/Models/LokOpenHours.cs +++ b/api/App/Models/LokOpenHours.cs @@ -1,5 +1,7 @@ public class LokOpenHours { + public DateTime Version { get; set; } + public string Paragraph1 { get; set; } = string.Empty; public string Paragraph2 { get; set; } = string.Empty; diff --git a/api/App/Program.cs b/api/App/Program.cs index 9697f19..041b8c6 100644 --- a/api/App/Program.cs +++ b/api/App/Program.cs @@ -44,6 +44,18 @@ public class Program } } } + + using (var command = connection.CreateCommand()) + { + command.CommandText = "SELECT COUNT(*) FROM pragma_table_info('LokOpenHours') WHERE name = 'version';"; + var hasVersionColumn = Convert.ToInt32(command.ExecuteScalar()) > 0; + + if (!hasVersionColumn) + { + command.CommandText = "ALTER TABLE LokOpenHours ADD COLUMN version TEXT NOT NULL DEFAULT '';"; + command.ExecuteNonQuery(); + } + } } if (app.Environment.IsDevelopment()) diff --git a/api/App/Services/LokService.cs b/api/App/Services/LokService.cs index cfbf152..479e6be 100644 --- a/api/App/Services/LokService.cs +++ b/api/App/Services/LokService.cs @@ -10,7 +10,7 @@ public class LokService _connection = connection; } - public async Task GetOpenHoursAsync() + public async Task> GetOpenHours() { if (_connection.State != ConnectionState.Open) { @@ -19,24 +19,72 @@ public class LokService await using var command = _connection.CreateCommand(); command.CommandText = @" - SELECT paragraph1, paragraph2, paragraph3, paragraph4, kitchenNotice + SELECT version, paragraph1, paragraph2, paragraph3, paragraph4, kitchenNotice FROM LokOpenHours - LIMIT 1"; + ORDER BY datetime(version) DESC, id DESC + LIMIT 5"; await using var reader = await command.ExecuteReaderAsync(); - if (!await reader.ReadAsync()) + var openHoursList = new List(); + + while (await reader.ReadAsync()) { - return null; + openHoursList.Add(new LokOpenHours + { + Version = ParseVersion(reader["version"]?.ToString()), + Paragraph1 = reader["paragraph1"]?.ToString() ?? string.Empty, + Paragraph2 = reader["paragraph2"]?.ToString() ?? string.Empty, + Paragraph3 = reader["paragraph3"]?.ToString() ?? string.Empty, + Paragraph4 = reader["paragraph4"]?.ToString() ?? string.Empty, + KitchenNotice = reader["kitchenNotice"]?.ToString() ?? string.Empty + }); } + return openHoursList; + } + + public async Task InsertOpenHours(LokOpenHours openHours) + { + if (_connection.State != ConnectionState.Open) + { + await _connection.OpenAsync(); + } + + var version = DateTime.UtcNow; + + await using var command = _connection.CreateCommand(); + command.CommandText = @" + INSERT INTO LokOpenHours (version, paragraph1, paragraph2, paragraph3, paragraph4, kitchenNotice) + VALUES (@version, @paragraph1, @paragraph2, @paragraph3, @paragraph4, @kitchenNotice);"; + + command.Parameters.AddWithValue("@version", version.ToString("O")); + command.Parameters.AddWithValue("@paragraph1", openHours.Paragraph1 ?? string.Empty); + command.Parameters.AddWithValue("@paragraph2", openHours.Paragraph2 ?? string.Empty); + command.Parameters.AddWithValue("@paragraph3", openHours.Paragraph3 ?? string.Empty); + command.Parameters.AddWithValue("@paragraph4", openHours.Paragraph4 ?? string.Empty); + command.Parameters.AddWithValue("@kitchenNotice", openHours.KitchenNotice ?? string.Empty); + + await command.ExecuteNonQueryAsync(); + return new LokOpenHours { - Paragraph1 = reader["paragraph1"]?.ToString() ?? string.Empty, - Paragraph2 = reader["paragraph2"]?.ToString() ?? string.Empty, - Paragraph3 = reader["paragraph3"]?.ToString() ?? string.Empty, - Paragraph4 = reader["paragraph4"]?.ToString() ?? string.Empty, - KitchenNotice = reader["kitchenNotice"]?.ToString() ?? string.Empty + Version = version, + Paragraph1 = openHours.Paragraph1 ?? string.Empty, + Paragraph2 = openHours.Paragraph2 ?? string.Empty, + Paragraph3 = openHours.Paragraph3 ?? string.Empty, + Paragraph4 = openHours.Paragraph4 ?? string.Empty, + KitchenNotice = openHours.KitchenNotice ?? string.Empty }; } + + private static DateTime ParseVersion(string? value) + { + if (!string.IsNullOrWhiteSpace(value) && DateTime.TryParse(value, out var parsed)) + { + return parsed; + } + + return DateTime.MinValue; + } } \ No newline at end of file diff --git a/api/Database/init.sql b/api/Database/init.sql index f153f5e..cc65312 100644 --- a/api/Database/init.sql +++ b/api/Database/init.sql @@ -1,5 +1,6 @@ CREATE TABLE IF NOT EXISTS LokOpenHours ( id INTEGER PRIMARY KEY AUTOINCREMENT, + version TEXT NOT NULL, paragraph1 TEXT NOT NULL DEFAULT '', paragraph2 TEXT NOT NULL DEFAULT '', paragraph3 TEXT NOT NULL DEFAULT '', diff --git a/api/Database/klapi.db b/api/Database/klapi.db index 4140445..2a6faa7 100644 Binary files a/api/Database/klapi.db and b/api/Database/klapi.db differ diff --git a/api/Tests/Http/LokOpenHours.http b/api/Tests/Http/LokOpenHours.http new file mode 100644 index 0000000..9d44653 --- /dev/null +++ b/api/Tests/Http/LokOpenHours.http @@ -0,0 +1,135 @@ +@App_HostAddress = http://localhost:5013 + +### Get newest open hours (returns latest 5) +GET {{App_HostAddress}}/lok/open-hours +Accept: application/json + +### Insert open hours version 1 +POST {{App_HostAddress}}/lok/open-hours +Content-Type: application/json +Accept: application/json + +{ + "paragraph1": "Version 1 paragraph 1", + "paragraph2": "Version 1 paragraph 2", + "paragraph3": "Version 1 paragraph 3", + "paragraph4": "Version 1 paragraph 4", + "kitchenNotice": "Kitchen notice 1" +} + +### Insert open hours version 2 +POST {{App_HostAddress}}/lok/open-hours +Content-Type: application/json +Accept: application/json + +{ + "paragraph1": "Version 2 paragraph 1", + "paragraph2": "Version 2 paragraph 2", + "paragraph3": "Version 2 paragraph 3", + "paragraph4": "Version 2 paragraph 4", + "kitchenNotice": "Kitchen notice 2" +} + +### Insert open hours version 3 +POST {{App_HostAddress}}/lok/open-hours +Content-Type: application/json +Accept: application/json + +{ + "paragraph1": "Version 3 paragraph 1", + "paragraph2": "Version 3 paragraph 2", + "paragraph3": "Version 3 paragraph 3", + "paragraph4": "Version 3 paragraph 4", + "kitchenNotice": "Kitchen notice 3" +} + +### Insert open hours version 4 +POST {{App_HostAddress}}/lok/open-hours +Content-Type: application/json +Accept: application/json + +{ + "paragraph1": "Version 4 paragraph 1", + "paragraph2": "Version 4 paragraph 2", + "paragraph3": "Version 4 paragraph 3", + "paragraph4": "Version 4 paragraph 4", + "kitchenNotice": "Kitchen notice 4" +} + +### Insert open hours version 5 +POST {{App_HostAddress}}/lok/open-hours +Content-Type: application/json +Accept: application/json + +{ + "paragraph1": "Version 5 paragraph 1", + "paragraph2": "Version 5 paragraph 2", + "paragraph3": "Version 5 paragraph 3", + "paragraph4": "Version 5 paragraph 4", + "kitchenNotice": "Kitchen notice 5" +} + +### Insert open hours version 6 +POST {{App_HostAddress}}/lok/open-hours +Content-Type: application/json +Accept: application/json + +{ + "paragraph1": "Version 6 paragraph 1", + "paragraph2": "Version 6 paragraph 2", + "paragraph3": "Version 6 paragraph 3", + "paragraph4": "Version 6 paragraph 4", + "kitchenNotice": "Kitchen notice 6" +} + +### Insert open hours version 7 +POST {{App_HostAddress}}/lok/open-hours +Content-Type: application/json +Accept: application/json + +{ + "paragraph1": "Version 7 paragraph 1", + "paragraph2": "Version 7 paragraph 2", + "paragraph3": "Version 7 paragraph 3", + "paragraph4": "Version 7 paragraph 4", + "kitchenNotice": "Kitchen notice 7" +} + +### Insert open hours version 8 +POST {{App_HostAddress}}/lok/open-hours +Content-Type: application/json +Accept: application/json + +{ + "paragraph1": "Version 8 paragraph 1", + "paragraph2": "Version 8 paragraph 2", + "paragraph3": "Version 8 paragraph 3", + "paragraph4": "Version 8 paragraph 4", + "kitchenNotice": "Kitchen notice 8" +} + +### Insert open hours version 9 +POST {{App_HostAddress}}/lok/open-hours +Content-Type: application/json +Accept: application/json + +{ + "paragraph1": "Version 9 paragraph 1", + "paragraph2": "Version 9 paragraph 2", + "paragraph3": "Version 9 paragraph 3", + "paragraph4": "Version 9 paragraph 4", + "kitchenNotice": "Kitchen notice 9" +} + +### Insert open hours version 10 +POST {{App_HostAddress}}/lok/open-hours +Content-Type: application/json +Accept: application/json + +{ + "paragraph1": "Version 10 paragraph 1", + "paragraph2": "Version 10 paragraph 2", + "paragraph3": "Version 10 paragraph 3", + "paragraph4": "Version 10 paragraph 4", + "kitchenNotice": "Kitchen notice 10" +}