Compare commits

..

3 Commits

11 changed files with 221 additions and 16 deletions

4
.vscode/launch.json vendored
View File

@@ -9,9 +9,9 @@
"type": "coreclr", "type": "coreclr",
"request": "launch", "request": "launch",
"preLaunchTask": "build App API", "preLaunchTask": "build App API",
"program": "${workspaceFolder}/api/Public/bin/Debug/net10.0/App.dll", "program": "${workspaceFolder}/api/App/bin/Debug/net10.0/App.dll",
"args": [], "args": [],
"cwd": "${workspaceFolder}/api/Public", "cwd": "${workspaceFolder}/api/App",
"stopAtEntry": false, "stopAtEntry": false,
"env": { "env": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"

2
.vscode/tasks.json vendored
View File

@@ -5,7 +5,7 @@
"label": "build App API", "label": "build App API",
"type": "process", "type": "process",
"command": "dotnet", "command": "dotnet",
"args": ["build", "${workspaceFolder}/api/Public/App.csproj"], "args": ["build", "${workspaceFolder}/api/App/App.csproj"],
"problemMatcher": "$msCompile", "problemMatcher": "$msCompile",
"group": { "group": {
"kind": "build", "kind": "build",

View File

@@ -2,11 +2,18 @@ public static class LokEndpoints
{ {
public static void MapLokEndpoints(WebApplication app) 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) => 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 return Results.NotFound(new
{ {

View File

@@ -1,5 +1,7 @@
public class LokOpenHours public class LokOpenHours
{ {
public DateTime Version { get; set; }
public string Paragraph1 { get; set; } = string.Empty; public string Paragraph1 { get; set; } = string.Empty;
public string Paragraph2 { get; set; } = string.Empty; public string Paragraph2 { get; set; } = string.Empty;

View File

@@ -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()) if (app.Environment.IsDevelopment())

View File

@@ -10,7 +10,7 @@ public class LokService
_connection = connection; _connection = connection;
} }
public async Task<LokOpenHours?> GetOpenHoursAsync() public async Task<List<LokOpenHours>> GetOpenHours()
{ {
if (_connection.State != ConnectionState.Open) if (_connection.State != ConnectionState.Open)
{ {
@@ -19,24 +19,72 @@ public class LokService
await using var command = _connection.CreateCommand(); await using var command = _connection.CreateCommand();
command.CommandText = @" command.CommandText = @"
SELECT paragraph1, paragraph2, paragraph3, paragraph4, kitchenNotice SELECT version, paragraph1, paragraph2, paragraph3, paragraph4, kitchenNotice
FROM LokOpenHours FROM LokOpenHours
LIMIT 1"; ORDER BY datetime(version) DESC, id DESC
LIMIT 5";
await using var reader = await command.ExecuteReaderAsync(); await using var reader = await command.ExecuteReaderAsync();
if (!await reader.ReadAsync()) var openHoursList = new List<LokOpenHours>();
{
return null;
}
return new LokOpenHours while (await reader.ReadAsync())
{ {
openHoursList.Add(new LokOpenHours
{
Version = ParseVersion(reader["version"]?.ToString()),
Paragraph1 = reader["paragraph1"]?.ToString() ?? string.Empty, Paragraph1 = reader["paragraph1"]?.ToString() ?? string.Empty,
Paragraph2 = reader["paragraph2"]?.ToString() ?? string.Empty, Paragraph2 = reader["paragraph2"]?.ToString() ?? string.Empty,
Paragraph3 = reader["paragraph3"]?.ToString() ?? string.Empty, Paragraph3 = reader["paragraph3"]?.ToString() ?? string.Empty,
Paragraph4 = reader["paragraph4"]?.ToString() ?? string.Empty, Paragraph4 = reader["paragraph4"]?.ToString() ?? string.Empty,
KitchenNotice = reader["kitchenNotice"]?.ToString() ?? string.Empty KitchenNotice = reader["kitchenNotice"]?.ToString() ?? string.Empty
});
}
return openHoursList;
}
public async Task<LokOpenHours> 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
{
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;
}
} }

View File

@@ -1,5 +1,6 @@
CREATE TABLE IF NOT EXISTS LokOpenHours ( CREATE TABLE IF NOT EXISTS LokOpenHours (
id INTEGER PRIMARY KEY AUTOINCREMENT, id INTEGER PRIMARY KEY AUTOINCREMENT,
version TEXT NOT NULL,
paragraph1 TEXT NOT NULL DEFAULT '', paragraph1 TEXT NOT NULL DEFAULT '',
paragraph2 TEXT NOT NULL DEFAULT '', paragraph2 TEXT NOT NULL DEFAULT '',
paragraph3 TEXT NOT NULL DEFAULT '', paragraph3 TEXT NOT NULL DEFAULT '',

Binary file not shown.

View File

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

View File

@@ -34,7 +34,7 @@ ensure_app_window() {
start_or_restart_services() { start_or_restart_services() {
ensure_app_window ensure_app_window
tmux respawn-pane -k -t "$SESSION_NAME":app.0 -c "$UI_DIR" "bun dev" tmux respawn-pane -k -t "$SESSION_NAME":app.0 -c "$UI_DIR" "bun dev"
tmux respawn-pane -k -t "$SESSION_NAME":app.1 -c "$API_DIR" "dotnet run --project $API_DIR/Public/App.csproj" tmux respawn-pane -k -t "$SESSION_NAME":app.1 -c "$API_DIR" "dotnet run --project $API_DIR/App/App.csproj"
tmux select-pane -t "$SESSION_NAME":app.0 tmux select-pane -t "$SESSION_NAME":app.0
tmux select-window -t "$SESSION_NAME":app tmux select-window -t "$SESSION_NAME":app
} }