From c982d721d5c0dfc870143b433a8a86d83cd796bc Mon Sep 17 00:00:00 2001 From: Alon Fliess Date: Sun, 20 Apr 2025 12:36:01 +0300 Subject: [PATCH 01/12] Update test and demo project to .NET 9, Update NuGet packages for Dapr to 1.15.3 Upgrade .NET SDK and dependencies; update tests Updated `IntegrationTest.yaml` to use .NET SDK 9.0.x Updated Dapr package references from `1.15.0-rc02` to `1.15.3` and Polly from `8.4.1` to `8.5.2` in multiple `.csproj` files. Changed target frameworks from `net8.0` to `net9.0` across several projects. Modified `Dockerfile` to use .NET 9.0 base images for compatibility. Various package references in integration test projects were also updated to the latest versions, including OpenTelemetry and Swashbuckle. --- .github/workflows/IntegrationTest.yaml | 4 +- .../Sagaway.Callback.Propagator.csproj | 4 +- .../Sagaway.Callback.Router.csproj | 6 +- .../Sagaway.Hosts.DaprActorHost.csproj | 2 +- .../Dockerfile | 4 +- ...tegrationTests.OrchestrationService.csproj | 24 +-- .../Dockerfile | 4 +- ...rationTests.StepRecorderTestService.csproj | 22 +-- ...est_a_failed_on_2_no_callback.received.txt | 132 +++++++++++++ ...ailed_on_2_no_callback_revert.received.txt | 182 ++++++++++++++++++ ...agaway.IntegrationTests.TestProject.csproj | 28 +-- .../Dockerfile | 4 +- ...agaway.IntegrationTests.TestService.csproj | 24 +-- .../Dockerfile | 4 +- ...sts.TestSubSagaCommunicationService.csproj | 22 +-- .../Sagaway.OpenTelemetry.csproj | 2 +- .../Dockerfile | 4 +- ...y.ReservationDemo.BillingManagement.csproj | 22 +-- .../Dockerfile | 4 +- ...y.ReservationDemo.BookingManagement.csproj | 22 +-- .../Dockerfile | 4 +- ...ReservationDemo.InventoryManagement.csproj | 22 +-- .../Dockerfile | 4 +- ....ReservationDemo.ReservationManager.csproj | 28 +-- Sagaway.Tests/Sagaway.Tests.csproj | 13 +- 25 files changed, 452 insertions(+), 139 deletions(-) create mode 100644 Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_failed_on_2_no_callback.received.txt create mode 100644 Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_failed_on_2_no_callback_revert.received.txt diff --git a/.github/workflows/IntegrationTest.yaml b/.github/workflows/IntegrationTest.yaml index 38b2fb0..da4f7a3 100644 --- a/.github/workflows/IntegrationTest.yaml +++ b/.github/workflows/IntegrationTest.yaml @@ -33,10 +33,10 @@ jobs: rm ./dapr/components/dapr-secretstore.json echo "{\"SignalRConnectionString\": \"${{ secrets.SAGAWAY_SIGNALR_CONNECTION_STRING }}\"}" > ./dapr/components/dapr-secretstore.json - name: Setup .NET - uses: actions/setup-dotnet@v3 + uses: actions/setup-dotnet@v4 with: dotnet-version: | - 8.0.x + 9.0.x - name: Sagaway Core Tests run: dotnet test --verbosity normal --configuration Debug Sagaway.Tests/Sagaway.Tests.csproj - name: Docker Compose Up diff --git a/Sagaway.Callback.Propagator/Sagaway.Callback.Propagator.csproj b/Sagaway.Callback.Propagator/Sagaway.Callback.Propagator.csproj index 08b7732..ffb22d4 100644 --- a/Sagaway.Callback.Propagator/Sagaway.Callback.Propagator.csproj +++ b/Sagaway.Callback.Propagator/Sagaway.Callback.Propagator.csproj @@ -41,8 +41,8 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/Sagaway.Callback.Router/Sagaway.Callback.Router.csproj b/Sagaway.Callback.Router/Sagaway.Callback.Router.csproj index 90f4f3b..29f7358 100644 --- a/Sagaway.Callback.Router/Sagaway.Callback.Router.csproj +++ b/Sagaway.Callback.Router/Sagaway.Callback.Router.csproj @@ -41,13 +41,13 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/Sagaway.Hosts.DaprActorHost/Sagaway.Hosts.DaprActorHost.csproj b/Sagaway.Hosts.DaprActorHost/Sagaway.Hosts.DaprActorHost.csproj index 840fd25..ce82a3b 100644 --- a/Sagaway.Hosts.DaprActorHost/Sagaway.Hosts.DaprActorHost.csproj +++ b/Sagaway.Hosts.DaprActorHost/Sagaway.Hosts.DaprActorHost.csproj @@ -46,7 +46,7 @@ - + all diff --git a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.OrchestrationService/Dockerfile b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.OrchestrationService/Dockerfile index aa132bc..eff224f 100644 --- a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.OrchestrationService/Dockerfile +++ b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.OrchestrationService/Dockerfile @@ -1,12 +1,12 @@ #See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. -FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base USER app WORKDIR /app EXPOSE 8080 EXPOSE 8081 -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src COPY ["Sagaway.IntegrationTests/Sagaway.IntegrationTests.OrchestrationService/Sagaway.IntegrationTests.OrchestrationService.csproj", "Sagaway.IntegrationTests/Sagaway.IntegrationTests.OrchestrationService/"] diff --git a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.OrchestrationService/Sagaway.IntegrationTests.OrchestrationService.csproj b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.OrchestrationService/Sagaway.IntegrationTests.OrchestrationService.csproj index 41ca517..5683e87 100644 --- a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.OrchestrationService/Sagaway.IntegrationTests.OrchestrationService.csproj +++ b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.OrchestrationService/Sagaway.IntegrationTests.OrchestrationService.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 enable enable true @@ -12,17 +12,17 @@ - - - - - - - - - - - + + + + + + + + + + + diff --git a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.StepRecorderTestService/Dockerfile b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.StepRecorderTestService/Dockerfile index 2c54649..ed6dd77 100644 --- a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.StepRecorderTestService/Dockerfile +++ b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.StepRecorderTestService/Dockerfile @@ -1,7 +1,7 @@ # See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. # This stage is used when running from VS in fast mode (Default for Debug configuration) -FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base USER app WORKDIR /app EXPOSE 8080 @@ -9,7 +9,7 @@ EXPOSE 8081 # This stage is used to build the service project -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src COPY ["Sagaway.IntegrationTests/Sagaway.IntegrationTests.StepRecorderTestService/Sagaway.IntegrationTests.StepRecorderTestService.csproj", "Sagaway.IntegrationTests/Sagaway.IntegrationTests.StepRecorderTestService/"] diff --git a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.StepRecorderTestService/Sagaway.IntegrationTests.StepRecorderTestService.csproj b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.StepRecorderTestService/Sagaway.IntegrationTests.StepRecorderTestService.csproj index 6b9c525..2c29bfc 100644 --- a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.StepRecorderTestService/Sagaway.IntegrationTests.StepRecorderTestService.csproj +++ b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.StepRecorderTestService/Sagaway.IntegrationTests.StepRecorderTestService.csproj @@ -2,7 +2,7 @@ Exe - net8.0 + net9.0 enable enable Linux @@ -10,16 +10,16 @@ - - - - - - - - - - + + + + + + + + + + diff --git a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_failed_on_2_no_callback.received.txt b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_failed_on_2_no_callback.received.txt new file mode 100644 index 0000000..075ca4b --- /dev/null +++ b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_failed_on_2_no_callback.received.txt @@ -0,0 +1,132 @@ +Test Name: test_a_failed_on_2_no_callback +Result: False +Saga Log: +[*time*][CallA]: Start Executing CallA +[*time*][CallA]: Registering reminder CallA:Retry for CallA with interval 00:00:05 +[*time*]The Saga is deactivated. +[*time*]The Saga is activated. +[*time*][CallA]: Retry CallA. Retry count: 1 +[*time*][CallA]: Start Executing CallA +[*time*][CallA]: Registering reminder CallA:Retry for CallA with interval 00:00:05 +[*time*]The Saga is deactivated. +[*time*]The Saga is activated. +[*time*][CallA]: Wake by a reminder +[*time*][CallA]: OnReminderAsync: Validation for CallA returned false, retrying action. +[*time*][CallA]: Retry CallA. Retry count: 2 +[*time*][CallA]: Start Executing CallA +[*time*][CallA]: Registering reminder CallA:Retry for CallA with interval 00:00:05 +[*time*]The Saga is deactivated. +[*time*]The Saga is activated. +[*time*][CallA]: CallA Failed. Retries exhausted. +[*time*][CallA]: Start Executing Revert CallA +[*time*][CallA]: No undo operation for CallA. Marking as reverted + +Open Telemetry: +[ + { + "TraceId": "id-1", + "ParentId": "id-2", + "Kind": "SERVER", + "Name": "name-4", + "LocalEndpoint": { + "ServiceName": "orchestrationservice.sagaway" + }, + "Tags": { + "otel.library.name": "OrchestrationService.Sagaway", + "otel.scope.name": "OrchestrationService.Sagaway", + "saga.id": "id-3", + "saga.type": "SagaTestActorOperations" + } + }, + { + "TraceId": "id-1", + "ParentId": "id-5", + "Kind": null, + "Name": "name-6", + "LocalEndpoint": { + "ServiceName": "orchestrationservice.sagaway" + }, + "Tags": { + "operation.name": "CallA", + "otel.library.name": "OrchestrationService.Sagaway", + "otel.scope.name": "OrchestrationService.Sagaway", + "saga.id": "id-3" + } + }, + { + "TraceId": "id-1", + "ParentId": "id-7", + "Kind": "SERVER", + "Name": "name-4", + "LocalEndpoint": { + "ServiceName": "orchestrationservice.sagaway" + }, + "Tags": { + "otel.library.name": "OrchestrationService.Sagaway", + "otel.scope.name": "OrchestrationService.Sagaway", + "saga.id": "id-3", + "saga.type": "SagaTestActorOperations" + } + }, + { + "TraceId": "id-1", + "ParentId": "id-8", + "Kind": null, + "Name": "name-9", + "LocalEndpoint": { + "ServiceName": "orchestrationservice.sagaway" + }, + "Tags": { + "operation.name": "CallA", + "otel.library.name": "OrchestrationService.Sagaway", + "otel.scope.name": "OrchestrationService.Sagaway", + "saga.id": "id-3" + } + }, + { + "TraceId": "id-10", + "ParentId": "id-11", + "Kind": "SERVER", + "Name": "name-4", + "LocalEndpoint": { + "ServiceName": "orchestrationservice.sagaway" + }, + "Tags": { + "otel.library.name": "OrchestrationService.Sagaway", + "otel.scope.name": "OrchestrationService.Sagaway", + "saga.id": "id-3", + "saga.type": "SagaTestActorOperations" + } + }, + { + "TraceId": "id-1", + "ParentId": "id-12", + "Kind": null, + "Name": "name-9", + "LocalEndpoint": { + "ServiceName": "orchestrationservice.sagaway" + }, + "Tags": { + "operation.name": "CallA", + "otel.library.name": "OrchestrationService.Sagaway", + "otel.scope.name": "OrchestrationService.Sagaway", + "saga.id": "id-3" + } + }, + { + "TraceId": "id-1", + "ParentId": "id-13", + "Kind": "SERVER", + "Name": "name-4", + "LocalEndpoint": { + "ServiceName": "orchestrationservice.sagaway" + }, + "Tags": { + "otel.library.name": "OrchestrationService.Sagaway", + "otel.scope.name": "OrchestrationService.Sagaway", + "saga.id": "id-3", + "saga.outcome": "Reverted", + "saga.type": "SagaTestActorOperations" + } + } +] \ No newline at end of file diff --git a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_failed_on_2_no_callback_revert.received.txt b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_failed_on_2_no_callback_revert.received.txt new file mode 100644 index 0000000..2e40c0c --- /dev/null +++ b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_failed_on_2_no_callback_revert.received.txt @@ -0,0 +1,182 @@ +Test Name: test_a_failed_on_2_no_callback_revert +Result: False +Saga Log: +[*time*][CallA]: Start Executing CallA +[*time*][CallA]: Registering reminder CallA:Retry for CallA with interval 00:00:05 +[*time*]The Saga is deactivated. +[*time*]The Saga is activated. +[*time*][CallA]: Retry CallA. Retry count: 1 +[*time*][CallA]: Start Executing CallA +[*time*][CallA]: Registering reminder CallA:Retry for CallA with interval 00:00:05 +[*time*]The Saga is deactivated. +[*time*]The Saga is activated. +[*time*][CallA]: Retry CallA. Retry count: 2 +[*time*][CallA]: Start Executing CallA +[*time*][CallA]: Registering reminder CallA:Retry for CallA with interval 00:00:05 +[*time*]The Saga is deactivated. +[*time*]The Saga is activated. +[*time*][CallA]: Wake by a reminder +[*time*][CallA]: OnReminderAsync: Validation for CallA returned false, retrying action. +[*time*][CallA]: CallA Failed. Retries exhausted. +[*time*][CallA]: Start Executing Revert CallA +[*time*][CallA]: Registering reminder CallA:Retry for Revert CallA with interval 00:00:05 +[*time*]The Saga is deactivated. +[*time*]The Saga is activated. +[*time*]The Saga is deactivated. +[*time*]The Saga is activated. +[*time*][CallA]: Revert CallA Success + +Open Telemetry: +[ + { + "TraceId": "id-1", + "ParentId": "id-2", + "Kind": "SERVER", + "Name": "name-4", + "LocalEndpoint": { + "ServiceName": "orchestrationservice.sagaway" + }, + "Tags": { + "otel.library.name": "OrchestrationService.Sagaway", + "otel.scope.name": "OrchestrationService.Sagaway", + "saga.id": "id-3", + "saga.type": "SagaTestActorOperations" + } + }, + { + "TraceId": "id-1", + "ParentId": "id-5", + "Kind": null, + "Name": "name-6", + "LocalEndpoint": { + "ServiceName": "orchestrationservice.sagaway" + }, + "Tags": { + "operation.name": "CallA", + "otel.library.name": "OrchestrationService.Sagaway", + "otel.scope.name": "OrchestrationService.Sagaway", + "saga.id": "id-3" + } + }, + { + "TraceId": "id-1", + "ParentId": "id-7", + "Kind": "SERVER", + "Name": "name-4", + "LocalEndpoint": { + "ServiceName": "orchestrationservice.sagaway" + }, + "Tags": { + "otel.library.name": "OrchestrationService.Sagaway", + "otel.scope.name": "OrchestrationService.Sagaway", + "saga.id": "id-3", + "saga.type": "SagaTestActorOperations" + } + }, + { + "TraceId": "id-1", + "ParentId": "id-8", + "Kind": null, + "Name": "name-9", + "LocalEndpoint": { + "ServiceName": "orchestrationservice.sagaway" + }, + "Tags": { + "operation.name": "CallA", + "otel.library.name": "OrchestrationService.Sagaway", + "otel.scope.name": "OrchestrationService.Sagaway", + "saga.id": "id-3" + } + }, + { + "TraceId": "id-1", + "ParentId": "id-10", + "Kind": "SERVER", + "Name": "name-4", + "LocalEndpoint": { + "ServiceName": "orchestrationservice.sagaway" + }, + "Tags": { + "otel.library.name": "OrchestrationService.Sagaway", + "otel.scope.name": "OrchestrationService.Sagaway", + "saga.id": "id-3", + "saga.type": "SagaTestActorOperations" + } + }, + { + "TraceId": "id-1", + "ParentId": "id-11", + "Kind": null, + "Name": "name-9", + "LocalEndpoint": { + "ServiceName": "orchestrationservice.sagaway" + }, + "Tags": { + "operation.name": "CallA", + "otel.library.name": "OrchestrationService.Sagaway", + "otel.scope.name": "OrchestrationService.Sagaway", + "saga.id": "id-3" + } + }, + { + "TraceId": "id-12", + "ParentId": "id-13", + "Kind": "SERVER", + "Name": "name-4", + "LocalEndpoint": { + "ServiceName": "orchestrationservice.sagaway" + }, + "Tags": { + "otel.library.name": "OrchestrationService.Sagaway", + "otel.scope.name": "OrchestrationService.Sagaway", + "saga.id": "id-3", + "saga.type": "SagaTestActorOperations" + } + }, + { + "TraceId": "id-12", + "ParentId": "id-14", + "Kind": null, + "Name": "name-15", + "LocalEndpoint": { + "ServiceName": "orchestrationservice.sagaway" + }, + "Tags": { + "operation.name": "RevertCallA", + "otel.library.name": "OrchestrationService.Sagaway", + "otel.scope.name": "OrchestrationService.Sagaway", + "saga.id": "id-3" + } + }, + { + "TraceId": "id-1", + "ParentId": "id-16", + "Kind": "SERVER", + "Name": "name-4", + "LocalEndpoint": { + "ServiceName": "orchestrationservice.sagaway" + }, + "Tags": { + "otel.library.name": "OrchestrationService.Sagaway", + "otel.scope.name": "OrchestrationService.Sagaway", + "saga.id": "id-3", + "saga.type": "SagaTestActorOperations" + } + }, + { + "TraceId": "id-12", + "ParentId": "id-17", + "Kind": "SERVER", + "Name": "name-4", + "LocalEndpoint": { + "ServiceName": "orchestrationservice.sagaway" + }, + "Tags": { + "otel.library.name": "OrchestrationService.Sagaway", + "otel.scope.name": "OrchestrationService.Sagaway", + "saga.id": "id-3", + "saga.outcome": "Reverted", + "saga.type": "SagaTestActorOperations" + } + } +] \ No newline at end of file diff --git a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/Sagaway.IntegrationTests.TestProject.csproj b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/Sagaway.IntegrationTests.TestProject.csproj index 0462901..14635f0 100644 --- a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/Sagaway.IntegrationTests.TestProject.csproj +++ b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/Sagaway.IntegrationTests.TestProject.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 enable enable @@ -11,26 +11,26 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - + + + + + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - + + + diff --git a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestService/Dockerfile b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestService/Dockerfile index 6841043..08c981e 100644 --- a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestService/Dockerfile +++ b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestService/Dockerfile @@ -1,12 +1,12 @@ #See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. -FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base USER app WORKDIR /app EXPOSE 8080 EXPOSE 8081 -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src COPY ["Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestService/Sagaway.IntegrationTests.TestService.csproj", "Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestService/"] diff --git a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestService/Sagaway.IntegrationTests.TestService.csproj b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestService/Sagaway.IntegrationTests.TestService.csproj index 0bab55e..561d6ce 100644 --- a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestService/Sagaway.IntegrationTests.TestService.csproj +++ b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestService/Sagaway.IntegrationTests.TestService.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 enable enable true @@ -12,17 +12,17 @@ - - - - - - - - - - - + + + + + + + + + + + diff --git a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestSubSagaCommunicationService/Dockerfile b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestSubSagaCommunicationService/Dockerfile index d12ca23..e53fed5 100644 --- a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestSubSagaCommunicationService/Dockerfile +++ b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestSubSagaCommunicationService/Dockerfile @@ -1,7 +1,7 @@ # See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. # This stage is used when running from VS in fast mode (Default for Debug configuration) -FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base USER app WORKDIR /app EXPOSE 8080 @@ -9,7 +9,7 @@ EXPOSE 8081 # This stage is used to build the service project -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src COPY ["Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestSubSagaCommunicationService/Sagaway.IntegrationTests.TestSubSagaCommunicationService.csproj", "Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestSubSagaCommunicationService/"] diff --git a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestSubSagaCommunicationService/Sagaway.IntegrationTests.TestSubSagaCommunicationService.csproj b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestSubSagaCommunicationService/Sagaway.IntegrationTests.TestSubSagaCommunicationService.csproj index fbbfe6e..1bba78c 100644 --- a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestSubSagaCommunicationService/Sagaway.IntegrationTests.TestSubSagaCommunicationService.csproj +++ b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestSubSagaCommunicationService/Sagaway.IntegrationTests.TestSubSagaCommunicationService.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 enable enable true @@ -12,16 +12,16 @@ - - - - - - - - - - + + + + + + + + + + diff --git a/Sagaway.OpenTelemetry/Sagaway.OpenTelemetry.csproj b/Sagaway.OpenTelemetry/Sagaway.OpenTelemetry.csproj index 75ef63d..3462d82 100644 --- a/Sagaway.OpenTelemetry/Sagaway.OpenTelemetry.csproj +++ b/Sagaway.OpenTelemetry/Sagaway.OpenTelemetry.csproj @@ -48,7 +48,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.BillingManagement/Dockerfile b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.BillingManagement/Dockerfile index d311896..7969706 100644 --- a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.BillingManagement/Dockerfile +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.BillingManagement/Dockerfile @@ -1,12 +1,12 @@ #See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. -FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base USER app WORKDIR /app EXPOSE 80 EXPOSE 443 -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src COPY ["Sagaway.ReservationDemo/Sagaway.ReservationDemo.BillingManagement/Sagaway.ReservationDemo.BillingManagement.csproj", "Sagaway.ReservationDemo/Sagaway.ReservationDemo.BillingManagement/"] diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.BillingManagement/Sagaway.ReservationDemo.BillingManagement.csproj b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.BillingManagement/Sagaway.ReservationDemo.BillingManagement.csproj index 3bf62f1..4e718d1 100644 --- a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.BillingManagement/Sagaway.ReservationDemo.BillingManagement.csproj +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.BillingManagement/Sagaway.ReservationDemo.BillingManagement.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 enable enable true @@ -12,16 +12,16 @@ - - - - - - - - - - + + + + + + + + + + diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.BookingManagement/Dockerfile b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.BookingManagement/Dockerfile index 109a4f4..468ec5b 100644 --- a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.BookingManagement/Dockerfile +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.BookingManagement/Dockerfile @@ -1,12 +1,12 @@ #See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. -FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base USER app WORKDIR /app EXPOSE 80 EXPOSE 443 -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src COPY ["Sagaway.ReservationDemo/Sagaway.ReservationDemo.BookingManagement/Sagaway.ReservationDemo.BookingManagement.csproj", "Sagaway.ReservationDemo/Sagaway.ReservationDemo.BookingManagement/"] diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.BookingManagement/Sagaway.ReservationDemo.BookingManagement.csproj b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.BookingManagement/Sagaway.ReservationDemo.BookingManagement.csproj index 2e18c3c..dcdb8d0 100644 --- a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.BookingManagement/Sagaway.ReservationDemo.BookingManagement.csproj +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.BookingManagement/Sagaway.ReservationDemo.BookingManagement.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 enable enable true @@ -12,16 +12,16 @@ - - - - - - - - - - + + + + + + + + + + diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.InventoryManagement/Dockerfile b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.InventoryManagement/Dockerfile index 6b3c32e..c79da8e 100644 --- a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.InventoryManagement/Dockerfile +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.InventoryManagement/Dockerfile @@ -1,12 +1,12 @@ #See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. -FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base USER app WORKDIR /app EXPOSE 80 EXPOSE 443 -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src COPY ["Sagaway.ReservationDemo/Sagaway.ReservationDemo.InventoryManagement/Sagaway.ReservationDemo.InventoryManagement.csproj", "Sagaway.ReservationDemo/Sagaway.ReservationDemo.InventoryManagement/"] diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.InventoryManagement/Sagaway.ReservationDemo.InventoryManagement.csproj b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.InventoryManagement/Sagaway.ReservationDemo.InventoryManagement.csproj index 6f928b1..2145a77 100644 --- a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.InventoryManagement/Sagaway.ReservationDemo.InventoryManagement.csproj +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.InventoryManagement/Sagaway.ReservationDemo.InventoryManagement.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 enable enable true @@ -12,16 +12,16 @@ - - - - - - - - - - + + + + + + + + + + diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationManager/Dockerfile b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationManager/Dockerfile index 2399469..6abea91 100644 --- a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationManager/Dockerfile +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationManager/Dockerfile @@ -1,12 +1,12 @@ #See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. -FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base +FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base USER app WORKDIR /app EXPOSE 80 EXPOSE 443 -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build ARG BUILD_CONFIGURATION=Release WORKDIR /src COPY ["Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationManager/Sagaway.ReservationDemo.ReservationManager.csproj", "Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationManager/"] diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationManager/Sagaway.ReservationDemo.ReservationManager.csproj b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationManager/Sagaway.ReservationDemo.ReservationManager.csproj index 18f6f00..1eadef6 100644 --- a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationManager/Sagaway.ReservationDemo.ReservationManager.csproj +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationManager/Sagaway.ReservationDemo.ReservationManager.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 enable enable true @@ -12,19 +12,19 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/Sagaway.Tests/Sagaway.Tests.csproj b/Sagaway.Tests/Sagaway.Tests.csproj index 50f5aa5..6a00e6b 100644 --- a/Sagaway.Tests/Sagaway.Tests.csproj +++ b/Sagaway.Tests/Sagaway.Tests.csproj @@ -1,7 +1,7 @@ - + - net8.0 + net9.0 enable enable @@ -10,16 +10,15 @@ - - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all From a00917f1cfb34913764a5eddc158a7969373eeed Mon Sep 17 00:00:00 2001 From: Alon Fliess Date: Thu, 24 Apr 2025 22:29:22 +0300 Subject: [PATCH 02/12] Remove OpenTelemetry logs from saga test files The test files `test_a_failed_on_2_no_callback.received.txt` and `test_a_failed_on_2_no_callback_revert.received.txt` have been updated to remove several OpenTelemetry logging entries related to saga operations and their outcomes. The changes reflect the execution flow of the saga, including retries and final outcomes. Additionally, the revert test file has been modified to indicate the success of the revert operation, which was previously absent. --- ...est_a_failed_on_2_no_callback.received.txt | 132 ------------- ...ailed_on_2_no_callback_revert.received.txt | 182 ------------------ 2 files changed, 314 deletions(-) delete mode 100644 Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_failed_on_2_no_callback.received.txt delete mode 100644 Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_failed_on_2_no_callback_revert.received.txt diff --git a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_failed_on_2_no_callback.received.txt b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_failed_on_2_no_callback.received.txt deleted file mode 100644 index 075ca4b..0000000 --- a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_failed_on_2_no_callback.received.txt +++ /dev/null @@ -1,132 +0,0 @@ -Test Name: test_a_failed_on_2_no_callback -Result: False -Saga Log: -[*time*][CallA]: Start Executing CallA -[*time*][CallA]: Registering reminder CallA:Retry for CallA with interval 00:00:05 -[*time*]The Saga is deactivated. -[*time*]The Saga is activated. -[*time*][CallA]: Retry CallA. Retry count: 1 -[*time*][CallA]: Start Executing CallA -[*time*][CallA]: Registering reminder CallA:Retry for CallA with interval 00:00:05 -[*time*]The Saga is deactivated. -[*time*]The Saga is activated. -[*time*][CallA]: Wake by a reminder -[*time*][CallA]: OnReminderAsync: Validation for CallA returned false, retrying action. -[*time*][CallA]: Retry CallA. Retry count: 2 -[*time*][CallA]: Start Executing CallA -[*time*][CallA]: Registering reminder CallA:Retry for CallA with interval 00:00:05 -[*time*]The Saga is deactivated. -[*time*]The Saga is activated. -[*time*][CallA]: CallA Failed. Retries exhausted. -[*time*][CallA]: Start Executing Revert CallA -[*time*][CallA]: No undo operation for CallA. Marking as reverted - -Open Telemetry: -[ - { - "TraceId": "id-1", - "ParentId": "id-2", - "Kind": "SERVER", - "Name": "name-4", - "LocalEndpoint": { - "ServiceName": "orchestrationservice.sagaway" - }, - "Tags": { - "otel.library.name": "OrchestrationService.Sagaway", - "otel.scope.name": "OrchestrationService.Sagaway", - "saga.id": "id-3", - "saga.type": "SagaTestActorOperations" - } - }, - { - "TraceId": "id-1", - "ParentId": "id-5", - "Kind": null, - "Name": "name-6", - "LocalEndpoint": { - "ServiceName": "orchestrationservice.sagaway" - }, - "Tags": { - "operation.name": "CallA", - "otel.library.name": "OrchestrationService.Sagaway", - "otel.scope.name": "OrchestrationService.Sagaway", - "saga.id": "id-3" - } - }, - { - "TraceId": "id-1", - "ParentId": "id-7", - "Kind": "SERVER", - "Name": "name-4", - "LocalEndpoint": { - "ServiceName": "orchestrationservice.sagaway" - }, - "Tags": { - "otel.library.name": "OrchestrationService.Sagaway", - "otel.scope.name": "OrchestrationService.Sagaway", - "saga.id": "id-3", - "saga.type": "SagaTestActorOperations" - } - }, - { - "TraceId": "id-1", - "ParentId": "id-8", - "Kind": null, - "Name": "name-9", - "LocalEndpoint": { - "ServiceName": "orchestrationservice.sagaway" - }, - "Tags": { - "operation.name": "CallA", - "otel.library.name": "OrchestrationService.Sagaway", - "otel.scope.name": "OrchestrationService.Sagaway", - "saga.id": "id-3" - } - }, - { - "TraceId": "id-10", - "ParentId": "id-11", - "Kind": "SERVER", - "Name": "name-4", - "LocalEndpoint": { - "ServiceName": "orchestrationservice.sagaway" - }, - "Tags": { - "otel.library.name": "OrchestrationService.Sagaway", - "otel.scope.name": "OrchestrationService.Sagaway", - "saga.id": "id-3", - "saga.type": "SagaTestActorOperations" - } - }, - { - "TraceId": "id-1", - "ParentId": "id-12", - "Kind": null, - "Name": "name-9", - "LocalEndpoint": { - "ServiceName": "orchestrationservice.sagaway" - }, - "Tags": { - "operation.name": "CallA", - "otel.library.name": "OrchestrationService.Sagaway", - "otel.scope.name": "OrchestrationService.Sagaway", - "saga.id": "id-3" - } - }, - { - "TraceId": "id-1", - "ParentId": "id-13", - "Kind": "SERVER", - "Name": "name-4", - "LocalEndpoint": { - "ServiceName": "orchestrationservice.sagaway" - }, - "Tags": { - "otel.library.name": "OrchestrationService.Sagaway", - "otel.scope.name": "OrchestrationService.Sagaway", - "saga.id": "id-3", - "saga.outcome": "Reverted", - "saga.type": "SagaTestActorOperations" - } - } -] \ No newline at end of file diff --git a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_failed_on_2_no_callback_revert.received.txt b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_failed_on_2_no_callback_revert.received.txt deleted file mode 100644 index 2e40c0c..0000000 --- a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_failed_on_2_no_callback_revert.received.txt +++ /dev/null @@ -1,182 +0,0 @@ -Test Name: test_a_failed_on_2_no_callback_revert -Result: False -Saga Log: -[*time*][CallA]: Start Executing CallA -[*time*][CallA]: Registering reminder CallA:Retry for CallA with interval 00:00:05 -[*time*]The Saga is deactivated. -[*time*]The Saga is activated. -[*time*][CallA]: Retry CallA. Retry count: 1 -[*time*][CallA]: Start Executing CallA -[*time*][CallA]: Registering reminder CallA:Retry for CallA with interval 00:00:05 -[*time*]The Saga is deactivated. -[*time*]The Saga is activated. -[*time*][CallA]: Retry CallA. Retry count: 2 -[*time*][CallA]: Start Executing CallA -[*time*][CallA]: Registering reminder CallA:Retry for CallA with interval 00:00:05 -[*time*]The Saga is deactivated. -[*time*]The Saga is activated. -[*time*][CallA]: Wake by a reminder -[*time*][CallA]: OnReminderAsync: Validation for CallA returned false, retrying action. -[*time*][CallA]: CallA Failed. Retries exhausted. -[*time*][CallA]: Start Executing Revert CallA -[*time*][CallA]: Registering reminder CallA:Retry for Revert CallA with interval 00:00:05 -[*time*]The Saga is deactivated. -[*time*]The Saga is activated. -[*time*]The Saga is deactivated. -[*time*]The Saga is activated. -[*time*][CallA]: Revert CallA Success - -Open Telemetry: -[ - { - "TraceId": "id-1", - "ParentId": "id-2", - "Kind": "SERVER", - "Name": "name-4", - "LocalEndpoint": { - "ServiceName": "orchestrationservice.sagaway" - }, - "Tags": { - "otel.library.name": "OrchestrationService.Sagaway", - "otel.scope.name": "OrchestrationService.Sagaway", - "saga.id": "id-3", - "saga.type": "SagaTestActorOperations" - } - }, - { - "TraceId": "id-1", - "ParentId": "id-5", - "Kind": null, - "Name": "name-6", - "LocalEndpoint": { - "ServiceName": "orchestrationservice.sagaway" - }, - "Tags": { - "operation.name": "CallA", - "otel.library.name": "OrchestrationService.Sagaway", - "otel.scope.name": "OrchestrationService.Sagaway", - "saga.id": "id-3" - } - }, - { - "TraceId": "id-1", - "ParentId": "id-7", - "Kind": "SERVER", - "Name": "name-4", - "LocalEndpoint": { - "ServiceName": "orchestrationservice.sagaway" - }, - "Tags": { - "otel.library.name": "OrchestrationService.Sagaway", - "otel.scope.name": "OrchestrationService.Sagaway", - "saga.id": "id-3", - "saga.type": "SagaTestActorOperations" - } - }, - { - "TraceId": "id-1", - "ParentId": "id-8", - "Kind": null, - "Name": "name-9", - "LocalEndpoint": { - "ServiceName": "orchestrationservice.sagaway" - }, - "Tags": { - "operation.name": "CallA", - "otel.library.name": "OrchestrationService.Sagaway", - "otel.scope.name": "OrchestrationService.Sagaway", - "saga.id": "id-3" - } - }, - { - "TraceId": "id-1", - "ParentId": "id-10", - "Kind": "SERVER", - "Name": "name-4", - "LocalEndpoint": { - "ServiceName": "orchestrationservice.sagaway" - }, - "Tags": { - "otel.library.name": "OrchestrationService.Sagaway", - "otel.scope.name": "OrchestrationService.Sagaway", - "saga.id": "id-3", - "saga.type": "SagaTestActorOperations" - } - }, - { - "TraceId": "id-1", - "ParentId": "id-11", - "Kind": null, - "Name": "name-9", - "LocalEndpoint": { - "ServiceName": "orchestrationservice.sagaway" - }, - "Tags": { - "operation.name": "CallA", - "otel.library.name": "OrchestrationService.Sagaway", - "otel.scope.name": "OrchestrationService.Sagaway", - "saga.id": "id-3" - } - }, - { - "TraceId": "id-12", - "ParentId": "id-13", - "Kind": "SERVER", - "Name": "name-4", - "LocalEndpoint": { - "ServiceName": "orchestrationservice.sagaway" - }, - "Tags": { - "otel.library.name": "OrchestrationService.Sagaway", - "otel.scope.name": "OrchestrationService.Sagaway", - "saga.id": "id-3", - "saga.type": "SagaTestActorOperations" - } - }, - { - "TraceId": "id-12", - "ParentId": "id-14", - "Kind": null, - "Name": "name-15", - "LocalEndpoint": { - "ServiceName": "orchestrationservice.sagaway" - }, - "Tags": { - "operation.name": "RevertCallA", - "otel.library.name": "OrchestrationService.Sagaway", - "otel.scope.name": "OrchestrationService.Sagaway", - "saga.id": "id-3" - } - }, - { - "TraceId": "id-1", - "ParentId": "id-16", - "Kind": "SERVER", - "Name": "name-4", - "LocalEndpoint": { - "ServiceName": "orchestrationservice.sagaway" - }, - "Tags": { - "otel.library.name": "OrchestrationService.Sagaway", - "otel.scope.name": "OrchestrationService.Sagaway", - "saga.id": "id-3", - "saga.type": "SagaTestActorOperations" - } - }, - { - "TraceId": "id-12", - "ParentId": "id-17", - "Kind": "SERVER", - "Name": "name-4", - "LocalEndpoint": { - "ServiceName": "orchestrationservice.sagaway" - }, - "Tags": { - "otel.library.name": "OrchestrationService.Sagaway", - "otel.scope.name": "OrchestrationService.Sagaway", - "saga.id": "id-3", - "saga.outcome": "Reverted", - "saga.type": "SagaTestActorOperations" - } - } -] \ No newline at end of file From acf717224dff09648bb7264475a3db4c08f7777b Mon Sep 17 00:00:00 2001 From: Alon Fliess Date: Mon, 28 Apr 2025 04:21:36 +0300 Subject: [PATCH 03/12] Add a UI for the Car Reservation Demo Update .gitignore for integration test files Added entries to ignore three .received.txt files from the Sagaway.IntegrationTests project to keep the repository clean and prevent unnecessary tracking of generated approval test files. --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 9491a2f..ac991fd 100644 --- a/.gitignore +++ b/.gitignore @@ -360,4 +360,7 @@ MigrationBackup/ .ionide/ # Fody - auto-generated XML schema -FodyWeavers.xsd \ No newline at end of file +FodyWeavers.xsd +/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_1_failed_wait10_2_failed_b_1_success.received.txt +/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_1_failed_wait5_2_success_b_1_failed_wait5_2_failed.received.txt +/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_failed_on_2_no_callback_revert.received.txt From 9d9799ef59e72f146bef98ead9224203be8f36ae Mon Sep 17 00:00:00 2001 From: Alon Fliess Date: Mon, 28 Apr 2025 04:22:49 +0300 Subject: [PATCH 04/12] Add car reservation UI and update related services Enhanced the codebase with a new Blazor component for car reservations, including customer and car class selection. Updated the `.gitignore` for web artifacts, modified test files for saga logs, and added new classes for managing reservations. Updated `docker-compose.yml` to include a new service for the reservation UI and adjusted the `Program.cs` for service registration. Configured Nginx in `nginx.conf` to serve the Blazor app and proxy API requests. Added Tailwind CSS support with `package.json` and `package-lock.json`. Overall, these changes improve functionality, performance, and maintainability of the application. --- .gitignore | 4 + ...d_wait10_2_failed_b_1_success.approved.txt | 32 +- ...ess_b_1_failed_wait5_2_failed.approved.txt | 76 +- ...ailed_on_2_no_callback_revert.approved.txt | 6 +- .../App.razor | 209 +++ .../Components/ReservationStatusDisplay.razor | 150 ++ .../Dockerfile | 46 + .../Layout/MainLayout.razor | 16 + .../Layout/MainLayout.razor.css | 77 + .../Layout/NavMenu.razor | 39 + .../Layout/NavMenu.razor.css | 83 ++ .../Program.cs | 13 + .../Properties/launchSettings.json | 15 + ...gaway.ReservationDemo.ReservationUI.csproj | 29 + .../Sagaway.ReservationDemo.ReservationUI.sln | 24 + .../Services/BookingInfo.cs | 9 + .../Services/IReservationApiClient.cs | 33 + .../Services/ReservationApiClient.cs | 214 +++ .../Services/ReservationResult.cs | 15 + .../Services/ReservationStatus.cs | 19 + .../_Imports.razor | 10 + .../nginx.conf | 43 + .../package-lock.json | 1270 +++++++++++++++++ .../package.json | 19 + .../postcss.config.js | 7 + .../tailwind.config.js | 11 + .../wwwroot/css/app.css | 119 ++ .../wwwroot/favicon.png | Bin 0 -> 1148 bytes .../wwwroot/icon-192.png | Bin 0 -> 2626 bytes .../wwwroot/images/EconomyCar.png | Bin 0 -> 645846 bytes .../wwwroot/images/LuxuryCar.png | Bin 0 -> 667962 bytes .../wwwroot/images/StandardCar.png | Bin 0 -> 678801 bytes .../wwwroot/index.html | 38 + Sagaway.sln | 6 + Sagaway.sln.DotSettings | 1 + dapr/config.yaml | 5 +- docker-compose.yml | 61 +- launchSettings.json | 51 +- 38 files changed, 2690 insertions(+), 60 deletions(-) create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/App.razor create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Components/ReservationStatusDisplay.razor create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Dockerfile create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Layout/MainLayout.razor create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Layout/MainLayout.razor.css create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Layout/NavMenu.razor create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Layout/NavMenu.razor.css create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Program.cs create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Properties/launchSettings.json create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Sagaway.ReservationDemo.ReservationUI.csproj create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Sagaway.ReservationDemo.ReservationUI.sln create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Services/BookingInfo.cs create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Services/IReservationApiClient.cs create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Services/ReservationApiClient.cs create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Services/ReservationResult.cs create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Services/ReservationStatus.cs create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/_Imports.razor create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/nginx.conf create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/package-lock.json create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/package.json create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/postcss.config.js create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/tailwind.config.js create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/wwwroot/css/app.css create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/wwwroot/favicon.png create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/wwwroot/icon-192.png create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/wwwroot/images/EconomyCar.png create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/wwwroot/images/LuxuryCar.png create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/wwwroot/images/StandardCar.png create mode 100644 Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/wwwroot/index.html diff --git a/.gitignore b/.gitignore index ac991fd..389a683 100644 --- a/.gitignore +++ b/.gitignore @@ -364,3 +364,7 @@ FodyWeavers.xsd /Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_1_failed_wait10_2_failed_b_1_success.received.txt /Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_1_failed_wait5_2_success_b_1_failed_wait5_2_failed.received.txt /Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_failed_on_2_no_callback_revert.received.txt + +#web artifacrs +/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/wwwroot/lib +/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/wwwroot/css/app.Output.css diff --git a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_1_failed_wait10_2_failed_b_1_success.approved.txt b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_1_failed_wait10_2_failed_b_1_success.approved.txt index 79162d1..804e88e 100644 --- a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_1_failed_wait10_2_failed_b_1_success.approved.txt +++ b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_1_failed_wait10_2_failed_b_1_success.approved.txt @@ -12,6 +12,9 @@ Saga Log: [*time*][CallA]: Registering reminder CallA:Retry for CallA with interval 00:00:10 [*time*]The Saga is deactivated. [*time*]The Saga is activated. +[*time*][CallB]: CallB Success +[*time*]The Saga is deactivated. +[*time*]The Saga is activated. [*time*][CallA]: Wake by a reminder [*time*][CallA]: OnReminderAsync: Validation for CallA returned false, retrying action. [*time*][CallA]: Retry CallA. Retry count: 2 @@ -19,9 +22,6 @@ Saga Log: [*time*][CallA]: Registering reminder CallA:Retry for CallA with interval 00:00:10 [*time*]The Saga is deactivated. [*time*]The Saga is activated. -[*time*][CallB]: CallB Success -[*time*]The Saga is deactivated. -[*time*]The Saga is activated. [*time*]The Saga is deactivated. [*time*]The Saga is activated. [*time*][CallA]: CallA Failed. Retries exhausted. @@ -113,8 +113,8 @@ Open Telemetry: } }, { - "TraceId": "id-10", - "ParentId": "id-11", + "TraceId": "id-1", + "ParentId": "id-10", "Kind": "SERVER", "Name": "name-4", "LocalEndpoint": { @@ -128,33 +128,33 @@ Open Telemetry: } }, { - "TraceId": "id-1", + "TraceId": "id-11", "ParentId": "id-12", - "Kind": null, - "Name": "name-13", + "Kind": "SERVER", + "Name": "name-4", "LocalEndpoint": { "ServiceName": "orchestrationservice.sagaway" }, "Tags": { - "operation.name": "CallA", "otel.library.name": "OrchestrationService.Sagaway", "otel.scope.name": "OrchestrationService.Sagaway", - "saga.id": "id-3" + "saga.id": "id-3", + "saga.type": "SagaTestActorOperations" } }, { "TraceId": "id-1", - "ParentId": "id-14", - "Kind": "SERVER", - "Name": "name-4", + "ParentId": "id-13", + "Kind": null, + "Name": "name-14", "LocalEndpoint": { "ServiceName": "orchestrationservice.sagaway" }, "Tags": { + "operation.name": "CallA", "otel.library.name": "OrchestrationService.Sagaway", "otel.scope.name": "OrchestrationService.Sagaway", - "saga.id": "id-3", - "saga.type": "SagaTestActorOperations" + "saga.id": "id-3" } }, { @@ -203,7 +203,7 @@ Open Telemetry: } }, { - "TraceId": "id-10", + "TraceId": "id-11", "ParentId": "id-20", "Kind": "SERVER", "Name": "name-4", diff --git a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_1_failed_wait5_2_success_b_1_failed_wait5_2_failed.approved.txt b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_1_failed_wait5_2_success_b_1_failed_wait5_2_failed.approved.txt index 3f39496..2422308 100644 --- a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_1_failed_wait5_2_success_b_1_failed_wait5_2_failed.approved.txt +++ b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_1_failed_wait5_2_success_b_1_failed_wait5_2_failed.approved.txt @@ -24,9 +24,17 @@ Saga Log: [*time*][CallB]: Registering reminder CallB:Retry for CallB with interval 00:00:30 [*time*]The Saga is deactivated. [*time*]The Saga is activated. -[*time*][CallA]: Wake by a reminder -[*time*][CallA]: OnReminderAsync: Validation for CallA returned false, retrying action. -[*time*][CallA]: CallA Failed. Retries exhausted. +[*time*][CallA]: CallA Success +[*time*]The Saga is deactivated. +[*time*]The Saga is activated. +[*time*]The Saga is deactivated. +[*time*]The Saga is activated. +[*time*][CallB]: Retry CallB. Retry count: 2 +[*time*][CallB]: Start Executing CallB +[*time*][CallB]: Registering reminder CallB:Retry for CallB with interval 00:00:30 +[*time*]The Saga is deactivated. +[*time*]The Saga is activated. +[*time*][CallB]: CallB Failed. Retries exhausted. [*time*][CallA]: Start Executing Revert CallA [*time*][CallA]: No undo operation for CallA. Marking as reverted [*time*][CallB]: Start Executing Revert CallB @@ -170,13 +178,73 @@ Open Telemetry: } }, { - "TraceId": "id-16", + "TraceId": "id-1", + "ParentId": "id-16", + "Kind": "SERVER", + "Name": "name-4", + "LocalEndpoint": { + "ServiceName": "orchestrationservice.sagaway" + }, + "Tags": { + "otel.library.name": "OrchestrationService.Sagaway", + "otel.scope.name": "OrchestrationService.Sagaway", + "saga.id": "id-3", + "saga.type": "SagaTestActorOperations" + } + }, + { + "TraceId": "id-10", "ParentId": "id-17", "Kind": "SERVER", "Name": "name-4", "LocalEndpoint": { "ServiceName": "orchestrationservice.sagaway" }, + "Tags": { + "otel.library.name": "OrchestrationService.Sagaway", + "otel.scope.name": "OrchestrationService.Sagaway", + "saga.id": "id-3", + "saga.type": "SagaTestActorOperations" + } + }, + { + "TraceId": "id-1", + "ParentId": "id-18", + "Kind": "SERVER", + "Name": "name-4", + "LocalEndpoint": { + "ServiceName": "orchestrationservice.sagaway" + }, + "Tags": { + "otel.library.name": "OrchestrationService.Sagaway", + "otel.scope.name": "OrchestrationService.Sagaway", + "saga.id": "id-3", + "saga.type": "SagaTestActorOperations" + } + }, + { + "TraceId": "id-1", + "ParentId": "id-19", + "Kind": null, + "Name": "name-20", + "LocalEndpoint": { + "ServiceName": "orchestrationservice.sagaway" + }, + "Tags": { + "operation.name": "CallB", + "otel.library.name": "OrchestrationService.Sagaway", + "otel.scope.name": "OrchestrationService.Sagaway", + "saga.id": "id-3" + } + }, + { + "TraceId": "id-1", + "ParentId": "id-21", + "Kind": "SERVER", + "Name": "name-4", + "LocalEndpoint": { + "ServiceName": "orchestrationservice.sagaway" + }, "Tags": { "otel.library.name": "OrchestrationService.Sagaway", "otel.scope.name": "OrchestrationService.Sagaway", diff --git a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_failed_on_2_no_callback_revert.approved.txt b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_failed_on_2_no_callback_revert.approved.txt index d092c64..606faa8 100644 --- a/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_failed_on_2_no_callback_revert.approved.txt +++ b/Sagaway.IntegrationTests/Sagaway.IntegrationTests.TestProject/ApprovalFiles/test_a_failed_on_2_no_callback_revert.approved.txt @@ -20,8 +20,6 @@ Saga Log: [*time*][CallA]: Registering reminder CallA:Retry for Revert CallA with interval 00:00:05 [*time*]The Saga is deactivated. [*time*]The Saga is activated. -[*time*][CallA]: Wake by a reminder -[*time*][CallA]: OnReminderAsync: Revert CallA passed validation successfully. [*time*][CallA]: Revert CallA Success Open Telemetry: @@ -147,8 +145,8 @@ Open Telemetry: } }, { - "TraceId": "id-15", - "ParentId": "id-16", + "TraceId": "id-1", + "ParentId": "id-15", "Kind": "SERVER", "Name": "name-4", "LocalEndpoint": { diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/App.razor b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/App.razor new file mode 100644 index 0000000..f5f98d1 --- /dev/null +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/App.razor @@ -0,0 +1,209 @@ +@page "/reservation" + +@using Sagaway.ReservationDemo.ReservationUI.Components +@using Sagaway.ReservationDemo.ReservationUI.Services + +@inject ILogger Logger +@inject IReservationApiClient ApiClient + +Car Reservation + +
+ +

Sagaway Car Reservation

+ +
+ + +
+ +
+ +

Choose Your Car Class

+
+ @foreach (var carType in _availableCarTypes) + { + var borderClass = _selectedCarClass?.Code == carType.Code + ? "border-4 border-indigo-600 ring-2 ring-indigo-300 scale-105" // Selected style + : "border-2 border-gray-300 hover:border-gray-400"; // Default/hover style + +
+ @* Increased width slightly *@ + @carType.Name @* Adjusted height *@ +
+ @carType.Name +
+
+ } +
+ + @if (_selectedCarClass != null && _selectedCustomerId != Guid.Empty) + { + var selectedCustomerName = _predefinedCustomers.FirstOrDefault(c => c.CustomerId == _selectedCustomerId)?.CustomerName ?? "Unknown"; +
+

Selected: @_selectedCarClass.Name for @selectedCustomerName

+ + + @if (!string.IsNullOrEmpty(_reservationMessage)) + { +

@_reservationMessage

+ } +
+ } + +
+ + + +
+ +@code { + // --- Component State --- + private List _availableCarTypes = new(); + private CarType? _selectedCarClass; + + private List _predefinedCustomers = new(); + private Guid _selectedCustomerId = Guid.Empty; // Bound to dropdown + + private string? _customerNameToFetch; // Passed to Status Display component + private bool _isProcessingReservation; + private string? _reservationMessage; // To show success/error feedback + + // --- Initialization --- + protected override void OnInitialized() + { + // Populate Car Types + _availableCarTypes = + [ + new() { Name = "Economy", Code = "ECON", ImageUrl = "images/EconomyCar.png" }, + new() { Name = "Standard", Code = "STD", ImageUrl = "images/StandardCar.png" }, + new() { Name = "Luxury", Code = "LUX", ImageUrl = "images/LuxuryCar.png" } + ]; + + // Populate Predefined Customers + _predefinedCustomers = + [ + new() { CustomerId = Guid.Parse("a1f8e6b4-0b1d-4a5a-8b0a-1c2d3e4f5a6b"), CustomerName = "Alon Fliess" }, + new() { CustomerId = Guid.Parse("b2c8d6a3-1c2e-4b6b-9c1b-2d3e4f5a6b7c"), CustomerName = "Jane Doe" }, + new() { CustomerId = Guid.Parse("c3d8e6b2-2d3f-4c7c-ad2c-3e4f5a6b7d8e"), CustomerName = "John Smith" } + ]; + + // Set default customer selection + if (_predefinedCustomers.Any()) + { + _selectedCustomerId = _predefinedCustomers.First().CustomerId; + SelectedCustomerChanged(); // Trigger initial status fetch for default customer + } + } + + // --- Event Handlers --- + private void SelectCarClass(CarType carType) + { + _selectedCarClass = carType; + _reservationMessage = null; // Clear previous message + Logger.LogInformation("Selected car class: {CarCode}", _selectedCarClass?.Code); + } + + private void SelectedCustomerChanged() + { + var selectedCustomer = _predefinedCustomers.FirstOrDefault(c => c.CustomerId == _selectedCustomerId); + _customerNameToFetch = selectedCustomer?.CustomerName; // Update name for status component + _reservationMessage = null; // Clear previous message + Logger.LogInformation("Customer selection changed: ID={CustomerId}, Name={CustomerName}", _selectedCustomerId, _customerNameToFetch); + // Optional: Call StateHasChanged() if you need immediate UI updates dependent on this outside the @bind flow + } + + private async Task HandleReservation() + { + var selectedCustomer = _predefinedCustomers.FirstOrDefault(c => c.CustomerId == _selectedCustomerId); + + if (_selectedCarClass == null || selectedCustomer == null) + { + _reservationMessage = "Error: Please select a car class and customer."; + Logger.LogWarning("Attempted reservation with missing selection."); + return; + } + + var customerNameForApi = selectedCustomer.CustomerName; + _isProcessingReservation = true; + _reservationMessage = null; // Clear previous messages + StateHasChanged(); // Show spinner + + Logger.LogInformation("Attempting to reserve {CarClass} for {CustomerName} (ID: {CustomerId})", + _selectedCarClass.Code, customerNameForApi, _selectedCustomerId); + + // --- TODO: Replace with actual API call --- + await Task.Delay(2000); // Simulate API call delay + var reservationSucceeded = DateTime.Now.Second % 2 == 0; // Simulate random success/failure for demo + Guid? newReservationId = reservationSucceeded ? Guid.NewGuid() : null; + try + { + var reservationResult = await ApiClient.ReserveCarAsync(customerNameForApi, _selectedCarClass.Code); + reservationSucceeded = true; // Assuming API call success if no exception + newReservationId = reservationResult?.ReservationId; + Logger.LogInformation("Reservation initiated, ID: {ReservationId}", newReservationId); + } + catch (Exception ex) + { + reservationSucceeded = false; + Logger.LogError(ex, "Reservation failed for {CustomerName}", customerNameForApi); + _reservationMessage = $"Error: Reservation failed - {ex.Message}"; + } + + + _isProcessingReservation = false; + + if (reservationSucceeded) + { + _reservationMessage = $"Success! Reservation {newReservationId} started for {customerNameForApi}."; + // Trigger status fetch for the selected customer + _customerNameToFetch = customerNameForApi; + } + else + { + _reservationMessage = $"Error: Failed to start reservation process for {customerNameForApi}."; + } + + StateHasChanged(); // Update UI with message and hide spinner + } + + // --- Data Structures --- + private class CarType + { +#pragma warning disable CS8618 + public string Name { get; init; } + public string Code { get; init; } + public string ImageUrl { get; init; } +#pragma warning restore CS8618 + } + + private class CustomerInfo + { +#pragma warning disable CS8618 + public Guid CustomerId { get; init; } + public string CustomerName { get; init; } +#pragma warning restore CS8618 + } +} \ No newline at end of file diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Components/ReservationStatusDisplay.razor b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Components/ReservationStatusDisplay.razor new file mode 100644 index 0000000..28de5a9 --- /dev/null +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Components/ReservationStatusDisplay.razor @@ -0,0 +1,150 @@ +@* Components/ReservationStatusDisplay.razor *@ +@* Inject HttpClient or your custom API client service *@ +@* @inject HttpClient Http *@ +@* @inject ReservationApiClient ApiClient *@ + +
+

Reservation Status (@(string.IsNullOrWhiteSpace(CustomerNameToFetch) ? "No customer selected" : CustomerNameToFetch))

+ + @if (_isLoading) + { +

Loading reservation status...

+ @* Add a spinner here if desired *@ + } + else if (!string.IsNullOrWhiteSpace(_errorMessage)) + { +

Error loading status: @_errorMessage

+ } + else if (_reservations == null || !_reservations.Any()) + { +

No reservations found for this customer.

+ } + else + { +
    + @foreach (var reservation in _reservations) + { +
  • +

    ID: @reservation.ReservationId

    +

    Car: @reservation.CarClass

    + @* Assuming BookingInfo has a status property - adapt as needed *@ +

    Status: @reservation.Status

    +
  • + } +
+ } + +
+ +@code { + [Parameter] + public string? CustomerNameToFetch { get; set; } + + private List? _reservations; + private bool _isLoading = false; + private string? _errorMessage; + + // This method is called when the parameter changes *after* initial render + protected override async Task OnParametersSetAsync() + { + // Automatically fetch when the customer name is set/changed + // Avoid fetching if it hasn't actually changed or is null/empty + // We might need more robust change detection depending on usage + if (!string.IsNullOrWhiteSpace(CustomerNameToFetch)) + { + await FetchReservationStatus(); + } + else + { + // Clear status if customer name is cleared + _reservations = null; + _errorMessage = null; + } + } + + private async Task FetchReservationStatus() + { + if (string.IsNullOrWhiteSpace(CustomerNameToFetch)) + { + _reservations = null; + _errorMessage = null; + _isLoading = false; + StateHasChanged(); + return; + } + + _isLoading = true; + _errorMessage = null; + _reservations = null; // Clear previous results + StateHasChanged(); // Update UI to show loading + + try + { + Console.WriteLine($"Fetching reservations for {CustomerNameToFetch}"); + + // --- TODO: Replace with actual API call using HttpClient or your API Client --- + // Example using injected HttpClient (ensure base address is configured in Program.cs) + // var response = await Http.GetAsync($"/reservations/{Uri.EscapeDataString(CustomerNameToFetch)}"); + // if (response.IsSuccessStatusCode) + // { + // reservations = await response.Content.ReadFromJsonAsync>(); + // } + // else + // { + // errorMessage = $"API Error: {response.StatusCode}"; + // } + + // --- Placeholder Simulation --- + await Task.Delay(1500); // Simulate network delay + // Simulate finding some data + if (CustomerNameToFetch.ToLower() == "alon") + { + _reservations = + [ + new() { ReservationId = Guid.NewGuid(), CustomerName = CustomerNameToFetch, CarClass = "ECON", Status = "Confirmed", IsReserved = true }, + new() { ReservationId = Guid.NewGuid(), CustomerName = CustomerNameToFetch, CarClass = "LUX", Status = "Pending", IsReserved = true } + ]; + } + else + { + _reservations = []; // Simulate not finding data + } + // --- End Placeholder Simulation --- + + } + catch (Exception ex) + { + Console.WriteLine($"Error fetching status: {ex.Message}"); + _errorMessage = "Failed to load data. Please try again."; + } + finally + { + _isLoading = false; + StateHasChanged(); // Update UI with results or error + } + } + + private string GetStatusClass(string? status) => status switch + { + "Confirmed" => "text-green-700", + "Pending" => "text-yellow-700", + "Cancelled" => "text-red-700", + "Failed" => "text-red-800", + _ => "text-gray-600" + }; + + // Class to represent the reservation data from the backend API + // Adapt properties based on your actual API response (BookingInfo) + private class BookingInfo + { + public Guid ReservationId { get; set; } + public string? CustomerName { get; set; } + public string? CarClass { get; set; } + public bool IsReserved { get; set; } // From backend example + public string Status { get; set; } = "Unknown"; // Add a status property if your API provides it + } +} \ No newline at end of file diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Dockerfile b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Dockerfile new file mode 100644 index 0000000..1fe718f --- /dev/null +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Dockerfile @@ -0,0 +1,46 @@ +# Stage 1: Build Tailwind and WebAssembly App +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build +ARG BUILD_CONFIGURATION=Release +WORKDIR /src + +# Copy only csproj first to optimize Docker caching +COPY Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Sagaway.ReservationDemo.ReservationUI.csproj Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/ +# Consider copying package.json and tailwind config earlier too if they don't change often +COPY Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/package.json Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/ +COPY Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/package-lock.json Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/ +COPY Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/tailwind.config.js Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/ +RUN dotnet restore "Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Sagaway.ReservationDemo.ReservationUI.csproj" + +# Copy full source +COPY . . +WORKDIR /src/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI + +# Install Node.js and Tailwind dependencies +# Combine RUN commands where possible +RUN apt-get update && \ + apt-get install -y --no-install-recommends nodejs npm && \ + npm ci && \ + npx @tailwindcss/cli -i ./wwwroot/css/app.css -o ./wwwroot/css/app.output.css --minify && \ + # Clean up apt cache + rm -rf /var/lib/apt/lists/* + +# Build the Blazor WebAssembly app +RUN dotnet publish "Sagaway.ReservationDemo.ReservationUI.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false + +# Stage 2: Serve using nginx +FROM nginx:alpine AS final + +# Remove the default nginx static website and config +RUN rm -rf /usr/share/nginx/html/* && rm /etc/nginx/conf.d/default.conf + +# Copy custom nginx configuration +# Assumes nginx.conf is in the same directory as the Dockerfile +COPY Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/nginx.conf /etc/nginx/conf.d/default.conf + +# Copy published Blazor WebAssembly app to nginx public directory +COPY --from=build /app/publish/wwwroot /usr/share/nginx/html + +EXPOSE 80 + +# Start nginx +CMD ["nginx", "-g", "daemon off;"] \ No newline at end of file diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Layout/MainLayout.razor b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Layout/MainLayout.razor new file mode 100644 index 0000000..76eb725 --- /dev/null +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Layout/MainLayout.razor @@ -0,0 +1,16 @@ +@inherits LayoutComponentBase +
+ + +
+
+ About +
+ +
+ @Body +
+
+
diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Layout/MainLayout.razor.css b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Layout/MainLayout.razor.css new file mode 100644 index 0000000..ecf25e5 --- /dev/null +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Layout/MainLayout.razor.css @@ -0,0 +1,77 @@ +.page { + position: relative; + display: flex; + flex-direction: column; +} + +main { + flex: 1; +} + +.sidebar { + background-image: linear-gradient(180deg, rgb(5, 39, 103) 0%, #3a0647 70%); +} + +.top-row { + background-color: #f7f7f7; + border-bottom: 1px solid #d6d5d5; + justify-content: flex-end; + height: 3.5rem; + display: flex; + align-items: center; +} + + .top-row ::deep a, .top-row ::deep .btn-link { + white-space: nowrap; + margin-left: 1.5rem; + text-decoration: none; + } + + .top-row ::deep a:hover, .top-row ::deep .btn-link:hover { + text-decoration: underline; + } + + .top-row ::deep a:first-child { + overflow: hidden; + text-overflow: ellipsis; + } + +@media (max-width: 640.98px) { + .top-row { + justify-content: space-between; + } + + .top-row ::deep a, .top-row ::deep .btn-link { + margin-left: 0; + } +} + +@media (min-width: 641px) { + .page { + flex-direction: row; + } + + .sidebar { + width: 250px; + height: 100vh; + position: sticky; + top: 0; + } + + .top-row { + position: sticky; + top: 0; + z-index: 1; + } + + .top-row.auth ::deep a:first-child { + flex: 1; + text-align: right; + width: 0; + } + + .top-row, article { + padding-left: 2rem !important; + padding-right: 1.5rem !important; + } +} diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Layout/NavMenu.razor b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Layout/NavMenu.razor new file mode 100644 index 0000000..c1d448f --- /dev/null +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Layout/NavMenu.razor @@ -0,0 +1,39 @@ + + + + +@code { + private bool collapseNavMenu = true; + + private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null; + + private void ToggleNavMenu() + { + collapseNavMenu = !collapseNavMenu; + } +} diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Layout/NavMenu.razor.css b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Layout/NavMenu.razor.css new file mode 100644 index 0000000..617b89c --- /dev/null +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Layout/NavMenu.razor.css @@ -0,0 +1,83 @@ +.navbar-toggler { + background-color: rgba(255, 255, 255, 0.1); +} + +.top-row { + min-height: 3.5rem; + background-color: rgba(0,0,0,0.4); +} + +.navbar-brand { + font-size: 1.1rem; +} + +.bi { + display: inline-block; + position: relative; + width: 1.25rem; + height: 1.25rem; + margin-right: 0.75rem; + top: -1px; + background-size: cover; +} + +.bi-house-door-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-house-door-fill' viewBox='0 0 16 16'%3E%3Cpath d='M6.5 14.5v-3.505c0-.245.25-.495.5-.495h2c.25 0 .5.25.5.5v3.5a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5v-7a.5.5 0 0 0-.146-.354L13 5.793V2.5a.5.5 0 0 0-.5-.5h-1a.5.5 0 0 0-.5.5v1.293L8.354 1.146a.5.5 0 0 0-.708 0l-6 6A.5.5 0 0 0 1.5 7.5v7a.5.5 0 0 0 .5.5h4a.5.5 0 0 0 .5-.5Z'/%3E%3C/svg%3E"); +} + +.bi-plus-square-fill-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-plus-square-fill' viewBox='0 0 16 16'%3E%3Cpath d='M2 0a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V2a2 2 0 0 0-2-2H2zm6.5 4.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3a.5.5 0 0 1 1 0z'/%3E%3C/svg%3E"); +} + +.bi-list-nested-nav-menu { + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='white' class='bi bi-list-nested' viewBox='0 0 16 16'%3E%3Cpath fill-rule='evenodd' d='M4.5 11.5A.5.5 0 0 1 5 11h10a.5.5 0 0 1 0 1H5a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 3 7h10a.5.5 0 0 1 0 1H3a.5.5 0 0 1-.5-.5zm-2-4A.5.5 0 0 1 1 3h10a.5.5 0 0 1 0 1H1a.5.5 0 0 1-.5-.5z'/%3E%3C/svg%3E"); +} + +.nav-item { + font-size: 0.9rem; + padding-bottom: 0.5rem; +} + + .nav-item:first-of-type { + padding-top: 1rem; + } + + .nav-item:last-of-type { + padding-bottom: 1rem; + } + + .nav-item ::deep a { + color: #d7d7d7; + border-radius: 4px; + height: 3rem; + display: flex; + align-items: center; + line-height: 3rem; + } + +.nav-item ::deep a.active { + background-color: rgba(255,255,255,0.37); + color: white; +} + +.nav-item ::deep a:hover { + background-color: rgba(255,255,255,0.1); + color: white; +} + +@media (min-width: 641px) { + .navbar-toggler { + display: none; + } + + .collapse { + /* Never collapse the sidebar for wide screens */ + display: block; + } + + .nav-scrollable { + /* Allow sidebar to scroll for tall menus */ + height: calc(100vh - 3.5rem); + overflow-y: auto; + } +} diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Program.cs b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Program.cs new file mode 100644 index 0000000..df8438b --- /dev/null +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Program.cs @@ -0,0 +1,13 @@ +using Microsoft.AspNetCore.Components.Web; +using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +using Sagaway.ReservationDemo.ReservationUI; +using Sagaway.ReservationDemo.ReservationUI.Services; + +var builder = WebAssemblyHostBuilder.CreateDefault(args); +builder.RootComponents.Add("#app"); +builder.RootComponents.Add("head::after"); + +builder.Services.AddScoped(sp => new HttpClient()); +builder.Services.AddScoped(); + +await builder.Build().RunAsync(); diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Properties/launchSettings.json b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Properties/launchSettings.json new file mode 100644 index 0000000..7156637 --- /dev/null +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Properties/launchSettings.json @@ -0,0 +1,15 @@ +{ + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", + "applicationUrl": "http://localhost:5201", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Sagaway.ReservationDemo.ReservationUI.csproj b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Sagaway.ReservationDemo.ReservationUI.csproj new file mode 100644 index 0000000..8b571e8 --- /dev/null +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Sagaway.ReservationDemo.ReservationUI.csproj @@ -0,0 +1,29 @@ + + + + net9.0 + enable + enable + Linux + ..\.. + ..\..\docker-compose.dcproj + + + + + + + + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + + diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Sagaway.ReservationDemo.ReservationUI.sln b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Sagaway.ReservationDemo.ReservationUI.sln new file mode 100644 index 0000000..c390bbd --- /dev/null +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Sagaway.ReservationDemo.ReservationUI.sln @@ -0,0 +1,24 @@ +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.5.2.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sagaway.ReservationDemo.ReservationUI", "Sagaway.ReservationDemo.ReservationUI.csproj", "{3301C64B-430F-BCF5-ACE5-D12349FF6C83}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3301C64B-430F-BCF5-ACE5-D12349FF6C83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3301C64B-430F-BCF5-ACE5-D12349FF6C83}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3301C64B-430F-BCF5-ACE5-D12349FF6C83}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3301C64B-430F-BCF5-ACE5-D12349FF6C83}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {8BF5D552-C817-4B1A-A48D-8082CB6FB9AC} + EndGlobalSection +EndGlobal diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Services/BookingInfo.cs b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Services/BookingInfo.cs new file mode 100644 index 0000000..825bbb3 --- /dev/null +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Services/BookingInfo.cs @@ -0,0 +1,9 @@ +namespace Sagaway.ReservationDemo.ReservationUI.Services; + +public class BookingInfo +{ + public Guid ReservationId { get; set; } + public required string CustomerName { get; set; } + public required string CarClass { get; set; } + public bool IsReserved { get; set; } +} \ No newline at end of file diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Services/IReservationApiClient.cs b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Services/IReservationApiClient.cs new file mode 100644 index 0000000..918082f --- /dev/null +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Services/IReservationApiClient.cs @@ -0,0 +1,33 @@ +namespace Sagaway.ReservationDemo.ReservationUI.Services; +public interface IReservationApiClient +{ + /// + /// Initiates a car reservation request. + /// + /// The name of the customer. + /// The desired car class code (e.g., "ECON", "STD", "LUX"). + /// An optional existing reservation ID to use. + /// A ReservationResult containing details of the initiated reservation, or null if failed before getting a result. + Task ReserveCarAsync(string customerName, string carClass, Guid? reservationId = null); + + /// + /// Retrieves the current status of reservations for a specific customer. + /// + /// The name of the customer whose reservations to fetch. + /// A list of ReservationStatus objects (mapped from BookingInfo), or null/empty list if none found or an error occurred. + Task?> GetReservationsAsync(string customerName); + + /// + /// Retrieves the details of a specific reservation. + /// + /// The ID of the reservation to fetch. + /// A ReservationStatus object (mapped from BookingInfo), or null if not found or an error occurred. + Task GetReservationAsync(Guid reservationId); + + /// + /// Initiates the cancellation process for a specific reservation. + /// + /// The ID of the reservation to cancel. + /// True if the cancellation request was accepted, false otherwise. + Task CancelReservationAsync(Guid reservationId); +} diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Services/ReservationApiClient.cs b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Services/ReservationApiClient.cs new file mode 100644 index 0000000..2b45130 --- /dev/null +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Services/ReservationApiClient.cs @@ -0,0 +1,214 @@ +using System.Net.Http.Json; +using Microsoft.AspNetCore.Components; + +namespace Sagaway.ReservationDemo.ReservationUI.Services +{ + /// + /// Interface for the client accessing the Reservation API. + /// + + /// + /// Implementation of the client accessing the Reservation API. + /// + + public class ReservationApiClient : IReservationApiClient + { + private readonly HttpClient _http; + private readonly NavigationManager _navigationManager; // Inject NavigationManager + private readonly ILogger _logger; + + // Constructor injection for HttpClient, NavigationManager, and ILogger + // ReSharper disable once ConvertToPrimaryConstructor + public ReservationApiClient(HttpClient http, NavigationManager navigationManager, + ILogger logger) + { + _http = http ?? throw new ArgumentNullException(nameof(http)); + _navigationManager = + navigationManager ?? + throw new ArgumentNullException(nameof(navigationManager)); // Store injected NavigationManager + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + } + + /// + /// Initiates a car reservation request via a POST call to /reserve. + /// + public async Task ReserveCarAsync(string customerName, string carClass, + Guid? reservationId = null) + { + // Build the relative path and query string + var relativePathAndQuery = + $"reserve?customerName={Uri.EscapeDataString(customerName)}&carClass={Uri.EscapeDataString(carClass)}"; + if (reservationId.HasValue && reservationId != Guid.Empty) + { + relativePathAndQuery += $"&reservationId={reservationId.Value}"; + } + + // *** CHANGED: Construct Absolute URI using NavigationManager *** + var absoluteUri = _navigationManager.ToAbsoluteUri(relativePathAndQuery); + _logger.LogInformation("Sending POST request to absolute URI: {AbsoluteUri}", absoluteUri); + + // Use the absolute URI when creating the HttpRequestMessage + using var request = new HttpRequestMessage(HttpMethod.Post, absoluteUri); + + try + { + // Send the request using SendAsync + using var response = await _http.SendAsync(request); + response.EnsureSuccessStatusCode(); // Throws HttpRequestException on non-success + + var result = await response.Content.ReadFromJsonAsync(); + _logger.LogInformation("Successfully initiated reservation via /reserve, ID: {ReservationId}", + result?.ReservationId); + return result; + } + catch (HttpRequestException ex) + { + _logger.LogError(ex, "HTTP request failed when calling {AbsoluteUri}. Status Code: {StatusCode}", + absoluteUri, ex.StatusCode); + throw; + } + catch (Exception ex) + { + _logger.LogError(ex, "An unexpected error occurred during ReserveCarAsync for URI {AbsoluteUri}", + absoluteUri); + throw; + } + } + + /// + /// Retrieves reservation statuses for a customer via a GET call to /reservations/{customerName}. + /// + public async Task?> GetReservationsAsync(string customerName) + { + var relativePath = $"reservations/{Uri.EscapeDataString(customerName)}"; + var absoluteUri = _navigationManager.ToAbsoluteUri(relativePath); // Construct absolute URI + _logger.LogInformation("Sending GET request to absolute URI: {AbsoluteUri}", absoluteUri); + + using var request = new HttpRequestMessage(HttpMethod.Get, absoluteUri); // Use absolute URI + + try + { + using var response = await _http.SendAsync(request); + + if (response.StatusCode == System.Net.HttpStatusCode.NotFound) + { + _logger.LogInformation( + "No reservations found for customer {CustomerName} via {AbsoluteUri} (404)", customerName, + absoluteUri); + return new List(); + } + + response.EnsureSuccessStatusCode(); + + var statuses = await response.Content.ReadFromJsonAsync>(); + _logger.LogInformation( + "Successfully retrieved {Count} reservation statuses for {CustomerName} via {AbsoluteUri}", + statuses?.Count ?? 0, customerName, absoluteUri); + return statuses; + } + catch (HttpRequestException ex) + { + _logger.LogError(ex, "HTTP request failed when calling {AbsoluteUri}. Status Code: {StatusCode}", + absoluteUri, ex.StatusCode); + return null; + } + catch (Exception ex) + { + _logger.LogError(ex, + "An unexpected error occurred during GetReservationsAsync for URI {AbsoluteUri}", absoluteUri); + return null; + } + } + + /// + /// Retrieves the details of a specific reservation via GET /reservation/{reservationId}. + /// + public async Task GetReservationAsync(Guid reservationId) + { + var relativePath = $"reservation/{reservationId:D}"; + var absoluteUri = _navigationManager.ToAbsoluteUri(relativePath); // Construct absolute URI + _logger.LogInformation("Sending GET request to absolute URI: {AbsoluteUri}", absoluteUri); + + using var request = new HttpRequestMessage(HttpMethod.Get, absoluteUri); // Use absolute URI + + try + { + using var response = await _http.SendAsync(request); + + if (response.StatusCode == System.Net.HttpStatusCode.NotFound) + { + _logger.LogInformation("Reservation {ReservationId} not found via {AbsoluteUri} (404)", + reservationId, absoluteUri); + return null; + } + + response.EnsureSuccessStatusCode(); + + var status = await response.Content.ReadFromJsonAsync(); + _logger.LogInformation( + "Successfully retrieved reservation status for {ReservationId} via {AbsoluteUri}", + reservationId, absoluteUri); + return status; + } + catch (HttpRequestException ex) + { + _logger.LogError(ex, "HTTP request failed when calling {AbsoluteUri}. Status Code: {StatusCode}", + absoluteUri, ex.StatusCode); + return null; + } + catch (Exception ex) + { + _logger.LogError(ex, + "An unexpected error occurred during GetReservationAsync for URI {AbsoluteUri}", absoluteUri); + return null; + } + } + + + /// + /// Initiates the cancellation process for a specific reservation via POST /cancel. + /// + public async Task CancelReservationAsync(Guid reservationId) + { + var relativePathAndQuery = $"cancel?reservationId={reservationId:D}"; + var absoluteUri = _navigationManager.ToAbsoluteUri(relativePathAndQuery); // Construct absolute URI + _logger.LogInformation("Sending POST request to absolute URI: {AbsoluteUri}", absoluteUri); + + using var request = new HttpRequestMessage(HttpMethod.Post, absoluteUri); // Use absolute URI + + try + { + using var response = await _http.SendAsync(request); + + if (response.IsSuccessStatusCode) + { + _logger.LogInformation( + "Successfully requested cancellation for reservation {ReservationId} via {AbsoluteUri}", + reservationId, absoluteUri); + return true; + } + else + { + var errorContent = await response.Content.ReadAsStringAsync(); + _logger.LogWarning( + "Cancellation request failed for reservation {ReservationId} via {AbsoluteUri}. Status Code: {StatusCode}. Response: {Response}", + reservationId, absoluteUri, response.StatusCode, errorContent); + return false; + } + } + catch (HttpRequestException ex) + { + _logger.LogError(ex, "HTTP request failed when calling {AbsoluteUri}. Status Code: {StatusCode}", + absoluteUri, ex.StatusCode); + return false; + } + catch (Exception ex) + { + _logger.LogError(ex, + "An unexpected error occurred during CancelReservationAsync for URI {AbsoluteUri}", + absoluteUri); + return false; + } + } + } +} \ No newline at end of file diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Services/ReservationResult.cs b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Services/ReservationResult.cs new file mode 100644 index 0000000..9e93c86 --- /dev/null +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Services/ReservationResult.cs @@ -0,0 +1,15 @@ +using System.Text.Json.Serialization; + +namespace Sagaway.ReservationDemo.ReservationUI.Services; + +public class ReservationResult +{ + [JsonPropertyName("reservationId")] + public Guid ReservationId { get; set; } + + [JsonPropertyName("customerName")] + public string? CustomerName { get; set; } + + [JsonPropertyName("carClass")] + public string? CarClass { get; set; } +} \ No newline at end of file diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Services/ReservationStatus.cs b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Services/ReservationStatus.cs new file mode 100644 index 0000000..4912218 --- /dev/null +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/Services/ReservationStatus.cs @@ -0,0 +1,19 @@ +using System.Text.Json.Serialization; + +namespace Sagaway.ReservationDemo.ReservationUI.Services; + +/// +/// Represents the status/details of a single reservation. +/// Mirrors the server's BookingInfo record. +/// +public class ReservationStatus // Renamed for clarity on client-side, but maps to BookingInfo +{ + [JsonPropertyName("id")] // Maps to BookingInfo.Id + public Guid ReservationId { get; set; } // Renamed from 'Id' for client-side consistency + + [JsonPropertyName("customerName")] + public string? CustomerName { get; set; } + + [JsonPropertyName("isReserved")] // Maps to BookingInfo.IsReserved + public bool IsReserved { get; set; } +} \ No newline at end of file diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/_Imports.razor b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/_Imports.razor new file mode 100644 index 0000000..b51f91f --- /dev/null +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/_Imports.razor @@ -0,0 +1,10 @@ +@using System.Net.Http +@using System.Net.Http.Json +@using Microsoft.AspNetCore.Components.Forms +@using Microsoft.AspNetCore.Components.Routing +@using Microsoft.AspNetCore.Components.Web +@using Microsoft.AspNetCore.Components.Web.Virtualization +@using Microsoft.AspNetCore.Components.WebAssembly.Http +@using Microsoft.JSInterop +@using Sagaway.ReservationDemo.ReservationUI +@using Sagaway.ReservationDemo.ReservationUI.Layout diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/nginx.conf b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/nginx.conf new file mode 100644 index 0000000..33e6f04 --- /dev/null +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/nginx.conf @@ -0,0 +1,43 @@ +# /etc/nginx/conf.d/default.conf + +server { + listen 80; + server_name localhost; + + # Root directory for Blazor app files + root /usr/share/nginx/html; + index index.html index.htm; + + # Proxy API requests to the reservation-manager service + location /reserve { + proxy_pass http://reservation-manager:80/reserve; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + location /reservations/ { + proxy_pass http://reservation-manager:80/reservations/; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } + + # Default location for Blazor files + location / { + try_files $uri $uri/ /index.html =404; + } + + # Caching for Blazor framework files + location /_framework/ { + add_header Cache-Control "public, max-age=604800"; + } + + gzip on; + gzip_vary on; + gzip_proxied any; + gzip_comp_level 6; + gzip_types text/plain text/css text/xml application/json application/javascript application/xml application/wasm application/octet-stream; +} diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/package-lock.json b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/package-lock.json new file mode 100644 index 0000000..14929a5 --- /dev/null +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/package-lock.json @@ -0,0 +1,1270 @@ +{ + "name": "sagaway.reservationdemo.reservationui", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "sagaway.reservationdemo.reservationui", + "version": "1.0.0", + "license": "ISC", + "devDependencies": { + "@tailwindcss/cli": "^4.1.4", + "autoprefixer": "^10.4.21", + "postcss": "^8.5.3", + "tailwindcss": "^4.1.4" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/cli": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/cli/-/cli-4.1.4.tgz", + "integrity": "sha512-gP05Qihh+cZ2FqD5fa0WJXx3KEk2YWUYv/RBKAyiOg0V4vYVDr/xlLc0sacpnVEXM45BVUR9U2hsESufYs6YTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@parcel/watcher": "^2.5.1", + "@tailwindcss/node": "4.1.4", + "@tailwindcss/oxide": "4.1.4", + "enhanced-resolve": "^5.18.1", + "mri": "^1.2.0", + "picocolors": "^1.1.1", + "tailwindcss": "4.1.4" + }, + "bin": { + "tailwindcss": "dist/index.mjs" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.4.tgz", + "integrity": "sha512-MT5118zaiO6x6hNA04OWInuAiP1YISXql8Z+/Y8iisV5nuhM8VXlyhRuqc2PEviPszcXI66W44bCIk500Oolhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "enhanced-resolve": "^5.18.1", + "jiti": "^2.4.2", + "lightningcss": "1.29.2", + "tailwindcss": "4.1.4" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.4.tgz", + "integrity": "sha512-p5wOpXyOJx7mKh5MXh5oKk+kqcz8T+bA3z/5VWWeQwFrmuBItGwz8Y2CHk/sJ+dNb9B0nYFfn0rj/cKHZyjahQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.4", + "@tailwindcss/oxide-darwin-arm64": "4.1.4", + "@tailwindcss/oxide-darwin-x64": "4.1.4", + "@tailwindcss/oxide-freebsd-x64": "4.1.4", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.4", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.4", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.4", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.4", + "@tailwindcss/oxide-linux-x64-musl": "4.1.4", + "@tailwindcss/oxide-wasm32-wasi": "4.1.4", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.4", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.4" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.4.tgz", + "integrity": "sha512-xMMAe/SaCN/vHfQYui3fqaBDEXMu22BVwQ33veLc8ep+DNy7CWN52L+TTG9y1K397w9nkzv+Mw+mZWISiqhmlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.4.tgz", + "integrity": "sha512-JGRj0SYFuDuAGilWFBlshcexev2hOKfNkoX+0QTksKYq2zgF9VY/vVMq9m8IObYnLna0Xlg+ytCi2FN2rOL0Sg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.4.tgz", + "integrity": "sha512-sdDeLNvs3cYeWsEJ4H1DvjOzaGios4QbBTNLVLVs0XQ0V95bffT3+scptzYGPMjm7xv4+qMhCDrkHwhnUySEzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.4.tgz", + "integrity": "sha512-VHxAqxqdghM83HslPhRsNhHo91McsxRJaEnShJOMu8mHmEj9Ig7ToHJtDukkuLWLzLboh2XSjq/0zO6wgvykNA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.4.tgz", + "integrity": "sha512-OTU/m/eV4gQKxy9r5acuesqaymyeSCnsx1cFto/I1WhPmi5HDxX1nkzb8KYBiwkHIGg7CTfo/AcGzoXAJBxLfg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.4.tgz", + "integrity": "sha512-hKlLNvbmUC6z5g/J4H+Zx7f7w15whSVImokLPmP6ff1QqTVE+TxUM9PGuNsjHvkvlHUtGTdDnOvGNSEUiXI1Ww==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.4.tgz", + "integrity": "sha512-X3As2xhtgPTY/m5edUtddmZ8rCruvBvtxYLMw9OsZdH01L2gS2icsHRwxdU0dMItNfVmrBezueXZCHxVeeb7Aw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.4.tgz", + "integrity": "sha512-2VG4DqhGaDSmYIu6C4ua2vSLXnJsb/C9liej7TuSO04NK+JJJgJucDUgmX6sn7Gw3Cs5ZJ9ZLrnI0QRDOjLfNQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.4.tgz", + "integrity": "sha512-v+mxVgH2kmur/X5Mdrz9m7TsoVjbdYQT0b4Z+dr+I4RvreCNXyCFELZL/DO0M1RsidZTrm6O1eMnV6zlgEzTMQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.4.tgz", + "integrity": "sha512-2TLe9ir+9esCf6Wm+lLWTMbgklIjiF0pbmDnwmhR9MksVOq+e8aP3TSsXySnBDDvTTVd/vKu1aNttEGj3P6l8Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.0", + "@emnapi/runtime": "^1.4.0", + "@emnapi/wasi-threads": "^1.0.1", + "@napi-rs/wasm-runtime": "^0.2.8", + "@tybys/wasm-util": "^0.9.0", + "tslib": "^2.8.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.4.tgz", + "integrity": "sha512-VlnhfilPlO0ltxW9/BgfLI5547PYzqBMPIzRrk4W7uupgCt8z6Trw/tAj6QUtF2om+1MH281Pg+HHUJoLesmng==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.4.tgz", + "integrity": "sha512-+7S63t5zhYjslUGb8NcgLpFXD+Kq1F/zt5Xv5qTv7HaFTG/DHyHD9GA6ieNAxhgyA4IcKa/zy7Xx4Oad2/wuhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001715", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001715.tgz", + "integrity": "sha512-7ptkFGMm2OAOgvZpwgA4yjQ5SQbrNVGdRjzH0pBdy1Fasvcr+KAeECmbCAECzTuDuoX0FCY8KzUxjf9+9kfZEw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.143", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.143.tgz", + "integrity": "sha512-QqklJMOFBMqe46k8iIOwA9l2hz57V2OKMmP5eSWcUvwx+mASAsbU+wkF1pHjn9ZVSBPrsYWr4/W/95y5SwYg2g==", + "dev": true, + "license": "ISC" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", + "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jiti": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", + "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/lightningcss": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", + "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-darwin-arm64": "1.29.2", + "lightningcss-darwin-x64": "1.29.2", + "lightningcss-freebsd-x64": "1.29.2", + "lightningcss-linux-arm-gnueabihf": "1.29.2", + "lightningcss-linux-arm64-gnu": "1.29.2", + "lightningcss-linux-arm64-musl": "1.29.2", + "lightningcss-linux-x64-gnu": "1.29.2", + "lightningcss-linux-x64-musl": "1.29.2", + "lightningcss-win32-arm64-msvc": "1.29.2", + "lightningcss-win32-x64-msvc": "1.29.2" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", + "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", + "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", + "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", + "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", + "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", + "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", + "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", + "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", + "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.29.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", + "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss/node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.4.tgz", + "integrity": "sha512-1ZIUqtPITFbv/DxRmDr5/agPqJwF69d24m9qmM1939TJehgY539CtzeZRjbLt5G6fSy/7YqqYsfvoTEw9xUI2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + } + } +} diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/package.json b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/package.json new file mode 100644 index 0000000..5cfa53a --- /dev/null +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/package.json @@ -0,0 +1,19 @@ +{ + "name": "sagaway.reservationdemo.reservationui", + "version": "1.0.0", + "main": "index.js", + "scripts": { + "build:css": "npx @tailwindcss/cli -i ./wwwroot/css/app.css -o ./wwwroot/css/app.output.css --minify", + "watch:css": "npx @tailwindcss/cli -i ./wwwroot/css/app.css -o ./wwwroot/css/app.output.css --watch" +}, + "keywords": [], + "author": "", + "license": "ISC", + "description": "", + "devDependencies": { + "@tailwindcss/cli": "^4.1.4", + "autoprefixer": "^10.4.21", + "postcss": "^8.5.3", + "tailwindcss": "^4.1.4" + } +} diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/postcss.config.js b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/postcss.config.js new file mode 100644 index 0000000..28d577f --- /dev/null +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/postcss.config.js @@ -0,0 +1,7 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + } + } + \ No newline at end of file diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/tailwind.config.js b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/tailwind.config.js new file mode 100644 index 0000000..60af78e --- /dev/null +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/tailwind.config.js @@ -0,0 +1,11 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + // Ensure this pattern correctly finds your Blazor files + './**/*.{razor,html,cshtml}' + ], + theme: { + extend: {}, + }, + plugins: [], +} \ No newline at end of file diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/wwwroot/css/app.css b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/wwwroot/css/app.css new file mode 100644 index 0000000..c61e901 --- /dev/null +++ b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/wwwroot/css/app.css @@ -0,0 +1,119 @@ +/* Styles/app.css */ +@import "tailwindcss"; + +html, body { + font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; +} + +h1:focus { + outline: none; +} + +a, .btn-link { + color: #0071c1; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} + +.btn:focus, .btn:active:focus, .btn-link.nav-link:focus, .form-control:focus, .form-check-input:focus { + box-shadow: 0 0 0 0.1rem white, 0 0 0 0.25rem #258cfb; +} + +.content { + padding-top: 1.1rem; +} + +.valid.modified:not([type=checkbox]) { + outline: 1px solid #26b050; +} + +.invalid { + outline: 1px solid red; +} + +.validation-message { + color: red; +} + +#blazor-error-ui { + color-scheme: light only; + background: lightyellow; + bottom: 0; + box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2); + box-sizing: border-box; + display: none; + left: 0; + padding: 0.6rem 1.25rem 0.7rem 1.25rem; + position: fixed; + width: 100%; + z-index: 1000; +} + + #blazor-error-ui .dismiss { + cursor: pointer; + position: absolute; + right: 0.75rem; + top: 0.5rem; + } + +.blazor-error-boundary { + background: url(data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTYiIGhlaWdodD0iNDkiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIG92ZXJmbG93PSJoaWRkZW4iPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDAiPjxyZWN0IHg9IjIzNSIgeT0iNTEiIHdpZHRoPSI1NiIgaGVpZ2h0PSI0OSIvPjwvY2xpcFBhdGg+PC9kZWZzPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMCkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMzUgLTUxKSI+PHBhdGggZD0iTTI2My41MDYgNTFDMjY0LjcxNyA1MSAyNjUuODEzIDUxLjQ4MzcgMjY2LjYwNiA1Mi4yNjU4TDI2Ny4wNTIgNTIuNzk4NyAyNjcuNTM5IDUzLjYyODMgMjkwLjE4NSA5Mi4xODMxIDI5MC41NDUgOTIuNzk1IDI5MC42NTYgOTIuOTk2QzI5MC44NzcgOTMuNTEzIDI5MSA5NC4wODE1IDI5MSA5NC42NzgyIDI5MSA5Ny4wNjUxIDI4OS4wMzggOTkgMjg2LjYxNyA5OUwyNDAuMzgzIDk5QzIzNy45NjMgOTkgMjM2IDk3LjA2NTEgMjM2IDk0LjY3ODIgMjM2IDk0LjM3OTkgMjM2LjAzMSA5NC4wODg2IDIzNi4wODkgOTMuODA3MkwyMzYuMzM4IDkzLjAxNjIgMjM2Ljg1OCA5Mi4xMzE0IDI1OS40NzMgNTMuNjI5NCAyNTkuOTYxIDUyLjc5ODUgMjYwLjQwNyA1Mi4yNjU4QzI2MS4yIDUxLjQ4MzcgMjYyLjI5NiA1MSAyNjMuNTA2IDUxWk0yNjMuNTg2IDY2LjAxODNDMjYwLjczNyA2Ni4wMTgzIDI1OS4zMTMgNjcuMTI0NSAyNTkuMzEzIDY5LjMzNyAyNTkuMzEzIDY5LjYxMDIgMjU5LjMzMiA2OS44NjA4IDI1OS4zNzEgNzAuMDg4N0wyNjEuNzk1IDg0LjAxNjEgMjY1LjM4IDg0LjAxNjEgMjY3LjgyMSA2OS43NDc1QzI2Ny44NiA2OS43MzA5IDI2Ny44NzkgNjkuNTg3NyAyNjcuODc5IDY5LjMxNzkgMjY3Ljg3OSA2Ny4xMTgyIDI2Ni40NDggNjYuMDE4MyAyNjMuNTg2IDY2LjAxODNaTTI2My41NzYgODYuMDU0N0MyNjEuMDQ5IDg2LjA1NDcgMjU5Ljc4NiA4Ny4zMDA1IDI1OS43ODYgODkuNzkyMSAyNTkuNzg2IDkyLjI4MzcgMjYxLjA0OSA5My41Mjk1IDI2My41NzYgOTMuNTI5NSAyNjYuMTE2IDkzLjUyOTUgMjY3LjM4NyA5Mi4yODM3IDI2Ny4zODcgODkuNzkyMSAyNjcuMzg3IDg3LjMwMDUgMjY2LjExNiA4Ni4wNTQ3IDI2My41NzYgODYuMDU0N1oiIGZpbGw9IiNGRkU1MDAiIGZpbGwtcnVsZT0iZXZlbm9kZCIvPjwvZz48L3N2Zz4=) no-repeat 1rem/1.8rem, #b32121; + padding: 1rem 1rem 1rem 3.7rem; + color: white; +} + + .blazor-error-boundary::after { + content: "An error has occurred." + } + +.loading-progress { + position: relative; + display: block; + width: 8rem; + height: 8rem; + margin: 20vh auto 1rem auto; +} + + .loading-progress circle { + fill: none; + stroke: #e0e0e0; + stroke-width: 0.6rem; + transform-origin: 50% 50%; + transform: rotate(-90deg); + } + + .loading-progress circle:last-child { + stroke: #1b6ec2; + stroke-dasharray: calc(3.141 * var(--blazor-load-percentage, 0%) * 0.8), 500%; + transition: stroke-dasharray 0.05s ease-in-out; + } + +.loading-progress-text { + position: absolute; + text-align: center; + font-weight: bold; + inset: calc(20vh + 3.25rem) 0 auto 0.2rem; +} + + .loading-progress-text:after { + content: var(--blazor-load-percentage-text, "Loading"); + } + +code { + color: #c02d76; +} + +.form-floating > .form-control-plaintext::placeholder, .form-floating > .form-control::placeholder { + color: var(--bs-secondary-color); + text-align: end; +} + +.form-floating > .form-control-plaintext:focus::placeholder, .form-floating > .form-control:focus::placeholder { + text-align: start; +} + +/* You can add custom base styles or components below if needed */ \ No newline at end of file diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/wwwroot/favicon.png b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/wwwroot/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8422b59695935d180d11d5dbe99653e711097819 GIT binary patch literal 1148 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 literal 0 HcmV?d00001 diff --git a/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/wwwroot/images/EconomyCar.png b/Sagaway.ReservationDemo/Sagaway.ReservationDemo.ReservationUI/wwwroot/images/EconomyCar.png new file mode 100644 index 0000000000000000000000000000000000000000..3b21ff55d1bed49a177cd00bf2383fc55b72e97e GIT binary patch literal 645846 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