From c921fbf2982a6bdbd9f85cb423686ceddcd8fada Mon Sep 17 00:00:00 2001 From: qdraw Date: Wed, 10 Jan 2024 05:48:36 +0000 Subject: [PATCH 01/31] Auto .NET SDK version Upgrade to 6.0.418 --- .../workflows/auto-update-swagger-dotnet.yml | 2 +- ...elease-on-tag-netcore-desktop-electron.yml | 2 +- .../starsky-codecov-clientapp-netcore.yml | 2 +- .../workflows/starsky-dotnetcore-ubuntu.yml | 2 +- .../workflows/starsky-dotnetcore-windows.yml | 2 +- .../starsky-sonarqube-clientapp-netcore.yml | 2 +- pipelines/azure/steps/use_dotnet_version.yml | 4 +-- starsky/global.json | 2 +- starsky/nuget-packages-list.json | 26 +++++++++---------- .../starsky.feature.health.csproj | 6 ++--- ...tarsky.foundation.accountmanagement.csproj | 2 +- .../starsky.foundation.database.csproj | 14 +++++----- ...tarsky.foundation.databasetelemetry.csproj | 2 +- starsky/starsky/starsky.csproj | 4 +-- .../starskyadmincli/starskyadmincli.csproj | 2 +- .../starskydemoseedcli.csproj | 2 +- starsky/starskygeocli/starskygeocli.csproj | 2 +- .../starskyimportercli.csproj | 2 +- .../starskysynchronizecli.csproj | 2 +- starsky/starskytest/starskytest.csproj | 6 ++--- .../starskythumbnailcli.csproj | 2 +- .../starskythumbnailmetacli.csproj | 2 +- .../starskywebftpcli/starskywebftpcli.csproj | 2 +- .../starskywebhtmlcli.csproj | 2 +- 24 files changed, 48 insertions(+), 48 deletions(-) diff --git a/.github/workflows/auto-update-swagger-dotnet.yml b/.github/workflows/auto-update-swagger-dotnet.yml index 46020571f4..191b392f81 100644 --- a/.github/workflows/auto-update-swagger-dotnet.yml +++ b/.github/workflows/auto-update-swagger-dotnet.yml @@ -29,7 +29,7 @@ jobs: - name: Setup .NET Core uses: actions/setup-dotnet@v4 with: - dotnet-version: 6.0.417 + dotnet-version: 6.0.418 - name: Cache nuget packages (*nix) uses: actions/cache@v3 diff --git a/.github/workflows/release-on-tag-netcore-desktop-electron.yml b/.github/workflows/release-on-tag-netcore-desktop-electron.yml index 82fdb67053..f0919189cc 100644 --- a/.github/workflows/release-on-tag-netcore-desktop-electron.yml +++ b/.github/workflows/release-on-tag-netcore-desktop-electron.yml @@ -22,7 +22,7 @@ jobs: - name: Setup .NET Core uses: actions/setup-dotnet@v4 with: - dotnet-version: 6.0.417 + dotnet-version: 6.0.418 - name: Build --no-unit-test linux-arm,linux-arm64,win-x64,osx-x64,linux-x64 shell: bash diff --git a/.github/workflows/starsky-codecov-clientapp-netcore.yml b/.github/workflows/starsky-codecov-clientapp-netcore.yml index d707255229..58937b294a 100644 --- a/.github/workflows/starsky-codecov-clientapp-netcore.yml +++ b/.github/workflows/starsky-codecov-clientapp-netcore.yml @@ -33,7 +33,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: 6.0.417 + dotnet-version: 6.0.418 - name: Cache node modules clientapp (*nix) uses: actions/cache@v3 diff --git a/.github/workflows/starsky-dotnetcore-ubuntu.yml b/.github/workflows/starsky-dotnetcore-ubuntu.yml index e0d1a4a287..17330a043a 100644 --- a/.github/workflows/starsky-dotnetcore-ubuntu.yml +++ b/.github/workflows/starsky-dotnetcore-ubuntu.yml @@ -38,7 +38,7 @@ jobs: - name: Setup .NET Core uses: actions/setup-dotnet@v4 with: - dotnet-version: 6.0.417 + dotnet-version: 6.0.418 - name: Cache nuget packages (*nix) uses: actions/cache@v3 diff --git a/.github/workflows/starsky-dotnetcore-windows.yml b/.github/workflows/starsky-dotnetcore-windows.yml index 1668c0dccd..d2026de7c5 100644 --- a/.github/workflows/starsky-dotnetcore-windows.yml +++ b/.github/workflows/starsky-dotnetcore-windows.yml @@ -35,7 +35,7 @@ jobs: - name: Setup .NET Core uses: actions/setup-dotnet@v4 with: - dotnet-version: 6.0.417 + dotnet-version: 6.0.418 - name: Build (Windows) shell: pwsh diff --git a/.github/workflows/starsky-sonarqube-clientapp-netcore.yml b/.github/workflows/starsky-sonarqube-clientapp-netcore.yml index c4e8875132..504beec05d 100644 --- a/.github/workflows/starsky-sonarqube-clientapp-netcore.yml +++ b/.github/workflows/starsky-sonarqube-clientapp-netcore.yml @@ -43,7 +43,7 @@ jobs: - name: Setup .NET SDK uses: actions/setup-dotnet@v4 with: - dotnet-version: 6.0.417 + dotnet-version: 6.0.418 - name: Use Java 17 uses: actions/setup-java@v4 diff --git a/pipelines/azure/steps/use_dotnet_version.yml b/pipelines/azure/steps/use_dotnet_version.yml index 80a58ee5a6..6c552acec2 100644 --- a/pipelines/azure/steps/use_dotnet_version.yml +++ b/pipelines/azure/steps/use_dotnet_version.yml @@ -1,8 +1,8 @@ steps: - task: UseDotNet@2 - displayName: 'Use .NET Core sdk 6.0.417' + displayName: 'Use .NET Core sdk 6.0.418' enabled: true inputs: packageType: sdk - version: 6.0.417 + version: 6.0.418 installationPath: $(Agent.ToolsDirectory)/dotnet diff --git a/starsky/global.json b/starsky/global.json index d4c5f4ad49..2b9cc12a65 100644 --- a/starsky/global.json +++ b/starsky/global.json @@ -1,7 +1,7 @@ { "strictVersion": true, "sdk": { - "version": "6.0.417", + "version": "6.0.418", "rollForward": "disable", "allowPrerelease": false } diff --git a/starsky/nuget-packages-list.json b/starsky/nuget-packages-list.json index 1abae6c601..f5a7b05029 100644 --- a/starsky/nuget-packages-list.json +++ b/starsky/nuget-packages-list.json @@ -1,5 +1,5 @@ [ - "Microsoft.AspNetCore.Mvc.NewtonsoftJson 6.0.25", + "Microsoft.AspNetCore.Mvc.NewtonsoftJson 6.0.26", "Microsoft.Extensions.Hosting.WindowsServices 6.0.2", "SQLitePCLRaw.lib.e_sqlite3.linux 1.1.14", "Swashbuckle.AspNetCore 6.5.0", @@ -7,25 +7,25 @@ "Microsoft.Extensions.Caching.Memory 6.0.1", "Microsoft.Extensions.Hosting.Abstractions 6.0.0", "NGeoNames 1.5.1", - "Microsoft.Extensions.Diagnostics.HealthChecks 6.0.25", - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions 6.0.25", + "Microsoft.Extensions.Diagnostics.HealthChecks 6.0.26", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions 6.0.26", "AspNetCore.HealthChecks.MySql 6.0.2", "AspNetCore.HealthChecks.Sqlite 6.0.2", - "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore 6.0.25", + "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore 6.0.26", "MedallionShell 1.6.2", "RazorLight 2.3.1", "SixLabors.ImageSharp 3.1.1", "SixLabors.ImageSharp.Drawing 2.1.0", - "Microsoft.AspNetCore.Authorization 6.0.25", + "Microsoft.AspNetCore.Authorization 6.0.26", "Microsoft.ApplicationInsights.WorkerService 2.22.0", "Microsoft.Extensions.DependencyInjection.Abstractions 6.0.0", - "Microsoft.EntityFrameworkCore.Analyzers 6.0.25", - "Microsoft.EntityFrameworkCore.Design 6.0.25", - "Microsoft.EntityFrameworkCore.InMemory 6.0.25", - "Microsoft.EntityFrameworkCore.Sqlite 6.0.25", - "Microsoft.EntityFrameworkCore 6.0.25", - "Microsoft.EntityFrameworkCore.Relational 6.0.25", - "Microsoft.Extensions.Identity.Stores 6.0.25", + "Microsoft.EntityFrameworkCore.Analyzers 6.0.26", + "Microsoft.EntityFrameworkCore.Design 6.0.26", + "Microsoft.EntityFrameworkCore.InMemory 6.0.26", + "Microsoft.EntityFrameworkCore.Sqlite 6.0.26", + "Microsoft.EntityFrameworkCore 6.0.26", + "Microsoft.EntityFrameworkCore.Relational 6.0.26", + "Microsoft.Extensions.Identity.Stores 6.0.26", "Pomelo.EntityFrameworkCore.MySql 6.0.2", "System.ComponentModel.Annotations 5.0.0", "Microsoft.ApplicationInsights 2.22.0", @@ -56,7 +56,7 @@ "OpenTelemetry.Instrumentation.Http 1.7.0", "OpenTelemetry.Instrumentation.Runtime 1.5.1", "System.Text.Json 6.0.7", - "Microsoft.AspNetCore.Identity.EntityFrameworkCore 6.0.25", + "Microsoft.AspNetCore.Identity.EntityFrameworkCore 6.0.26", "Microsoft.Extensions.Hosting 6.0.1", "Microsoft.NET.Test.Sdk 17.8.0", "MSTest.TestAdapter 3.1.1", diff --git a/starsky/starsky.feature.health/starsky.feature.health.csproj b/starsky/starsky.feature.health/starsky.feature.health.csproj index 602256e0aa..b6692d334c 100644 --- a/starsky/starsky.feature.health/starsky.feature.health.csproj +++ b/starsky/starsky.feature.health/starsky.feature.health.csproj @@ -13,11 +13,11 @@ - - + + - + diff --git a/starsky/starsky.foundation.accountmanagement/starsky.foundation.accountmanagement.csproj b/starsky/starsky.foundation.accountmanagement/starsky.foundation.accountmanagement.csproj index 6974496b5d..5e0d4b609c 100644 --- a/starsky/starsky.foundation.accountmanagement/starsky.foundation.accountmanagement.csproj +++ b/starsky/starsky.foundation.accountmanagement/starsky.foundation.accountmanagement.csproj @@ -14,7 +14,7 @@ - + diff --git a/starsky/starsky.foundation.database/starsky.foundation.database.csproj b/starsky/starsky.foundation.database/starsky.foundation.database.csproj index 9b330ebd9a..c76beec33f 100644 --- a/starsky/starsky.foundation.database/starsky.foundation.database.csproj +++ b/starsky/starsky.foundation.database/starsky.foundation.database.csproj @@ -11,13 +11,13 @@ - - - - - - - + + + + + + + diff --git a/starsky/starsky.foundation.databasetelemetry/starsky.foundation.databasetelemetry.csproj b/starsky/starsky.foundation.databasetelemetry/starsky.foundation.databasetelemetry.csproj index cb485384e2..4d8a59dc11 100644 --- a/starsky/starsky.foundation.databasetelemetry/starsky.foundation.databasetelemetry.csproj +++ b/starsky/starsky.foundation.databasetelemetry/starsky.foundation.databasetelemetry.csproj @@ -12,7 +12,7 @@ - + diff --git a/starsky/starsky/starsky.csproj b/starsky/starsky/starsky.csproj index 94959dfc7e..220a17446a 100644 --- a/starsky/starsky/starsky.csproj +++ b/starsky/starsky/starsky.csproj @@ -1,7 +1,7 @@  net6.0 - 6.0.25 + 6.0.26 An attempt to create a database driven photo library 0.5.14 @@ -54,7 +54,7 @@ 0 - + diff --git a/starsky/starskyadmincli/starskyadmincli.csproj b/starsky/starskyadmincli/starskyadmincli.csproj index af3a7dade0..252d7a2757 100644 --- a/starsky/starskyadmincli/starskyadmincli.csproj +++ b/starsky/starskyadmincli/starskyadmincli.csproj @@ -5,7 +5,7 @@ net6.0 {dcf1f6cb-1c65-4394-bef7-cccc2967b56c} - 6.0.25 + 6.0.26 Full 0.5.14 diff --git a/starsky/starskydemoseedcli/starskydemoseedcli.csproj b/starsky/starskydemoseedcli/starskydemoseedcli.csproj index 9625e7e5bf..442cbc5385 100644 --- a/starsky/starskydemoseedcli/starskydemoseedcli.csproj +++ b/starsky/starskydemoseedcli/starskydemoseedcli.csproj @@ -5,7 +5,7 @@ enable {215a3302-a418-4148-8d20-1127e27c3dae} - 6.0.25 + 6.0.26 Full 0.5.14 diff --git a/starsky/starskygeocli/starskygeocli.csproj b/starsky/starskygeocli/starskygeocli.csproj index d8ef0f69f1..bcf5e30c8c 100644 --- a/starsky/starskygeocli/starskygeocli.csproj +++ b/starsky/starskygeocli/starskygeocli.csproj @@ -5,7 +5,7 @@ enable {a030c158-2f79-4317-a9f9-bdd46d66d1d8} - 6.0.25 + 6.0.26 Full 0.5.14 diff --git a/starsky/starskyimportercli/starskyimportercli.csproj b/starsky/starskyimportercli/starskyimportercli.csproj index 804088a2c7..86ed4ddbb6 100644 --- a/starsky/starskyimportercli/starskyimportercli.csproj +++ b/starsky/starskyimportercli/starskyimportercli.csproj @@ -4,7 +4,7 @@ net6.0 {23e4ea86-970a-4de1-badc-8d7e9d3d4dd6} - 6.0.25 + 6.0.26 Full 0.5.14 diff --git a/starsky/starskysynchronizecli/starskysynchronizecli.csproj b/starsky/starskysynchronizecli/starskysynchronizecli.csproj index 81c472535b..b70b3cae01 100644 --- a/starsky/starskysynchronizecli/starskysynchronizecli.csproj +++ b/starsky/starskysynchronizecli/starskysynchronizecli.csproj @@ -5,7 +5,7 @@ net6.0 {7e1136a7-cc43-49d2-91d3-48e557f0fb66} - 6.0.25 + 6.0.26 starskysynchronizecli 0.5.14 diff --git a/starsky/starskytest/starskytest.csproj b/starsky/starskytest/starskytest.csproj index feaf3ed6c3..8f457cd515 100644 --- a/starsky/starskytest/starskytest.csproj +++ b/starsky/starskytest/starskytest.csproj @@ -2,7 +2,7 @@ net6.0 - 6.0.25 + 6.0.26 Full {b3342a3e-64e1-442f-b4f7-f7a718508aac} @@ -21,8 +21,8 @@ - - + + diff --git a/starsky/starskythumbnailcli/starskythumbnailcli.csproj b/starsky/starskythumbnailcli/starskythumbnailcli.csproj index b2a1f50627..ceedfe496c 100644 --- a/starsky/starskythumbnailcli/starskythumbnailcli.csproj +++ b/starsky/starskythumbnailcli/starskythumbnailcli.csproj @@ -5,7 +5,7 @@ net6.0 {67e3fb34-1ca8-4a28-a0e0-00ff61821002} - 6.0.25 + 6.0.26 starskythumbnailcli 0.5.14 diff --git a/starsky/starskythumbnailmetacli/starskythumbnailmetacli.csproj b/starsky/starskythumbnailmetacli/starskythumbnailmetacli.csproj index 027d39bdbe..7fc1f87795 100644 --- a/starsky/starskythumbnailmetacli/starskythumbnailmetacli.csproj +++ b/starsky/starskythumbnailmetacli/starskythumbnailmetacli.csproj @@ -5,7 +5,7 @@ net6.0 {a0cce905-ae43-4d1b-a97a-2bcd2c010ed1} - 6.0.25 + 6.0.26 starskythumbnailmetacli 0.5.14 diff --git a/starsky/starskywebftpcli/starskywebftpcli.csproj b/starsky/starskywebftpcli/starskywebftpcli.csproj index 0272edd402..95d9d2ef20 100644 --- a/starsky/starskywebftpcli/starskywebftpcli.csproj +++ b/starsky/starskywebftpcli/starskywebftpcli.csproj @@ -4,7 +4,7 @@ Exe net6.0 {eb1d57d1-29d8-4bfb-950e-447ef8522a10} - 6.0.25 + 6.0.26 Full 0.5.14 diff --git a/starsky/starskywebhtmlcli/starskywebhtmlcli.csproj b/starsky/starskywebhtmlcli/starskywebhtmlcli.csproj index 598a69ca63..4a07b9bc08 100644 --- a/starsky/starskywebhtmlcli/starskywebhtmlcli.csproj +++ b/starsky/starskywebhtmlcli/starskywebhtmlcli.csproj @@ -3,7 +3,7 @@ Exe net6.0 {76d7bf62-9f1d-48f1-9035-dceb01de55c3} - 6.0.25 + 6.0.26 8.0 true Full From 6d962b994a224d2ec21195d99dc3e4bf4665a8e1 Mon Sep 17 00:00:00 2001 From: Dion Date: Wed, 10 Jan 2024 11:32:24 +0100 Subject: [PATCH 02/31] WIP --- starsky/nuget-packages-list.json | 10 ++++------ .../Extensions/OpenTelemetryExtension.cs | 2 +- .../Helpers/SetupLogging.cs | 1 - .../starsky.foundation.webtelemetry.csproj | 11 +++++------ 4 files changed, 10 insertions(+), 14 deletions(-) diff --git a/starsky/nuget-packages-list.json b/starsky/nuget-packages-list.json index f5a7b05029..3c05f2748c 100644 --- a/starsky/nuget-packages-list.json +++ b/starsky/nuget-packages-list.json @@ -47,13 +47,11 @@ "MetadataExtractor 2.8.1", "Microsoft.ApplicationInsights.AspNetCore 2.22.0", "Microsoft.Extensions.Logging.Console 6.0.0", - "OpenTelemetry 1.7.0", - "OpenTelemetry.Api 1.7.0", - "OpenTelemetry.Exporter.Console 1.7.0", - "OpenTelemetry.Exporter.OpenTelemetryProtocol 1.7.0", + "OpenTelemetry 1.6.0", + "OpenTelemetry.Api 1.6.0", + "OpenTelemetry.Exporter.OpenTelemetryProtocol 1.6.0", "OpenTelemetry.Extensions.Hosting 1.6.0", - "OpenTelemetry.Instrumentation.AspNetCore 1.6.0", - "OpenTelemetry.Instrumentation.Http 1.7.0", + "OpenTelemetry.Instrumentation.AspNetCore 1.6.0-rc.1", "OpenTelemetry.Instrumentation.Runtime 1.5.1", "System.Text.Json 6.0.7", "Microsoft.AspNetCore.Identity.EntityFrameworkCore 6.0.26", diff --git a/starsky/starsky.foundation.webtelemetry/Extensions/OpenTelemetryExtension.cs b/starsky/starsky.foundation.webtelemetry/Extensions/OpenTelemetryExtension.cs index 3fb7a94de9..a1a0dfeeeb 100644 --- a/starsky/starsky.foundation.webtelemetry/Extensions/OpenTelemetryExtension.cs +++ b/starsky/starsky.foundation.webtelemetry/Extensions/OpenTelemetryExtension.cs @@ -63,10 +63,10 @@ public static void AddOpenTelemetryMonitoring( return; } + // AddHttpClientInstrumentation from OpenTelemetry.Instrumentation.Http telemetryBuilder.WithMetrics(metrics => metrics.AddAspNetCoreInstrumentation() .AddRuntimeInstrumentation() - .AddHttpClientInstrumentation() .AddOtlpExporter( o => { diff --git a/starsky/starsky.foundation.webtelemetry/Helpers/SetupLogging.cs b/starsky/starsky.foundation.webtelemetry/Helpers/SetupLogging.cs index 040e8ce6aa..4b4bfeab37 100644 --- a/starsky/starsky.foundation.webtelemetry/Helpers/SetupLogging.cs +++ b/starsky/starsky.foundation.webtelemetry/Helpers/SetupLogging.cs @@ -25,7 +25,6 @@ public static void AddTelemetryLogging(this IServiceCollection services, AppSett { logging.AddOpenTelemetry(builder => builder.AddOtlpExporter( - "logging", options => { options.Protocol = OtlpExportProtocol.HttpProtobuf; diff --git a/starsky/starsky.foundation.webtelemetry/starsky.foundation.webtelemetry.csproj b/starsky/starsky.foundation.webtelemetry/starsky.foundation.webtelemetry.csproj index cc8776c41b..1160d70966 100644 --- a/starsky/starsky.foundation.webtelemetry/starsky.foundation.webtelemetry.csproj +++ b/starsky/starsky.foundation.webtelemetry/starsky.foundation.webtelemetry.csproj @@ -21,15 +21,14 @@ + - - - - + + + - - + From 05101ca3e0b3dcdbf9509a3e11496829b2ec6a40 Mon Sep 17 00:00:00 2001 From: Dion Date: Wed, 10 Jan 2024 12:06:48 +0100 Subject: [PATCH 03/31] .NET 8 --- .../workflows/auto-update-swagger-dotnet.yml | 2 +- ...elease-on-tag-netcore-desktop-electron.yml | 2 +- .../starsky-codecov-clientapp-netcore.yml | 2 +- .../workflows/starsky-dotnetcore-ubuntu.yml | 2 +- .../workflows/starsky-dotnetcore-windows.yml | 2 +- .../starsky-sonarqube-clientapp-netcore.yml | 2 +- pipelines/azure/steps/use_dotnet_version.yml | 4 ++-- .../build-tools/dotnet-sdk-version-update.js | 2 +- starsky/Dockerfile | 4 ++-- starsky/build/_build.csproj | 5 +++-- starsky/global.json | 2 +- starsky/nuget-packages-list.json | 7 ++++--- .../starsky.feature.demo.csproj | 2 +- .../starsky.feature.export.csproj | 2 +- .../starsky.feature.geolookup.csproj | 8 ++++---- .../HealthCheck/SetupHealthCheck.cs | 2 +- .../starsky.feature.health.csproj | 12 +++++------ .../starsky.feature.import.csproj | 2 +- .../starsky.feature.metaupdate.csproj | 2 +- .../starsky.feature.packagetelemetry.csproj | 2 +- .../starsky.feature.realtime.csproj | 2 +- .../starsky.feature.rename.csproj | 2 +- .../starsky.feature.search.csproj | 2 +- .../starsky.feature.syncbackground.csproj | 4 ++-- .../starsky.feature.thumbnail.csproj | 2 +- .../starsky.feature.trash.csproj | 2 +- .../starsky.feature.webftppublish.csproj | 2 +- .../starsky.feature.webhtmlpublish.csproj | 4 ++-- ...tarsky.foundation.accountmanagement.csproj | 4 ++-- ...starsky.foundation.consoletelemetry.csproj | 5 +++-- .../starsky.foundation.database.csproj | 19 +++++++++--------- ...tarsky.foundation.databasetelemetry.csproj | 4 ++-- .../starsky.foundation.http.csproj | 7 +------ .../starsky.foundation.injection.csproj | 6 +++--- .../starsky.foundation.native.csproj | 2 +- .../starsky.foundation.platform.csproj | 18 ++++++++--------- .../starsky.foundation.readmeta.csproj | 6 +++--- .../starsky.foundation.realtime.csproj | 6 +++--- .../starsky.foundation.settings.csproj | 2 +- .../starsky.foundation.storage.csproj | 2 +- .../starsky.foundation.sync.csproj | 4 ++-- ...rsky.foundation.thumbnailgeneration.csproj | 4 ++-- .../starsky.foundation.thumbnailmeta.csproj | 4 ++-- .../starsky.foundation.webtelemetry.csproj | 20 +++++++++---------- .../starsky.foundation.worker.csproj | 4 ++-- .../starsky.foundation.writemeta.csproj | 4 ++-- starsky/starsky/starsky.csproj | 8 ++++---- .../starskyadmincli/starskyadmincli.csproj | 4 ++-- starsky/starskycore/starskycore.csproj | 2 +- .../starskydemoseedcli.csproj | 4 ++-- starsky/starskygeocli/starskygeocli.csproj | 4 ++-- .../starskyimportercli.csproj | 4 ++-- .../starskysynchronizecli.csproj | 4 ++-- .../NotificationQueryErrorTest.cs | 10 +++++++++- .../QueryTest/QueryUpdateItem_Error.cs | 10 +++++++++- .../Thumbnails/ThumbnailQueryErrorTest.cs | 10 +++++++++- .../Services/UpdateBackgroundTaskQueueTest.cs | 3 +-- starsky/starskytest/starskytest.csproj | 12 +++++------ .../starskythumbnailcli.csproj | 4 ++-- .../starskythumbnailmetacli.csproj | 4 ++-- .../starskywebftpcli/starskywebftpcli.csproj | 4 ++-- .../starskywebhtmlcli.csproj | 4 ++-- starskydesktop/Dockerfile | 2 +- 63 files changed, 162 insertions(+), 140 deletions(-) diff --git a/.github/workflows/auto-update-swagger-dotnet.yml b/.github/workflows/auto-update-swagger-dotnet.yml index 191b392f81..15bda92c38 100644 --- a/.github/workflows/auto-update-swagger-dotnet.yml +++ b/.github/workflows/auto-update-swagger-dotnet.yml @@ -29,7 +29,7 @@ jobs: - name: Setup .NET Core uses: actions/setup-dotnet@v4 with: - dotnet-version: 6.0.418 + dotnet-version: 8.0.101 - name: Cache nuget packages (*nix) uses: actions/cache@v3 diff --git a/.github/workflows/release-on-tag-netcore-desktop-electron.yml b/.github/workflows/release-on-tag-netcore-desktop-electron.yml index f0919189cc..4a3178f0b0 100644 --- a/.github/workflows/release-on-tag-netcore-desktop-electron.yml +++ b/.github/workflows/release-on-tag-netcore-desktop-electron.yml @@ -22,7 +22,7 @@ jobs: - name: Setup .NET Core uses: actions/setup-dotnet@v4 with: - dotnet-version: 6.0.418 + dotnet-version: 8.0.101 - name: Build --no-unit-test linux-arm,linux-arm64,win-x64,osx-x64,linux-x64 shell: bash diff --git a/.github/workflows/starsky-codecov-clientapp-netcore.yml b/.github/workflows/starsky-codecov-clientapp-netcore.yml index 58937b294a..d0d2a1f4af 100644 --- a/.github/workflows/starsky-codecov-clientapp-netcore.yml +++ b/.github/workflows/starsky-codecov-clientapp-netcore.yml @@ -33,7 +33,7 @@ jobs: - name: Setup .NET uses: actions/setup-dotnet@v4 with: - dotnet-version: 6.0.418 + dotnet-version: 8.0.101 - name: Cache node modules clientapp (*nix) uses: actions/cache@v3 diff --git a/.github/workflows/starsky-dotnetcore-ubuntu.yml b/.github/workflows/starsky-dotnetcore-ubuntu.yml index 17330a043a..106128925e 100644 --- a/.github/workflows/starsky-dotnetcore-ubuntu.yml +++ b/.github/workflows/starsky-dotnetcore-ubuntu.yml @@ -38,7 +38,7 @@ jobs: - name: Setup .NET Core uses: actions/setup-dotnet@v4 with: - dotnet-version: 6.0.418 + dotnet-version: 8.0.101 - name: Cache nuget packages (*nix) uses: actions/cache@v3 diff --git a/.github/workflows/starsky-dotnetcore-windows.yml b/.github/workflows/starsky-dotnetcore-windows.yml index d2026de7c5..d588ad5568 100644 --- a/.github/workflows/starsky-dotnetcore-windows.yml +++ b/.github/workflows/starsky-dotnetcore-windows.yml @@ -35,7 +35,7 @@ jobs: - name: Setup .NET Core uses: actions/setup-dotnet@v4 with: - dotnet-version: 6.0.418 + dotnet-version: 8.0.101 - name: Build (Windows) shell: pwsh diff --git a/.github/workflows/starsky-sonarqube-clientapp-netcore.yml b/.github/workflows/starsky-sonarqube-clientapp-netcore.yml index 504beec05d..eb69a84761 100644 --- a/.github/workflows/starsky-sonarqube-clientapp-netcore.yml +++ b/.github/workflows/starsky-sonarqube-clientapp-netcore.yml @@ -43,7 +43,7 @@ jobs: - name: Setup .NET SDK uses: actions/setup-dotnet@v4 with: - dotnet-version: 6.0.418 + dotnet-version: 8.0.101 - name: Use Java 17 uses: actions/setup-java@v4 diff --git a/pipelines/azure/steps/use_dotnet_version.yml b/pipelines/azure/steps/use_dotnet_version.yml index 6c552acec2..26c0d4f540 100644 --- a/pipelines/azure/steps/use_dotnet_version.yml +++ b/pipelines/azure/steps/use_dotnet_version.yml @@ -1,8 +1,8 @@ steps: - task: UseDotNet@2 - displayName: 'Use .NET Core sdk 6.0.418' + displayName: 'Use .NET Core sdk 8.0.101' enabled: true inputs: packageType: sdk - version: 6.0.418 + version: 8.0.101 installationPath: $(Agent.ToolsDirectory)/dotnet diff --git a/starsky-tools/build-tools/dotnet-sdk-version-update.js b/starsky-tools/build-tools/dotnet-sdk-version-update.js index e305179ed8..0fa2ee57b4 100644 --- a/starsky-tools/build-tools/dotnet-sdk-version-update.js +++ b/starsky-tools/build-tools/dotnet-sdk-version-update.js @@ -12,7 +12,7 @@ const { getFiles } = require("./lib/get-files-directory"); const { prefixPath } = require("./lib/prefix-path.const.js"); const { httpsGet } = require("./lib/https-get.js"); -let newRunTimeVersion = "6.0.x"; +let newRunTimeVersion = "8.0.x"; // https://docs.microsoft.com/en-us/dotnet/standard/frameworks diff --git a/starsky/Dockerfile b/starsky/Dockerfile index 9601dcddee..b1e171474e 100644 --- a/starsky/Dockerfile +++ b/starsky/Dockerfile @@ -28,7 +28,7 @@ RUN echo "react done" # no alpine build since there is no support for multi-arch # docker buildx imagetools inspect mcr.microsoft.com/dotnet/sdk:6.0 -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env ARG BUILDPLATFORM ARG TARGETPLATFORM # insert demo user and content @@ -112,7 +112,7 @@ RUN if [ "$TEST" = "true" ]; then \ # build runtime image (multiarch) # docker buildx imagetools inspect mcr.microsoft.com/dotnet/aspnet:6.0 -FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS release +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS release WORKDIR /app ARG TOOLS=false diff --git a/starsky/build/_build.csproj b/starsky/build/_build.csproj index c8d173f0e8..8fd3da2786 100644 --- a/starsky/build/_build.csproj +++ b/starsky/build/_build.csproj @@ -11,9 +11,10 @@ - + + - + diff --git a/starsky/global.json b/starsky/global.json index 2b9cc12a65..41df4afed0 100644 --- a/starsky/global.json +++ b/starsky/global.json @@ -1,7 +1,7 @@ { "strictVersion": true, "sdk": { - "version": "6.0.418", + "version": "8.0.101", "rollForward": "disable", "allowPrerelease": false } diff --git a/starsky/nuget-packages-list.json b/starsky/nuget-packages-list.json index 3c05f2748c..5d98a5fd19 100644 --- a/starsky/nuget-packages-list.json +++ b/starsky/nuget-packages-list.json @@ -14,17 +14,19 @@ "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore 6.0.26", "MedallionShell 1.6.2", "RazorLight 2.3.1", - "SixLabors.ImageSharp 3.1.1", + "SixLabors.ImageSharp 3.1.2", "SixLabors.ImageSharp.Drawing 2.1.0", "Microsoft.AspNetCore.Authorization 6.0.26", "Microsoft.ApplicationInsights.WorkerService 2.22.0", "Microsoft.Extensions.DependencyInjection.Abstractions 6.0.0", + "Microsoft.Extensions.Logging 6.0.0", "Microsoft.EntityFrameworkCore.Analyzers 6.0.26", "Microsoft.EntityFrameworkCore.Design 6.0.26", "Microsoft.EntityFrameworkCore.InMemory 6.0.26", "Microsoft.EntityFrameworkCore.Sqlite 6.0.26", "Microsoft.EntityFrameworkCore 6.0.26", "Microsoft.EntityFrameworkCore.Relational 6.0.26", + "Microsoft.Extensions.DependencyInjection 6.0.1", "Microsoft.Extensions.Identity.Stores 6.0.26", "Pomelo.EntityFrameworkCore.MySql 6.0.2", "System.ComponentModel.Annotations 5.0.0", @@ -32,7 +34,6 @@ "Microsoft.ApplicationInsights.DependencyCollector 2.22.0", "Microsoft.AspNetCore.Http 2.2.2", "Microsoft.Net.Http.Headers 2.2.8", - "Microsoft.Extensions.DependencyInjection 6.0.1", "Microsoft.CSharp 4.7.0", "Microsoft.Extensions.Configuration 6.0.1", "Microsoft.Extensions.Configuration.Binder 6.0.0", @@ -53,7 +54,7 @@ "OpenTelemetry.Extensions.Hosting 1.6.0", "OpenTelemetry.Instrumentation.AspNetCore 1.6.0-rc.1", "OpenTelemetry.Instrumentation.Runtime 1.5.1", - "System.Text.Json 6.0.7", + "System.Text.Json 6.0.9", "Microsoft.AspNetCore.Identity.EntityFrameworkCore 6.0.26", "Microsoft.Extensions.Hosting 6.0.1", "Microsoft.NET.Test.Sdk 17.8.0", diff --git a/starsky/starsky.feature.demo/starsky.feature.demo.csproj b/starsky/starsky.feature.demo/starsky.feature.demo.csproj index e33c4b988c..ab6dcc8214 100644 --- a/starsky/starsky.feature.demo/starsky.feature.demo.csproj +++ b/starsky/starsky.feature.demo/starsky.feature.demo.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {34d46dc0-f965-46bf-9178-b83a9a6627e7} 0.5.14 diff --git a/starsky/starsky.feature.export/starsky.feature.export.csproj b/starsky/starsky.feature.export/starsky.feature.export.csproj index 8eeac65d05..f4492f8685 100644 --- a/starsky/starsky.feature.export/starsky.feature.export.csproj +++ b/starsky/starsky.feature.export/starsky.feature.export.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {09ccbfa9-612f-4d5e-ae27-c0c06e7114c9} 0.5.14 diff --git a/starsky/starsky.feature.geolookup/starsky.feature.geolookup.csproj b/starsky/starsky.feature.geolookup/starsky.feature.geolookup.csproj index 456e9ecb9c..d61ee3c029 100644 --- a/starsky/starsky.feature.geolookup/starsky.feature.geolookup.csproj +++ b/starsky/starsky.feature.geolookup/starsky.feature.geolookup.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {23e26a58-29c5-4d0c-813b-9f7bd991b107} starsky.feature.geolookup @@ -11,9 +11,9 @@ - - - + + + diff --git a/starsky/starsky.feature.health/HealthCheck/SetupHealthCheck.cs b/starsky/starsky.feature.health/HealthCheck/SetupHealthCheck.cs index 7a7064c05c..63d34395b3 100644 --- a/starsky/starsky.feature.health/HealthCheck/SetupHealthCheck.cs +++ b/starsky/starsky.feature.health/HealthCheck/SetupHealthCheck.cs @@ -67,7 +67,7 @@ public void BuilderHealth() _services.AddHealthChecks().AddMySql(_appSettings.DatabaseConnection); break; case AppSettings.DatabaseTypeList.Sqlite: - _services.AddHealthChecks().AddSqlite(_appSettings.DatabaseConnection, healthSqlQuery, "sqlite"); + _services.AddHealthChecks().AddSqlite(_appSettings.DatabaseConnection, healthSqlQuery); break; case AppSettings.DatabaseTypeList.InMemoryDatabase: break; diff --git a/starsky/starsky.feature.health/starsky.feature.health.csproj b/starsky/starsky.feature.health/starsky.feature.health.csproj index b6692d334c..e99903635e 100644 --- a/starsky/starsky.feature.health/starsky.feature.health.csproj +++ b/starsky/starsky.feature.health/starsky.feature.health.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {d9c8e6e0-2526-4978-ad8c-b4e74993cfd8} starsky.feature.health 0.5.14 @@ -13,11 +13,11 @@ - - - - - + + + + + diff --git a/starsky/starsky.feature.import/starsky.feature.import.csproj b/starsky/starsky.feature.import/starsky.feature.import.csproj index 4d5c32b97a..1f91877370 100644 --- a/starsky/starsky.feature.import/starsky.feature.import.csproj +++ b/starsky/starsky.feature.import/starsky.feature.import.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {e9c60bf0-09b6-40c9-95b5-25c7a185365e} 0.5.14 diff --git a/starsky/starsky.feature.metaupdate/starsky.feature.metaupdate.csproj b/starsky/starsky.feature.metaupdate/starsky.feature.metaupdate.csproj index 16157e5fc6..6b5f2a3385 100644 --- a/starsky/starsky.feature.metaupdate/starsky.feature.metaupdate.csproj +++ b/starsky/starsky.feature.metaupdate/starsky.feature.metaupdate.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 starsky.feature.metaupdate {9567d576-4dee-481b-b316-c55d493416f4} 0.5.14 diff --git a/starsky/starsky.feature.packagetelemetry/starsky.feature.packagetelemetry.csproj b/starsky/starsky.feature.packagetelemetry/starsky.feature.packagetelemetry.csproj index f33ce6a5ad..9d7cb5fb9e 100644 --- a/starsky/starsky.feature.packagetelemetry/starsky.feature.packagetelemetry.csproj +++ b/starsky/starsky.feature.packagetelemetry/starsky.feature.packagetelemetry.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 starsky.feature.packagetelemetry {6fbad8a6-53fa-41d2-98a4-61eb46d70794} 0.5.14 diff --git a/starsky/starsky.feature.realtime/starsky.feature.realtime.csproj b/starsky/starsky.feature.realtime/starsky.feature.realtime.csproj index 0219301cb5..163c3e9eaf 100644 --- a/starsky/starsky.feature.realtime/starsky.feature.realtime.csproj +++ b/starsky/starsky.feature.realtime/starsky.feature.realtime.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 starsky.feature.realtime {4a749ec1-4e6d-4c68-b69c-00c5c80f5660} 0.5.14 diff --git a/starsky/starsky.feature.rename/starsky.feature.rename.csproj b/starsky/starsky.feature.rename/starsky.feature.rename.csproj index 56b8a256f5..b8a6c88d15 100644 --- a/starsky/starsky.feature.rename/starsky.feature.rename.csproj +++ b/starsky/starsky.feature.rename/starsky.feature.rename.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {a864f834-133f-4ea8-9a4d-53e5cad837ab} 0.5.14 diff --git a/starsky/starsky.feature.search/starsky.feature.search.csproj b/starsky/starsky.feature.search/starsky.feature.search.csproj index 71462f0c4c..9d4b5e3f13 100644 --- a/starsky/starsky.feature.search/starsky.feature.search.csproj +++ b/starsky/starsky.feature.search/starsky.feature.search.csproj @@ -1,6 +1,6 @@ - net6.0 + net8.0 {c9e6cec6-c453-4c61-a955-ec65765afe0a} 0.5.14 diff --git a/starsky/starsky.feature.syncbackground/starsky.feature.syncbackground.csproj b/starsky/starsky.feature.syncbackground/starsky.feature.syncbackground.csproj index 8d48b53622..d19ece6af1 100644 --- a/starsky/starsky.feature.syncbackground/starsky.feature.syncbackground.csproj +++ b/starsky/starsky.feature.syncbackground/starsky.feature.syncbackground.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 starsky.feature.syncbackground {15e1493e-6e79-4314-907f-b3ef18eb9046} 0.5.14 @@ -13,7 +13,7 @@ - + diff --git a/starsky/starsky.feature.thumbnail/starsky.feature.thumbnail.csproj b/starsky/starsky.feature.thumbnail/starsky.feature.thumbnail.csproj index 9f08048c8b..9eee8da742 100644 --- a/starsky/starsky.feature.thumbnail/starsky.feature.thumbnail.csproj +++ b/starsky/starsky.feature.thumbnail/starsky.feature.thumbnail.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 starsky.feature.thumbnail {93a6019f-6627-483e-a18e-0d073d7b0883} 0.5.14 diff --git a/starsky/starsky.feature.trash/starsky.feature.trash.csproj b/starsky/starsky.feature.trash/starsky.feature.trash.csproj index 0a08b8ba55..83550f30f2 100644 --- a/starsky/starsky.feature.trash/starsky.feature.trash.csproj +++ b/starsky/starsky.feature.trash/starsky.feature.trash.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 starsky.feature.trash {21affb47-1f8c-458a-84bb-24959e0fda31} 0.5.14 diff --git a/starsky/starsky.feature.webftppublish/starsky.feature.webftppublish.csproj b/starsky/starsky.feature.webftppublish/starsky.feature.webftppublish.csproj index 859f9eb804..feaf8a80a0 100644 --- a/starsky/starsky.feature.webftppublish/starsky.feature.webftppublish.csproj +++ b/starsky/starsky.feature.webftppublish/starsky.feature.webftppublish.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {31df1419-6c81-4372-b7ae-a6ebb429e7e9} 0.5.14 diff --git a/starsky/starsky.feature.webhtmlpublish/starsky.feature.webhtmlpublish.csproj b/starsky/starsky.feature.webhtmlpublish/starsky.feature.webhtmlpublish.csproj index ad0a42e5ef..d2ce4dd8f8 100644 --- a/starsky/starsky.feature.webhtmlpublish/starsky.feature.webhtmlpublish.csproj +++ b/starsky/starsky.feature.webhtmlpublish/starsky.feature.webhtmlpublish.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 8.0 {7f7fe502-31a8-409b-bd0b-92d7d1bfeb31} @@ -17,7 +17,7 @@ - + diff --git a/starsky/starsky.foundation.accountmanagement/starsky.foundation.accountmanagement.csproj b/starsky/starsky.foundation.accountmanagement/starsky.foundation.accountmanagement.csproj index 5e0d4b609c..01ebda3032 100644 --- a/starsky/starsky.foundation.accountmanagement/starsky.foundation.accountmanagement.csproj +++ b/starsky/starsky.foundation.accountmanagement/starsky.foundation.accountmanagement.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {842d2080-b847-43c3-8535-e5065970dd47} starsky.foundation.accountmanagement @@ -14,7 +14,7 @@ - + diff --git a/starsky/starsky.foundation.consoletelemetry/starsky.foundation.consoletelemetry.csproj b/starsky/starsky.foundation.consoletelemetry/starsky.foundation.consoletelemetry.csproj index 3435dca407..e9c2c1f137 100644 --- a/starsky/starsky.foundation.consoletelemetry/starsky.foundation.consoletelemetry.csproj +++ b/starsky/starsky.foundation.consoletelemetry/starsky.foundation.consoletelemetry.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {9402eb61-ae4c-4e8b-8413-c47573d16c9d} Full @@ -16,7 +16,8 @@ - + + diff --git a/starsky/starsky.foundation.database/starsky.foundation.database.csproj b/starsky/starsky.foundation.database/starsky.foundation.database.csproj index c76beec33f..d8ef23590c 100644 --- a/starsky/starsky.foundation.database/starsky.foundation.database.csproj +++ b/starsky/starsky.foundation.database/starsky.foundation.database.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {46588bf9-d745-460d-a22d-d8fdfc698809} Full @@ -11,14 +11,15 @@ - - - - - - - - + + + + + + + + + diff --git a/starsky/starsky.foundation.databasetelemetry/starsky.foundation.databasetelemetry.csproj b/starsky/starsky.foundation.databasetelemetry/starsky.foundation.databasetelemetry.csproj index 4d8a59dc11..54aa069c91 100644 --- a/starsky/starsky.foundation.databasetelemetry/starsky.foundation.databasetelemetry.csproj +++ b/starsky/starsky.foundation.databasetelemetry/starsky.foundation.databasetelemetry.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {0697d621-f50c-430b-9a41-9a9992d63a2b} Full @@ -12,7 +12,7 @@ - + diff --git a/starsky/starsky.foundation.http/starsky.foundation.http.csproj b/starsky/starsky.foundation.http/starsky.foundation.http.csproj index 40f4f2f578..83b6d27c9a 100644 --- a/starsky/starsky.foundation.http/starsky.foundation.http.csproj +++ b/starsky/starsky.foundation.http/starsky.foundation.http.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {60193d91-0d92-4fc2-b469-d7691cb0e986} Full @@ -14,11 +14,6 @@ - - - - - true diff --git a/starsky/starsky.foundation.injection/starsky.foundation.injection.csproj b/starsky/starsky.foundation.injection/starsky.foundation.injection.csproj index ce698d6caf..28c0d2cc08 100644 --- a/starsky/starsky.foundation.injection/starsky.foundation.injection.csproj +++ b/starsky/starsky.foundation.injection/starsky.foundation.injection.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 starsky.foundation.injection {e1753943-96a7-4dee-afc3-234c1c83b8a3} @@ -11,8 +11,8 @@ - - + + diff --git a/starsky/starsky.foundation.native/starsky.foundation.native.csproj b/starsky/starsky.foundation.native/starsky.foundation.native.csproj index e794ee86bd..7918c8d1ee 100644 --- a/starsky/starsky.foundation.native/starsky.foundation.native.csproj +++ b/starsky/starsky.foundation.native/starsky.foundation.native.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 enable enable diff --git a/starsky/starsky.foundation.platform/starsky.foundation.platform.csproj b/starsky/starsky.foundation.platform/starsky.foundation.platform.csproj index 4c76a9c9d8..fecac1a0f0 100644 --- a/starsky/starsky.foundation.platform/starsky.foundation.platform.csproj +++ b/starsky/starsky.foundation.platform/starsky.foundation.platform.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {10a49647-83ab-43c4-a3ff-8b0767518023} Full @@ -14,16 +14,16 @@ - - - - - - - + + + + + + + - + diff --git a/starsky/starsky.foundation.readmeta/starsky.foundation.readmeta.csproj b/starsky/starsky.foundation.readmeta/starsky.foundation.readmeta.csproj index 945a5b314c..2e9c669e7f 100644 --- a/starsky/starsky.foundation.readmeta/starsky.foundation.readmeta.csproj +++ b/starsky/starsky.foundation.readmeta/starsky.foundation.readmeta.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {82ba730f-0aca-470d-ad0e-af046d422f8c} Full @@ -11,8 +11,8 @@ - - + + diff --git a/starsky/starsky.foundation.realtime/starsky.foundation.realtime.csproj b/starsky/starsky.foundation.realtime/starsky.foundation.realtime.csproj index 4805a63dfe..ce3c304915 100644 --- a/starsky/starsky.foundation.realtime/starsky.foundation.realtime.csproj +++ b/starsky/starsky.foundation.realtime/starsky.foundation.realtime.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 starsky.foundation.realtime {b90175e1-ba3f-4a18-a0ff-2cde71e8151e} @@ -12,8 +12,8 @@ - - + + diff --git a/starsky/starsky.foundation.settings/starsky.foundation.settings.csproj b/starsky/starsky.foundation.settings/starsky.foundation.settings.csproj index 6c745f7302..fb11e597cc 100644 --- a/starsky/starsky.foundation.settings/starsky.foundation.settings.csproj +++ b/starsky/starsky.foundation.settings/starsky.foundation.settings.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 starsky.foundation.settings {67e301f1-e700-4ca5-81ae-696abab1bb0f} diff --git a/starsky/starsky.foundation.storage/starsky.foundation.storage.csproj b/starsky/starsky.foundation.storage/starsky.foundation.storage.csproj index 1828bc9b3e..f70556e2fe 100644 --- a/starsky/starsky.foundation.storage/starsky.foundation.storage.csproj +++ b/starsky/starsky.foundation.storage/starsky.foundation.storage.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {12f5ae66-8d7f-4d81-86c5-e3e3864f44a1} Full diff --git a/starsky/starsky.foundation.sync/starsky.foundation.sync.csproj b/starsky/starsky.foundation.sync/starsky.foundation.sync.csproj index 0ba8a005f8..1eaa9c7eec 100644 --- a/starsky/starsky.foundation.sync/starsky.foundation.sync.csproj +++ b/starsky/starsky.foundation.sync/starsky.foundation.sync.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {8cd2e452-ab62-446c-ad42-7d90b63d1b81} 0.5.14 @@ -19,7 +19,7 @@ - + diff --git a/starsky/starsky.foundation.thumbnailgeneration/starsky.foundation.thumbnailgeneration.csproj b/starsky/starsky.foundation.thumbnailgeneration/starsky.foundation.thumbnailgeneration.csproj index 7916771c22..b8bb2eaa3a 100644 --- a/starsky/starsky.foundation.thumbnailgeneration/starsky.foundation.thumbnailgeneration.csproj +++ b/starsky/starsky.foundation.thumbnailgeneration/starsky.foundation.thumbnailgeneration.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {4b3990c9-171b-4d53-a821-f458e8ac072f} Full @@ -16,7 +16,7 @@ - + diff --git a/starsky/starsky.foundation.thumbnailmeta/starsky.foundation.thumbnailmeta.csproj b/starsky/starsky.foundation.thumbnailmeta/starsky.foundation.thumbnailmeta.csproj index 86be0a274f..cb0cf00180 100644 --- a/starsky/starsky.foundation.thumbnailmeta/starsky.foundation.thumbnailmeta.csproj +++ b/starsky/starsky.foundation.thumbnailmeta/starsky.foundation.thumbnailmeta.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {88e70822-ae50-4fc5-9384-a8726b70849a} Full @@ -20,7 +20,7 @@ - + diff --git a/starsky/starsky.foundation.webtelemetry/starsky.foundation.webtelemetry.csproj b/starsky/starsky.foundation.webtelemetry/starsky.foundation.webtelemetry.csproj index 1160d70966..717dae6bba 100644 --- a/starsky/starsky.foundation.webtelemetry/starsky.foundation.webtelemetry.csproj +++ b/starsky/starsky.foundation.webtelemetry/starsky.foundation.webtelemetry.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {3b84ed27-fef0-4c2b-8cb5-04b7fdb613f8} Full @@ -21,16 +21,16 @@ - + - - - - - - - - + + + + + + + + diff --git a/starsky/starsky.foundation.worker/starsky.foundation.worker.csproj b/starsky/starsky.foundation.worker/starsky.foundation.worker.csproj index 9c9ac5986b..7bc6a8e176 100644 --- a/starsky/starsky.foundation.worker/starsky.foundation.worker.csproj +++ b/starsky/starsky.foundation.worker/starsky.foundation.worker.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {240fbcdb-4379-4bbe-b154-eb4f87504d9e} Full @@ -16,7 +16,7 @@ - + diff --git a/starsky/starsky.foundation.writemeta/starsky.foundation.writemeta.csproj b/starsky/starsky.foundation.writemeta/starsky.foundation.writemeta.csproj index c61b0abaaa..4e90605c44 100644 --- a/starsky/starsky.foundation.writemeta/starsky.foundation.writemeta.csproj +++ b/starsky/starsky.foundation.writemeta/starsky.foundation.writemeta.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 {bc265f9e-e0f1-46da-9c40-0babe44de9ee} Full @@ -10,7 +10,7 @@ - + diff --git a/starsky/starsky/starsky.csproj b/starsky/starsky/starsky.csproj index 220a17446a..85c3331a4b 100644 --- a/starsky/starsky/starsky.csproj +++ b/starsky/starsky/starsky.csproj @@ -1,7 +1,7 @@  - net6.0 - 6.0.26 + net8.0 + 8.0.1 An attempt to create a database driven photo library 0.5.14 @@ -54,8 +54,8 @@ 0 - - + + diff --git a/starsky/starskyadmincli/starskyadmincli.csproj b/starsky/starskyadmincli/starskyadmincli.csproj index 252d7a2757..e5adbe78bd 100644 --- a/starsky/starskyadmincli/starskyadmincli.csproj +++ b/starsky/starskyadmincli/starskyadmincli.csproj @@ -2,10 +2,10 @@ Exe - net6.0 + net8.0 {dcf1f6cb-1c65-4394-bef7-cccc2967b56c} - 6.0.26 + 8.0.1 Full 0.5.14 diff --git a/starsky/starskycore/starskycore.csproj b/starsky/starskycore/starskycore.csproj index a5fe1dd092..f1befdad7c 100644 --- a/starsky/starskycore/starskycore.csproj +++ b/starsky/starskycore/starskycore.csproj @@ -1,7 +1,7 @@  - net6.0 + net8.0 An attempt to create a database driven photo library 0.5.14 true diff --git a/starsky/starskydemoseedcli/starskydemoseedcli.csproj b/starsky/starskydemoseedcli/starskydemoseedcli.csproj index 442cbc5385..983834ebae 100644 --- a/starsky/starskydemoseedcli/starskydemoseedcli.csproj +++ b/starsky/starskydemoseedcli/starskydemoseedcli.csproj @@ -1,11 +1,11 @@ Exe - net6.0 + net8.0 enable {215a3302-a418-4148-8d20-1127e27c3dae} - 6.0.26 + 8.0.1 Full 0.5.14 diff --git a/starsky/starskygeocli/starskygeocli.csproj b/starsky/starskygeocli/starskygeocli.csproj index bcf5e30c8c..43446b1079 100644 --- a/starsky/starskygeocli/starskygeocli.csproj +++ b/starsky/starskygeocli/starskygeocli.csproj @@ -1,11 +1,11 @@  Exe - net6.0 + net8.0 enable {a030c158-2f79-4317-a9f9-bdd46d66d1d8} - 6.0.26 + 8.0.1 Full 0.5.14 diff --git a/starsky/starskyimportercli/starskyimportercli.csproj b/starsky/starskyimportercli/starskyimportercli.csproj index 86ed4ddbb6..3a24aeb23c 100644 --- a/starsky/starskyimportercli/starskyimportercli.csproj +++ b/starsky/starskyimportercli/starskyimportercli.csproj @@ -1,10 +1,10 @@  Exe - net6.0 + net8.0 {23e4ea86-970a-4de1-badc-8d7e9d3d4dd6} - 6.0.26 + 8.0.1 Full 0.5.14 diff --git a/starsky/starskysynchronizecli/starskysynchronizecli.csproj b/starsky/starskysynchronizecli/starskysynchronizecli.csproj index b70b3cae01..e799d4a867 100644 --- a/starsky/starskysynchronizecli/starskysynchronizecli.csproj +++ b/starsky/starskysynchronizecli/starskysynchronizecli.csproj @@ -2,10 +2,10 @@ Exe - net6.0 + net8.0 {7e1136a7-cc43-49d2-91d3-48e557f0fb66} - 6.0.26 + 8.0.1 starskysynchronizecli 0.5.14 diff --git a/starsky/starskytest/starsky.foundation.database/NotificationsTest/NotificationQueryErrorTest.cs b/starsky/starskytest/starsky.foundation.database/NotificationsTest/NotificationQueryErrorTest.cs index 382f532d4e..b6649a3376 100644 --- a/starsky/starskytest/starsky.foundation.database/NotificationsTest/NotificationQueryErrorTest.cs +++ b/starsky/starskytest/starsky.foundation.database/NotificationsTest/NotificationQueryErrorTest.cs @@ -66,7 +66,13 @@ public TProperty GetOriginalValue(IProperty property) { throw new System.NotImplementedException(); } - + + public void SetStoreGeneratedValue(IProperty property, object? value, + bool setModified = true) + { + throw new NotImplementedException(); + } + public void SetStoreGeneratedValue(IProperty property, object? value) { throw new System.NotImplementedException(); @@ -94,6 +100,8 @@ public bool IsConceptualNull(IProperty property) throw new NotImplementedException(); } + public DbContext Context { get; } + #pragma warning disable 8618 // ReSharper disable once UnassignedGetOnlyAutoProperty public IEntityType EntityType { get; } diff --git a/starsky/starskytest/starsky.foundation.database/QueryTest/QueryUpdateItem_Error.cs b/starsky/starskytest/starsky.foundation.database/QueryTest/QueryUpdateItem_Error.cs index 524777ca9d..d2e75192b2 100644 --- a/starsky/starskytest/starsky.foundation.database/QueryTest/QueryUpdateItem_Error.cs +++ b/starsky/starskytest/starsky.foundation.database/QueryTest/QueryUpdateItem_Error.cs @@ -87,7 +87,13 @@ public TProperty GetOriginalValue(IProperty property) { throw new System.NotImplementedException(); } - + + public void SetStoreGeneratedValue(IProperty property, object? value, + bool setModified = true) + { + throw new NotImplementedException(); + } + public void SetStoreGeneratedValue(IProperty property, object? value) { throw new System.NotImplementedException(); @@ -115,6 +121,8 @@ public bool IsConceptualNull(IProperty property) throw new NotImplementedException(); } + public DbContext Context { get; } + #pragma warning disable 8618 // ReSharper disable once UnassignedGetOnlyAutoProperty public IEntityType EntityType { get; } diff --git a/starsky/starskytest/starsky.foundation.database/Thumbnails/ThumbnailQueryErrorTest.cs b/starsky/starskytest/starsky.foundation.database/Thumbnails/ThumbnailQueryErrorTest.cs index 0a2c9a03e9..d7b068b778 100644 --- a/starsky/starskytest/starsky.foundation.database/Thumbnails/ThumbnailQueryErrorTest.cs +++ b/starsky/starskytest/starsky.foundation.database/Thumbnails/ThumbnailQueryErrorTest.cs @@ -71,7 +71,13 @@ public TProperty GetOriginalValue(IProperty property) { throw new System.NotImplementedException(); } - + + public void SetStoreGeneratedValue(IProperty property, object? value, + bool setModified = true) + { + throw new NotImplementedException(); + } + public void SetStoreGeneratedValue(IProperty property, object? value) { throw new NotImplementedException(); @@ -99,6 +105,8 @@ public bool IsConceptualNull(IProperty property) throw new NotImplementedException(); } + public DbContext Context { get; } + #pragma warning disable 8618 // ReSharper disable once UnassignedGetOnlyAutoProperty public IEntityType EntityType { get; } diff --git a/starsky/starskytest/starsky.foundation.worker/Services/UpdateBackgroundTaskQueueTest.cs b/starsky/starskytest/starsky.foundation.worker/Services/UpdateBackgroundTaskQueueTest.cs index 71cfcfb7b4..60938d83b8 100644 --- a/starsky/starskytest/starsky.foundation.worker/Services/UpdateBackgroundTaskQueueTest.cs +++ b/starsky/starskytest/starsky.foundation.worker/Services/UpdateBackgroundTaskQueueTest.cs @@ -17,8 +17,7 @@ using starsky.foundation.worker.Interfaces; using starsky.foundation.worker.Services; using starskytest.FakeMocks; - -#pragma warning disable 1998 +#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously namespace starskytest.starsky.foundation.worker.Services { diff --git a/starsky/starskytest/starskytest.csproj b/starsky/starskytest/starskytest.csproj index 8f457cd515..7a42b42cdf 100644 --- a/starsky/starskytest/starskytest.csproj +++ b/starsky/starskytest/starskytest.csproj @@ -1,8 +1,8 @@  - net6.0 + net8.0 - 6.0.26 + 8.0.1 Full {b3342a3e-64e1-442f-b4f7-f7a718508aac} @@ -21,10 +21,10 @@ - - - - + + + + diff --git a/starsky/starskythumbnailcli/starskythumbnailcli.csproj b/starsky/starskythumbnailcli/starskythumbnailcli.csproj index ceedfe496c..d8d7eea633 100644 --- a/starsky/starskythumbnailcli/starskythumbnailcli.csproj +++ b/starsky/starskythumbnailcli/starskythumbnailcli.csproj @@ -2,10 +2,10 @@ Exe - net6.0 + net8.0 {67e3fb34-1ca8-4a28-a0e0-00ff61821002} - 6.0.26 + 8.0.1 starskythumbnailcli 0.5.14 diff --git a/starsky/starskythumbnailmetacli/starskythumbnailmetacli.csproj b/starsky/starskythumbnailmetacli/starskythumbnailmetacli.csproj index 7fc1f87795..dd4f73ed67 100644 --- a/starsky/starskythumbnailmetacli/starskythumbnailmetacli.csproj +++ b/starsky/starskythumbnailmetacli/starskythumbnailmetacli.csproj @@ -2,10 +2,10 @@ Exe - net6.0 + net8.0 {a0cce905-ae43-4d1b-a97a-2bcd2c010ed1} - 6.0.26 + 8.0.1 starskythumbnailmetacli 0.5.14 diff --git a/starsky/starskywebftpcli/starskywebftpcli.csproj b/starsky/starskywebftpcli/starskywebftpcli.csproj index 95d9d2ef20..c88b578d58 100644 --- a/starsky/starskywebftpcli/starskywebftpcli.csproj +++ b/starsky/starskywebftpcli/starskywebftpcli.csproj @@ -2,9 +2,9 @@ Exe - net6.0 + net8.0 {eb1d57d1-29d8-4bfb-950e-447ef8522a10} - 6.0.26 + 8.0.1 Full 0.5.14 diff --git a/starsky/starskywebhtmlcli/starskywebhtmlcli.csproj b/starsky/starskywebhtmlcli/starskywebhtmlcli.csproj index 4a07b9bc08..c77f871f91 100644 --- a/starsky/starskywebhtmlcli/starskywebhtmlcli.csproj +++ b/starsky/starskywebhtmlcli/starskywebhtmlcli.csproj @@ -1,9 +1,9 @@  Exe - net6.0 + net8.0 {76d7bf62-9f1d-48f1-9035-dceb01de55c3} - 6.0.26 + 8.0.1 8.0 true Full diff --git a/starskydesktop/Dockerfile b/starskydesktop/Dockerfile index 61670a5a59..3e7496429f 100644 --- a/starskydesktop/Dockerfile +++ b/starskydesktop/Dockerfile @@ -19,7 +19,7 @@ RUN npm ci --legacy-peer-deps --prefer-offline --no-audit --no-fund RUN npm run build RUN echo "react done" -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:6.0 AS build-env +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env ARG BUILDPLATFORM ARG TARGETPLATFORM From 5a61f2c0197bf895a42f4789a9f369d3eb0c13da Mon Sep 17 00:00:00 2001 From: Dion Date: Wed, 10 Jan 2024 12:12:27 +0100 Subject: [PATCH 04/31] update list --- starsky/nuget-packages-list.json | 78 ++++++++++++++++---------------- 1 file changed, 38 insertions(+), 40 deletions(-) diff --git a/starsky/nuget-packages-list.json b/starsky/nuget-packages-list.json index 5d98a5fd19..ecf6b768f8 100644 --- a/starsky/nuget-packages-list.json +++ b/starsky/nuget-packages-list.json @@ -1,62 +1,60 @@ [ - "Microsoft.AspNetCore.Mvc.NewtonsoftJson 6.0.26", - "Microsoft.Extensions.Hosting.WindowsServices 6.0.2", + "Microsoft.AspNetCore.Mvc.NewtonsoftJson 8.0.1", + "Microsoft.Extensions.Hosting.WindowsServices 8.0.0", "SQLitePCLRaw.lib.e_sqlite3.linux 1.1.14", "Swashbuckle.AspNetCore 6.5.0", - "Microsoft.Extensions.Caching.Abstractions 6.0.0", - "Microsoft.Extensions.Caching.Memory 6.0.1", - "Microsoft.Extensions.Hosting.Abstractions 6.0.0", + "Microsoft.Extensions.Caching.Abstractions 8.0.0", + "Microsoft.Extensions.Caching.Memory 8.0.0", + "Microsoft.Extensions.Hosting.Abstractions 8.0.0", "NGeoNames 1.5.1", - "Microsoft.Extensions.Diagnostics.HealthChecks 6.0.26", - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions 6.0.26", - "AspNetCore.HealthChecks.MySql 6.0.2", - "AspNetCore.HealthChecks.Sqlite 6.0.2", - "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore 6.0.26", + "Microsoft.Extensions.Diagnostics.HealthChecks 8.0.1", + "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions 8.0.1", + "AspNetCore.HealthChecks.MySql 8.0.0", + "AspNetCore.HealthChecks.Sqlite 8.0.0", + "Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore 8.0.1", "MedallionShell 1.6.2", "RazorLight 2.3.1", "SixLabors.ImageSharp 3.1.2", "SixLabors.ImageSharp.Drawing 2.1.0", - "Microsoft.AspNetCore.Authorization 6.0.26", + "Microsoft.AspNetCore.Authorization 8.0.1", "Microsoft.ApplicationInsights.WorkerService 2.22.0", - "Microsoft.Extensions.DependencyInjection.Abstractions 6.0.0", - "Microsoft.Extensions.Logging 6.0.0", - "Microsoft.EntityFrameworkCore.Analyzers 6.0.26", - "Microsoft.EntityFrameworkCore.Design 6.0.26", - "Microsoft.EntityFrameworkCore.InMemory 6.0.26", - "Microsoft.EntityFrameworkCore.Sqlite 6.0.26", - "Microsoft.EntityFrameworkCore 6.0.26", - "Microsoft.EntityFrameworkCore.Relational 6.0.26", - "Microsoft.Extensions.DependencyInjection 6.0.1", - "Microsoft.Extensions.Identity.Stores 6.0.26", - "Pomelo.EntityFrameworkCore.MySql 6.0.2", + "Microsoft.Extensions.DependencyInjection.Abstractions 8.0.0", + "Microsoft.Extensions.Logging 8.0.0", + "Microsoft.EntityFrameworkCore.Analyzers 8.0.1", + "Microsoft.EntityFrameworkCore.Design 8.0.1", + "Microsoft.EntityFrameworkCore.InMemory 8.0.1", + "Microsoft.EntityFrameworkCore.Sqlite 8.0.1", + "Microsoft.EntityFrameworkCore 8.0.1", + "Microsoft.EntityFrameworkCore.Relational 8.0.1", + "Microsoft.Extensions.DependencyInjection 8.0.0", + "Microsoft.Extensions.Identity.Stores 8.0.1", + "Pomelo.EntityFrameworkCore.MySql 8.0.0-beta.2", "System.ComponentModel.Annotations 5.0.0", "Microsoft.ApplicationInsights 2.22.0", "Microsoft.ApplicationInsights.DependencyCollector 2.22.0", - "Microsoft.AspNetCore.Http 2.2.2", - "Microsoft.Net.Http.Headers 2.2.8", "Microsoft.CSharp 4.7.0", - "Microsoft.Extensions.Configuration 6.0.1", - "Microsoft.Extensions.Configuration.Binder 6.0.0", - "Microsoft.Extensions.Configuration.EnvironmentVariables 6.0.1", - "Microsoft.Extensions.Configuration.Json 6.0.0", - "Microsoft.Extensions.Logging.Abstractions 6.0.4", + "Microsoft.Extensions.Configuration 8.0.0", + "Microsoft.Extensions.Configuration.Binder 8.0.1", + "Microsoft.Extensions.Configuration.EnvironmentVariables 8.0.0", + "Microsoft.Extensions.Configuration.Json 8.0.0", + "Microsoft.Extensions.Logging.Abstractions 8.0.0", "System.Buffers 4.5.1", - "System.Threading.Tasks.Dataflow 6.0.0", + "System.Threading.Tasks.Dataflow 8.0.0", "TimeZoneConverter 6.1.0", "GeoTimeZone 5.3.0", "XmpCore 6.1.10.1", "MetadataExtractor 2.8.1", "Microsoft.ApplicationInsights.AspNetCore 2.22.0", - "Microsoft.Extensions.Logging.Console 6.0.0", - "OpenTelemetry 1.6.0", - "OpenTelemetry.Api 1.6.0", - "OpenTelemetry.Exporter.OpenTelemetryProtocol 1.6.0", - "OpenTelemetry.Extensions.Hosting 1.6.0", - "OpenTelemetry.Instrumentation.AspNetCore 1.6.0-rc.1", - "OpenTelemetry.Instrumentation.Runtime 1.5.1", - "System.Text.Json 6.0.9", - "Microsoft.AspNetCore.Identity.EntityFrameworkCore 6.0.26", - "Microsoft.Extensions.Hosting 6.0.1", + "Microsoft.Extensions.Logging.Console 8.0.0", + "OpenTelemetry 1.7.0", + "OpenTelemetry.Api 1.7.0", + "OpenTelemetry.Exporter.OpenTelemetryProtocol 1.7.0", + "OpenTelemetry.Extensions.Hosting 1.7.0", + "OpenTelemetry.Instrumentation.AspNetCore 1.7.0", + "OpenTelemetry.Instrumentation.Runtime 1.7.0", + "System.Text.Json 8.0.1", + "Microsoft.AspNetCore.Identity.EntityFrameworkCore 8.0.1", + "Microsoft.Extensions.Hosting 8.0.0", "Microsoft.NET.Test.Sdk 17.8.0", "MSTest.TestAdapter 3.1.1", "MSTest.TestFramework 3.1.1", From 829b8228641029ae0728905ead4ab488650e8a13 Mon Sep 17 00:00:00 2001 From: Dion Date: Wed, 10 Jan 2024 21:20:28 +0100 Subject: [PATCH 05/31] add some fixes --- documentation/documentation.csproj | 2 +- .../build-tools/dotnet-sdk-version-update.js | 17 +++++++- starsky-tools/socket/ChannelWSClient.csproj | 2 +- starsky/build/_build.csproj | 2 +- starsky/build/helpers/DotnetGenericHelper.cs | 1 - .../helpers/DotnetRuntimeSpecificHelper.cs | 2 +- .../build/helpers/GetSolutionAllProjects.cs | 14 +++++-- starsky/build/helpers/ProjectAssetsCopier.cs | 22 ++++++++++- starsky/readme-upgrade-net-core.md | 7 ---- .../Services/DeviceIdService.cs | 8 +++- .../20180419182654_importdatabase.cs | 1 + .../20221025182759_data-protection-keys.cs | 1 + .../Query/Query.cs | 4 +- .../Extensions/MemoryCacheExtensions.cs | 39 +++++++++++++++---- starsky/starsky/cleanup-build-tools.sh | 20 ++++++++++ .../Helpers/PathHelperTest.cs | 5 ++- 16 files changed, 117 insertions(+), 30 deletions(-) diff --git a/documentation/documentation.csproj b/documentation/documentation.csproj index 6a5d89cdd9..d97afa9f95 100644 --- a/documentation/documentation.csproj +++ b/documentation/documentation.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net8.0 enable enable diff --git a/starsky-tools/build-tools/dotnet-sdk-version-update.js b/starsky-tools/build-tools/dotnet-sdk-version-update.js index 0fa2ee57b4..674c3351c4 100644 --- a/starsky-tools/build-tools/dotnet-sdk-version-update.js +++ b/starsky-tools/build-tools/dotnet-sdk-version-update.js @@ -84,7 +84,7 @@ getLatestDotnetRelease().then((newTargetVersion) => { await addReferencedProjectMonikers(frameworkMonikerByPath); const sortedFrameworkMonikerByPath = - await sortNetFrameworkMoniker(refFrameworkMonikerByPath); + await sortNetFrameworkMoniker(refFrameworkMonikerByPath, newTargetVersion); await updateNetFrameworkMoniker(sortedFrameworkMonikerByPath); @@ -561,7 +561,7 @@ async function addReferencedProjectMonikers(frameworkMonikerByPath) { return frameworkMonikerByPath; } -async function sortNetFrameworkMoniker(frameworkMonikerByPath) { +async function sortNetFrameworkMoniker(frameworkMonikerByPath, newTargetVersionAsFallback) { // references for (let [filePath, netMonikers] of Object.entries( frameworkMonikerByPath @@ -572,6 +572,14 @@ async function sortNetFrameworkMoniker(frameworkMonikerByPath) { // console.log(filePath + ' referencedProjectPaths') // console.log(referencedProjectPaths) + if (referencedProjectPaths.length === 0) { + const netMonikerFallback = "net" + newTargetVersionAsFallback.match(/^\d\.\d/ig,"")[0]; + frameworkMonikerByPath[filePath].push(netMonikerFallback); + console.log( + `🎁 ${filePath} - is using default ${netMonikerFallback}` + ); + } + for (const refPath of referencedProjectPaths) { for (const netMoniker of netMonikers) { if (!frameworkMonikerByPath[refPath]) { @@ -702,6 +710,11 @@ async function updateNetFrameworkMoniker(sortedFrameworkMonikerByPath) { } usedTargetFrameworkMonikers[filePath].push(lastNet); } + else { + console.log( + `❌ ✖ ${filePath} - is skipped to ${usedTargetFrameworkMonikers}` + ); + } } } diff --git a/starsky-tools/socket/ChannelWSClient.csproj b/starsky-tools/socket/ChannelWSClient.csproj index d8c041d788..b5040c9dd1 100755 --- a/starsky-tools/socket/ChannelWSClient.csproj +++ b/starsky-tools/socket/ChannelWSClient.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + net8.0 diff --git a/starsky/build/_build.csproj b/starsky/build/_build.csproj index 8fd3da2786..2498c3fa1f 100644 --- a/starsky/build/_build.csproj +++ b/starsky/build/_build.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net8.0 CS0649;CS0169 .. diff --git a/starsky/build/helpers/DotnetGenericHelper.cs b/starsky/build/helpers/DotnetGenericHelper.cs index 9ccbd12246..eab6631764 100644 --- a/starsky/build/helpers/DotnetGenericHelper.cs +++ b/starsky/build/helpers/DotnetGenericHelper.cs @@ -107,7 +107,6 @@ public static void PublishNetCoreGenericCommand(Solution solution, .EnableNoRestore() .EnableNoBuild() .EnableNoDependencies() - .EnableSelfContained() .SetOutput(outputFullPath) .SetProject(publishProjectFullPath) .EnableNoLogo()); diff --git a/starsky/build/helpers/DotnetRuntimeSpecificHelper.cs b/starsky/build/helpers/DotnetRuntimeSpecificHelper.cs index 231da723a2..a671cee446 100644 --- a/starsky/build/helpers/DotnetRuntimeSpecificHelper.cs +++ b/starsky/build/helpers/DotnetRuntimeSpecificHelper.cs @@ -43,7 +43,7 @@ public static void Clean(List runtimesWithoutGeneric) .FrameworkDescription; var netMoniker = new Regex(".\\d+$", RegexOptions.None, TimeSpan.FromMilliseconds(100)) .Replace(version, string.Empty).Replace(".NET ","net"); - // e.g net6.0 + // e.g net6.0 or net8.0 if (Directory.Exists($"obj/Release/{netMoniker}/{runtime}")) { diff --git a/starsky/build/helpers/GetSolutionAllProjects.cs b/starsky/build/helpers/GetSolutionAllProjects.cs index 5f696e35c7..55ea343bf8 100644 --- a/starsky/build/helpers/GetSolutionAllProjects.cs +++ b/starsky/build/helpers/GetSolutionAllProjects.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.IO; @@ -14,6 +15,11 @@ public static class GetSolutionAllProjects { public static List GetSolutionAllProjectsList(Solution solution) { + if ( solution.Directory == null ) + { + throw new ArgumentNullException(nameof(Solution)); + } + var slnListOutput = DotNet($"sln {solution.ToString()} list", null, null, null, false); @@ -27,10 +33,12 @@ public static List GetSolutionAllProjectsList(Solution solution) { continue; } - - if ( File.Exists(slnListOutputItem.Text) ) + + var fullPath = Path.Combine(solution.Directory, slnListOutputItem.Text); + + if ( File.Exists(fullPath) ) { - result.Add(slnListOutputItem.Text); + result.Add(fullPath); } } return result; diff --git a/starsky/build/helpers/ProjectAssetsCopier.cs b/starsky/build/helpers/ProjectAssetsCopier.cs index 639b7e0914..65558a8b30 100644 --- a/starsky/build/helpers/ProjectAssetsCopier.cs +++ b/starsky/build/helpers/ProjectAssetsCopier.cs @@ -9,8 +9,9 @@ public static class ProjectAssetsCopier public static void CopyAssetFileToCurrentRuntime(string runtime, Solution solution) { + var allSolutionProjectsList = GetSolutionAllProjectsList(solution); // Restore Asset runtime file - foreach ( var path in GetSolutionAllProjectsList(solution) ) + foreach ( var path in allSolutionProjectsList ) { var parent = Directory.GetParent(path)?.FullName; var assetFile = $"{parent}/obj/project.assets.json"; @@ -20,6 +21,16 @@ public static void CopyAssetFileToCurrentRuntime(string runtime, { File.Copy(assetRuntimeFile,assetFile,true); } + + // restore dg spec + var projectName = Path.GetFileName(path).Replace(".csproj",string.Empty); + var assetFileDgSpec = $"{parent}/obj/{projectName}.csproj.nuget.dgspec.json"; + var assetRuntimeDgSpec = $"{parent}/obj/{projectName}.csproj.nuget.dgspec_{runtime}.json"; + + if ( File.Exists(assetRuntimeDgSpec) ) + { + File.Copy(assetRuntimeDgSpec, assetFileDgSpec,true); + } } } @@ -36,6 +47,15 @@ public static void CopyNewAssetFileByRuntimeId(string runtime, { File.Copy(assetFile,assetRuntimeFile,true); } + + var projectName = Path.GetFileName(path).Replace(".csproj",string.Empty); + var assetFileDgSpec = $"{parent}/obj/{projectName}.csproj.nuget.dgspec.json"; + var assetRuntimeDgSpec = $"{parent}/obj/{projectName}.csproj.nuget.dgspec_{runtime}.json"; + + if ( File.Exists(assetRuntimeDgSpec) ) + { + File.Copy(assetRuntimeDgSpec,assetFileDgSpec,true); + } } } } diff --git a/starsky/readme-upgrade-net-core.md b/starsky/readme-upgrade-net-core.md index 48bdc318cd..82149f8b19 100644 --- a/starsky/readme-upgrade-net-core.md +++ b/starsky/readme-upgrade-net-core.md @@ -32,13 +32,6 @@ Check at least those files - [x] `starsky/starskywebftpcli/starskywebftpcli.csproj` - [x] `starsky/starskywebhtmlcli/starskywebhtmlcli.csproj` -## Marked as deprecated -- [x] `starsky/starskysynccli/starskysynccli.csproj` - -## Legacy project - - [x] `starsky.netframework/starskyImporterNetFrameworkCli/starskyImporterNetFrameworkCli.csproj` - - [x] `starsky.netframework/starskySyncNetFrameworkCli/starskySyncNetFrameworkCli.csproj` - Might useful to force evaluate packages ``` dotnet restore --force-evaluate diff --git a/starsky/starsky.feature.packagetelemetry/Services/DeviceIdService.cs b/starsky/starsky.feature.packagetelemetry/Services/DeviceIdService.cs index df8900c30b..7f6e4c3ba4 100644 --- a/starsky/starsky.feature.packagetelemetry/Services/DeviceIdService.cs +++ b/starsky/starsky.feature.packagetelemetry/Services/DeviceIdService.cs @@ -119,11 +119,17 @@ internal async Task DeviceIdOsX() try { // Windows Only feature - var registryKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Cryptography"); + var registryKey = + Registry.LocalMachine.OpenSubKey( + @"SOFTWARE\Microsoft\Cryptography"); var title = registryKey?.GetValue("MachineGuid")?.ToString(); registryKey?.Dispose(); return title; } + catch ( NullReferenceException ) + { + return string.Empty; + } catch ( TypeInitializationException ) { return string.Empty; diff --git a/starsky/starsky.foundation.database/Migrations/20180419182654_importdatabase.cs b/starsky/starsky.foundation.database/Migrations/20180419182654_importdatabase.cs index 49e3e0f027..fce51e67af 100644 --- a/starsky/starsky.foundation.database/Migrations/20180419182654_importdatabase.cs +++ b/starsky/starsky.foundation.database/Migrations/20180419182654_importdatabase.cs @@ -1,5 +1,6 @@ using System; using Microsoft.EntityFrameworkCore.Migrations; +#pragma warning disable CS8981 // The type name only contains lower-cased ascii characters. Such names may become reserved for the language. namespace starsky.foundation.database.Migrations { diff --git a/starsky/starsky.foundation.database/Migrations/20221025182759_data-protection-keys.cs b/starsky/starsky.foundation.database/Migrations/20221025182759_data-protection-keys.cs index 62c720e508..1ad19190a8 100644 --- a/starsky/starsky.foundation.database/Migrations/20221025182759_data-protection-keys.cs +++ b/starsky/starsky.foundation.database/Migrations/20221025182759_data-protection-keys.cs @@ -1,4 +1,5 @@ using Microsoft.EntityFrameworkCore.Migrations; +#pragma warning disable CS8981 // The type name only contains lower-cased ascii characters. Such names may become reserved for the language. #nullable disable diff --git a/starsky/starsky.foundation.database/Query/Query.cs b/starsky/starsky.foundation.database/Query/Query.cs index 4da9419b78..63dde37c52 100644 --- a/starsky/starsky.foundation.database/Query/Query.cs +++ b/starsky/starsky.foundation.database/Query/Query.cs @@ -143,7 +143,7 @@ public void SetGetObjectByFilePathCache(string filePath, // if result is not null return cached value if ( _cache.TryGetValue(queryHashListCacheName, out var cachedSubPath) - && !string.IsNullOrEmpty((string)cachedSubPath)) return ( string ) cachedSubPath; + && !string.IsNullOrEmpty((string?)cachedSubPath)) return ( string ) cachedSubPath; cachedSubPath = await QueryGetItemByHashAsync(fileHash); @@ -430,7 +430,7 @@ internal void AddCacheItem(FileIndexItem updateStatusContent) if (!_cache.TryGetValue(queryCacheName, out var objectFileFolders)) return; - var displayFileFolders = (List) objectFileFolders; + var displayFileFolders = (List?) objectFileFolders; if ( updateStatusContent.FilePath == "/" ) { diff --git a/starsky/starsky.foundation.platform/Extensions/MemoryCacheExtensions.cs b/starsky/starsky.foundation.platform/Extensions/MemoryCacheExtensions.cs index 4bc1f583b5..cdacf391b0 100644 --- a/starsky/starsky.foundation.platform/Extensions/MemoryCacheExtensions.cs +++ b/starsky/starsky.foundation.platform/Extensions/MemoryCacheExtensions.cs @@ -1,23 +1,45 @@ using System; using System.Collections; using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection; +using System.Reflection.Emit; using Microsoft.Extensions.Caching.Memory; namespace starsky.foundation.platform.Extensions { + /// + /// @see: https://stackoverflow.com/a/64291008 + /// public static class MemoryCacheExtensions { - [SuppressMessage("Usage", "S3011:Make sure that this accessibility bypass is safe here", Justification = "Safe")] - private static readonly Func GetEntriesCollection = Delegate.CreateDelegate( - typeof(Func), - typeof(MemoryCache).GetProperty("EntriesCollection", BindingFlags.NonPublic | BindingFlags.Instance)?.GetGetMethod(true)!, - throwOnBindFailure: true) as Func; + private static readonly Lazy> GetCoherentState = + new(() => + CreateGetter(typeof(MemoryCache) + .GetField("_coherentState", BindingFlags.NonPublic | BindingFlags.Instance))); - private static IEnumerable GetKeys(this IMemoryCache memoryCache) => - ((IDictionary)GetEntriesCollection((MemoryCache)memoryCache)).Keys; + private static readonly Lazy> GetEntries7 = + new(() => + CreateGetter(typeof(MemoryCache) + .GetNestedType("CoherentState", BindingFlags.NonPublic)? + .GetField("_entries", BindingFlags.NonPublic | BindingFlags.Instance))); + + private static Func CreateGetter(FieldInfo field) + { + var methodName = $"{field.ReflectedType?.FullName}.get_{field.Name}"; + var method = new DynamicMethod(methodName, typeof(TReturn), new[] { typeof(TParam) }, typeof(TParam), true); + var ilGen = method.GetILGenerator(); + ilGen.Emit(OpCodes.Ldarg_0); + ilGen.Emit(OpCodes.Ldfld, field); + ilGen.Emit(OpCodes.Ret); + return (Func)method.CreateDelegate(typeof(Func)); + } + + private static readonly Func GetEntries = + cache => GetEntries7.Value(GetCoherentState.Value(cache)); + + private static ICollection GetKeys(this IMemoryCache memoryCache) => + GetEntries((MemoryCache)memoryCache).Keys; /// /// Get Keys @@ -36,5 +58,6 @@ public static IEnumerable GetKeys(this IMemoryCache memoryCache) { } } + } } diff --git a/starsky/starsky/cleanup-build-tools.sh b/starsky/starsky/cleanup-build-tools.sh index 8b7a024ba8..8460de813a 100755 --- a/starsky/starsky/cleanup-build-tools.sh +++ b/starsky/starsky/cleanup-build-tools.sh @@ -15,6 +15,26 @@ else fi PARENT_DIR="$(dirname "$SCRIPT_DIR")" +# eg starsky/starsky + +## docs +GIT_ROOT_DIR="$(dirname "$PARENT_DIR")" + +if [ -d "$GIT_ROOT_DIR""/documentation/bin" ] +then + rm -rf "$GIT_ROOT_DIR""/documentation/bin" +else + echo "Skip: remove documentation bin. -> ""$GIT_ROOT_DIR""/documentation/bin" +fi + +if [ -d "$GIT_ROOT_DIR""/documentation/obj" ] +then + rm -rf "$GIT_ROOT_DIR""/documentation/obj" +else + echo "Skip: remove documentation obj. -> ""$GIT_ROOT_DIR""/documentation/obj" +fi +## end docs + if [ -d "$PARENT_DIR""/TestResults" ] then diff --git a/starsky/starskytest/starsky.foundation.platform/Helpers/PathHelperTest.cs b/starsky/starskytest/starsky.foundation.platform/Helpers/PathHelperTest.cs index 2792e5f08e..ce2b855c28 100644 --- a/starsky/starskytest/starsky.foundation.platform/Helpers/PathHelperTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Helpers/PathHelperTest.cs @@ -1,3 +1,4 @@ +using System; using System.IO; using System.Linq; using System.Text.RegularExpressions; @@ -36,7 +37,9 @@ public void GetFileName_ReturnsFileName_WithMaliciousInput() var test2 = PlainTextFileHelper.StreamToString( new MemoryStream(CreateAnImageA6600.Bytes.ToArray())); - PathHelper.GetFileName(test + test2,100); + PathHelper.GetFileName(test + test2 + test,1); + + Console.WriteLine(); } [TestMethod] From d03bbb2dfb48944f88e255413c6547436acc9cc5 Mon Sep 17 00:00:00 2001 From: Dion Date: Thu, 11 Jan 2024 07:39:03 +0100 Subject: [PATCH 06/31] rename group --- starsky/Dockerfile | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/starsky/Dockerfile b/starsky/Dockerfile index b1e171474e..e3c130330e 100644 --- a/starsky/Dockerfile +++ b/starsky/Dockerfile @@ -126,31 +126,31 @@ else \ fi # Create a group and user -RUN groupadd --gid 1000 app \ - && useradd --uid 1000 --gid app --shell /bin/bash --create-home app +RUN groupadd --gid 1000 starsky \ + && useradd --uid 1000 --gid starsky --shell /bin/bash --create-home starsky # copy dlls -COPY --chown=app:app --from=build-env /app/starsky/out /app +COPY --chown=starsky:starsky --from=build-env /app/starsky/out /app # copy dependencies & demo content -COPY --chown=app:app --from=build-env /app/dependencies /app/dependencies -COPY --chown=app:app --from=build-env /app/temp /app/temp -COPY --chown=app:app --from=build-env /app/data.db /app/app__data.db +COPY --chown=starsky:starsky --from=build-env /app/dependencies /app/dependencies +COPY --chown=starsky:starsky --from=build-env /app/temp /app/temp +COPY --chown=starsky:starsky --from=build-env /app/data.db /app/app__data.db # copy react build -COPY --chown=app:app --from=react-build /app/starsky/clientapp ./clientapp +COPY --chown=starsky:starsky --from=react-build /app/starsky/clientapp ./clientapp # Makes sure the test stage is run when using docker buildkit -COPY --chown=app:app --from=test /testresults /tmp +COPY --chown=starsky:starsky --from=test /testresults /tmp # you could mount this location -RUN mkdir -p /app/photos && chown app:app /app/photos -RUN mkdir -p /app/thumbnailTempFolder && chown app:app /app/thumbnailTempFolder +RUN mkdir -p /app/photos && chown starsky:starsky /app/photos +RUN mkdir -p /app/thumbnailTempFolder && chown starsky:starsky /app/thumbnailTempFolder # and change owner of folder -RUN chown app:app /app +RUN chown starsky:starsky /app -USER app +USER starsky ENV ASPNETCORE_Environment=Production ENTRYPOINT ["dotnet", "starsky.dll"] \ No newline at end of file From 95844b33469b94d6a3868bf4349b17a5a426030e Mon Sep 17 00:00:00 2001 From: Dion Date: Fri, 12 Jan 2024 16:23:06 +0100 Subject: [PATCH 07/31] Change build process --- starsky/build/Build.cs | 14 +- starsky/build/_build.csproj | 2 + starsky/build/helpers/DotnetGenericHelper.cs | 21 +-- .../helpers/DotnetRuntimeSpecificHelper.cs | 130 ++++++++---------- starsky/build/helpers/ProjectAssetsCopier.cs | 62 --------- 5 files changed, 72 insertions(+), 157 deletions(-) delete mode 100644 starsky/build/helpers/ProjectAssetsCopier.cs diff --git a/starsky/build/Build.cs b/starsky/build/Build.cs index a979e02b40..fd0b42c774 100644 --- a/starsky/build/Build.cs +++ b/starsky/build/Build.cs @@ -235,12 +235,14 @@ void ShowSettingsInfo() ShowSettingsInfo(); DotnetRuntimeSpecificHelper.Clean(GetRuntimesWithoutGeneric()); - DotnetRuntimeSpecificHelper.RestoreNetCoreCommand(Solution, - GetRuntimesWithoutGeneric()); - DotnetRuntimeSpecificHelper.BuildNetCoreCommand(Solution, - GetRuntimesWithoutGeneric(),Configuration); - DotnetRuntimeSpecificHelper.PublishNetCoreGenericCommand(Solution, - GetRuntimesWithoutGeneric(),Configuration); + + foreach ( var runtime in GetRuntimesWithoutGeneric() ) + { + DotnetRuntimeSpecificHelper.RestoreNetCoreCommand(Solution, runtime); + DotnetRuntimeSpecificHelper.BuildNetCoreCommand(Solution, Configuration, runtime); + DotnetRuntimeSpecificHelper.PublishNetCoreGenericCommand(Configuration, runtime); + } + DotnetRuntimeSpecificHelper.CopyDependenciesFiles(NoDependencies, "generic-netcore",GetRuntimesWithoutGeneric()); diff --git a/starsky/build/_build.csproj b/starsky/build/_build.csproj index 2498c3fa1f..03c5c7511c 100644 --- a/starsky/build/_build.csproj +++ b/starsky/build/_build.csproj @@ -8,6 +8,8 @@ .. .. 1 + + true diff --git a/starsky/build/helpers/DotnetGenericHelper.cs b/starsky/build/helpers/DotnetGenericHelper.cs index eab6631764..34816d2d55 100644 --- a/starsky/build/helpers/DotnetGenericHelper.cs +++ b/starsky/build/helpers/DotnetGenericHelper.cs @@ -2,6 +2,7 @@ using System.IO; using build; using Nuke.Common.ProjectModel; +using Nuke.Common.Tooling; using Nuke.Common.Tools.DotNet; using static Nuke.Common.Tools.DotNet.DotNetTasks; using static build.Build; @@ -12,24 +13,20 @@ public static class DotnetGenericHelper { public static void RestoreNetCoreCommand(Solution solution) { - ProjectAssetsCopier.CopyAssetFileToCurrentRuntime(GenericRuntimeName, solution); - DotNetRestore(_ => _ - .SetProjectFile(solution)); - ProjectAssetsCopier.CopyNewAssetFileByRuntimeId(GenericRuntimeName, solution); + Console.WriteLine("solution: " + solution); + DotNetRestore(p => p + .SetProjectFile(solution.Path) + ); } public static void BuildNetCoreGenericCommand(Solution solution, Configuration configuration) { - ProjectAssetsCopier.CopyAssetFileToCurrentRuntime(GenericRuntimeName, solution); - DotNetBuild(_ => _ .SetConfiguration(configuration) .EnableNoRestore() .EnableNoLogo() .SetProjectFile(solution)); - - ProjectAssetsCopier.CopyNewAssetFileByRuntimeId(GenericRuntimeName, solution); } /// @@ -49,9 +46,7 @@ public static void DownloadDependencies(Solution solution, Console.WriteLine("skip --no-dependencies"); return; } - - ProjectAssetsCopier.CopyAssetFileToCurrentRuntime(GenericRuntimeName, solution); - + var genericDepsFullPath = Path.Combine(BasePath(), genericNetcoreFolder, "dependencies"); Console.WriteLine($"genericDepsFullPath: {genericDepsFullPath}"); @@ -75,7 +70,6 @@ public static void DownloadDependencies(Solution solution, } Environment.SetEnvironmentVariable("app__DependenciesFolder", string.Empty); - ProjectAssetsCopier.CopyNewAssetFileByRuntimeId(GenericRuntimeName, solution); Console.WriteLine($" genericDepsFullPath: {genericDepsFullPath}"); Console.WriteLine("DownloadDependencies done"); @@ -90,8 +84,6 @@ public static void PublishNetCoreGenericCommand(Solution solution, return; } - ProjectAssetsCopier.CopyAssetFileToCurrentRuntime(GenericRuntimeName, solution); - foreach ( var publishProject in PublishProjectsList ) { var publishProjectFullPath = Path.Combine( @@ -111,7 +103,6 @@ public static void PublishNetCoreGenericCommand(Solution solution, .SetProject(publishProjectFullPath) .EnableNoLogo()); } - ProjectAssetsCopier.CopyNewAssetFileByRuntimeId(GenericRuntimeName, solution); } static string BasePath() diff --git a/starsky/build/helpers/DotnetRuntimeSpecificHelper.cs b/starsky/build/helpers/DotnetRuntimeSpecificHelper.cs index a671cee446..1eda1eec5a 100644 --- a/starsky/build/helpers/DotnetRuntimeSpecificHelper.cs +++ b/starsky/build/helpers/DotnetRuntimeSpecificHelper.cs @@ -16,6 +16,12 @@ namespace helpers /// public static class DotnetRuntimeSpecificHelper { + static string BasePath() + { + return Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory) + ?.Parent?.Parent?.Parent?.FullName; + } + public static void Clean(List runtimesWithoutGeneric) { foreach(var runtime in runtimesWithoutGeneric) @@ -89,92 +95,68 @@ public static void CopyDependenciesFiles(bool noDependencies, } - public static void RestoreNetCoreCommand(Solution solution, - List runtimesWithoutGeneric) + public static void RestoreNetCoreCommand(Solution solution, string runtime) { - foreach ( var runtime in runtimesWithoutGeneric ) - { - ProjectAssetsCopier.CopyAssetFileToCurrentRuntime(runtime, solution); - // OverwriteRuntimeIdentifier is done via Directory.Build.props - DotNetRestore(_ => _ - .SetProjectFile(solution) - .SetProcessArgumentConfigurator(args => args - .Add($"/p:OverwriteRuntimeIdentifier={runtime}") - .Add("/p:noSonar=true"))); - - ProjectAssetsCopier.CopyNewAssetFileByRuntimeId(runtime, solution); - } + Console.WriteLine("> dotnet restore next for: solution: " + solution + " runtime: " + runtime); + // OverwriteRuntimeIdentifier is done via Directory.Build.props + DotNetRestore(p => p + .SetProjectFile(solution) + .SetRuntime(runtime) + .SetProcessArgumentConfigurator(args => args + .Add($"/p:OverwriteRuntimeIdentifier={runtime}") + .Add("/p:noSonar=true"))); } - - public static void PublishNetCoreGenericCommand(Solution solution, - List runtimesWithoutGeneric, Configuration configuration) - { - foreach ( var runtime in runtimesWithoutGeneric ) - { - ProjectAssetsCopier.CopyAssetFileToCurrentRuntime(runtime, solution); - foreach ( var publishProject in Build.PublishProjectsList ) - { - var publishProjectFullPath = Path.Combine( - WorkingDirectory.GetSolutionParentFolder(), - publishProject); - - var outputFullPath = Path.Combine( - WorkingDirectory.GetSolutionParentFolder(), - runtime); - - DotNetPublish(_ => _ - .SetConfiguration(configuration) - .EnableNoRestore() - .EnableNoBuild() - .EnableNoDependencies() - .EnableSelfContained() - .SetOutput(outputFullPath) - .SetProject(publishProjectFullPath) - .SetRuntime(runtime) - .EnableNoLogo() - .SetProcessArgumentConfigurator(args => args.Add("/p:noSonar=true")) - ); - - } - // to check if the right runtime is published - var runtimeDebugFile = Path.Combine(WorkingDirectory.GetSolutionParentFolder(), - runtime, "_runtime_" + runtime + ".debug"); - - if ( !File.Exists(runtimeDebugFile) ) - { - File.Create(runtimeDebugFile).Close(); - } + public static void BuildNetCoreCommand(Solution solution, Configuration configuration, string runtime) + { + Console.WriteLine("> dotnet build next for: solution: " + solution + " runtime: " + runtime); - ProjectAssetsCopier.CopyNewAssetFileByRuntimeId(runtime, solution); - } + // OverwriteRuntimeIdentifier is done via Directory.Build.props + // search for: dotnet build + DotNetBuild(p => p + .SetProjectFile(solution) + .EnableNoRestore() + .EnableNoLogo() + .DisableRunCodeAnalysis() + .SetConfiguration(configuration) + .SetProcessArgumentConfigurator(args => + args + .Add($"/p:OverwriteRuntimeIdentifier={runtime}") + // Warnings are disabled because in Generic build they are already checked + .Add("-v q") + .Add("/p:WarningLevel=0") + .Add("/p:noSonar=true") + )); } - public static void BuildNetCoreCommand(Solution solution, List getRuntimesWithoutGeneric, Configuration configuration) + public static void PublishNetCoreGenericCommand(Configuration configuration, string runtime) { - foreach ( var runtime in getRuntimesWithoutGeneric ) + foreach ( var publishProject in Build.PublishProjectsList ) { - ProjectAssetsCopier.CopyAssetFileToCurrentRuntime(runtime, solution); - // OverwriteRuntimeIdentifier is done via Directory.Build.props - // search for: dotnet build - DotNetBuild(_ => _ - .SetProjectFile(solution) + Console.WriteLine(">> next publishProject: " + publishProject + " runtime: " + runtime); + + var publishProjectFullPath = Path.Combine( + WorkingDirectory.GetSolutionParentFolder(), + publishProject); + + var outputFullPath = Path.Combine( + WorkingDirectory.GetSolutionParentFolder(), + runtime); + + DotNetPublish(p => p + .SetConfiguration(configuration) .EnableNoRestore() + .EnableNoBuild() + .EnableNoDependencies() + .EnableSelfContained() + .SetOutput(outputFullPath) + .SetProject(publishProjectFullPath) + .SetRuntime(runtime) .EnableNoLogo() - .SetConfiguration(configuration) - .SetProcessArgumentConfigurator(args => - args - .Add($"/p:OverwriteRuntimeIdentifier={runtime}") - .Add("/p:noSonar=true") - )); - ProjectAssetsCopier.CopyNewAssetFileByRuntimeId(runtime, solution); + .SetProcessArgumentConfigurator(args => args.Add("/p:noSonar=true")) + ); } } - static string BasePath() - { - return Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory) - ?.Parent?.Parent?.Parent?.FullName; - } } } diff --git a/starsky/build/helpers/ProjectAssetsCopier.cs b/starsky/build/helpers/ProjectAssetsCopier.cs deleted file mode 100644 index 65558a8b30..0000000000 --- a/starsky/build/helpers/ProjectAssetsCopier.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System.IO; -using Nuke.Common.ProjectModel; -using static helpers.GetSolutionAllProjects; - -namespace helpers -{ - public static class ProjectAssetsCopier - { - public static void CopyAssetFileToCurrentRuntime(string runtime, - Solution solution) - { - var allSolutionProjectsList = GetSolutionAllProjectsList(solution); - // Restore Asset runtime file - foreach ( var path in allSolutionProjectsList ) - { - var parent = Directory.GetParent(path)?.FullName; - var assetFile = $"{parent}/obj/project.assets.json"; - var assetRuntimeFile = $"{parent}/obj/project.assets_{runtime}.json"; - - if ( File.Exists(assetRuntimeFile) ) - { - File.Copy(assetRuntimeFile,assetFile,true); - } - - // restore dg spec - var projectName = Path.GetFileName(path).Replace(".csproj",string.Empty); - var assetFileDgSpec = $"{parent}/obj/{projectName}.csproj.nuget.dgspec.json"; - var assetRuntimeDgSpec = $"{parent}/obj/{projectName}.csproj.nuget.dgspec_{runtime}.json"; - - if ( File.Exists(assetRuntimeDgSpec) ) - { - File.Copy(assetRuntimeDgSpec, assetFileDgSpec,true); - } - } - } - - public static void CopyNewAssetFileByRuntimeId(string runtime, - Solution solution) - { - // Create a new one - foreach ( var path in GetSolutionAllProjectsList(solution) ) - { - var parent = Directory.GetParent(path)?.FullName; - var assetFile = $"{parent}/obj/project.assets.json"; - var assetRuntimeFile = $"{parent}/obj/project.assets_{runtime}.json"; - if ( File.Exists(assetFile) ) - { - File.Copy(assetFile,assetRuntimeFile,true); - } - - var projectName = Path.GetFileName(path).Replace(".csproj",string.Empty); - var assetFileDgSpec = $"{parent}/obj/{projectName}.csproj.nuget.dgspec.json"; - var assetRuntimeDgSpec = $"{parent}/obj/{projectName}.csproj.nuget.dgspec_{runtime}.json"; - - if ( File.Exists(assetRuntimeDgSpec) ) - { - File.Copy(assetRuntimeDgSpec,assetFileDgSpec,true); - } - } - } - } -} From f880d21aad3f9240bbf1b1ee6a0d300f566ff4c5 Mon Sep 17 00:00:00 2001 From: Dion Date: Fri, 12 Jan 2024 16:28:04 +0100 Subject: [PATCH 08/31] add asticks --- .github/workflows/auto-update-swagger-dotnet.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/auto-update-swagger-dotnet.yml b/.github/workflows/auto-update-swagger-dotnet.yml index 15bda92c38..75ec5ba76c 100644 --- a/.github/workflows/auto-update-swagger-dotnet.yml +++ b/.github/workflows/auto-update-swagger-dotnet.yml @@ -57,7 +57,7 @@ jobs: - name: Copy shell: bash - run: cp starsky/starsky/bin/Debug/net6.0/temp/starsky.json documentation/static/openapi/openapi.json + run: cp starsky/starsky/bin/Debug/net*.0/temp/starsky.json documentation/static/openapi/openapi.json - name: Generate swagger shell: bash From 64c28bc84482dd6e7869849d7471ae7009558905 Mon Sep 17 00:00:00 2001 From: Dion Date: Tue, 16 Jan 2024 15:35:14 +0100 Subject: [PATCH 09/31] WIP breaking code --- .../Helpers/PathHelperTest.cs | 14 +++++++++----- .../Services/ExifToolHostStorageServiceTest.cs | 1 + 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/starsky/starskytest/starsky.foundation.platform/Helpers/PathHelperTest.cs b/starsky/starskytest/starsky.foundation.platform/Helpers/PathHelperTest.cs index ce2b855c28..8390bfa792 100644 --- a/starsky/starskytest/starsky.foundation.platform/Helpers/PathHelperTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Helpers/PathHelperTest.cs @@ -1,9 +1,9 @@ -using System; using System.IO; using System.Linq; using System.Text.RegularExpressions; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.foundation.platform.Helpers; +using starsky.foundation.platform.Models; using starsky.foundation.storage.Helpers; using starskytest.FakeCreateAn; @@ -28,8 +28,14 @@ public void GetFileName_ReturnsValidFileName() [TestMethod] [ExpectedException(typeof(RegexMatchTimeoutException))] - public void GetFileName_ReturnsFileName_WithMaliciousInput() + public void GetFileName_ReturnsFileName_WithMaliciousInput_UnixOnly() { + if ( new AppSettings().IsWindows ) + { + Assert.Inconclusive("Test is Linux & Mac OS Only"); + return; + } + // Act and Assert var test = PlainTextFileHelper.StreamToString( @@ -37,9 +43,7 @@ public void GetFileName_ReturnsFileName_WithMaliciousInput() var test2 = PlainTextFileHelper.StreamToString( new MemoryStream(CreateAnImageA6600.Bytes.ToArray())); - PathHelper.GetFileName(test + test2 + test,1); - - Console.WriteLine(); + PathHelper.GetFileName(test + test2 + test + test,1); } [TestMethod] diff --git a/starsky/starskytest/starsky.foundation.writemeta/Services/ExifToolHostStorageServiceTest.cs b/starsky/starskytest/starsky.foundation.writemeta/Services/ExifToolHostStorageServiceTest.cs index a816d6c7f5..fd23a0d7ce 100644 --- a/starsky/starskytest/starsky.foundation.writemeta/Services/ExifToolHostStorageServiceTest.cs +++ b/starsky/starskytest/starsky.foundation.writemeta/Services/ExifToolHostStorageServiceTest.cs @@ -146,6 +146,7 @@ await hostFileSystemStorage.WriteStreamAsync(new MemoryStream(item), var appSettings = new AppSettings { ExifToolPath = Path.Combine(outputPath, "exiftool.exe"), + Verbose = true }; var fakeStorage = new FakeIStorage(new List{"/"}, From 24d334bd9e87008e641a02e54630b33638892c4c Mon Sep 17 00:00:00 2001 From: Dion Date: Tue, 16 Jan 2024 18:03:32 +0100 Subject: [PATCH 10/31] Try this --- .../Helpers/ExifTool.cs | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/starsky/starsky.foundation.writemeta/Helpers/ExifTool.cs b/starsky/starsky.foundation.writemeta/Helpers/ExifTool.cs index ee1566a1df..518c45f316 100644 --- a/starsky/starsky.foundation.writemeta/Helpers/ExifTool.cs +++ b/starsky/starsky.foundation.writemeta/Helpers/ExifTool.cs @@ -158,18 +158,28 @@ public async Task RunProcessAsync(string optionsArgs) try { - + // run with pipes - var cmd = Default.Run(_appSettings.ExifToolPath, options: opts => { + var cmd = Default.Run(_appSettings.ExifToolPath, options: opts => + { opts.StartInfo(si => si.Arguments = args); - }) < _src > ms; - - var result = await cmd.Task.ConfigureAwait(false); + }); + + cmd.RedirectFrom(_src); + cmd.RedirectTo(ms); + cmd.RedirectStandardErrorTo(ms); + + var result = await cmd.Task; + + if ( !result.Success ) + { + Console.Error.WriteLine($"command failed with exit code {result.ExitCode}: {result.StandardError}"); + } // option without pipes: // await cmd.StandardInput.PipeFromAsync(_src).ConfigureAwait(false) await // cmd.StandardOutput.BaseStream.CopyToAsync(ms).ConfigureAwait(false) - + if ( _appSettings.IsVerbose() ) _logger.LogInformation($"[RunProcessAsync] ~ exifTool {optionsArgs} " + $"run with result: {result.Success} ~ "); From 17272e73a1cf3842c5efd6b79f2edfad99a1dba1 Mon Sep 17 00:00:00 2001 From: Dion Date: Wed, 17 Jan 2024 17:11:40 +0100 Subject: [PATCH 11/31] some fixes --- .../Query/Query.cs | 16 +++++-- .../Extensions/MemoryCacheExtensions.cs | 2 + .../EntityFrameworkExtensionsTest.cs | 33 ++++++-------- .../DataProtection/SqlXmlRepositoryTest.cs | 33 ++++++-------- .../Helpers/RunMigrationsTest.cs | 35 ++++++--------- .../NotificationQueryErrorTest.cs | 6 +-- .../QueryTest/QueryGetAllRecursiveTest.cs | 39 +++++++--------- .../QueryTest/QueryTest.cs | 2 + .../QueryTest/QueryUpdateItem_Error.cs | 45 ++++++++----------- .../Thumbnails/ThumbnailQueryErrorTest.cs | 39 +++++++--------- .../Helpers/MacOsTrashBindingHelperTest.cs | 3 +- 11 files changed, 111 insertions(+), 142 deletions(-) diff --git a/starsky/starsky.foundation.database/Query/Query.cs b/starsky/starsky.foundation.database/Query/Query.cs index 63dde37c52..a382022737 100644 --- a/starsky/starsky.foundation.database/Query/Query.cs +++ b/starsky/starsky.foundation.database/Query/Query.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Collections.Specialized; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Text; @@ -278,7 +279,10 @@ async Task LocalQuery(ApplicationDbContext context, FileIndexItem fileIndexItem) /// same item public async Task> UpdateItemAsync(List updateStatusContentList) { - if ( !updateStatusContentList.Any() ) return new List(); + if ( updateStatusContentList.Count == 0 ) + { + return new List(); + } async Task> LocalQuery(DbContext context, List fileIndexItems) { @@ -430,7 +434,8 @@ internal void AddCacheItem(FileIndexItem updateStatusContent) if (!_cache.TryGetValue(queryCacheName, out var objectFileFolders)) return; - var displayFileFolders = (List?) objectFileFolders; + objectFileFolders ??= new List(); + var displayFileFolders = (List) objectFileFolders; if ( updateStatusContent.FilePath == "/" ) { @@ -471,7 +476,8 @@ public void CacheUpdateItem(List updateStatusContent) skippedCacheItems.Add(item.ParentDirectory!); continue; } - + + objectFileFolders ??= new List(); var displayFileFolders = (List) objectFileFolders; // make it a list to avoid enum errors @@ -499,7 +505,7 @@ public void CacheUpdateItem(List updateStatusContent) _cache.Set(queryCacheName, displayFileFolders, new TimeSpan(1,0,0)); } - if ( skippedCacheItems.Any() && _appSettings.Verbose == true ) + if ( skippedCacheItems.Count >= 1 && _appSettings.Verbose == true ) { _logger.LogInformation($"[CacheUpdateItem] skipped: {string.Join(", ", skippedCacheItems)}"); } @@ -536,7 +542,9 @@ public void RemoveCacheItem(FileIndexItem updateStatusContent) if (!_cache.TryGetValue(queryCacheName, out var objectFileFolders)) return; + objectFileFolders ??= new List(); var displayFileFolders = (List) objectFileFolders; + // Order by filename displayFileFolders = displayFileFolders .Where(p => p.FilePath != updateStatusContent.FilePath) diff --git a/starsky/starsky.foundation.platform/Extensions/MemoryCacheExtensions.cs b/starsky/starsky.foundation.platform/Extensions/MemoryCacheExtensions.cs index cdacf391b0..5abfde895f 100644 --- a/starsky/starsky.foundation.platform/Extensions/MemoryCacheExtensions.cs +++ b/starsky/starsky.foundation.platform/Extensions/MemoryCacheExtensions.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection; using System.Reflection.Emit; @@ -11,6 +12,7 @@ namespace starsky.foundation.platform.Extensions /// /// @see: https://stackoverflow.com/a/64291008 /// + [SuppressMessage("Usage", "S3011:Make sure that this accessibility bypass is safe here", Justification = "Safe")] public static class MemoryCacheExtensions { private static readonly Lazy> GetCoherentState = diff --git a/starsky/starskytest/Extensions/EntityFrameworkExtensionsTest.cs b/starsky/starskytest/Extensions/EntityFrameworkExtensionsTest.cs index 84ef6c44f7..f42d010ce3 100644 --- a/starsky/starskytest/Extensions/EntityFrameworkExtensionsTest.cs +++ b/starsky/starskytest/Extensions/EntityFrameworkExtensionsTest.cs @@ -92,29 +92,22 @@ public AppDbMySqlException(DbContextOptions options) : base(options) private static MySqlException CreateMySqlException(string message) { - var info = new SerializationInfo(typeof(Exception), - new FormatterConverter()); - info.AddValue("Number", 1); - info.AddValue("SqlState", "SqlState"); - info.AddValue("Message", message); - info.AddValue("InnerException", new Exception()); - info.AddValue("HelpURL", ""); - info.AddValue("StackTraceString", ""); - info.AddValue("RemoteStackTraceString", ""); - info.AddValue("RemoteStackIndex", 1); - info.AddValue("HResult", 1); - info.AddValue("Source", ""); - info.AddValue("WatsonBuckets", Array.Empty() ); - - // private MySqlException(SerializationInfo info, StreamingContext context) - var ctor = - typeof(MySqlException).GetConstructors(BindingFlags.Instance | - BindingFlags.NonPublic | BindingFlags.InvokeMethod).FirstOrDefault(); + // MySqlErrorCode errorCode, string? sqlState, string message, Exception? innerException + + var ctorLIst = + typeof(MySqlException).GetConstructors( + BindingFlags.Instance | + BindingFlags.NonPublic | BindingFlags.InvokeMethod); + var ctor = ctorLIst.FirstOrDefault(p => + p.ToString() == "Void .ctor(MySqlConnector.MySqlErrorCode, System.String, System.String, System.Exception)" ); + var instance = ( MySqlException ) ctor?.Invoke(new object[] { - info, - new StreamingContext(StreamingContextStates.All) + MySqlErrorCode.AccessDenied, + "test", + message, + new Exception() }); return instance; } diff --git a/starsky/starskytest/starsky.foundation.database/DataProtection/SqlXmlRepositoryTest.cs b/starsky/starskytest/starsky.foundation.database/DataProtection/SqlXmlRepositoryTest.cs index 588979d6a9..32651457e3 100644 --- a/starsky/starskytest/starsky.foundation.database/DataProtection/SqlXmlRepositoryTest.cs +++ b/starsky/starskytest/starsky.foundation.database/DataProtection/SqlXmlRepositoryTest.cs @@ -65,29 +65,22 @@ public void SqlXmlRepositoryTest_ExpectedException_NullReferenceException() private static MySqlException CreateMySqlException(string message) { - var info = new SerializationInfo(typeof(Exception), - new FormatterConverter()); - info.AddValue("Number", 1); - info.AddValue("SqlState", "SqlState"); - info.AddValue("Message", message); - info.AddValue("InnerException", new Exception()); - info.AddValue("HelpURL", ""); - info.AddValue("StackTraceString", ""); - info.AddValue("RemoteStackTraceString", ""); - info.AddValue("RemoteStackIndex", 1); - info.AddValue("HResult", 1); - info.AddValue("Source", ""); - info.AddValue("WatsonBuckets", Array.Empty() ); - - // private MySqlException(SerializationInfo info, StreamingContext context) - var ctor = - typeof(MySqlException).GetConstructors(BindingFlags.Instance | - BindingFlags.NonPublic | BindingFlags.InvokeMethod).FirstOrDefault(); + // MySqlErrorCode errorCode, string? sqlState, string message, Exception? innerException + + var ctorLIst = + typeof(MySqlException).GetConstructors( + BindingFlags.Instance | + BindingFlags.NonPublic | BindingFlags.InvokeMethod); + var ctor = ctorLIst.FirstOrDefault(p => + p.ToString() == "Void .ctor(MySqlConnector.MySqlErrorCode, System.String, System.String, System.Exception)" ); + var instance = ( MySqlException ) ctor?.Invoke(new object[] { - info, - new StreamingContext(StreamingContextStates.All) + MySqlErrorCode.AccessDenied, + "test", + message, + new Exception() }); return instance; } diff --git a/starsky/starskytest/starsky.foundation.database/Helpers/RunMigrationsTest.cs b/starsky/starskytest/starsky.foundation.database/Helpers/RunMigrationsTest.cs index 7cd754de06..7d9be63e9e 100644 --- a/starsky/starskytest/starsky.foundation.database/Helpers/RunMigrationsTest.cs +++ b/starsky/starskytest/starsky.foundation.database/Helpers/RunMigrationsTest.cs @@ -49,29 +49,22 @@ public async Task Test() private static MySqlException CreateMySqlException(string message) { - var info = new SerializationInfo(typeof(Exception), - new FormatterConverter()); - info.AddValue("Number", 1); - info.AddValue("SqlState", "SqlState"); - info.AddValue("Message", message); - info.AddValue("InnerException", new Exception()); - info.AddValue("HelpURL", ""); - info.AddValue("StackTraceString", ""); - info.AddValue("RemoteStackTraceString", ""); - info.AddValue("RemoteStackIndex", 1); - info.AddValue("HResult", 1); - info.AddValue("Source", ""); - info.AddValue("WatsonBuckets", Array.Empty() ); - - // private MySqlException(SerializationInfo info, StreamingContext context) - var ctor = - typeof(MySqlException).GetConstructors(BindingFlags.Instance | - BindingFlags.NonPublic | BindingFlags.InvokeMethod).FirstOrDefault(); + // MySqlErrorCode errorCode, string? sqlState, string message, Exception? innerException + + var ctorLIst = + typeof(MySqlException).GetConstructors( + BindingFlags.Instance | + BindingFlags.NonPublic | BindingFlags.InvokeMethod); + var ctor = ctorLIst.FirstOrDefault(p => + p.ToString() == "Void .ctor(MySqlConnector.MySqlErrorCode, System.String, System.String, System.Exception)" ); + var instance = - ( MySqlException ) ctor.Invoke(new object[] + ( MySqlException ) ctor?.Invoke(new object[] { - info, - new StreamingContext(StreamingContextStates.All) + MySqlErrorCode.AccessDenied, + "test", + message, + new Exception() }); return instance; } diff --git a/starsky/starskytest/starsky.foundation.database/NotificationsTest/NotificationQueryErrorTest.cs b/starsky/starskytest/starsky.foundation.database/NotificationsTest/NotificationQueryErrorTest.cs index b6649a3376..3fc4245676 100644 --- a/starsky/starskytest/starsky.foundation.database/NotificationsTest/NotificationQueryErrorTest.cs +++ b/starsky/starskytest/starsky.foundation.database/NotificationsTest/NotificationQueryErrorTest.cs @@ -100,14 +100,14 @@ public bool IsConceptualNull(IProperty property) throw new NotImplementedException(); } +#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. public DbContext Context { get; } -#pragma warning disable 8618 // ReSharper disable once UnassignedGetOnlyAutoProperty public IEntityType EntityType { get; } -#pragma warning restore 8618 + public EntityState EntityState { get; set; } -#pragma warning disable 8618 + // ReSharper disable once UnassignedGetOnlyAutoProperty public IUpdateEntry SharedIdentityEntry { get; } #pragma warning restore 8618 diff --git a/starsky/starskytest/starsky.foundation.database/QueryTest/QueryGetAllRecursiveTest.cs b/starsky/starskytest/starsky.foundation.database/QueryTest/QueryGetAllRecursiveTest.cs index b7216e8b9f..767d04c250 100644 --- a/starsky/starskytest/starsky.foundation.database/QueryTest/QueryGetAllRecursiveTest.cs +++ b/starsky/starskytest/starsky.foundation.database/QueryTest/QueryGetAllRecursiveTest.cs @@ -77,31 +77,24 @@ await _query.AddItemAsync( private static MySqlException CreateMySqlException(string message) { - var info = new SerializationInfo(typeof(Exception), - new FormatterConverter()); - info.AddValue("Number", 1); - info.AddValue("SqlState", "SqlState"); - info.AddValue("Message", message); - info.AddValue("InnerException", new Exception()); - info.AddValue("HelpURL", ""); - info.AddValue("StackTraceString", ""); - info.AddValue("RemoteStackTraceString", ""); - info.AddValue("RemoteStackIndex", 1); - info.AddValue("HResult", 1); - info.AddValue("Source", ""); - info.AddValue("WatsonBuckets", Array.Empty() ); - - // private MySqlException(SerializationInfo info, StreamingContext context) - var ctor = - typeof(MySqlException).GetConstructors(BindingFlags.Instance | - BindingFlags.NonPublic | BindingFlags.InvokeMethod).FirstOrDefault(); + // MySqlErrorCode errorCode, string? sqlState, string message, Exception? innerException + + var ctorLIst = + typeof(MySqlException).GetConstructors( + BindingFlags.Instance | + BindingFlags.NonPublic | BindingFlags.InvokeMethod); + var ctor = ctorLIst.FirstOrDefault(p => + p.ToString() == "Void .ctor(MySqlConnector.MySqlErrorCode, System.String, System.String, System.Exception)" ); + var instance = - ( MySqlException? ) ctor?.Invoke(new object[] + ( MySqlException ) ctor?.Invoke(new object[] { - info, - new StreamingContext(StreamingContextStates.All) - }); - return instance!; + MySqlErrorCode.AccessDenied, + "test", + message, + new Exception() + })!; + return instance; } private static bool IsCalledMySqlSaveDbExceptionContext { get; set; } diff --git a/starsky/starskytest/starsky.foundation.database/QueryTest/QueryTest.cs b/starsky/starskytest/starsky.foundation.database/QueryTest/QueryTest.cs index d4a19ea938..8364f825bd 100644 --- a/starsky/starskytest/starsky.foundation.database/QueryTest/QueryTest.cs +++ b/starsky/starskytest/starsky.foundation.database/QueryTest/QueryTest.cs @@ -1102,9 +1102,11 @@ public void QueryFolder_Add_And_UpdateFolderCache_UpdateCacheItemTest() public void CacheUpdateItem_Skip_ShouldSetItem() { var item1 = new FileIndexItem {Id = 400, Tags = "hi", FileName = "cache"}; + // already verbose _query.CacheUpdateItem(new List{item1}); + Assert.IsTrue(_logger.TrackedInformation.Any()); Assert.IsTrue(_logger.TrackedInformation.FirstOrDefault().Item2.Contains("[CacheUpdateItem]")); } diff --git a/starsky/starskytest/starsky.foundation.database/QueryTest/QueryUpdateItem_Error.cs b/starsky/starskytest/starsky.foundation.database/QueryTest/QueryUpdateItem_Error.cs index d2e75192b2..f2e66b66f1 100644 --- a/starsky/starskytest/starsky.foundation.database/QueryTest/QueryUpdateItem_Error.cs +++ b/starsky/starskytest/starsky.foundation.database/QueryTest/QueryUpdateItem_Error.cs @@ -121,14 +121,14 @@ public bool IsConceptualNull(IProperty property) throw new NotImplementedException(); } +#pragma warning disable 8618 public DbContext Context { get; } -#pragma warning disable 8618 // ReSharper disable once UnassignedGetOnlyAutoProperty public IEntityType EntityType { get; } -#pragma warning restore 8618 + public EntityState EntityState { get; set; } -#pragma warning disable 8618 + // ReSharper disable once UnassignedGetOnlyAutoProperty public IUpdateEntry SharedIdentityEntry { get; } #pragma warning restore 8618 @@ -310,31 +310,24 @@ public override Task SaveChangesAsync(CancellationToken cancellationToken = private static MySqlException CreateMySqlException(string message) { - var info = new SerializationInfo(typeof(Exception), - new FormatterConverter()); - info.AddValue("Number", 1); - info.AddValue("SqlState", "SqlState"); - info.AddValue("Message", message); - info.AddValue("InnerException", new Exception()); - info.AddValue("HelpURL", ""); - info.AddValue("StackTraceString", ""); - info.AddValue("RemoteStackTraceString", ""); - info.AddValue("RemoteStackIndex", 1); - info.AddValue("HResult", 1); - info.AddValue("Source", ""); - info.AddValue("WatsonBuckets", Array.Empty() ); - - // private MySqlException(SerializationInfo info, StreamingContext context) - var ctor = - typeof(MySqlException).GetConstructors(BindingFlags.Instance | - BindingFlags.NonPublic | BindingFlags.InvokeMethod).FirstOrDefault(); + // MySqlErrorCode errorCode, string? sqlState, string message, Exception? innerException + + var ctorLIst = + typeof(MySqlException).GetConstructors( + BindingFlags.Instance | + BindingFlags.NonPublic | BindingFlags.InvokeMethod); + var ctor = ctorLIst.FirstOrDefault(p => + p.ToString() == "Void .ctor(MySqlConnector.MySqlErrorCode, System.String, System.String, System.Exception)" ); + var instance = - ( MySqlException? ) ctor?.Invoke(new object[] + ( MySqlException ) ctor?.Invoke(new object[] { - info, - new StreamingContext(StreamingContextStates.All) - }); - return instance!; + MySqlErrorCode.AccessDenied, + "test", + message, + new Exception() + })!; + return instance; } [TestMethod] diff --git a/starsky/starskytest/starsky.foundation.database/Thumbnails/ThumbnailQueryErrorTest.cs b/starsky/starskytest/starsky.foundation.database/Thumbnails/ThumbnailQueryErrorTest.cs index d7b068b778..71d07e435c 100644 --- a/starsky/starskytest/starsky.foundation.database/Thumbnails/ThumbnailQueryErrorTest.cs +++ b/starsky/starskytest/starsky.foundation.database/Thumbnails/ThumbnailQueryErrorTest.cs @@ -208,31 +208,24 @@ public async Task ThumbnailQuery_3ConcurrencyException() private static MySqlException CreateMySqlException(string message) { - var info = new SerializationInfo(typeof(Exception), - new FormatterConverter()); - info.AddValue("Number", 1); - info.AddValue("SqlState", "SqlState"); - info.AddValue("Message", message); - info.AddValue("InnerException", new Exception()); - info.AddValue("HelpURL", ""); - info.AddValue("StackTraceString", ""); - info.AddValue("RemoteStackTraceString", ""); - info.AddValue("RemoteStackIndex", 1); - info.AddValue("HResult", 1); - info.AddValue("Source", ""); - info.AddValue("WatsonBuckets", Array.Empty() ); - - // private MySqlException(SerializationInfo info, StreamingContext context) - var ctor = - typeof(MySqlException).GetConstructors(BindingFlags.Instance | - BindingFlags.NonPublic | BindingFlags.InvokeMethod).FirstOrDefault(); + // MySqlErrorCode errorCode, string? sqlState, string message, Exception? innerException + + var ctorLIst = + typeof(MySqlException).GetConstructors( + BindingFlags.Instance | + BindingFlags.NonPublic | BindingFlags.InvokeMethod); + var ctor = ctorLIst.FirstOrDefault(p => + p.ToString() == "Void .ctor(MySqlConnector.MySqlErrorCode, System.String, System.String, System.Exception)" ); + var instance = - ( MySqlException? ) ctor?.Invoke(new object[] + ( MySqlException ) ctor?.Invoke(new object[] { - info, - new StreamingContext(StreamingContextStates.All) - }); - return instance!; + MySqlErrorCode.AccessDenied, + "test", + message, + new Exception() + })!; + return instance; } private static bool IsCalledMySqlSaveDbExceptionContext { get; set; } diff --git a/starsky/starskytest/starsky.foundation.native/Trash/Helpers/MacOsTrashBindingHelperTest.cs b/starsky/starskytest/starsky.foundation.native/Trash/Helpers/MacOsTrashBindingHelperTest.cs index 96acdadaad..c6b9c411ab 100644 --- a/starsky/starskytest/starsky.foundation.native/Trash/Helpers/MacOsTrashBindingHelperTest.cs +++ b/starsky/starskytest/starsky.foundation.native/Trash/Helpers/MacOsTrashBindingHelperTest.cs @@ -6,11 +6,10 @@ using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.foundation.native.Helpers; -using starsky.foundation.native.Trash; using starsky.foundation.native.Trash.Helpers; using starskytest.FakeCreateAn; -namespace starskytest.starsky.foundation.native.Trash; +namespace starskytest.starsky.foundation.native.Trash.Helpers; [TestClass] public class MacOsTrashBindingHelperTest From c2ad5098bf9dc766e161c1b79cfd9f0eea257b3d Mon Sep 17 00:00:00 2001 From: Dion Date: Wed, 17 Jan 2024 19:12:25 +0100 Subject: [PATCH 12/31] more time && rename --- starsky/starskytest/root/ProgramTest.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/starsky/starskytest/root/ProgramTest.cs b/starsky/starskytest/root/ProgramTest.cs index 6f29315ee6..04d03e9e61 100644 --- a/starsky/starskytest/root/ProgramTest.cs +++ b/starsky/starskytest/root/ProgramTest.cs @@ -77,9 +77,9 @@ public async Task Program_RunAsync_Null_False() } [TestMethod] - [Timeout(9000)] + [Timeout(15000)] [ExpectedException(typeof(TimeoutException))] - public async Task Program_RunAsync_ReturnedTrue() + public async Task Program_RunAsync_WebApplication_CreateBuilder_TimeoutException() { Environment.SetEnvironmentVariable("ASPNETCORE_URLS","http://*:7518"); @@ -92,7 +92,7 @@ public async Task Program_RunAsync_ReturnedTrue() [TestMethod] [Timeout(9000)] [ExpectedException(typeof(FormatException))] - public async Task Program_RunAsync_InvalidUrl() + public async Task Program_RunAsync_WebApplication_CreateBuilder_InvalidUrl() { Environment.SetEnvironmentVariable("ASPNETCORE_URLS","test"); From 4b782702a03f8151610568beb8f841cab8ef2d35 Mon Sep 17 00:00:00 2001 From: Dion Date: Thu, 18 Jan 2024 15:55:05 +0100 Subject: [PATCH 13/31] remove sync class && make async && change palintextfilehelper --- .../Services/CleanDemoDataService.cs | 2 +- .../Services/ExportService.cs | 2 +- .../Interfaces/IGeoIndexGpx.cs | 5 +- .../Services/GeoBackgroundTask.cs | 8 +-- .../Services/GeoCacheStatusService.cs | 4 +- .../Services/GeoCli.cs | 6 +-- .../Services/GeoIndexGpx.cs | 10 ++-- .../UpdateCheck/Services/CheckForUpdates.cs | 1 + .../Helpers/UpdateImportTransformations.cs | 2 +- .../starsky.feature.import/Services/Import.cs | 8 +-- .../Interfaces/IMetaInfo.cs | 4 +- .../Services/MetaInfo.cs | 9 ++-- .../Services/DeviceIdService.cs | 10 ++-- .../Helpers/WebFtpCli.cs | 7 +-- .../Helpers/PublishCli.cs | 4 +- .../Helpers/PublishManifest.cs | 2 +- .../Services/WebHtmlPublishService.cs | 4 +- .../Exceptions/TelemetryServiceException.cs | 2 + .../ContentSecurityPolicyMiddleware.cs | 12 ++--- .../Interfaces/IReadMeta.cs | 8 +-- .../ReadMetaHelpers/ReadMetaGpx.cs | 11 ++-- .../ReadMetaHelpers/ReadMetaXmp.cs | 5 +- .../Services/ReadMeta.cs | 33 ++++++------ .../Services/ReadMetaSubPathStorage.cs | 12 +++-- .../Helpers/DeserializeJson.cs | 5 +- .../Helpers/PlainTextFileHelper.cs | 48 ----------------- .../Helpers/StreamToStringHelper.cs | 31 +++++++++++ .../Helpers/StringToStreamHelper.cs | 19 +++++++ .../Helpers/NewItem.cs | 18 +++---- .../Helpers/NewUpdateItemWrapper.cs | 6 +-- .../EventQueueOverflowException.cs | 2 + .../Helpers/Thumbnail.cs | 2 +- .../Helpers/ExifTool.cs | 14 +---- .../JsonService/FileIndexItemJsonParser.cs | 6 +-- .../Services/ExifCopy.cs | 9 ++-- .../Controllers/AppSettingsController.cs | 2 +- .../starsky/Controllers/MetaInfoController.cs | 5 +- .../starsky/Controllers/PublishController.cs | 2 +- .../starsky/Controllers/UploadController.cs | 2 +- .../starsky/Helpers/SwaggerExportHelper.cs | 2 +- .../Controllers/AppSettingsControllerTest.cs | 9 ++-- .../Controllers/CacheIndexControllerTest.cs | 2 +- .../Controllers/MetaInfoControllerTest.cs | 27 +++++----- .../Controllers/ThumbnailControllerTest.cs | 2 +- .../Controllers/UploadControllerTest.cs | 10 ++-- .../starskytest/FakeMocks/FakeIGeoIndexGpx.cs | 5 +- .../starskytest/FakeMocks/FakeIMetaInfo.cs | 5 +- .../FakeMocks/FakeIThumbnailService.cs | 8 +-- starsky/starskytest/FakeMocks/FakeReadMeta.cs | 13 ++--- .../FakeMocks/FakeReadMetaSubPathStorage.cs | 12 +++-- .../starskytest/Helpers/Base64HelperTest.cs | 1 - .../starskytest/Helpers/SwaggerHelperTest.cs | 2 +- starsky/starskytest/Models/FakeExifTool.cs | 4 +- .../Services/GeoBackgroundTaskTest.cs | 4 +- .../Services/GeoFileDownloadTest.cs | 8 +-- .../Services/GeoIndexGpxTest.cs | 7 +-- .../Services/GeoReverseLookupTest.cs | 6 +-- .../Services/ImportTest.cs | 24 ++++----- .../Services/ImportTest_InMemoryDb.cs | 10 ++-- .../Services/MetaInfoTest.cs | 25 ++++----- .../Services/ReplaceServiceTest.cs | 2 +- .../Services/DeviceIdServiceTest.cs | 22 ++++---- .../Services/RenameServiceTest.cs | 4 +- .../Helpers/WebFtpCliTest.cs | 43 +++++++-------- .../Thumbnails/ThumbnailQueryErrorTest.cs | 6 +-- .../TelemetryServiceExceptionTest.cs | 2 + .../Helpers/PathHelper2Test.cs} | 5 +- .../Helpers/PathHelperTest.cs | 12 +++-- .../Helpers/PortProgramHelperTest.cs | 6 +-- .../Helpers/ReadAppSettingsTest.cs | 2 +- .../Helpers/SetupAppSettingsTest.cs | 16 +++--- .../ContentSecurityPolicyMiddlewareTest.cs | 21 ++++---- .../Services/ReadMetaSubPathStorageTest.cs | 16 +++--- .../Services/ReadMetaTest.cs | 52 ++++++++++++------- .../Services/ReadMeta_ExifReadTest.cs | 2 +- .../Services/ReadMeta_GpxFromFileTest.cs | 41 +++++++-------- .../ReadMeta_ReadMetaBoth_Cache_Test.cs | 28 +++++----- .../Services/ReadMeta_XmpReadHelperTest.cs | 20 +++---- .../DisabledWebSocketsMiddlewareTest.cs | 4 +- .../ArchiveFormats/TarBalTest.cs | 2 +- .../Helpers/DeserializeJsonTest.cs | 25 +++++---- .../Services/FileHashTest.cs | 2 +- .../Storage/StorageSubPathFilesystemTest.cs | 6 +-- .../Helpers/NewItemTest.cs | 4 +- .../Helpers/ThumbnailTest.cs | 6 +-- .../Services/ReadMetaThumbnailTest.cs | 8 +-- .../Helpers/ExifToolDownloadTest.cs | 4 +- .../Helpers/ExifToolTest.cs | 5 ++ .../FileIndexItemJsonWriterTest.cs | 18 +++---- .../Services/ExifCopyTest.cs | 8 +-- .../Services/ExifToolServiceTest.cs | 2 +- starsky/starskywebftpcli/Program.cs | 2 +- 92 files changed, 483 insertions(+), 441 deletions(-) delete mode 100644 starsky/starsky.foundation.storage/Helpers/PlainTextFileHelper.cs create mode 100644 starsky/starsky.foundation.storage/Helpers/StreamToStringHelper.cs create mode 100644 starsky/starsky.foundation.storage/Helpers/StringToStreamHelper.cs rename starsky/starskytest/{ => starsky.feature.metaupdate}/Services/ReplaceServiceTest.cs (99%) rename starsky/starskytest/{Services/ConfigReadTest.cs => starsky.foundation.platform/Helpers/PathHelper2Test.cs} (92%) rename starsky/starskytest/{ => starsky.foundation.readmeta}/Services/ReadMetaTest.cs (83%) rename starsky/starskytest/{ => starsky.foundation.readmeta}/Services/ReadMeta_ExifReadTest.cs (99%) rename starsky/starskytest/{ => starsky.foundation.readmeta}/Services/ReadMeta_GpxFromFileTest.cs (82%) rename starsky/starskytest/{ => starsky.foundation.readmeta}/Services/ReadMeta_ReadMetaBoth_Cache_Test.cs (61%) rename starsky/starskytest/{ => starsky.foundation.readmeta}/Services/ReadMeta_XmpReadHelperTest.cs (95%) rename starsky/starskytest/{ => starsky.foundation.storage}/Services/FileHashTest.cs (97%) rename starsky/starskytest/{ => starsky.foundation.writemeta}/Services/ExifCopyTest.cs (92%) diff --git a/starsky/starsky.feature.demo/Services/CleanDemoDataService.cs b/starsky/starsky.feature.demo/Services/CleanDemoDataService.cs index 74eecbb56e..0376f751f0 100644 --- a/starsky/starsky.feature.demo/Services/CleanDemoDataService.cs +++ b/starsky/starsky.feature.demo/Services/CleanDemoDataService.cs @@ -166,7 +166,7 @@ internal static async Task DownloadAsync(AppSettings appSettings, continue; } - var result = await PlainTextFileHelper.StreamToStringAsync( + var result = await StreamToStringHelper.StreamToStringAsync( hostStorage.ReadStream(settingsJsonFullPath)); var data = Deserialize(result, webLogger, hostStorage, settingsJsonFullPath); diff --git a/starsky/starsky.feature.export/Services/ExportService.cs b/starsky/starsky.feature.export/Services/ExportService.cs index 6b1d9c1b7a..c4979ab3e5 100644 --- a/starsky/starsky.feature.export/Services/ExportService.cs +++ b/starsky/starsky.feature.export/Services/ExportService.cs @@ -145,7 +145,7 @@ public async Task CreateZip(List fileIndexResultsList, bool thumb // Write a single file to be sure that writing is ready var doneFileFullPath = Path.Combine(_appSettings.TempFolder,zipOutputFileName) + ".done"; await _hostFileSystemStorage. - WriteStreamAsync(PlainTextFileHelper.StringToStream("OK"), doneFileFullPath); + WriteStreamAsync(StringToStreamHelper.StringToStream("OK"), doneFileFullPath); if(_appSettings.IsVerbose()) _logger.LogInformation("[CreateZip] Zip done: " + doneFileFullPath); } diff --git a/starsky/starsky.feature.geolookup/Interfaces/IGeoIndexGpx.cs b/starsky/starsky.feature.geolookup/Interfaces/IGeoIndexGpx.cs index f830de5c92..21b5791bb2 100644 --- a/starsky/starsky.feature.geolookup/Interfaces/IGeoIndexGpx.cs +++ b/starsky/starsky.feature.geolookup/Interfaces/IGeoIndexGpx.cs @@ -1,11 +1,12 @@ using System.Collections.Generic; +using System.Threading.Tasks; using starsky.foundation.database.Models; namespace starsky.feature.geolookup.Interfaces { public interface IGeoIndexGpx { - List - LoopFolder(List metaFilesInDirectory); + Task> LoopFolderAsync( + List metaFilesInDirectory); } } diff --git a/starsky/starsky.feature.geolookup/Services/GeoBackgroundTask.cs b/starsky/starsky.feature.geolookup/Services/GeoBackgroundTask.cs index d6fca5ce77..3ea7a52054 100644 --- a/starsky/starsky.feature.geolookup/Services/GeoBackgroundTask.cs +++ b/starsky/starsky.feature.geolookup/Services/GeoBackgroundTask.cs @@ -54,15 +54,15 @@ public async Task> GeoBackgroundTaskAsync( var listOfFiles = _iStorage.GetAllFilesInDirectory(f) .Where(ExtensionRolesHelper.IsExtensionSyncSupported).ToList(); - var fileIndexList = _readMeta - .ReadExifAndXmpFromFileAddFilePathHash(listOfFiles); + var fileIndexList = await _readMeta + .ReadExifAndXmpFromFileAddFilePathHashAsync(listOfFiles); var toMetaFilesUpdate = new List(); if ( index ) { toMetaFilesUpdate = - _geoIndexGpx - .LoopFolder(fileIndexList); + await _geoIndexGpx + .LoopFolderAsync(fileIndexList); if ( _appSettings.IsVerbose() ) Console.Write("¬"); diff --git a/starsky/starsky.feature.geolookup/Services/GeoCacheStatusService.cs b/starsky/starsky.feature.geolookup/Services/GeoCacheStatusService.cs index 1c5fb42b35..4d62417cf2 100644 --- a/starsky/starsky.feature.geolookup/Services/GeoCacheStatusService.cs +++ b/starsky/starsky.feature.geolookup/Services/GeoCacheStatusService.cs @@ -22,14 +22,14 @@ public GeoCacheStatus Status(string path) var result = new GeoCacheStatus(); if(_cache.TryGetValue(totalCacheName, out var statusObjectTotal) && - TryParse(statusObjectTotal.ToString(), out var totalStatus)) + TryParse(statusObjectTotal?.ToString(), out var totalStatus)) { result.Total = totalStatus; } var currentCacheName = nameof(GeoCacheStatus) + path + StatusType.Current; if(_cache.TryGetValue(currentCacheName, out var statusObjectCurrent) && - TryParse(statusObjectCurrent.ToString(), out var currentStatus)) + TryParse(statusObjectCurrent?.ToString(), out var currentStatus)) { result.Current = currentStatus; } diff --git a/starsky/starsky.feature.geolookup/Services/GeoCli.cs b/starsky/starsky.feature.geolookup/Services/GeoCli.cs index a8412a5797..a4dae6e7e7 100644 --- a/starsky/starsky.feature.geolookup/Services/GeoCli.cs +++ b/starsky/starsky.feature.geolookup/Services/GeoCli.cs @@ -45,7 +45,7 @@ public GeoCli(IGeoReverseLookup geoReverseLookup, _geoLocationWrite = geoLocationWrite; _iStorage = selectorStorage.Get(SelectorStorage.StorageServices.SubPath); _thumbnailStorage = selectorStorage.Get(SelectorStorage.StorageServices.Thumbnail); - _readMeta = new ReadMeta(_iStorage, appSettings, null, logger); + _readMeta = new ReadMeta(_iStorage, appSettings, null!, logger); _appSettings = appSettings; _console = console; _exifToolDownload = exifToolDownload; @@ -122,7 +122,7 @@ public async Task CommandLineAsync(string[] args) var listOfFiles = _iStorage.GetAllFilesInDirectory("/") .Where(ExtensionRolesHelper.IsExtensionSyncSupported).ToList(); - var fileIndexList = _readMeta.ReadExifAndXmpFromFileAddFilePathHash(listOfFiles); + var fileIndexList = await _readMeta.ReadExifAndXmpFromFileAddFilePathHashAsync(listOfFiles); var toMetaFilesUpdate = new List(); if ( ArgsHelper.GetIndexMode(args) ) @@ -131,7 +131,7 @@ public async Task CommandLineAsync(string[] args) _console.WriteLine($"Folder: {inputPath}"); var geoIndexGpx = new GeoIndexGpx(_appSettings, _iStorage, _logger); - toMetaFilesUpdate = geoIndexGpx.LoopFolder(fileIndexList); + toMetaFilesUpdate = await geoIndexGpx.LoopFolderAsync(fileIndexList); _console.Write("¬"); await _geoLocationWrite.LoopFolderAsync(toMetaFilesUpdate, false); diff --git a/starsky/starsky.feature.geolookup/Services/GeoIndexGpx.cs b/starsky/starsky.feature.geolookup/Services/GeoIndexGpx.cs index 688d3496e3..d21e64ad73 100644 --- a/starsky/starsky.feature.geolookup/Services/GeoIndexGpx.cs +++ b/starsky/starsky.feature.geolookup/Services/GeoIndexGpx.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Runtime.CompilerServices; +using System.Threading.Tasks; using Microsoft.Extensions.Caching.Memory; using starsky.feature.geolookup.Interfaces; using starsky.feature.geolookup.Models; @@ -11,7 +12,6 @@ using starsky.foundation.platform.Models; using starsky.foundation.readmeta.Models; using starsky.foundation.readmeta.ReadMetaHelpers; -using starsky.foundation.readmeta.Services; using starsky.foundation.storage.Interfaces; [assembly: InternalsVisibleTo("starskytest")] @@ -42,7 +42,7 @@ private static List GetNoLocationItems(IEnumerable .ToList(); } - private List GetGpxFile(List metaFilesInDirectory) + private async Task> GetGpxFileAsync(List metaFilesInDirectory) { var geoList = new List(); foreach (var metaFileItem in metaFilesInDirectory) @@ -54,7 +54,7 @@ private List GetGpxFile(List metaFilesInDirectory) using ( var stream = _iStorage.ReadStream(metaFileItem.FilePath!) ) { - geoList.AddRange(new ReadMetaGpx(_logger).ReadGpxFile(stream, geoList)); + geoList.AddRange(await new ReadMetaGpx(_logger).ReadGpxFileAsync(stream, geoList)); } } return geoList; @@ -82,11 +82,11 @@ internal DateTime ConvertTimeZone(DateTime valueDateTime, string subPath = "") _appSettings.CameraTimeZoneInfo, TimeZoneInfo.Utc); } - public List LoopFolder(List metaFilesInDirectory) + public async Task> LoopFolderAsync(List metaFilesInDirectory) { var toUpdateMetaFiles = new List(); - var gpxList = GetGpxFile(metaFilesInDirectory); + var gpxList = await GetGpxFileAsync(metaFilesInDirectory); if(!gpxList.Any()) return toUpdateMetaFiles; metaFilesInDirectory = GetNoLocationItems(metaFilesInDirectory); diff --git a/starsky/starsky.feature.health/UpdateCheck/Services/CheckForUpdates.cs b/starsky/starsky.feature.health/UpdateCheck/Services/CheckForUpdates.cs index 0145953593..5f83afeb06 100644 --- a/starsky/starsky.feature.health/UpdateCheck/Services/CheckForUpdates.cs +++ b/starsky/starsky.feature.health/UpdateCheck/Services/CheckForUpdates.cs @@ -58,6 +58,7 @@ public async Task> IsUpdateNeeded(string curr if ( _cache.TryGetValue(QueryCheckForUpdatesCacheName, out var cacheResult) ) { + cacheResult ??= new List(); return Parse(( List ) cacheResult, currentVersion); } diff --git a/starsky/starsky.feature.import/Helpers/UpdateImportTransformations.cs b/starsky/starsky.feature.import/Helpers/UpdateImportTransformations.cs index 4661f57638..674f255bef 100644 --- a/starsky/starsky.feature.import/Helpers/UpdateImportTransformations.cs +++ b/starsky/starsky.feature.import/Helpers/UpdateImportTransformations.cs @@ -74,7 +74,7 @@ internal async Task UpdateTransformations( var exifToolCmdHelper = new ExifToolCmdHelper(_exifTool, _subPathStorage, _thumbnailStorage, - new ReadMeta(_subPathStorage, _appSettings, null, _logger), + new ReadMeta(_subPathStorage, _appSettings, null!, _logger), _thumbnailQuery); await exifToolCmdHelper.UpdateAsync(fileIndexItem, comparedNamesList); diff --git a/starsky/starsky.feature.import/Services/Import.cs b/starsky/starsky.feature.import/Services/Import.cs index ecdd359172..e33ff9e415 100644 --- a/starsky/starsky.feature.import/Services/Import.cs +++ b/starsky/starsky.feature.import/Services/Import.cs @@ -91,7 +91,7 @@ public Import( _thumbnailStorage = selectorStorage.Get(SelectorStorage.StorageServices.Thumbnail); _appSettings = appSettings; - _readMetaHost = new ReadMeta(_filesystemStorage, appSettings, null, logger); + _readMetaHost = new ReadMeta(_filesystemStorage, appSettings, null!, logger); _exifTool = exifTool; _query = query; _console = console; @@ -366,11 +366,11 @@ internal async Task PreflightPerFile(KeyValuePair // Only accept files with correct meta data // Check if there is a xmp file that contains data - var fileIndexItem = _readMetaHost.ReadExifAndXmpFromFile(inputFileFullPath.Key); + var fileIndexItem = await _readMetaHost.ReadExifAndXmpFromFileAsync(inputFileFullPath.Key); // Parse the filename and create a new importIndexItem object var importIndexItem = ObjectCreateIndexItem(inputFileFullPath.Key, imageFormat, - hashList.Key, fileIndexItem, importSettings.ColorClass, + hashList.Key, fileIndexItem!, importSettings.ColorClass, _filesystemStorage.Info(inputFileFullPath.Key).Size); // Update the parent and filenames @@ -638,7 +638,7 @@ private async Task CreateSideCarFile(ImportIndexItem importIndexItem, bool xmpEx { var exifCopy = new ExifCopy(_subPathStorage, _thumbnailStorage, _exifTool, new ReadMeta(_subPathStorage, - _appSettings, null, _logger),_thumbnailQuery); + _appSettings, null!, _logger),_thumbnailQuery); await exifCopy.XmpSync(importIndexItem.FileIndexItem!.FilePath); } } diff --git a/starsky/starsky.feature.metaupdate/Interfaces/IMetaInfo.cs b/starsky/starsky.feature.metaupdate/Interfaces/IMetaInfo.cs index 9c829c3135..e8a1b98f16 100644 --- a/starsky/starsky.feature.metaupdate/Interfaces/IMetaInfo.cs +++ b/starsky/starsky.feature.metaupdate/Interfaces/IMetaInfo.cs @@ -1,10 +1,12 @@ using System.Collections.Generic; +using System.Threading.Tasks; using starsky.foundation.database.Models; namespace starsky.feature.metaupdate.Interfaces { public interface IMetaInfo { - List GetInfo(List inputFilePaths, bool collections); + Task> GetInfoAsync(List inputFilePaths, + bool collections); } } diff --git a/starsky/starsky.feature.metaupdate/Services/MetaInfo.cs b/starsky/starsky.feature.metaupdate/Services/MetaInfo.cs index d1c4389295..35039e278b 100644 --- a/starsky/starsky.feature.metaupdate/Services/MetaInfo.cs +++ b/starsky/starsky.feature.metaupdate/Services/MetaInfo.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading.Tasks; using Microsoft.Extensions.Caching.Memory; using starsky.feature.metaupdate.Interfaces; using starsky.foundation.database.Helpers; @@ -31,7 +32,7 @@ public MetaInfo(IQuery query, AppSettings appSettings, ISelectorStorage selector _statusCodeHelper = new StatusCodesHelper(appSettings); } - public List GetInfo(List inputFilePaths, bool collections) + public async Task> GetInfoAsync(List inputFilePaths, bool collections) { // the result list var fileIndexResultsList = new List(); @@ -62,7 +63,7 @@ public List GetInfo(List inputFilePaths, bool collections && !ExtensionRolesHelper.IsExtensionSidecar(detailView.FileIndexItem!.FileName)) { StatusCodesHelper.ReturnExifStatusError( - new FileIndexItemJsonParser(_iStorage).Read(detailView.FileIndexItem), + await new FileIndexItemJsonParser(_iStorage).ReadAsync(detailView.FileIndexItem), FileIndexItem.ExifStatus.ExifWriteNotSupported, fileIndexResultsList); continue; @@ -78,9 +79,9 @@ public List GetInfo(List inputFilePaths, bool collections foreach ( var collectionSubPath in collectionSubPathList ) { - var collectionItem = _readMeta.ReadExifAndXmpFromFile(collectionSubPath); + var collectionItem = await _readMeta.ReadExifAndXmpFromFileAsync(collectionSubPath); - collectionItem.Status = statusResults; + collectionItem!.Status = statusResults; collectionItem.CollectionPaths = collectionSubPathList; collectionItem.ImageFormat = ExtensionRolesHelper.MapFileTypesToExtension(collectionSubPath); diff --git a/starsky/starsky.feature.packagetelemetry/Services/DeviceIdService.cs b/starsky/starsky.feature.packagetelemetry/Services/DeviceIdService.cs index 7f6e4c3ba4..a9d0e5b8fd 100644 --- a/starsky/starsky.feature.packagetelemetry/Services/DeviceIdService.cs +++ b/starsky/starsky.feature.packagetelemetry/Services/DeviceIdService.cs @@ -50,7 +50,7 @@ public async Task DeviceId(OSPlatform? currentPlatform ) if ( currentPlatform == OSPlatform.Linux || currentPlatform == OSPlatform.FreeBSD) { - id = DeviceIdLinuxBsd(); + id = await DeviceIdLinuxBsdAsync(); } // For privacy reason this content of this id will be anonymous @@ -73,23 +73,23 @@ internal async Task DeviceIdDatabaseId() return generatedString; } - private string DeviceIdLinuxBsd() + private async Task DeviceIdLinuxBsdAsync() { if ( _hostStorage.ExistFile(DbusMachineIdPath) ) { var stream = _hostStorage.ReadStream(DbusMachineIdPath); - return PlainTextFileHelper.StreamToString(stream); + return await StreamToStringHelper.StreamToStringAsync(stream); } if ( _hostStorage.ExistFile(MachineIdPath2) ) { var stream = _hostStorage.ReadStream(MachineIdPath2); - return PlainTextFileHelper.StreamToString(stream); + return await StreamToStringHelper.StreamToStringAsync(stream); } if ( !_hostStorage.ExistFile(BsdHostIdPath) ) return string.Empty; var streamBsd = _hostStorage.ReadStream(BsdHostIdPath); - return PlainTextFileHelper.StreamToString(streamBsd); + return await StreamToStringHelper.StreamToStringAsync(streamBsd); } /// diff --git a/starsky/starsky.feature.webftppublish/Helpers/WebFtpCli.cs b/starsky/starsky.feature.webftppublish/Helpers/WebFtpCli.cs index 569ec7013c..e6097c6f2b 100644 --- a/starsky/starsky.feature.webftppublish/Helpers/WebFtpCli.cs +++ b/starsky/starsky.feature.webftppublish/Helpers/WebFtpCli.cs @@ -1,4 +1,5 @@ using System.IO; +using System.Threading.Tasks; using starsky.feature.webftppublish.FtpAbstractions.Interfaces; using starsky.feature.webftppublish.Models; using starsky.feature.webftppublish.Services; @@ -30,7 +31,7 @@ public WebFtpCli(AppSettings appSettings, ISelectorStorage selectorStorage, ICon _webRequestFactory = webRequestFactory; } - public void Run(string[] args) + public async Task RunAsync(string[] args) { _appSettings.Verbose = ArgsHelper.NeedVerbose(args); @@ -75,8 +76,8 @@ public void Run(string[] args) return; } - var settings = - new DeserializeJson(_hostStorageProvider).Read( + var settings = await + new DeserializeJson(_hostStorageProvider).ReadAsync( settingsFullFilePath); var ftpService = new FtpService(_appSettings,_hostStorageProvider, diff --git a/starsky/starsky.feature.webhtmlpublish/Helpers/PublishCli.cs b/starsky/starsky.feature.webhtmlpublish/Helpers/PublishCli.cs index 6d8f9b3218..84aa31aa32 100644 --- a/starsky/starsky.feature.webhtmlpublish/Helpers/PublishCli.cs +++ b/starsky/starsky.feature.webhtmlpublish/Helpers/PublishCli.cs @@ -94,8 +94,8 @@ public async Task Publisher(string[] args) var listOfFiles = _subPathStorage.GetAllFilesInDirectory("/") .Where(ExtensionRolesHelper.IsExtensionExifToolSupported).ToList(); - var fileIndexList = new ReadMeta(_subPathStorage, _appSettings, null, _logger) - .ReadExifAndXmpFromFileAddFilePathHash(listOfFiles); + var fileIndexList = await new ReadMeta(_subPathStorage, _appSettings, null, _logger) + .ReadExifAndXmpFromFileAddFilePathHashAsync(listOfFiles); // todo introduce selector var profileName = new PublishPreflight(_appSettings,_console, _storageSelector, _logger) diff --git a/starsky/starsky.feature.webhtmlpublish/Helpers/PublishManifest.cs b/starsky/starsky.feature.webhtmlpublish/Helpers/PublishManifest.cs index f1470cc4a8..1c29f9f72f 100644 --- a/starsky/starsky.feature.webhtmlpublish/Helpers/PublishManifest.cs +++ b/starsky/starsky.feature.webhtmlpublish/Helpers/PublishManifest.cs @@ -42,7 +42,7 @@ public void ExportManifest( string parentFullFilePath, string itemName, var outputLocation = Path.Combine(parentFullFilePath, ManifestName); _storage.FileDelete(outputLocation); - _storage.WriteStream(PlainTextFileHelper.StringToStream(output), outputLocation); + _storage.WriteStream(StringToStreamHelper.StringToStream(output), outputLocation); } } } diff --git a/starsky/starsky.feature.webhtmlpublish/Services/WebHtmlPublishService.cs b/starsky/starsky.feature.webhtmlpublish/Services/WebHtmlPublishService.cs index a6c431c36a..703c405375 100644 --- a/starsky/starsky.feature.webhtmlpublish/Services/WebHtmlPublishService.cs +++ b/starsky/starsky.feature.webhtmlpublish/Services/WebHtmlPublishService.cs @@ -233,7 +233,7 @@ internal async Task> GenerateWebHtml(List /// protected TelemetryServiceException(SerializationInfo info, StreamingContext context) +#pragma warning disable SYSLIB0051 : base(info, context) +#pragma warning restore SYSLIB0051 { } } diff --git a/starsky/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddleware.cs b/starsky/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddleware.cs index 680d3aef96..6d9a77cb15 100644 --- a/starsky/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddleware.cs +++ b/starsky/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddleware.cs @@ -62,7 +62,7 @@ public async Task Invoke(HttpContext httpContext) // When change also update in Electron httpContext.Response.Headers - .Add("Content-Security-Policy",cspHeader); + .Append("Content-Security-Policy",cspHeader); } // @see: https://www.permissionspolicy.com/ @@ -70,7 +70,7 @@ public async Task Invoke(HttpContext httpContext) httpContext.Response.Headers["Permissions-Policy"]) ) { httpContext.Response.Headers - .Add("Permissions-Policy", "autoplay=(self), " + + .Append("Permissions-Policy", "autoplay=(self), " + "fullscreen=(self), " + "geolocation=(self), " + "picture-in-picture=(self), " + @@ -82,25 +82,25 @@ public async Task Invoke(HttpContext httpContext) if (string.IsNullOrEmpty(httpContext.Response.Headers["Referrer-Policy"]) ) { httpContext.Response.Headers - .Add("Referrer-Policy", "no-referrer"); + .Append("Referrer-Policy", "no-referrer"); } if (string.IsNullOrEmpty(httpContext.Response.Headers["X-Frame-Options"]) ) { httpContext.Response.Headers - .Add("X-Frame-Options", "DENY"); + .Append("X-Frame-Options", "DENY"); } if (string.IsNullOrEmpty(httpContext.Response.Headers["X-Xss-Protection"]) ) { httpContext.Response.Headers - .Add("X-Xss-Protection", "1; mode=block"); + .Append("X-Xss-Protection", "1; mode=block"); } if (string.IsNullOrEmpty(httpContext.Response.Headers["X-Content-Type-Options"]) ) { httpContext.Response.Headers - .Add("X-Content-Type-Options", "nosniff"); + .Append("X-Content-Type-Options", "nosniff"); } await _next(httpContext); diff --git a/starsky/starsky.foundation.readmeta/Interfaces/IReadMeta.cs b/starsky/starsky.foundation.readmeta/Interfaces/IReadMeta.cs index 1c06341293..d9d1c9420e 100644 --- a/starsky/starsky.foundation.readmeta/Interfaces/IReadMeta.cs +++ b/starsky/starsky.foundation.readmeta/Interfaces/IReadMeta.cs @@ -1,4 +1,6 @@ -using System.Collections.Generic; +#nullable enable +using System.Collections.Generic; +using System.Threading.Tasks; using starsky.foundation.database.Models; namespace starsky.foundation.readmeta.Interfaces @@ -10,8 +12,8 @@ public interface IReadMeta /// /// subPath /// - FileIndexItem ReadExifAndXmpFromFile(string subPath); - List ReadExifAndXmpFromFileAddFilePathHash(List subPathList, List fileHashes = null); + Task ReadExifAndXmpFromFileAsync(string subPath); + Task> ReadExifAndXmpFromFileAddFilePathHashAsync(List subPathList, List fileHashes = null); bool? RemoveReadMetaCache(string fullFilePath); void UpdateReadMetaCache(IEnumerable objectExifToolModel); } diff --git a/starsky/starsky.foundation.readmeta/ReadMetaHelpers/ReadMetaGpx.cs b/starsky/starsky.foundation.readmeta/ReadMetaHelpers/ReadMetaGpx.cs index da7807deaa..bac9e8e416 100644 --- a/starsky/starsky.foundation.readmeta/ReadMetaHelpers/ReadMetaGpx.cs +++ b/starsky/starsky.foundation.readmeta/ReadMetaHelpers/ReadMetaGpx.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using System.Text; +using System.Threading.Tasks; using System.Xml; using GeoTimeZone; using starsky.foundation.database.Models; @@ -26,7 +27,7 @@ public ReadMetaGpx(IWebLogger logger) private const string GpxXmlNameSpaceName = "http://www.topografix.com/GPX/1/1"; - public FileIndexItem ReadGpxFromFileReturnAfterFirstField(Stream? stream, + public async Task ReadGpxFromFileReturnAfterFirstFieldAsync(Stream? stream, string subPath, bool useLocal = true) { if ( stream == null ) @@ -38,7 +39,7 @@ public FileIndexItem ReadGpxFromFileReturnAfterFirstField(Stream? stream, return returnItem; } - var readGpxFile = ReadGpxFile(stream, null, 1); + var readGpxFile = await ReadGpxFileAsync(stream, null, 1); if ( !readGpxFile.Any() ) { @@ -103,13 +104,13 @@ private static string GetTrkName(XmlNode? gpxDoc, XmlNamespaceManager namespaceM /// /// default complete file, but can be used to read only the first point /// - public List ReadGpxFile(Stream stream, + public async Task> ReadGpxFileAsync(Stream stream, List? geoList = null, int returnAfter = int.MaxValue) { - if (geoList == null) geoList = new List(); + geoList ??= new List(); // Some files are having problems with gpxDoc.Load() - var fileString = PlainTextFileHelper.StreamToString(stream); + var fileString = await StreamToStringHelper.StreamToStringAsync(stream); try { diff --git a/starsky/starsky.foundation.readmeta/ReadMetaHelpers/ReadMetaXmp.cs b/starsky/starsky.foundation.readmeta/ReadMetaHelpers/ReadMetaXmp.cs index fad384d361..520c32ead1 100644 --- a/starsky/starsky.foundation.readmeta/ReadMetaHelpers/ReadMetaXmp.cs +++ b/starsky/starsky.foundation.readmeta/ReadMetaHelpers/ReadMetaXmp.cs @@ -2,6 +2,7 @@ using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.Text; +using System.Threading.Tasks; using starsky.foundation.database.Models; using starsky.foundation.platform.Helpers; using starsky.foundation.platform.Interfaces; @@ -23,7 +24,7 @@ public ReadMetaXmp(IStorage iStorage, IWebLogger logger) _logger = logger; } - public FileIndexItem XmpGetSidecarFile(FileIndexItem databaseItem) + public async Task XmpGetSidecarFileAsync(FileIndexItem databaseItem) { databaseItem ??= new FileIndexItem(); @@ -38,7 +39,7 @@ public FileIndexItem XmpGetSidecarFile(FileIndexItem databaseItem) !_iStorage.ExistFile(xmpSubPath) ) return databaseItem; // Read the text-content of the xmp file. - var xmp = PlainTextFileHelper.StreamToString(_iStorage.ReadStream(xmpSubPath)); + var xmp = await StreamToStringHelper.StreamToStringAsync(_iStorage.ReadStream(xmpSubPath)); // Get the data from the xmp databaseItem = GetDataFromString(xmp,databaseItem); return databaseItem; diff --git a/starsky/starsky.foundation.readmeta/Services/ReadMeta.cs b/starsky/starsky.foundation.readmeta/Services/ReadMeta.cs index a6e890d587..e824bdde16 100644 --- a/starsky/starsky.foundation.readmeta/Services/ReadMeta.cs +++ b/starsky/starsky.foundation.readmeta/Services/ReadMeta.cs @@ -1,6 +1,8 @@ -using System; +#nullable enable +using System; using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; using Microsoft.Extensions.Caching.Memory; using starsky.foundation.database.Helpers; using starsky.foundation.database.Models; @@ -16,8 +18,8 @@ namespace starsky.foundation.readmeta.Services { public sealed class ReadMeta : IReadMeta { - private readonly AppSettings _appSettings; - private readonly IMemoryCache _cache; + private readonly AppSettings? _appSettings; + private readonly IMemoryCache? _cache; private readonly IStorage _iStorage; private readonly ReadMetaExif _readExif; private readonly ReadMetaXmp _readXmp; @@ -40,13 +42,13 @@ public ReadMeta(IStorage iStorage, AppSettings appSettings, IMemoryCache memoryC _readMetaGpx = new ReadMetaGpx(logger); } - private FileIndexItem ReadExifAndXmpFromFileDirect(string subPath) + private async Task ReadExifAndXmpFromFileDirectAsync(string subPath) { if ( _iStorage.ExistFile(subPath) && ExtensionRolesHelper.IsExtensionForceGpx(subPath) ) { // Get the item back with DateTime as Camera local datetime - return _readMetaGpx.ReadGpxFromFileReturnAfterFirstField( + return await _readMetaGpx.ReadGpxFromFileReturnAfterFirstFieldAsync( _iStorage.ReadStream(subPath), subPath); // use local } @@ -54,7 +56,7 @@ private FileIndexItem ReadExifAndXmpFromFileDirect(string subPath) var fileIndexItemWithPath = new FileIndexItem(subPath); // Read first the sidecar file - var xmpFileIndexItem = _readXmp.XmpGetSidecarFile(fileIndexItemWithPath.Clone()); + var xmpFileIndexItem = await _readXmp.XmpGetSidecarFileAsync(fileIndexItemWithPath.Clone()); // if the sidecar file is not complete, read the original file // when reading a .xmp file direct ignore the readExifFromFile @@ -78,7 +80,7 @@ private FileIndexItem ReadExifAndXmpFromFileDirect(string subPath) } // used by the html generator - public List ReadExifAndXmpFromFileAddFilePathHash(List subPathList, List fileHashes = null) + public async Task> ReadExifAndXmpFromFileAddFilePathHashAsync(List subPathList, List? fileHashes = null) { var fileIndexList = new List(); @@ -86,10 +88,10 @@ public List ReadExifAndXmpFromFileAddFilePathHash(List su { var subPath = subPathList[i]; - var returnItem = ReadExifAndXmpFromFile(subPath); + var returnItem = await ReadExifAndXmpFromFileAsync(subPath); var imageFormat = ExtensionRolesHelper.GetImageFormat(_iStorage.ReadStream(subPath, 50)); - returnItem.ImageFormat = imageFormat; + returnItem!.ImageFormat = imageFormat; returnItem.FileName = Path.GetFileName(subPath); returnItem.IsDirectory = false; returnItem.Status = FileIndexItem.ExifStatus.Ok; @@ -97,7 +99,7 @@ public List ReadExifAndXmpFromFileAddFilePathHash(List su if ( fileHashes == null || fileHashes.Count <= i ) { - returnItem.FileHash = new FileHash(_iStorage).GetHashCode(subPath).Key; + returnItem.FileHash = (await new FileHash(_iStorage).GetHashCodeAsync(subPath)).Key; } else { @@ -118,11 +120,11 @@ public List ReadExifAndXmpFromFileAddFilePathHash(List su /// /// path /// metaData - public FileIndexItem ReadExifAndXmpFromFile(string subPath) + public async Task ReadExifAndXmpFromFileAsync(string subPath) { // The CLI programs uses no cache if( _cache == null || _appSettings?.AddMemoryCache == false) - return ReadExifAndXmpFromFileDirect(subPath); + return await ReadExifAndXmpFromFileDirectAsync(subPath); // Return values from IMemoryCache var queryReadMetaCacheName = CachePrefix + subPath; @@ -132,10 +134,11 @@ public FileIndexItem ReadExifAndXmpFromFile(string subPath) return objectExifToolModel as FileIndexItem; // Try to catch a new object - objectExifToolModel = ReadExifAndXmpFromFileDirect(subPath); + objectExifToolModel = await ReadExifAndXmpFromFileDirectAsync(subPath); + _cache.Set(queryReadMetaCacheName, objectExifToolModel, new TimeSpan(0,1,0)); - return (FileIndexItem) objectExifToolModel; + return (FileIndexItem?) objectExifToolModel!; } @@ -165,7 +168,7 @@ public void UpdateReadMetaCache(IEnumerable objectExifToolModel) { foreach ( var item in objectExifToolModel ) { - UpdateReadMetaCache(item.FilePath, item); + UpdateReadMetaCache(item.FilePath!, item); } } diff --git a/starsky/starsky.foundation.readmeta/Services/ReadMetaSubPathStorage.cs b/starsky/starsky.foundation.readmeta/Services/ReadMetaSubPathStorage.cs index 41ee9fc514..b9f79d8d8f 100644 --- a/starsky/starsky.foundation.readmeta/Services/ReadMetaSubPathStorage.cs +++ b/starsky/starsky.foundation.readmeta/Services/ReadMetaSubPathStorage.cs @@ -1,4 +1,6 @@ +#nullable enable using System.Collections.Generic; +using System.Threading.Tasks; using Microsoft.Extensions.Caching.Memory; using starsky.foundation.database.Models; using starsky.foundation.injection; @@ -21,15 +23,15 @@ public ReadMetaSubPathStorage(ISelectorStorage selectorStorage, AppSettings appS _readMeta = new ReadMeta(storage, appSettings, memoryCache,logger); } - public FileIndexItem ReadExifAndXmpFromFile(string subPath) + public async Task> ReadExifAndXmpFromFileAddFilePathHashAsync(List subPathList, + List? fileHashes = null) { - return _readMeta.ReadExifAndXmpFromFile(subPath); + return await _readMeta.ReadExifAndXmpFromFileAddFilePathHashAsync(subPathList,fileHashes); } - public List ReadExifAndXmpFromFileAddFilePathHash(List subPathList, - List fileHashes = null) + public async Task ReadExifAndXmpFromFileAsync(string subPath) { - return _readMeta.ReadExifAndXmpFromFileAddFilePathHash(subPathList,fileHashes); + return await _readMeta.ReadExifAndXmpFromFileAsync(subPath); } public bool? RemoveReadMetaCache(string fullFilePath) diff --git a/starsky/starsky.foundation.storage/Helpers/DeserializeJson.cs b/starsky/starsky.foundation.storage/Helpers/DeserializeJson.cs index 776a1a65b8..20b9fc64d7 100644 --- a/starsky/starsky.foundation.storage/Helpers/DeserializeJson.cs +++ b/starsky/starsky.foundation.storage/Helpers/DeserializeJson.cs @@ -1,5 +1,6 @@ using System.IO; using System.Text.Json; +using System.Threading.Tasks; using starsky.foundation.platform.JsonConverter; using starsky.foundation.storage.Interfaces; @@ -21,11 +22,11 @@ public DeserializeJson(IStorage iStorage) /// Typed /// Data /// when file is not found - public T? Read(string jsonSubPath) + public async Task ReadAsync(string jsonSubPath) { if ( !_iStorage.ExistFile(jsonSubPath) ) throw new FileNotFoundException(jsonSubPath); var stream = _iStorage.ReadStream(jsonSubPath); - var jsonAsString = PlainTextFileHelper.StreamToString(stream); + var jsonAsString = await StreamToStringHelper.StreamToStringAsync(stream); var returnFileIndexItem = JsonSerializer.Deserialize(jsonAsString, DefaultJsonSerializer.CamelCase); return returnFileIndexItem; } diff --git a/starsky/starsky.foundation.storage/Helpers/PlainTextFileHelper.cs b/starsky/starsky.foundation.storage/Helpers/PlainTextFileHelper.cs deleted file mode 100644 index a7321bc3ae..0000000000 --- a/starsky/starsky.foundation.storage/Helpers/PlainTextFileHelper.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System.IO; -using System.Text; -using System.Threading.Tasks; - -namespace starsky.foundation.storage.Helpers -{ - public static class PlainTextFileHelper - { - /// - /// Stream to string (UTF8) - /// - /// stream - /// content of the file as string - public static string StreamToString(Stream stream) - { - var reader = new StreamReader(stream, Encoding.UTF8); - var result = reader.ReadToEnd(); - stream.Dispose(); - return result; - } - - /// - /// Stream to string (UTF8) But Async - /// - /// stream - /// dispose afterwards = default true - /// content of the file as string - public static async Task StreamToStringAsync(Stream stream, bool dispose = true) - { - var reader = new StreamReader(stream, Encoding.UTF8); - var result = await reader.ReadToEndAsync(); - if ( dispose ) await stream.DisposeAsync(); - return result; - } - - /// - /// String (UTF8) to Stream - /// - /// - /// - public static Stream StringToStream(string input) - { - byte[] byteArray = Encoding.UTF8.GetBytes(input); - MemoryStream stream = new MemoryStream(byteArray); - return stream; - } - } -} diff --git a/starsky/starsky.foundation.storage/Helpers/StreamToStringHelper.cs b/starsky/starsky.foundation.storage/Helpers/StreamToStringHelper.cs new file mode 100644 index 0000000000..2f0fda9600 --- /dev/null +++ b/starsky/starsky.foundation.storage/Helpers/StreamToStringHelper.cs @@ -0,0 +1,31 @@ +using System.IO; +using System.Text; +using System.Threading.Tasks; + +namespace starsky.foundation.storage.Helpers +{ + /// + /// Before known as PlainTextFileHelper + /// + public static class StreamToStringHelper + { + + /// + /// Stream to string (UTF8) But Async + /// + /// stream + /// dispose afterwards = default true + /// content of the file as string + public static async Task StreamToStringAsync(Stream stream, bool dispose = true) + { + var reader = new StreamReader(stream, Encoding.UTF8); + var result = await reader.ReadToEndAsync(); + if ( dispose ) + { + await stream.DisposeAsync(); + } + return result; + } + + } +} diff --git a/starsky/starsky.foundation.storage/Helpers/StringToStreamHelper.cs b/starsky/starsky.foundation.storage/Helpers/StringToStreamHelper.cs new file mode 100644 index 0000000000..0ce0ee7970 --- /dev/null +++ b/starsky/starsky.foundation.storage/Helpers/StringToStreamHelper.cs @@ -0,0 +1,19 @@ +using System.IO; +using System.Text; + +namespace starsky.foundation.storage.Helpers; + +public static class StringToStreamHelper +{ + /// + /// String (UTF8) to Stream + /// + /// + /// + public static Stream StringToStream(string input) + { + var byteArray = Encoding.UTF8.GetBytes(input); + var stream = new MemoryStream(byteArray); + return stream; + } +} diff --git a/starsky/starsky.foundation.sync/Helpers/NewItem.cs b/starsky/starsky.foundation.sync/Helpers/NewItem.cs index 601337d12b..86c631dc6c 100644 --- a/starsky/starsky.foundation.sync/Helpers/NewItem.cs +++ b/starsky/starsky.foundation.sync/Helpers/NewItem.cs @@ -24,12 +24,12 @@ public NewItem(IStorage subPathStorage, IReadMeta readMeta) _readMeta = readMeta; } - public async Task> NewFileItem(List inputItems) + public async Task> NewFileItemAsync(List inputItems) { var result = new List(); foreach ( var inputItem in inputItems ) { - result.Add(await NewFileItem(inputItem)); + result.Add(await NewFileItemAsync(inputItem)); } return result; } @@ -39,9 +39,9 @@ public async Task> NewFileItem(List inputItem /// /// at least FilePath and ParentDirectory, fileHash is optional /// - public async Task NewFileItem(FileIndexItem inputItem) + public async Task NewFileItemAsync(FileIndexItem inputItem) { - return await NewFileItem(inputItem.FilePath, inputItem.FileHash, + return await NewFileItemAsync(inputItem.FilePath, inputItem.FileHash, inputItem.ParentDirectory, inputItem.FileName); } @@ -53,10 +53,10 @@ public async Task NewFileItem(FileIndexItem inputItem) /// parent directory name /// name without path /// - private async Task NewFileItem(string filePath, string fileHash, string parentDirectory, string fileName) + private async Task NewFileItemAsync(string filePath, string fileHash, string parentDirectory, string fileName) { - var updatedDatabaseItem = _readMeta.ReadExifAndXmpFromFile(filePath); - updatedDatabaseItem.ImageFormat = ExtensionRolesHelper + var updatedDatabaseItem = await _readMeta.ReadExifAndXmpFromFileAsync(filePath); + updatedDatabaseItem!.ImageFormat = ExtensionRolesHelper .GetImageFormat(_subPathStorage.ReadStream(filePath,50)); // future: read json sidecar @@ -79,9 +79,9 @@ private async Task NewFileItem(string filePath, string fileHash, /// database item /// byte size /// the updated item - public async Task PrepareUpdateFileItem(FileIndexItem dbItem, long size) + public async Task PrepareUpdateFileItemAsync(FileIndexItem dbItem, long size) { - var metaDataItem = _readMeta.ReadExifAndXmpFromFile(dbItem.FilePath); + var metaDataItem = await _readMeta.ReadExifAndXmpFromFileAsync(dbItem.FilePath!); var compare = FileIndexCompareHelper.Compare(dbItem, metaDataItem); dbItem.Size = size; await SetFileHashStatus(dbItem.FilePath, dbItem.FileHash, dbItem); diff --git a/starsky/starsky.foundation.sync/Helpers/NewUpdateItemWrapper.cs b/starsky/starsky.foundation.sync/Helpers/NewUpdateItemWrapper.cs index f37644fb81..12712aa225 100644 --- a/starsky/starsky.foundation.sync/Helpers/NewUpdateItemWrapper.cs +++ b/starsky/starsky.foundation.sync/Helpers/NewUpdateItemWrapper.cs @@ -37,7 +37,7 @@ public NewUpdateItemWrapper(IQuery query, IStorage subPathStorage, AppSettings a internal async Task NewItem(FileIndexItem statusItem, string subPath) { // Add a new Item - var dbItem = await _newItem.NewFileItem(statusItem); + var dbItem = await _newItem.NewFileItemAsync(statusItem); // When not OK do not Add (fileHash issues) if ( dbItem.Status != FileIndexItem.ExifStatus.Ok ) return dbItem; @@ -58,7 +58,7 @@ internal async Task NewItem(FileIndexItem statusItem, string subP internal async Task> NewItem(List statusItems, bool addParentItem) { // Add a new Item - var dbItems = await _newItem.NewFileItem(statusItems); + var dbItems = await _newItem.NewFileItemAsync(statusItems); // When not OK do not Add (fileHash issues) var okDbItems = @@ -115,7 +115,7 @@ internal async Task UpdateItem(FileIndexItem dbItem, long size, s _logger.LogDebug($"[SyncSingleFile] Trigger Update Item {subPath}"); } - var updateItem = await _newItem.PrepareUpdateFileItem(dbItem, size); + var updateItem = await _newItem.PrepareUpdateFileItemAsync(dbItem, size); if ( updateItem.Status == FileIndexItem.ExifStatus.OkAndSame) { return updateItem; diff --git a/starsky/starsky.foundation.sync/WatcherHelpers/EventQueueOverflowException.cs b/starsky/starsky.foundation.sync/WatcherHelpers/EventQueueOverflowException.cs index 3220a70471..c37c51f992 100644 --- a/starsky/starsky.foundation.sync/WatcherHelpers/EventQueueOverflowException.cs +++ b/starsky/starsky.foundation.sync/WatcherHelpers/EventQueueOverflowException.cs @@ -20,7 +20,9 @@ public EventQueueOverflowException(string message) /// /// protected EventQueueOverflowException(SerializationInfo info, StreamingContext context) +#pragma warning disable SYSLIB0051 : base(info, context) +#pragma warning restore SYSLIB0051 { } } diff --git a/starsky/starsky.foundation.thumbnailgeneration/Helpers/Thumbnail.cs b/starsky/starsky.foundation.thumbnailgeneration/Helpers/Thumbnail.cs index 2d06e39d80..a9c73de5b8 100644 --- a/starsky/starsky.foundation.thumbnailgeneration/Helpers/Thumbnail.cs +++ b/starsky/starsky.foundation.thumbnailgeneration/Helpers/Thumbnail.cs @@ -260,7 +260,7 @@ void AddFileNames(ThumbnailSize size) internal async Task WriteErrorMessageToBlockLog(string subPath, string resizeMessage) { - var stream = PlainTextFileHelper.StringToStream("Thumbnail error " + resizeMessage); + var stream = StringToStreamHelper.StringToStream("Thumbnail error " + resizeMessage); await _iStorage.WriteStreamAsync(stream, GetErrorLogItemFullPath(subPath)); } diff --git a/starsky/starsky.foundation.writemeta/Helpers/ExifTool.cs b/starsky/starsky.foundation.writemeta/Helpers/ExifTool.cs index 518c45f316..e3f4d60a71 100644 --- a/starsky/starsky.foundation.writemeta/Helpers/ExifTool.cs +++ b/starsky/starsky.foundation.writemeta/Helpers/ExifTool.cs @@ -63,7 +63,7 @@ public async Task> WriteTagsAndRenameThumbnailAsync(s // Need to Dispose for Windows inputStream.Close(); - if ( stream.Length <= 15 && (await PlainTextFileHelper.StreamToStringAsync(stream)) + if ( stream.Length <= 15 && (await StreamToStringHelper.StreamToStringAsync(stream)) .Contains("Fake ExifTool", StringComparison.InvariantCultureIgnoreCase)) { _logger.LogError($"[WriteTagsAndRenameThumbnailAsync] Fake Exiftool detected {subPath}"); @@ -167,19 +167,9 @@ public async Task RunProcessAsync(string optionsArgs) cmd.RedirectFrom(_src); cmd.RedirectTo(ms); - cmd.RedirectStandardErrorTo(ms); var result = await cmd.Task; - - if ( !result.Success ) - { - Console.Error.WriteLine($"command failed with exit code {result.ExitCode}: {result.StandardError}"); - } - - // option without pipes: - // await cmd.StandardInput.PipeFromAsync(_src).ConfigureAwait(false) await - // cmd.StandardOutput.BaseStream.CopyToAsync(ms).ConfigureAwait(false) - + if ( _appSettings.IsVerbose() ) _logger.LogInformation($"[RunProcessAsync] ~ exifTool {optionsArgs} " + $"run with result: {result.Success} ~ "); diff --git a/starsky/starsky.foundation.writemeta/JsonService/FileIndexItemJsonParser.cs b/starsky/starsky.foundation.writemeta/JsonService/FileIndexItemJsonParser.cs index ef0c768412..2f8b83be01 100644 --- a/starsky/starsky.foundation.writemeta/JsonService/FileIndexItemJsonParser.cs +++ b/starsky/starsky.foundation.writemeta/JsonService/FileIndexItemJsonParser.cs @@ -35,7 +35,7 @@ public async Task WriteAsync(FileIndexItem fileIndexItem) fileIndexItem.FileName); await _iStorage.WriteStreamAsync( - PlainTextFileHelper.StringToStream(jsonOutput), jsonSubPath); + StringToStreamHelper.StringToStream(jsonOutput), jsonSubPath); } /// @@ -43,13 +43,13 @@ await _iStorage.WriteStreamAsync( /// /// data object /// data - public FileIndexItem Read(FileIndexItem fileIndexItem) + public async Task ReadAsync(FileIndexItem fileIndexItem) { var jsonSubPath = JsonSidecarLocation.JsonLocation(fileIndexItem.ParentDirectory, fileIndexItem.FileName); // when sidecar file does not exist if ( !_iStorage.ExistFile(jsonSubPath) ) return fileIndexItem; - var returnContainer = new DeserializeJson(_iStorage).Read(jsonSubPath); + var returnContainer = await new DeserializeJson(_iStorage).ReadAsync(jsonSubPath); // in case of invalid json returnContainer.Item ??= fileIndexItem; diff --git a/starsky/starsky.foundation.writemeta/Services/ExifCopy.cs b/starsky/starsky.foundation.writemeta/Services/ExifCopy.cs index a8ab4314e8..1636f01dc1 100644 --- a/starsky/starsky.foundation.writemeta/Services/ExifCopy.cs +++ b/starsky/starsky.foundation.writemeta/Services/ExifCopy.cs @@ -18,7 +18,8 @@ public sealed class ExifCopy private readonly IReadMeta _readMeta; private readonly ExifToolCmdHelper _exifToolCmdHelper; - public ExifCopy(IStorage iStorage, IStorage thumbnailStorage, IExifTool exifTool, IReadMeta readMeta, IThumbnailQuery thumbnailQuery) + public ExifCopy(IStorage iStorage, IStorage thumbnailStorage, IExifTool exifTool, + IReadMeta readMeta, IThumbnailQuery thumbnailQuery) { _iStorage = iStorage; _readMeta = readMeta; @@ -39,7 +40,7 @@ public void XmpCreate(string xmpPath) { if ( _iStorage.ExistFile(xmpPath) ) return; - var plainTextStream = PlainTextFileHelper.StringToStream(XmpStartContent); + var plainTextStream = StringToStreamHelper.StringToStream(XmpStartContent); _iStorage.WriteStream(plainTextStream, xmpPath); } @@ -76,10 +77,10 @@ public async Task XmpSync(string subPath) /// internal async Task CopyExifPublish(string fromSubPath, string toSubPath) { - var updateModel = _readMeta.ReadExifAndXmpFromFile(fromSubPath); + var updateModel = await _readMeta.ReadExifAndXmpFromFileAsync(fromSubPath); var comparedNames = FileIndexCompareHelper.Compare(new FileIndexItem(), updateModel); comparedNames.Add(nameof(FileIndexItem.Software)); - updateModel.SetFilePath(toSubPath); + updateModel!.SetFilePath(toSubPath); return (await _exifToolCmdHelper.UpdateAsync(updateModel, comparedNames, true, false)).Item1; } diff --git a/starsky/starsky/Controllers/AppSettingsController.cs b/starsky/starsky/Controllers/AppSettingsController.cs index eb866b3fe5..4c07a8341b 100644 --- a/starsky/starsky/Controllers/AppSettingsController.cs +++ b/starsky/starsky/Controllers/AppSettingsController.cs @@ -89,7 +89,7 @@ public async Task UpdateAppSettings(AppSettingsTransferObject app }); await _hostStorage.WriteStreamAsync( - PlainTextFileHelper.StringToStream(jsonOutput), + StringToStreamHelper.StringToStream(jsonOutput), _appSettings.AppSettingsPath); return Env(); diff --git a/starsky/starsky/Controllers/MetaInfoController.cs b/starsky/starsky/Controllers/MetaInfoController.cs index aa86dc1ea7..a2ee4d79e3 100644 --- a/starsky/starsky/Controllers/MetaInfoController.cs +++ b/starsky/starsky/Controllers/MetaInfoController.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using starsky.feature.metaupdate.Interfaces; @@ -33,11 +34,11 @@ public MetaInfoController(IMetaInfo metaInfo) [ProducesResponseType(typeof(List),404)] [ProducesResponseType(typeof(List),203)] [Produces("application/json")] - public IActionResult Info(string f, bool collections = true) + public async Task InfoAsync(string f, bool collections = true) { var inputFilePaths = PathHelper.SplitInputFilePaths(f).ToList(); - var fileIndexResultsList = _metaInfo.GetInfo(inputFilePaths, collections); + var fileIndexResultsList = await _metaInfo.GetInfoAsync(inputFilePaths, collections); // returns read only if (fileIndexResultsList.TrueForAll(p => p.Status == FileIndexItem.ExifStatus.ReadOnly)) diff --git a/starsky/starsky/Controllers/PublishController.cs b/starsky/starsky/Controllers/PublishController.cs index a450f13195..2e54339785 100644 --- a/starsky/starsky/Controllers/PublishController.cs +++ b/starsky/starsky/Controllers/PublishController.cs @@ -82,7 +82,7 @@ public async Task PublishCreateAsync(string f, string itemName, } var inputFilePaths = PathHelper.SplitInputFilePaths(f).ToList(); - var info = _metaInfo.GetInfo(inputFilePaths, false); + var info = await _metaInfo.GetInfoAsync(inputFilePaths, false); if ( info.TrueForAll(p => p.Status != FileIndexItem.ExifStatus.Ok && p.Status != FileIndexItem.ExifStatus.ReadOnly) ) diff --git a/starsky/starsky/Controllers/UploadController.cs b/starsky/starsky/Controllers/UploadController.cs index 0e8554e55f..e65d41e436 100644 --- a/starsky/starsky/Controllers/UploadController.cs +++ b/starsky/starsky/Controllers/UploadController.cs @@ -263,7 +263,7 @@ public async Task UploadToFolderSidecarFile() var importedList = new List(); foreach ( var tempImportSinglePath in tempImportPaths ) { - var data = await PlainTextFileHelper.StreamToStringAsync( + var data = await StreamToStringHelper.StreamToStringAsync( _iHostStorage.ReadStream(tempImportSinglePath)); if ( !IsValidXml(data) ) continue; diff --git a/starsky/starsky/Helpers/SwaggerExportHelper.cs b/starsky/starsky/Helpers/SwaggerExportHelper.cs index 9f55f2756c..0687903fec 100644 --- a/starsky/starsky/Helpers/SwaggerExportHelper.cs +++ b/starsky/starsky/Helpers/SwaggerExportHelper.cs @@ -77,7 +77,7 @@ public bool Add03AppExport(AppSettings appSettings, ISelectorStorage selectorSto var storage = selectorStorage.Get(SelectorStorage.StorageServices.HostFilesystem); storage.FileDelete(swaggerJsonFullPath); - storage.WriteStream(PlainTextFileHelper.StringToStream(swaggerJsonText), + storage.WriteStream(StringToStreamHelper.StringToStream(swaggerJsonText), swaggerJsonFullPath); _logger?.LogInformation($"app__addSwaggerExport {swaggerJsonFullPath}"); diff --git a/starsky/starskytest/Controllers/AppSettingsControllerTest.cs b/starsky/starskytest/Controllers/AppSettingsControllerTest.cs index 8f9f32c3e6..55f559a2d9 100644 --- a/starsky/starskytest/Controllers/AppSettingsControllerTest.cs +++ b/starsky/starskytest/Controllers/AppSettingsControllerTest.cs @@ -8,9 +8,7 @@ using starsky.Controllers; using starsky.foundation.platform.Helpers; using starsky.foundation.platform.Models; -using starsky.foundation.platform.Services; using starsky.foundation.storage.Helpers; -using starsky.foundation.storage.Storage; using starskytest.FakeMocks; namespace starskytest.Controllers @@ -34,11 +32,12 @@ public void ENV_StarskyTestEnv_ForceHtml() var controller = new AppSettingsController(new AppSettings(), new FakeSelectorStorage()); controller.ControllerContext.HttpContext = new DefaultHttpContext(); - controller.ControllerContext.HttpContext.Request.Headers.Add("x-force-html", "true"); + controller.ControllerContext.HttpContext.Request.Headers.Append("x-force-html", "true"); var actionResult = controller.Env() as JsonResult; var resultAppSettings = actionResult?.Value as AppSettings; Assert.AreEqual("Starsky", resultAppSettings?.Name); - Assert.AreEqual("text/html; charset=utf-8", controller.ControllerContext.HttpContext.Response.Headers.ContentType.ToString()); + Assert.AreEqual("text/html; charset=utf-8", + controller.ControllerContext.HttpContext.Response.Headers.ContentType.ToString()); } [TestMethod] @@ -124,7 +123,7 @@ await controller.UpdateAppSettings( Assert.IsTrue(storage.ExistFile(appSettings.AppSettingsPath)); - var jsonContent= await PlainTextFileHelper.StreamToStringAsync( + var jsonContent= await StreamToStringHelper.StreamToStringAsync( storage.ReadStream(appSettings.AppSettingsPath)); Assert.IsTrue(jsonContent.Contains("app\": {")); diff --git a/starsky/starskytest/Controllers/CacheIndexControllerTest.cs b/starsky/starskytest/Controllers/CacheIndexControllerTest.cs index 7d9de67772..82b6bbcfcb 100644 --- a/starsky/starskytest/Controllers/CacheIndexControllerTest.cs +++ b/starsky/starskytest/Controllers/CacheIndexControllerTest.cs @@ -56,7 +56,7 @@ public CacheIndexControllerTest() services.AddSingleton(new ConfigurationBuilder().Build()); // random config var createAnImage = new CreateAnImage(); - var dict = new Dictionary + var dict = new Dictionary { { "App:StorageFolder", createAnImage.BasePath }, { "App:ThumbnailTempFolder",createAnImage.BasePath }, diff --git a/starsky/starskytest/Controllers/MetaInfoControllerTest.cs b/starsky/starskytest/Controllers/MetaInfoControllerTest.cs index 76cacf11c3..48ce9df871 100644 --- a/starsky/starskytest/Controllers/MetaInfoControllerTest.cs +++ b/starsky/starskytest/Controllers/MetaInfoControllerTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -32,35 +33,35 @@ public MetaInfoControllerTest() } [TestMethod] - public void Info_AllDataIncluded_WithFakeExifTool() + public async Task Info_AllDataIncluded_WithFakeExifTool() { var controller = new MetaInfoController(_metaInfo); - var jsonResult = controller.Info("/test.jpg", false) as JsonResult; - var listResult = jsonResult.Value as List; - Assert.AreEqual("test, sion", listResult.FirstOrDefault().Tags); - Assert.AreEqual(FileIndexItem.ExifStatus.Ok, listResult.FirstOrDefault().Status); + var jsonResult = await controller.InfoAsync("/test.jpg", false) as JsonResult; + var listResult = jsonResult?.Value as List; + Assert.AreEqual("test, sion", listResult?.FirstOrDefault()?.Tags); + Assert.AreEqual(FileIndexItem.ExifStatus.Ok, listResult?.FirstOrDefault()?.Status); } [TestMethod] - public void Info_SourceImageMissing_WithFakeExifTool() + public async Task Info_SourceImageMissing_WithFakeExifTool() { var controller = new MetaInfoController(_metaInfo); - var notFoundResult = controller.Info("/source_missing.jpg") as NotFoundObjectResult; - Assert.AreEqual(404, notFoundResult.StatusCode); + var notFoundResult = await controller.InfoAsync("/source_missing.jpg") as NotFoundObjectResult; + Assert.AreEqual(404, notFoundResult?.StatusCode); } [TestMethod] - public void ReadOnly() + public async Task ReadOnly() { var controller = new MetaInfoController(_metaInfo) { ControllerContext = {HttpContext = new DefaultHttpContext()} }; - var jsonResult = controller.Info("/readonly/image.jpg", false) as JsonResult; + var jsonResult = await controller.InfoAsync("/readonly/image.jpg", false) as JsonResult; - var listResult = jsonResult.Value as List; - Assert.AreEqual("test, sion", listResult.FirstOrDefault().Tags); - Assert.AreEqual(FileIndexItem.ExifStatus.ReadOnly, listResult.FirstOrDefault().Status); + var listResult = jsonResult?.Value as List; + Assert.AreEqual("test, sion", listResult?.FirstOrDefault()?.Tags); + Assert.AreEqual(FileIndexItem.ExifStatus.ReadOnly, listResult?.FirstOrDefault()?.Status); } } } diff --git a/starsky/starskytest/Controllers/ThumbnailControllerTest.cs b/starsky/starskytest/Controllers/ThumbnailControllerTest.cs index a048c3bd25..d4309bf5b3 100644 --- a/starsky/starskytest/Controllers/ThumbnailControllerTest.cs +++ b/starsky/starskytest/Controllers/ThumbnailControllerTest.cs @@ -88,7 +88,7 @@ public async Task Thumbnail_CorruptImage_NoContentResult_Test() { // Arrange var storage = ArrangeStorage(); - var plainTextStream = PlainTextFileHelper.StringToStream("CorruptImage"); + var plainTextStream = StringToStreamHelper.StringToStream("CorruptImage"); await storage.WriteStreamAsync(plainTextStream, ThumbnailNameHelper.Combine( "hash-corrupt-image", ThumbnailSize.ExtraLarge)); diff --git a/starsky/starskytest/Controllers/UploadControllerTest.cs b/starsky/starskytest/Controllers/UploadControllerTest.cs index 87b6187049..50b28c15dd 100644 --- a/starsky/starskytest/Controllers/UploadControllerTest.cs +++ b/starsky/starskytest/Controllers/UploadControllerTest.cs @@ -296,16 +296,16 @@ public async Task UploadToFolder_UnknownFailFlow() controller.ControllerContext.HttpContext.Request.Headers["to"] = "/"; //Set header var actionResult = await controller.UploadToFolder() as JsonResult; - var list = actionResult.Value as List; + var list = actionResult?.Value as List; - Assert.AreEqual( ImportStatus.FileError, list.FirstOrDefault().Status); + Assert.AreEqual( ImportStatus.FileError, list?.FirstOrDefault()?.Status); } [TestMethod] public void GetParentDirectoryFromRequestHeader_InputToAsSubPath() { var controllerContext = RequestWithFile(); - controllerContext.HttpContext.Request.Headers.Add("to", "/test.jpg"); + controllerContext.HttpContext.Request.Headers.Append("to", "/test.jpg"); var controller = new UploadController(_import, _appSettings, new FakeSelectorStorage(_iStorage), _query, @@ -323,7 +323,7 @@ public void GetParentDirectoryFromRequestHeader_InputToAsSubPath() public void GetParentDirectoryFromRequestHeader_InputToAsSubPath_TestFolder() { var controllerContext = RequestWithFile(); - controllerContext.HttpContext.Request.Headers.Add("to", "/test/test.jpg"); + controllerContext.HttpContext.Request.Headers.Append("to", "/test/test.jpg"); var controller = new UploadController(_import, _appSettings, new FakeSelectorStorage(_iStorage), _query, @@ -341,7 +341,7 @@ public void GetParentDirectoryFromRequestHeader_InputToAsSubPath_TestFolder() public void GetParentDirectoryFromRequestHeader_InputToAsSubPath_TestDirectFolder() { var controllerContext = RequestWithFile(); - controllerContext.HttpContext.Request.Headers.Add("to", "/test/"); + controllerContext.HttpContext.Request.Headers.Append("to", "/test/"); var controller = new UploadController(_import, _appSettings, new FakeSelectorStorage(_iStorage), _query, diff --git a/starsky/starskytest/FakeMocks/FakeIGeoIndexGpx.cs b/starsky/starskytest/FakeMocks/FakeIGeoIndexGpx.cs index 6c65acaf4b..1830235c94 100644 --- a/starsky/starskytest/FakeMocks/FakeIGeoIndexGpx.cs +++ b/starsky/starskytest/FakeMocks/FakeIGeoIndexGpx.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading.Tasks; using starsky.feature.geolookup.Interfaces; using starsky.foundation.database.Models; @@ -8,10 +9,10 @@ public class FakeIGeoIndexGpx : IGeoIndexGpx { public int Count { get; set; } - public List LoopFolder(List metaFilesInDirectory) + public Task> LoopFolderAsync(List metaFilesInDirectory) { Count++; - return metaFilesInDirectory; + return Task.FromResult(new List()); } } } diff --git a/starsky/starskytest/FakeMocks/FakeIMetaInfo.cs b/starsky/starskytest/FakeMocks/FakeIMetaInfo.cs index 8d8244a1da..6a0d0bdde2 100644 --- a/starsky/starskytest/FakeMocks/FakeIMetaInfo.cs +++ b/starsky/starskytest/FakeMocks/FakeIMetaInfo.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using starsky.feature.metaupdate.Interfaces; using starsky.foundation.database.Models; @@ -17,7 +18,7 @@ public FakeIMetaInfo(List existItems) } } - public List GetInfo(List inputFilePaths, bool collections) + public Task> GetInfoAsync(List inputFilePaths, bool collections) { var result = new List(); foreach ( var path in inputFilePaths ) @@ -26,7 +27,7 @@ public List GetInfo(List inputFilePaths, bool collections if ( data == null ) continue; result.Add(data); } - return result; + return Task.FromResult(result); } } } diff --git a/starsky/starskytest/FakeMocks/FakeIThumbnailService.cs b/starsky/starskytest/FakeMocks/FakeIThumbnailService.cs index 26562abdf1..791741d510 100644 --- a/starsky/starskytest/FakeMocks/FakeIThumbnailService.cs +++ b/starsky/starskytest/FakeMocks/FakeIThumbnailService.cs @@ -32,7 +32,7 @@ public Task> CreateThumbnailAsync(string subPath) if ( _exception != null ) throw _exception; _subPathStorage?.WriteStream( - PlainTextFileHelper.StringToStream("test"), subPath); + StringToStreamHelper.StringToStream("test"), subPath); Inputs.Add(new Tuple(subPath, null)); var items = _subPathStorage?.GetAllFilesInDirectory(subPath); @@ -46,8 +46,8 @@ public Task> CreateThumbnailAsync(string subPath) } var name = Base32.Encode(System.Text.Encoding.UTF8.GetBytes(subPath)); - _subPathStorage?.WriteStream( - PlainTextFileHelper.StringToStream("test"), "/"+ name + "@2000.jpg"); + _subPathStorage.WriteStream( + StringToStreamHelper.StringToStream("test"), "/"+ name + "@2000.jpg"); var resultModel = new List(); foreach ( var item in items ) @@ -66,7 +66,7 @@ public Task> CreateThumbAsync(string subPath, if ( _exception != null ) throw _exception; _subPathStorage?.WriteStream( - PlainTextFileHelper.StringToStream("test"), fileHash); + StringToStreamHelper.StringToStream("test"), fileHash); Inputs.Add(new Tuple(subPath, fileHash)); return Task.FromResult(new List{new GenerationResultModel() diff --git a/starsky/starskytest/FakeMocks/FakeReadMeta.cs b/starsky/starskytest/FakeMocks/FakeReadMeta.cs index b69d0601cd..6b8995a523 100644 --- a/starsky/starskytest/FakeMocks/FakeReadMeta.cs +++ b/starsky/starskytest/FakeMocks/FakeReadMeta.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Threading.Tasks; using starsky.foundation.database.Models; using starsky.foundation.readmeta.Interfaces; using starskytest.FakeCreateAn; @@ -7,27 +8,27 @@ namespace starskytest.FakeMocks { public class FakeReadMeta : IReadMeta { - public FileIndexItem ReadExifAndXmpFromFile(string subPath) + public Task ReadExifAndXmpFromFileAsync(string subPath) { - return new FileIndexItem + return Task.FromResult(new FileIndexItem { Status = FileIndexItem.ExifStatus.Ok, Tags = "test, fake read meta" - }; + }); } - public List ReadExifAndXmpFromFileAddFilePathHash(List subPathList, + public Task> ReadExifAndXmpFromFileAddFilePathHashAsync(List subPathList, List fileHashes = null) { var createAnImage = new CreateAnImage(); - return new List + return Task.FromResult(new List { new FileIndexItem { Status = FileIndexItem.ExifStatus.Ok, FileName = createAnImage.FileName } - }; + }); } public bool? RemoveReadMetaCache(string fullFilePath) diff --git a/starsky/starskytest/FakeMocks/FakeReadMetaSubPathStorage.cs b/starsky/starskytest/FakeMocks/FakeReadMetaSubPathStorage.cs index e99f6b5734..9bf49638ec 100644 --- a/starsky/starskytest/FakeMocks/FakeReadMetaSubPathStorage.cs +++ b/starsky/starskytest/FakeMocks/FakeReadMetaSubPathStorage.cs @@ -1,4 +1,6 @@ +#nullable enable using System.Collections.Generic; +using System.Threading.Tasks; using starsky.foundation.database.Models; using starsky.foundation.readmeta.Interfaces; @@ -13,15 +15,15 @@ public FakeReadMetaSubPathStorage() _readMeta = new FakeReadMeta(); } - public FileIndexItem ReadExifAndXmpFromFile(string subPath) + public async Task ReadExifAndXmpFromFileAsync(string subPath) { - return _readMeta.ReadExifAndXmpFromFile(subPath); + return await _readMeta.ReadExifAndXmpFromFileAsync(subPath); } - public List ReadExifAndXmpFromFileAddFilePathHash(List subPathList, - List fileHashes = null) + public async Task> ReadExifAndXmpFromFileAddFilePathHashAsync(List subPathList, + List? fileHashes = null) { - return _readMeta.ReadExifAndXmpFromFileAddFilePathHash(subPathList,fileHashes); + return await _readMeta.ReadExifAndXmpFromFileAddFilePathHashAsync(subPathList, fileHashes!); } public bool? RemoveReadMetaCache(string fullFilePath) diff --git a/starsky/starskytest/Helpers/Base64HelperTest.cs b/starsky/starskytest/Helpers/Base64HelperTest.cs index 473a75e50a..904039511b 100644 --- a/starsky/starskytest/Helpers/Base64HelperTest.cs +++ b/starsky/starskytest/Helpers/Base64HelperTest.cs @@ -2,7 +2,6 @@ using System.IO; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.foundation.platform.Helpers; -using starskycore.Helpers; namespace starskytest.Helpers { diff --git a/starsky/starskytest/Helpers/SwaggerHelperTest.cs b/starsky/starskytest/Helpers/SwaggerHelperTest.cs index 695b6c0cd3..fb565c42ab 100644 --- a/starsky/starskytest/Helpers/SwaggerHelperTest.cs +++ b/starsky/starskytest/Helpers/SwaggerHelperTest.cs @@ -97,7 +97,7 @@ public async Task SwaggerTest_Integration_Test() Assert.AreEqual(true,storage.ExistFile(swaggerFilePath)); var swaggerFileContent = - await PlainTextFileHelper.StreamToStringAsync( + await StreamToStringHelper.StreamToStringAsync( storage.ReadStream(swaggerFilePath)); System.Console.WriteLine("swaggerFileContent " + swaggerFileContent); diff --git a/starsky/starskytest/Models/FakeExifTool.cs b/starsky/starskytest/Models/FakeExifTool.cs index 9e6e594edc..a2e178f776 100644 --- a/starsky/starskytest/Models/FakeExifTool.cs +++ b/starsky/starskytest/Models/FakeExifTool.cs @@ -34,7 +34,7 @@ public async Task WriteTagsAsync(string subPath, string command) if ( subPath.EndsWith(".xmp") ) { - var stream = PlainTextFileHelper.StringToStream(XmpInjection); + var stream = StringToStreamHelper.StringToStream(XmpInjection); await _iStorage.WriteStreamAsync(stream, subPath); } return true; @@ -47,7 +47,7 @@ public async Task> WriteTagsAndRenameThumbnailAsync(s if ( subPath.EndsWith(".xmp") ) { - var stream = PlainTextFileHelper.StringToStream(XmpInjection); + var stream = StringToStreamHelper.StringToStream(XmpInjection); await _iStorage.WriteStreamAsync(stream, subPath); } diff --git a/starsky/starskytest/starsky.feature.geolookup/Services/GeoBackgroundTaskTest.cs b/starsky/starskytest/starsky.feature.geolookup/Services/GeoBackgroundTaskTest.cs index 834c2061b3..25cc1da184 100644 --- a/starsky/starskytest/starsky.feature.geolookup/Services/GeoBackgroundTaskTest.cs +++ b/starsky/starskytest/starsky.feature.geolookup/Services/GeoBackgroundTaskTest.cs @@ -62,7 +62,7 @@ private void Setup() new StorageHostFullPathFilesystem().WriteStream( - PlainTextFileHelper.StringToStream(mockCities1000), + StringToStreamHelper.StringToStream(mockCities1000), Path.Combine(_appSettings.DependenciesFolder, "cities1000.txt")); // Mockup data to: @@ -75,7 +75,7 @@ private void Setup() "AR.07\tBuenos Aires F.D.\tBuenos Aires F.D.\t3433955\r\n"; new StorageHostFullPathFilesystem().WriteStream( - PlainTextFileHelper.StringToStream(admin1CodesAscii), + StringToStreamHelper.StringToStream(admin1CodesAscii), Path.Combine(_appSettings.DependenciesFolder, "admin1CodesASCII.txt")); } diff --git a/starsky/starskytest/starsky.feature.geolookup/Services/GeoFileDownloadTest.cs b/starsky/starskytest/starsky.feature.geolookup/Services/GeoFileDownloadTest.cs index b1562c578b..c88b976def 100644 --- a/starsky/starskytest/starsky.feature.geolookup/Services/GeoFileDownloadTest.cs +++ b/starsky/starskytest/starsky.feature.geolookup/Services/GeoFileDownloadTest.cs @@ -117,9 +117,9 @@ public async Task DownloadAsync_ShouldNotDownloadFileIfAlreadyExists() var geoFileDownload = new GeoFileDownload(appSettings, httpClientHelper, new FakeSelectorStorage(storage)); storage.CreateDirectory(_dependenciesFolder3); - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("1"), + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("1"), Path.Combine(_dependenciesFolder3, GeoFileDownload.CountryName + ".txt")); - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("1"), + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("1"), Path.Combine(_dependenciesFolder3, "admin1CodesASCII.txt")); // Act @@ -158,7 +158,7 @@ public async Task RemoveFailedDownload_FileToSmall_SoRemove() geoFileDownload.CreateDependenciesFolder(); - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("1"), + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("1"), Path.Combine(_dependenciesFolder5, GeoFileDownload.CountryName + ".zip")); Assert.IsTrue(storage.ExistFile(Path.Combine(_dependenciesFolder5, GeoFileDownload.CountryName + ".zip"))); @@ -180,7 +180,7 @@ public async Task RemoveFailedDownload_FileRightSize_SoKeep() geoFileDownload.CreateDependenciesFolder(); geoFileDownload.MinimumSizeInBytes = -1; - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("1"), + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("1"), Path.Combine(_dependenciesFolder6, GeoFileDownload.CountryName + ".zip")); Assert.IsTrue(storage.ExistFile(Path.Combine(_dependenciesFolder6, GeoFileDownload.CountryName + ".zip"))); diff --git a/starsky/starskytest/starsky.feature.geolookup/Services/GeoIndexGpxTest.cs b/starsky/starskytest/starsky.feature.geolookup/Services/GeoIndexGpxTest.cs index 5b58808de8..fefac104dd 100644 --- a/starsky/starskytest/starsky.feature.geolookup/Services/GeoIndexGpxTest.cs +++ b/starsky/starskytest/starsky.feature.geolookup/Services/GeoIndexGpxTest.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.feature.geolookup.Services; using starsky.foundation.database.Models; @@ -80,7 +81,7 @@ public void GeoIndexGpx_ConvertTimeZone_typeLocal_Expect_ArgumentException() } [TestMethod] - public void GeoIndexGpx_LoopFolderLookupTest() + public async Task GeoIndexGpx_LoopFolderLookupTest() { var exampleFiles = new List(); exampleFiles.AddRange(new List @@ -102,8 +103,8 @@ public void GeoIndexGpx_LoopFolderLookupTest() var fakeIStorage = new FakeIStorage(new List{"/"}, new List{_metaFilesDirectory[0].FilePath}, new List{CreateAnGpx.Bytes.ToArray()} ); - var returnFileIndexItems = new GeoIndexGpx(_appSettings, - fakeIStorage, new FakeIWebLogger()).LoopFolder(exampleFiles); + var returnFileIndexItems = await new GeoIndexGpx(_appSettings, + fakeIStorage, new FakeIWebLogger()).LoopFolderAsync(exampleFiles); Assert.AreEqual(null,returnFileIndexItems.Find(p => p.FileName == "NotInRange.jpg")); Assert.AreEqual("01.jpg",returnFileIndexItems.Find(p => p.FileName == "01.jpg")?.FileName); diff --git a/starsky/starskytest/starsky.feature.geolookup/Services/GeoReverseLookupTest.cs b/starsky/starskytest/starsky.feature.geolookup/Services/GeoReverseLookupTest.cs index bc477ee240..eccd4899b3 100644 --- a/starsky/starskytest/starsky.feature.geolookup/Services/GeoReverseLookupTest.cs +++ b/starsky/starskytest/starsky.feature.geolookup/Services/GeoReverseLookupTest.cs @@ -67,7 +67,7 @@ private void Setup() new StorageHostFullPathFilesystem().WriteStream( - PlainTextFileHelper.StringToStream(mockCities1000), + StringToStreamHelper.StringToStream(mockCities1000), Path.Combine(_appSettings.DependenciesFolder, "cities1000.txt")); // Mockup data to: @@ -80,7 +80,7 @@ private void Setup() "AR.07\tBuenos Aires F.D.\tBuenos Aires F.D.\t3433955\r\n"; new StorageHostFullPathFilesystem().WriteStream( - PlainTextFileHelper.StringToStream(admin1CodesAscii), + StringToStreamHelper.StringToStream(admin1CodesAscii), Path.Combine(_appSettings.DependenciesFolder, "admin1CodesASCII.txt")); } @@ -296,7 +296,7 @@ public async Task GetLocation_NearestPlace2_Valkenswaard() public async Task GetLocation_No_nearest_place_found() { await new StorageHostFullPathFilesystem().WriteStreamAsync( - PlainTextFileHelper.StringToStream(""), // empty file yes! + StringToStreamHelper.StringToStream(string.Empty), // empty file yes! Path.Combine(_appSettings.DependenciesFolder, "cities1000.txt")); var result = await new GeoReverseLookup(_appSettings, new FakeIGeoFileDownload(), diff --git a/starsky/starskytest/starsky.feature.import/Services/ImportTest.cs b/starsky/starskytest/starsky.feature.import/Services/ImportTest.cs index 54eb71baf4..a911e81a06 100644 --- a/starsky/starskytest/starsky.feature.import/Services/ImportTest.cs +++ b/starsky/starskytest/starsky.feature.import/Services/ImportTest.cs @@ -369,10 +369,10 @@ public void AppendIndexerToFilePath_5() /// subPath style /// number /// expected result - public static string GetExpectedFilePath(IStorage storage, AppSettings appSettings, string inputFileFullPath, int index = 0) + public static async Task GetExpectedFilePathAsync(IStorage storage, AppSettings appSettings, string inputFileFullPath, int index = 0) { - var fileIndexItem = new ReadMeta(storage, appSettings, - null, new FakeIWebLogger()).ReadExifAndXmpFromFile(inputFileFullPath); + var fileIndexItem = await new ReadMeta(storage, appSettings, + null, new FakeIWebLogger()).ReadExifAndXmpFromFileAsync(inputFileFullPath); var importIndexItem = new ImportIndexItem(appSettings) { FileIndexItem = fileIndexItem, @@ -446,7 +446,7 @@ public async Task Importer_Xmp_WhenImportingAFileThatAlreadyHasAnXmpSidecarFile( var importService = new Import(new FakeSelectorStorage(storage), appSettings, new FakeIImportQuery(), new FakeExifTool(storage, appSettings),query,_console, new FakeIMetaExifThumbnailService(), new FakeIWebLogger(), new FakeIThumbnailQuery(), new FakeMemoryCache()); - var expectedFilePath = GetExpectedFilePath(storage, appSettings, + var expectedFilePath = await GetExpectedFilePathAsync(storage, appSettings, "/test.dng"); var result = await importService.Importer(new List {"/test.dng"}, @@ -509,13 +509,13 @@ public async Task Importer_Xmp_NotOverWriteExistingFile() new ImportSettingsModel()); Assert.AreEqual(1, result.Count); - var xmpExpectedFilePath = GetExpectedFilePath(storage, appSettings, - "/test.dng").Replace(".dng",".xmp"); + var xmpExpectedFilePath = (await GetExpectedFilePathAsync(storage, appSettings, + "/test.dng")).Replace(".dng",".xmp"); var xmpReadStream = storage.ReadStream(xmpExpectedFilePath); var xmpStreamLength = xmpReadStream.Length; - var toStringAsync = await PlainTextFileHelper.StreamToStringAsync(xmpReadStream); + var toStringAsync = await StreamToStringHelper.StreamToStringAsync(xmpReadStream); Assert.AreEqual(CreateAnXmp.Bytes.Length,xmpStreamLength); Assert.IsTrue(toStringAsync.Contains("Apple")); @@ -539,13 +539,13 @@ public async Task Importer_XmpIsCreatedDuringImport() await importService.Importer(new List {"/test.dng"}, new ImportSettingsModel()); - var expectedFilePath = GetExpectedFilePath(storage, appSettings, - "/test.dng").Replace(".dng",".xmp"); + var expectedFilePath = (await GetExpectedFilePathAsync(storage, appSettings, + "/test.dng")).Replace(".dng",".xmp"); Assert.IsTrue(storage.ExistFile(expectedFilePath)); var stream = storage.ReadStream(expectedFilePath); - var toStringAsync = await PlainTextFileHelper.StreamToStringAsync(stream); + var toStringAsync = await StreamToStringHelper.StreamToStringAsync(stream); Assert.AreEqual(FakeExifTool.XmpInjection,toStringAsync); } @@ -561,7 +561,7 @@ await storage.WriteStreamAsync( new MemoryStream(CreateAnImage.Bytes.ToArray()), "/test.jpg" ); // write /2018/04/2018_04_22/20180422_161454_test.jpg - var path = GetExpectedFilePath(storage, appSettings, "/test.jpg"); + var path = await GetExpectedFilePathAsync(storage, appSettings, "/test.jpg"); await storage.WriteStreamAsync( new MemoryStream(FakeCreateAn.CreateAnImage.Bytes.ToArray()), path ); @@ -600,7 +600,7 @@ public async Task Importer_DuplicateFileName() Assert.AreEqual(ImportStatus.Ok,result[0].Status); // get something like /2018/04/2018_04_22/20180422_161454_test_1.jpg - var expectedFilePath = GetExpectedFilePath(storage, appSettings, "/test.jpg", 1); + var expectedFilePath = await GetExpectedFilePathAsync(storage, appSettings, "/test.jpg", 1); Assert.AreEqual(expectedFilePath,result[0].FilePath); } diff --git a/starsky/starskytest/starsky.feature.import/Services/ImportTest_InMemoryDb.cs b/starsky/starskytest/starsky.feature.import/Services/ImportTest_InMemoryDb.cs index 63273ec05e..d76290180f 100644 --- a/starsky/starskytest/starsky.feature.import/Services/ImportTest_InMemoryDb.cs +++ b/starsky/starskytest/starsky.feature.import/Services/ImportTest_InMemoryDb.cs @@ -77,7 +77,7 @@ public async Task Importer_Gpx() var importService = new Import(new FakeSelectorStorage(storage), _appSettings, new FakeIImportQuery(), new FakeExifTool(storage, _appSettings),_query,_console, new FakeIMetaExifThumbnailService(), new FakeIWebLogger(),new FakeIThumbnailQuery(), new FakeMemoryCache()); - var expectedFilePath = ImportTest.GetExpectedFilePath(storage, _appSettings, "/test.gpx"); + var expectedFilePath = await ImportTest.GetExpectedFilePathAsync(storage, _appSettings, "/test.gpx"); var result = await importService.Importer(new List {"/test.gpx"}, new ImportSettingsModel()); @@ -103,7 +103,7 @@ public async Task Importer_OverwriteStructure_HappyFlow() Structure = "/yyyy/MM/yyyy_MM_dd*/_yyyyMMdd_HHmmss.ext" }); - var expectedFilePath = ImportTest.GetExpectedFilePath(_iStorageFake, new AppSettings + var expectedFilePath = await ImportTest.GetExpectedFilePathAsync(_iStorageFake, new AppSettings { Structure = "/yyyy/MM/yyyy_MM_dd*/_yyyyMMdd_HHmmss.ext" }, "/test.jpg"); @@ -135,7 +135,7 @@ await importService.Importer(new List {"/test.jpg"}, var isHashInImportDb = await _importQuery.IsHashInImportDbAsync(_exampleHash); Assert.IsTrue(isHashInImportDb); - var expectedFilePath = ImportTest.GetExpectedFilePath(_iStorageFake, new AppSettings + var expectedFilePath = await ImportTest.GetExpectedFilePathAsync(_iStorageFake, new AppSettings { Structure = "/yyyy/MM/yyyy_MM_dd*/_yyyyMMdd_HHmmss.ext" }, "/test.jpg"); @@ -156,7 +156,7 @@ public async Task Importer_OverwriteColorClass() _query, _console, new FakeIMetaExifThumbnailService(), new FakeIWebLogger(), new FakeIThumbnailQuery()); - var expectedFilePath = ImportTest.GetExpectedFilePath(_iStorageFake, _appSettings, "/test.jpg"); + var expectedFilePath = await ImportTest.GetExpectedFilePathAsync(_iStorageFake, _appSettings, "/test.jpg"); var result = await importService.Importer(new List {"/test.jpg"}, new ImportSettingsModel{ ColorClass = 5 @@ -183,7 +183,7 @@ public async Task Importer_ToDefaultFolderStructure_default_HappyFlow() _query,_console, new FakeIMetaExifThumbnailService(), new FakeIWebLogger(), new FakeIThumbnailQuery()); - var expectedFilePath = ImportTest.GetExpectedFilePath(_iStorageFake, _appSettings, "/test.jpg"); + var expectedFilePath = await ImportTest.GetExpectedFilePathAsync(_iStorageFake, _appSettings, "/test.jpg"); var result = await importService.Importer(new List {"/test.jpg"}, new ImportSettingsModel()); diff --git a/starsky/starskytest/starsky.feature.metaupdate/Services/MetaInfoTest.cs b/starsky/starskytest/starsky.feature.metaupdate/Services/MetaInfoTest.cs index e6cfc57821..72a286b615 100644 --- a/starsky/starskytest/starsky.feature.metaupdate/Services/MetaInfoTest.cs +++ b/starsky/starskytest/starsky.feature.metaupdate/Services/MetaInfoTest.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.feature.metaupdate.Services; using starsky.foundation.database.Models; @@ -14,35 +15,35 @@ namespace starskytest.starsky.feature.metaupdate.Services public sealed class MetaInfoTest { [TestMethod] - public void FileNotInIndex() + public async Task FileNotInIndex() { var metaInfo = new MetaInfo(new FakeIQuery(), new AppSettings(), new FakeSelectorStorage(),null, new FakeIWebLogger()); - var test = metaInfo.GetInfo(new List{"/test"}, false); + var test = await metaInfo.GetInfoAsync(new List{"/test"}, false); Assert.AreEqual(FileIndexItem.ExifStatus.NotFoundNotInIndex, test.FirstOrDefault()?.Status); } [TestMethod] - public void NotFoundSourceMissing() + public async Task NotFoundSourceMissing() { var metaInfo = new MetaInfo(new FakeIQuery(new List{new FileIndexItem("/test")}), new AppSettings(), new FakeSelectorStorage(),null, new FakeIWebLogger()); - var test = metaInfo.GetInfo(new List{"/test"}, false); + var test = await metaInfo.GetInfoAsync(new List{"/test"}, false); Assert.AreEqual(FileIndexItem.ExifStatus.NotFoundSourceMissing, test.FirstOrDefault()?.Status); } [TestMethod] - public void ExtensionNotSupported_ExifWriteNotSupported() + public async Task ExtensionNotSupported_ExifWriteNotSupported() { var metaInfo = new MetaInfo(new FakeIQuery(new List{new FileIndexItem("/test")}), new AppSettings(), new FakeSelectorStorage(new FakeIStorage(new List(), new List {"/test"})),null, new FakeIWebLogger()); - var test = metaInfo.GetInfo(new List{"/test"}, false); + var test = await metaInfo.GetInfoAsync(new List{"/test"}, false); Assert.AreEqual(FileIndexItem.ExifStatus.ExifWriteNotSupported,test.FirstOrDefault()?.Status); } [TestMethod] - public void GetInfo_XmpFile() + public async Task GetInfo_XmpFile() { var metaInfo = new MetaInfo(new FakeIQuery(new List{new FileIndexItem("/test.xmp")}), new AppSettings(), new FakeSelectorStorage(new FakeIStorage(new List(), @@ -50,12 +51,12 @@ public void GetInfo_XmpFile() { FakeCreateAn.CreateAnXmp.Bytes.ToArray() })),null, new FakeIWebLogger()); - var test = metaInfo.GetInfo(new List{"/test.xmp"}, false); + var test = await metaInfo.GetInfoAsync(new List{"/test.xmp"}, false); Assert.AreEqual(FileIndexItem.ExifStatus.Ok,test.FirstOrDefault()?.Status); } [TestMethod] - public void GetInfo_JpegFile_OkStatus() + public async Task GetInfo_JpegFile_OkStatus() { var metaInfo = new MetaInfo(new FakeIQuery(new List{new FileIndexItem("/test.jpg")}), new AppSettings(), new FakeSelectorStorage(new FakeIStorage(new List(), @@ -63,14 +64,14 @@ public void GetInfo_JpegFile_OkStatus() { FakeCreateAn.CreateAnImage.Bytes.ToArray() })),null, new FakeIWebLogger()); - var test = metaInfo.GetInfo(new List{"/test.jpg"}, false); + var test = await metaInfo.GetInfoAsync(new List{"/test.jpg"}, false); Assert.AreEqual(ExtensionRolesHelper.ImageFormat.jpg,test.FirstOrDefault()?.ImageFormat); Assert.AreEqual(FileIndexItem.ExifStatus.Ok,test.FirstOrDefault()?.Status); } [TestMethod] - public void GetInfo_JpegFile_LastWriteDate() + public async Task GetInfo_JpegFile_LastWriteDate() { var metaInfo = new MetaInfo(new FakeIQuery(new List{new FileIndexItem("/test.jpg")}), new AppSettings(), new FakeSelectorStorage(new FakeIStorage(new List(), @@ -78,7 +79,7 @@ public void GetInfo_JpegFile_LastWriteDate() { FakeCreateAn.CreateAnImage.Bytes.ToArray() }, new List{new DateTime(2000,01,01)})),null, new FakeIWebLogger()); - var test = metaInfo.GetInfo(new List{"/test.jpg"}, false); + var test = await metaInfo.GetInfoAsync(new List{"/test.jpg"}, false); Assert.AreEqual(new DateTime(2000,01,01),test.FirstOrDefault()?.LastEdited); } diff --git a/starsky/starskytest/Services/ReplaceServiceTest.cs b/starsky/starskytest/starsky.feature.metaupdate/Services/ReplaceServiceTest.cs similarity index 99% rename from starsky/starskytest/Services/ReplaceServiceTest.cs rename to starsky/starskytest/starsky.feature.metaupdate/Services/ReplaceServiceTest.cs index 19917b2419..ab54492665 100644 --- a/starsky/starskytest/Services/ReplaceServiceTest.cs +++ b/starsky/starskytest/starsky.feature.metaupdate/Services/ReplaceServiceTest.cs @@ -13,7 +13,7 @@ using starsky.foundation.platform.Models; using starskytest.FakeMocks; -namespace starskytest.Services +namespace starskytest.starsky.feature.metaupdate.Services { [TestClass] public sealed class ReplaceServiceTest diff --git a/starsky/starskytest/starsky.feature.packagetelemetry/Services/DeviceIdServiceTest.cs b/starsky/starskytest/starsky.feature.packagetelemetry/Services/DeviceIdServiceTest.cs index 564d91b3b7..03d001be72 100644 --- a/starsky/starskytest/starsky.feature.packagetelemetry/Services/DeviceIdServiceTest.cs +++ b/starsky/starskytest/starsky.feature.packagetelemetry/Services/DeviceIdServiceTest.cs @@ -105,7 +105,7 @@ public async Task DeviceId_Linux_BsdHostIdPath() var storage = new FakeIStorage(new List{"/"}); var storageSelector = new FakeSelectorStorage(storage); var deviceService = new DeviceIdService(storageSelector,new FakeISettingsService()); - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("test-id"), deviceService.BsdHostIdPath); + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("test-id"), deviceService.BsdHostIdPath); var id = await deviceService.DeviceId(OSPlatform.Linux); Assert.IsNotNull( id ); Assert.AreEqual("6CC41D5EC590AB78CCCECF81EF167D418C309A4598E8E45FEF78039F7D9AA9FE", id ); @@ -118,8 +118,8 @@ public async Task DeviceId_Linux_MachineIdPath2() var storageSelector = new FakeSelectorStorage(storage); var deviceService = new DeviceIdService(storageSelector, new FakeISettingsService()); - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("should-not-use"), deviceService.BsdHostIdPath); - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("test-id"), deviceService.MachineIdPath2); + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("should-not-use"), deviceService.BsdHostIdPath); + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("test-id"), deviceService.MachineIdPath2); var id = await deviceService.DeviceId(OSPlatform.Linux); Assert.IsNotNull( id ); Assert.AreEqual("6CC41D5EC590AB78CCCECF81EF167D418C309A4598E8E45FEF78039F7D9AA9FE", id ); @@ -131,9 +131,9 @@ public async Task DeviceId_Linux_DbusMachineIdPath() var storage = new FakeIStorage(new List{"/"}); var storageSelector = new FakeSelectorStorage(storage); var deviceService = new DeviceIdService(storageSelector,new FakeISettingsService()); - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("should-not-use"), deviceService.BsdHostIdPath); - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("should-not-use"), deviceService.MachineIdPath2); - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("test-id"), deviceService.DbusMachineIdPath); + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("should-not-use"), deviceService.BsdHostIdPath); + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("should-not-use"), deviceService.MachineIdPath2); + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("test-id"), deviceService.DbusMachineIdPath); var id = await deviceService.DeviceId(OSPlatform.Linux); Assert.IsNotNull( id ); @@ -147,9 +147,9 @@ public async Task DeviceId_Bsd_DbusMachineIdPath() var storageSelector = new FakeSelectorStorage(storage); var deviceService = new DeviceIdService(storageSelector, new FakeISettingsService()); - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("should-not-use"), deviceService.BsdHostIdPath); - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("should-not-use"), deviceService.MachineIdPath2); - await storage.WriteStreamAsync(PlainTextFileHelper.StringToStream("test-id"), deviceService.DbusMachineIdPath); + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("should-not-use"), deviceService.BsdHostIdPath); + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("should-not-use"), deviceService.MachineIdPath2); + await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("test-id"), deviceService.DbusMachineIdPath); var id = await deviceService.DeviceId(OSPlatform.FreeBSD); Assert.IsNotNull( id ); @@ -228,7 +228,7 @@ public async Task DeviceId_MacOS__UnixOnly() text += " } "; text += " ' "; - await hostFullPathFilesystem.WriteStreamAsync(PlainTextFileHelper.StringToStream(text),osxHostIdMockPath); + await hostFullPathFilesystem.WriteStreamAsync(StringToStreamHelper.StringToStream(text),osxHostIdMockPath); await Command.Run("chmod", "+x", osxHostIdMockPath).Task; @@ -273,7 +273,7 @@ public async Task DeviceId_MacOS_Direct__UnixOnly() text += " } "; text += " ' "; - await hostFullPathFilesystem.WriteStreamAsync(PlainTextFileHelper.StringToStream(text),osxHostIdMockPath); + await hostFullPathFilesystem.WriteStreamAsync(StringToStreamHelper.StringToStream(text),osxHostIdMockPath); await Command.Run("chmod", "+x", osxHostIdMockPath).Task; diff --git a/starsky/starskytest/starsky.feature.rename/Services/RenameServiceTest.cs b/starsky/starskytest/starsky.feature.rename/Services/RenameServiceTest.cs index 321957ea29..037e04d597 100644 --- a/starsky/starskytest/starsky.feature.rename/Services/RenameServiceTest.cs +++ b/starsky/starskytest/starsky.feature.rename/Services/RenameServiceTest.cs @@ -70,14 +70,14 @@ public async Task RenameFsTest_DuplicateFile() if ( !_iStorageSubPath.ExistFile(fileAlreadyExistSubPath) ) { - await _iStorageSubPath.WriteStreamAsync(PlainTextFileHelper.StringToStream("test"), + await _iStorageSubPath.WriteStreamAsync(StringToStreamHelper.StringToStream("test"), fileAlreadyExistSubPath); } var renameFs = await new RenameService( _query,_iStorageSubPath).Rename(_newImage.DbPath, fileAlreadyExistSubPath); - var result = await PlainTextFileHelper.StreamToStringAsync( + var result = await StreamToStringHelper.StreamToStringAsync( _iStorageSubPath.ReadStream(fileAlreadyExistSubPath)); // it should not overwrite the target file diff --git a/starsky/starskytest/starsky.feature.webftppublish/Helpers/WebFtpCliTest.cs b/starsky/starskytest/starsky.feature.webftppublish/Helpers/WebFtpCliTest.cs index e05653b919..514dc5f82b 100644 --- a/starsky/starskytest/starsky.feature.webftppublish/Helpers/WebFtpCliTest.cs +++ b/starsky/starskytest/starsky.feature.webftppublish/Helpers/WebFtpCliTest.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.feature.webftppublish.Helpers; using starsky.foundation.platform.Models; @@ -32,68 +33,68 @@ private static byte[] ExampleManifest() "true,\n \"_settings.json\": false\n },\n" + " \"Slug\": \"test\",\n \"Export\": \"20200808121411\",\n" + " \"Version\": \"0.3.0.0\"\n}"; - var stream = PlainTextFileHelper.StringToStream(input) as MemoryStream; + var stream = StringToStreamHelper.StringToStream(input) as MemoryStream; return stream?.ToArray(); } [TestMethod] - public void Run_Help() + public async Task Run_Help() { var console = new FakeConsoleWrapper(); - new WebFtpCli(_appSettings, new FakeSelectorStorage(), console,_webRequestFactory ) - .Run(new []{"-h"}); + await new WebFtpCli(_appSettings, new FakeSelectorStorage(), console,_webRequestFactory ) + .RunAsync(new []{"-h"}); Assert.IsTrue(console.WrittenLines.FirstOrDefault()?.Contains("Starsky WebFtp Cli ~ Help:")); Assert.IsTrue(console.WrittenLines.LastOrDefault()?.Contains(" use -v -help to show settings: ")); } [TestMethod] - public void Run_Default() + public async Task Run_Default() { var console = new FakeConsoleWrapper(); - new WebFtpCli(_appSettings, new FakeSelectorStorage(), console, _webRequestFactory) - .Run(new []{""}); + await new WebFtpCli(_appSettings, new FakeSelectorStorage(), console, _webRequestFactory) + .RunAsync(new []{""}); - Assert.IsTrue(console.WrittenLines.FirstOrDefault().Contains("Please use the -p to add a path first")); + Assert.IsTrue(console.WrittenLines.FirstOrDefault()?.Contains("Please use the -p to add a path first")); } [TestMethod] - public void Run_PathArg() + public async Task Run_PathArg() { var console = new FakeConsoleWrapper(); - new WebFtpCli(_appSettings, new FakeSelectorStorage(), console, _webRequestFactory) - .Run(new []{"-p"}); + await new WebFtpCli(_appSettings, new FakeSelectorStorage(), console, _webRequestFactory) + .RunAsync(new []{"-p"}); Assert.IsTrue(console.WrittenLines.LastOrDefault()?.Contains("is not found")); } [TestMethod] - public void Run_NoFtpSettings() + public async Task Run_NoFtpSettings() { var console = new FakeConsoleWrapper(); var fakeSelectorStorage = new FakeSelectorStorage(new FakeIStorage(new List{"/test"})); // no ftp settings - new WebFtpCli(new AppSettings(),fakeSelectorStorage , console, _webRequestFactory) - .Run(new []{"-p", "/test"}); + await new WebFtpCli(new AppSettings(),fakeSelectorStorage , console, _webRequestFactory) + .RunAsync(new []{"-p", "/test"}); Assert.IsTrue(console.WrittenLines.LastOrDefault()?.Contains("WebFtp settings")); } [TestMethod] - public void Run_NoSettingsFileInFolder() + public async Task Run_NoSettingsFileInFolder() { var console = new FakeConsoleWrapper(); var fakeSelectorStorage = new FakeSelectorStorage(new FakeIStorage(new List{"/test"})); - new WebFtpCli(_appSettings,fakeSelectorStorage , console, _webRequestFactory) - .Run(new []{"-p", "/test"}); + await new WebFtpCli(_appSettings,fakeSelectorStorage , console, _webRequestFactory) + .RunAsync(new []{"-p", "/test"}); Assert.IsTrue(console.WrittenLines.LastOrDefault()?.Contains("generate a settings file")); } [TestMethod] - public void Run_SettingsFile_successful() + public async Task Run_SettingsFile_successful() { var console = new FakeConsoleWrapper(); @@ -102,10 +103,10 @@ public void Run_SettingsFile_successful() "/test/1000/0_kl1k.jpg"}, new List {ExampleManifest(), Array.Empty()})); // instead of new byte[0] - new WebFtpCli(_appSettings, fakeSelectorStorage , console, _webRequestFactory) - .Run(new []{"-p", "/test"}); + await new WebFtpCli(_appSettings, fakeSelectorStorage , console, _webRequestFactory) + .RunAsync(new []{"-p", "/test"}); - var isSuccess = console?.WrittenLines?.LastOrDefault()? + var isSuccess = console.WrittenLines?.LastOrDefault()? .Contains("Ftp copy successful done"); switch ( isSuccess ) diff --git a/starsky/starskytest/starsky.foundation.database/Thumbnails/ThumbnailQueryErrorTest.cs b/starsky/starskytest/starsky.foundation.database/Thumbnails/ThumbnailQueryErrorTest.cs index 71d07e435c..dadcefa05d 100644 --- a/starsky/starskytest/starsky.foundation.database/Thumbnails/ThumbnailQueryErrorTest.cs +++ b/starsky/starskytest/starsky.foundation.database/Thumbnails/ThumbnailQueryErrorTest.cs @@ -104,17 +104,15 @@ public bool IsConceptualNull(IProperty property) { throw new NotImplementedException(); } - +#pragma warning disable 8618 public DbContext Context { get; } -#pragma warning disable 8618 // ReSharper disable once UnassignedGetOnlyAutoProperty public IEntityType EntityType { get; } -#pragma warning restore 8618 public EntityState EntityState { get; set; } -#pragma warning disable 8618 // ReSharper disable once UnassignedGetOnlyAutoProperty public IUpdateEntry SharedIdentityEntry { get; } + #pragma warning restore 8618 } diff --git a/starsky/starskytest/starsky.foundation.platform/Exceptions/TelemetryServiceExceptionTest.cs b/starsky/starskytest/starsky.foundation.platform/Exceptions/TelemetryServiceExceptionTest.cs index e75a3911bd..706f66d2bb 100644 --- a/starsky/starskytest/starsky.foundation.platform/Exceptions/TelemetryServiceExceptionTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Exceptions/TelemetryServiceExceptionTest.cs @@ -3,6 +3,7 @@ using System.Reflection; using System.Runtime.Serialization; using Microsoft.VisualStudio.TestTools.UnitTesting; +using MySqlConnector; using starsky.foundation.platform.Exceptions; namespace starskytest.starsky.foundation.platform.Exceptions @@ -10,6 +11,7 @@ namespace starskytest.starsky.foundation.platform.Exceptions [TestClass] public class TelemetryServiceExceptionTest { + [TestMethod] [ExpectedException(typeof(TelemetryServiceException))] public void TelemetryServiceException() diff --git a/starsky/starskytest/Services/ConfigReadTest.cs b/starsky/starskytest/starsky.foundation.platform/Helpers/PathHelper2Test.cs similarity index 92% rename from starsky/starskytest/Services/ConfigReadTest.cs rename to starsky/starskytest/starsky.foundation.platform/Helpers/PathHelper2Test.cs index 9d61ca19ae..ffa2f4b750 100644 --- a/starsky/starskytest/Services/ConfigReadTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Helpers/PathHelper2Test.cs @@ -2,12 +2,11 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.foundation.platform.Helpers; using starskycore.Attributes; -using starskycore.Helpers; -namespace starskytest.Services +namespace starskytest.starsky.foundation.platform.Helpers { [TestClass] - public sealed class ConfigReadTest + public sealed class PathHelper2Test { [ExcludeFromCoverage] diff --git a/starsky/starskytest/starsky.foundation.platform/Helpers/PathHelperTest.cs b/starsky/starskytest/starsky.foundation.platform/Helpers/PathHelperTest.cs index 8390bfa792..853e0db76a 100644 --- a/starsky/starskytest/starsky.foundation.platform/Helpers/PathHelperTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Helpers/PathHelperTest.cs @@ -1,6 +1,7 @@ using System.IO; using System.Linq; using System.Text.RegularExpressions; +using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.foundation.platform.Helpers; using starsky.foundation.platform.Models; @@ -28,7 +29,7 @@ public void GetFileName_ReturnsValidFileName() [TestMethod] [ExpectedException(typeof(RegexMatchTimeoutException))] - public void GetFileName_ReturnsFileName_WithMaliciousInput_UnixOnly() + public async Task GetFileName_ReturnsFileName_WithMaliciousInput_UnixOnly() { if ( new AppSettings().IsWindows ) { @@ -37,12 +38,13 @@ public void GetFileName_ReturnsFileName_WithMaliciousInput_UnixOnly() } // Act and Assert - var test = - PlainTextFileHelper.StreamToString( + var test = await + StreamToStringHelper.StreamToStringAsync( new MemoryStream(CreateAnImage.Bytes.ToArray())); - var test2 = - PlainTextFileHelper.StreamToString( + var test2 = await + StreamToStringHelper.StreamToStringAsync( new MemoryStream(CreateAnImageA6600.Bytes.ToArray())); + PathHelper.GetFileName(test + test2 + test + test,1); } diff --git a/starsky/starskytest/starsky.foundation.platform/Helpers/PortProgramHelperTest.cs b/starsky/starskytest/starsky.foundation.platform/Helpers/PortProgramHelperTest.cs index a6746e36cf..ba7704ed6d 100644 --- a/starsky/starskytest/starsky.foundation.platform/Helpers/PortProgramHelperTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Helpers/PortProgramHelperTest.cs @@ -69,7 +69,7 @@ public async Task SetEnvPortAspNetUrlsAndSetDefault_ShouldIgnore_DueAppSettingsF Environment.SetEnvironmentVariable("ASPNETCORE_URLS",""); var appSettingsPath = Path.Combine(new AppSettings().BaseDirectoryProject,"appsettings-222.json"); - var stream = PlainTextFileHelper.StringToStream("{ \"Kestrel\": {\n \"Endpoints\": {\n " + + var stream = StringToStreamHelper.StringToStream("{ \"Kestrel\": {\n \"Endpoints\": {\n " + " \"Https\": {\n \"Url\": \"https://*:8001\"\n },\n \"Http\": {\n " + " \"Url\": \"http://*:8000\"\n }\n }\n }\n }"); await new StorageHostFullPathFilesystem().WriteStreamAsync(stream,appSettingsPath); @@ -93,7 +93,7 @@ public async Task SkipForAppSettingsJsonFile_ShouldIgnore_DueAppSettingsFile() Environment.SetEnvironmentVariable("ASPNETCORE_URLS",""); var appSettingsPath = Path.Combine(new AppSettings().BaseDirectoryProject,"appsettings-111.json"); - var stream = PlainTextFileHelper.StringToStream("{ \"Kestrel\": {\n \"Endpoints\": {\n " + + var stream = StringToStreamHelper.StringToStream("{ \"Kestrel\": {\n \"Endpoints\": {\n " + " \"Https\": {\n \"Url\": \"https://*:8001\"\n },\n \"Http\": {\n " + " \"Url\": \"http://*:8000\"\n }\n }\n }\n }"); await new StorageHostFullPathFilesystem().WriteStreamAsync(stream,appSettingsPath); @@ -117,7 +117,7 @@ public async Task SkipForAppSettingsJsonFile_ShouldIgnore_DueAppSettingsFile2() Environment.SetEnvironmentVariable("ASPNETCORE_URLS",""); var appSettingsPath = Path.Combine(new AppSettings().BaseDirectoryProject,"appsettings-333.json"); - var stream = PlainTextFileHelper.StringToStream("{ \"Kestrel\": {\n \"Endpoints\": {\n " + + var stream = StringToStreamHelper.StringToStream("{ \"Kestrel\": {\n \"Endpoints\": {\n " + " \"Https\": {\n \"Url\": \"https://*:8001\"\n }\n " + "\n }\n }\n }"); await new StorageHostFullPathFilesystem().WriteStreamAsync(stream,appSettingsPath); diff --git a/starsky/starskytest/starsky.foundation.platform/Helpers/ReadAppSettingsTest.cs b/starsky/starskytest/starsky.foundation.platform/Helpers/ReadAppSettingsTest.cs index 4f89c3ed8f..80e30c555e 100644 --- a/starsky/starskytest/starsky.foundation.platform/Helpers/ReadAppSettingsTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Helpers/ReadAppSettingsTest.cs @@ -22,7 +22,7 @@ public void ReadAppSettingsTest_default() public async Task ReadAppSettingsTest_readKestrelData() { var appSettingsPath = Path.Combine(new AppSettings().BaseDirectoryProject,"appsettings-test2.json"); - var stream = PlainTextFileHelper.StringToStream("{ \"Kestrel\": {\n \"Endpoints\": {\n " + + var stream = StringToStreamHelper.StringToStream("{ \"Kestrel\": {\n \"Endpoints\": {\n " + " \"Https\": {\n \"Url\": \"https://*:8001\"\n },\n \"Http\": {\n " + " \"Url\": \"http://*:8000\"\n }\n }\n }\n }"); await new StorageHostFullPathFilesystem().WriteStreamAsync(stream,appSettingsPath); diff --git a/starsky/starskytest/starsky.foundation.platform/Helpers/SetupAppSettingsTest.cs b/starsky/starskytest/starsky.foundation.platform/Helpers/SetupAppSettingsTest.cs index bb296e6d3f..f376a1db51 100644 --- a/starsky/starskytest/starsky.foundation.platform/Helpers/SetupAppSettingsTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Helpers/SetupAppSettingsTest.cs @@ -32,7 +32,7 @@ public async Task SetLocalAppData_ShouldRead() var path = Path.Combine(appDataFolderFullPath, "appsettings.json"); var example = - PlainTextFileHelper.StringToStream( + StringToStreamHelper.StringToStream( "{\n \"app\" :{\n \"isAccountRegisterOpen\": \"true\"\n }\n}\n"); await _hostStorage.WriteStreamAsync(example, path); @@ -73,7 +73,7 @@ public async Task MergeJsonFiles_DefaultFile() } _hostStorage.CreateDirectory(testDir); - await _hostStorage.WriteStreamAsync(PlainTextFileHelper.StringToStream( + await _hostStorage.WriteStreamAsync(StringToStreamHelper.StringToStream( "{\n \"app\": {\n " + " \"StorageFolder\": \"/data/test\"\n " + " }\n}\n"), Path.Combine(testDir, "appsettings.json")); @@ -100,12 +100,12 @@ public async Task MergeJsonFiles_StackPatchFile() } _hostStorage.CreateDirectory(testDir); - await _hostStorage.WriteStreamAsync(PlainTextFileHelper.StringToStream( + await _hostStorage.WriteStreamAsync(StringToStreamHelper.StringToStream( "{\n \"app\": {\n " + " \"StorageFolder\": \"/data/test\",\n \"addSwagger\": \"true\" " + " }\n}\n"), Path.Combine(testDir, "appsettings.json")); - await _hostStorage.WriteStreamAsync(PlainTextFileHelper.StringToStream( + await _hostStorage.WriteStreamAsync(StringToStreamHelper.StringToStream( "{\n \"app\": {\n \"addSwagger\": \"false\" " + " }\n}\n"), Path.Combine(testDir, "appsettings.patch.json")); @@ -124,12 +124,12 @@ public async Task MergeJsonFiles_StackMachineNamePatchFile() } _hostStorage.CreateDirectory(testDir); - await _hostStorage.WriteStreamAsync(PlainTextFileHelper.StringToStream( + await _hostStorage.WriteStreamAsync(StringToStreamHelper.StringToStream( "{\n \"app\": {\n " + " \"StorageFolder\": \"/data/test\",\n \"addSwagger\": \"true\" " + " }\n}\n"), Path.Combine(testDir, "appsettings.json")); - await _hostStorage.WriteStreamAsync(PlainTextFileHelper.StringToStream( + await _hostStorage.WriteStreamAsync(StringToStreamHelper.StringToStream( "{\n \"app\": {\n \"addSwagger\": \"false\" " + " }\n}\n"), Path.Combine(testDir, $"{SetupAppSettings.AppSettingsMachineNameWithDot()}json")); @@ -145,12 +145,12 @@ public async Task MergeJsonFiles_StackFromEnv() _hostStorage.FolderDelete(testDir); _hostStorage.CreateDirectory(testDir); - await _hostStorage.WriteStreamAsync(PlainTextFileHelper.StringToStream( + await _hostStorage.WriteStreamAsync(StringToStreamHelper.StringToStream( "{\n \"app\": {\n " + " \"StorageFolder\": \"/data/test\",\n \"addSwagger\": \"true\" " + " }\n}\n"), Path.Combine(testDir, "appsettings.json")); - await _hostStorage.WriteStreamAsync(PlainTextFileHelper.StringToStream( + await _hostStorage.WriteStreamAsync(StringToStreamHelper.StringToStream( "{\n \"app\": {\n \"addSwagger\": \"false\" " + " }\n}\n"), Path.Combine(testDir, "appsettings_ref_patch.json")); diff --git a/starsky/starskytest/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddlewareTest.cs b/starsky/starskytest/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddlewareTest.cs index 1700a8d206..09e15e9c6d 100644 --- a/starsky/starskytest/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddlewareTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddlewareTest.cs @@ -4,7 +4,6 @@ using Microsoft.AspNetCore.Http; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.foundation.accountmanagement.Extensions; -using starsky.foundation.accountmanagement.Middleware; using starsky.foundation.platform.Extensions; using starsky.foundation.platform.Middleware; @@ -38,7 +37,7 @@ public async Task ContentSecurityPolicyMiddlewareTest_invoke_testContent() // Arrange var httpContext = new DefaultHttpContext(); httpContext.Request.Scheme = "http"; - var authMiddleware = new ContentSecurityPolicyMiddleware(next: (innerHttpContext) => Task.FromResult(0)); + var authMiddleware = new ContentSecurityPolicyMiddleware(next: (_) => Task.FromResult(0)); // Act await authMiddleware.Invoke(httpContext); @@ -55,7 +54,7 @@ public async Task invoke_httpsTest_websockets() var httpContext = new DefaultHttpContext(); httpContext.Request.Scheme = "https"; - var authMiddleware = new ContentSecurityPolicyMiddleware(next: (innerHttpContext) => Task.FromResult(0)); + var authMiddleware = new ContentSecurityPolicyMiddleware(next: (_) => Task.FromResult(0)); // Act await authMiddleware.Invoke(httpContext); @@ -74,7 +73,7 @@ public async Task invoke_httpsTest_websockets_localhostWithPort9000() httpContext.Request.Scheme = "https"; httpContext.Request.Host = new HostString("localhost", 9000); - var authMiddleware = new ContentSecurityPolicyMiddleware(next: (innerHttpContext) => Task.FromResult(0)); + var authMiddleware = new ContentSecurityPolicyMiddleware(next: (_) => Task.FromResult(0)); // Act await authMiddleware.Invoke(httpContext); @@ -94,7 +93,7 @@ public async Task invoke_httpsTest_websockets_localhostWithNoPort() httpContext.Request.Scheme = "https"; httpContext.Request.Host = new HostString("localhost"); - var authMiddleware = new ContentSecurityPolicyMiddleware(next: (innerHttpContext) => Task.FromResult(0)); + var authMiddleware = new ContentSecurityPolicyMiddleware(next: (_) => Task.FromResult(0)); // Act await authMiddleware.Invoke(httpContext); @@ -112,7 +111,7 @@ public async Task ContentSecurityPolicyMiddlewareTest_invoke_otherTypes() // Arrange var httpContext = new DefaultHttpContext(); httpContext.Request.Scheme = "http"; - var authMiddleware = new ContentSecurityPolicyMiddleware((innerHttpContext) => Task.FromResult(0)); + var authMiddleware = new ContentSecurityPolicyMiddleware((_) => Task.FromResult(0)); // Act await authMiddleware.Invoke(httpContext); @@ -139,10 +138,12 @@ public async Task ContentSecurityPolicyMiddlewareTest_invoke_Chrome() { // Arrange - var httpContext = new DefaultHttpContext(); - httpContext.Request.Scheme = "http"; - httpContext.Request.Headers.Add("User-Agent","Chrome"); - var authMiddleware = new ContentSecurityPolicyMiddleware((innerHttpContext) => Task.FromResult(0)); + var httpContext = new DefaultHttpContext { Request = + { + Scheme = "http" + } }; + httpContext.Request.Headers.Append("User-Agent","Chrome"); + var authMiddleware = new ContentSecurityPolicyMiddleware((_) => Task.FromResult(0)); // Act await authMiddleware.Invoke(httpContext); diff --git a/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMetaSubPathStorageTest.cs b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMetaSubPathStorageTest.cs index d02788b280..b4ea1de78f 100644 --- a/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMetaSubPathStorageTest.cs +++ b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMetaSubPathStorageTest.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Text.Json; +using System.Threading.Tasks; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.DependencyInjection; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -15,21 +16,21 @@ namespace starskytest.starsky.foundation.readmeta.Services; public class ReadMetaSubPathStorageTest { [TestMethod] - public void ReadExifAndXmpFromFile() + public async Task ReadExifAndXmpFromFile() { var fakeStorage = new FakeIStorage(); var readMetaSubPathStorage = new ReadMetaSubPathStorage(new FakeSelectorStorage(fakeStorage), new AppSettings(), new FakeMemoryCache(), new FakeIWebLogger()); - var result = readMetaSubPathStorage.ReadExifAndXmpFromFile("test.jpg"); + var result = await readMetaSubPathStorage.ReadExifAndXmpFromFileAsync("test.jpg"); Assert.AreEqual("test.jpg", result.FileName); Assert.AreEqual(FileIndexItem.ExifStatus.OperationNotSupported, result.Status); } [TestMethod] - public void ReadExifAndXmpFromFileAddFilePathHash() + public async Task ReadExifAndXmpFromFileAddFilePathHash() { var fakeStorage = new FakeIStorage(); var readMetaSubPathStorage = new ReadMetaSubPathStorage(new FakeSelectorStorage(fakeStorage), new AppSettings(), new FakeMemoryCache(), new FakeIWebLogger()); - var result = readMetaSubPathStorage.ReadExifAndXmpFromFileAddFilePathHash(new List(), new List()); + var result = await readMetaSubPathStorage.ReadExifAndXmpFromFileAddFilePathHashAsync(new List(), new List()); Assert.AreEqual(0, result.Count); } @@ -42,10 +43,13 @@ public void UpdateReadMetaCache() .BuildServiceProvider(); var memoryCache = provider.GetService(); - var readMetaSubPathStorage = new ReadMetaSubPathStorage(new FakeSelectorStorage(fakeStorage), new AppSettings(), memoryCache, new FakeIWebLogger()); + var readMetaSubPathStorage = new ReadMetaSubPathStorage(new FakeSelectorStorage(fakeStorage), + new AppSettings(), memoryCache, new FakeIWebLogger()); var addItem = new FileIndexItem("/test.jpg"); readMetaSubPathStorage.UpdateReadMetaCache(new List{addItem}); - var actualJson = JsonSerializer.Serialize(memoryCache.Get("info_/test.jpg"),DefaultJsonSerializer.CamelCaseNoEnters); + var actualJson = JsonSerializer.Serialize(memoryCache.Get("info_/test.jpg"), + DefaultJsonSerializer.CamelCaseNoEnters); + var expectedJson = JsonSerializer.Serialize(addItem,DefaultJsonSerializer.CamelCaseNoEnters); Assert.AreEqual(expectedJson, actualJson); diff --git a/starsky/starskytest/Services/ReadMetaTest.cs b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMetaTest.cs similarity index 83% rename from starsky/starskytest/Services/ReadMetaTest.cs rename to starsky/starskytest/starsky.foundation.readmeta/Services/ReadMetaTest.cs index 657dcaa20f..7d1fee7387 100644 --- a/starsky/starskytest/Services/ReadMetaTest.cs +++ b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMetaTest.cs @@ -3,6 +3,7 @@ using System.Globalization; using System.Linq; using System.Text; +using System.Threading.Tasks; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.DependencyInjection; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -13,13 +14,13 @@ using starskytest.FakeCreateAn; using starskytest.FakeMocks; -namespace starskytest.Services +namespace starskytest.starsky.foundation.readmeta.Services { [TestClass] public sealed class ReadMetaTest { [TestMethod] - public void ReadMetaTest_HalfCompleteFile() + public async Task ReadMetaTest_HalfCompleteFile() { const string xmpString = "" + "" + @@ -46,8 +47,8 @@ public void ReadMetaTest_HalfCompleteFile() var fakeIStorage = new FakeIStorage(new List {"/"}, new List {"/test.arw", "/test.xmp"}, new List{CreateAnImage.Bytes.ToArray(),xmpByteArray} ); - var data = new ReadMeta(fakeIStorage, new AppSettings(), - null, new FakeIWebLogger()).ReadExifAndXmpFromFile("/test.arw"); + var data = await new ReadMeta(fakeIStorage, new AppSettings(), + null, new FakeIWebLogger()).ReadExifAndXmpFromFileAsync("/test.arw"); // Is in source file Assert.AreEqual(200,data.IsoSpeed); @@ -69,7 +70,7 @@ public void ReadMetaTest_HalfCompleteFile() } [TestMethod] - public void UpdateReadMetaCache_Null() + public async Task UpdateReadMetaCache_Null() { var readMeta = new ReadMeta(new FakeIStorage(), new AppSettings(), null, new FakeIWebLogger()); @@ -81,11 +82,11 @@ public void UpdateReadMetaCache_Null() } }); - Assert.AreEqual(string.Empty,readMeta.ReadExifAndXmpFromFile("/test.jpg").Tags); + Assert.AreEqual(string.Empty,(await readMeta.ReadExifAndXmpFromFileAsync("/test.jpg"))!.Tags); } [TestMethod] - public void UpdateReadMetaCache_AppSettingsDisabled() + public async Task UpdateReadMetaCache_AppSettingsDisabled() { var provider = new ServiceCollection() .AddMemoryCache() @@ -103,8 +104,10 @@ public void UpdateReadMetaCache_AppSettingsDisabled() Tags = "t2" } }); - - Assert.AreEqual(string.Empty,readMeta.ReadExifAndXmpFromFile("/test.jpg").Tags); + + var result = (await readMeta.ReadExifAndXmpFromFileAsync("/test.jpg") )? + .Tags; + Assert.AreEqual(string.Empty, result); } @@ -165,7 +168,7 @@ public void RemoveReadMetaCache_Exists() }, memoryCache, new FakeIWebLogger()); // set cache - readMeta.ReadExifAndXmpFromFile("/test.jpg"); + readMeta.ReadExifAndXmpFromFileAsync("/test.jpg"); var result = readMeta.RemoveReadMetaCache("/test.jpg"); @@ -173,7 +176,7 @@ public void RemoveReadMetaCache_Exists() } [TestMethod] - public void ReadMetaTest_CheckIfCacheListIsUpdated() + public async Task ReadMetaTest_CheckIfCacheListIsUpdated() { var provider = new ServiceCollection() .AddMemoryCache() @@ -188,12 +191,15 @@ public void ReadMetaTest_CheckIfCacheListIsUpdated() Tags = "t2" } }); + + var result = + await readMeta.ReadExifAndXmpFromFileAsync("/test.jpg"); - Assert.AreEqual("t2",readMeta.ReadExifAndXmpFromFile("/test.jpg").Tags); + Assert.AreEqual("t2",result?.Tags); } [TestMethod] - public void ReadMetaTest_CheckIfCacheIsUpdated_SingleItem() + public async Task ReadMetaTest_CheckIfCacheIsUpdated_SingleItem() { var provider = new ServiceCollection() .AddMemoryCache() @@ -207,12 +213,15 @@ public void ReadMetaTest_CheckIfCacheIsUpdated_SingleItem() Tags = "t2" } ); + + var result = + await readMeta.ReadExifAndXmpFromFileAsync("/test.jpg"); - Assert.AreEqual("t2",readMeta.ReadExifAndXmpFromFile("/test.jpg").Tags); + Assert.AreEqual("t2",result?.Tags); } [TestMethod] - public void CorruptXmpFile_SoIgnore() + public async Task CorruptXmpFile_SoIgnore() { var storage = new FakeIStorage(new List { "/" }, new List { "/test.dng", "/test.xmp" }, new List @@ -222,11 +231,15 @@ public void CorruptXmpFile_SoIgnore() }); var readMeta = new ReadMeta(storage, new AppSettings(), null!, new FakeIWebLogger()); - Assert.AreEqual("test, sion",readMeta.ReadExifAndXmpFromFile("/test.dng").Tags); + var resultDng = + await readMeta.ReadExifAndXmpFromFileAsync("/test.dng"); + + Assert.AreEqual("test, sion",resultDng?.Tags); + } [TestMethod] - public void ShouldPickXmpFile() + public async Task ShouldPickXmpFile() { var storage = new FakeIStorage(new List { "/" }, new List { "/test.dng", "/test.xmp" }, new List @@ -236,7 +249,10 @@ public void ShouldPickXmpFile() }); var readMeta = new ReadMeta(storage, new AppSettings(), null!, new FakeIWebLogger()); - Assert.AreEqual(string.Empty,readMeta.ReadExifAndXmpFromFile("/test.dng").Tags); + var result = + await readMeta.ReadExifAndXmpFromFileAsync("/test.jpg"); + + Assert.AreEqual(string.Empty,result?.Tags); } } } diff --git a/starsky/starskytest/Services/ReadMeta_ExifReadTest.cs b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_ExifReadTest.cs similarity index 99% rename from starsky/starskytest/Services/ReadMeta_ExifReadTest.cs rename to starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_ExifReadTest.cs index 97b8096dbb..fc57dfdc19 100644 --- a/starsky/starskytest/Services/ReadMeta_ExifReadTest.cs +++ b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_ExifReadTest.cs @@ -18,7 +18,7 @@ using XmpCore; using XmpCore.Impl; -namespace starskytest.Services +namespace starskytest.starsky.foundation.readmeta.Services { public class MockDirectory : Directory { diff --git a/starsky/starskytest/Services/ReadMeta_GpxFromFileTest.cs b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_GpxFromFileTest.cs similarity index 82% rename from starsky/starskytest/Services/ReadMeta_GpxFromFileTest.cs rename to starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_GpxFromFileTest.cs index febc995677..45f82a987d 100644 --- a/starsky/starskytest/Services/ReadMeta_GpxFromFileTest.cs +++ b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_GpxFromFileTest.cs @@ -2,39 +2,38 @@ using System.Globalization; using System.IO; using System.Linq; +using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.foundation.database.Models; using starsky.foundation.readmeta.ReadMetaHelpers; -using starsky.foundation.readmeta.Services; -using starsky.foundation.storage.Helpers; using starskytest.FakeCreateAn; using starskytest.FakeMocks; -namespace starskytest.Services +namespace starskytest.starsky.foundation.readmeta.Services { [TestClass] public sealed class ReadGpxFromFileTest { [TestMethod] - public void ReadGpxFromFileTest_ReturnAfterFirstFieldReadFile_Null() + public async Task ReadGpxFromFileTest_ReturnAfterFirstFieldReadFile_Null() { - var returnItem = + var returnItem = await new ReadMetaGpx(new FakeIWebLogger()) - .ReadGpxFromFileReturnAfterFirstField(null, "/test.gpx"); + .ReadGpxFromFileReturnAfterFirstFieldAsync(null, "/test.gpx"); Assert.AreEqual(FileIndexItem.ExifStatus.OperationNotSupported, returnItem.Status); Assert.AreEqual("/test.gpx", returnItem.FilePath); } [TestMethod] - public void ReadGpxFromFileTest_ReturnAfterFirstFieldReadFile() + public async Task ReadGpxFromFileTest_ReturnAfterFirstFieldReadFile() { var gpxBytes = CreateAnGpx.Bytes.ToArray(); MemoryStream stream = new MemoryStream(gpxBytes); - var returnItem = + var returnItem = await new ReadMetaGpx(new FakeIWebLogger()) - .ReadGpxFromFileReturnAfterFirstField(stream, "/test.gpx"); + .ReadGpxFromFileReturnAfterFirstFieldAsync(stream, "/test.gpx"); Assert.AreEqual(5.485941, returnItem.Longitude, 0.001); Assert.AreEqual(51.809360, returnItem.Latitude, 0.001); Assert.AreEqual("_20180905-fietsen-oss", returnItem.Title); @@ -51,14 +50,14 @@ public void ReadGpxFromFileTest_ReturnAfterFirstFieldReadFile() } [TestMethod] - public void + public async Task ReadGpxFromFileTest_ReturnAfterFirstFieldReadFile_Utc_UseLocalFalse() { var gpxBytes = CreateAnGpx.Bytes.ToArray(); MemoryStream stream = new MemoryStream(gpxBytes); - var returnItem = new ReadMetaGpx(new FakeIWebLogger()) - .ReadGpxFromFileReturnAfterFirstField(stream, "/test.gpx", + var returnItem = await new ReadMetaGpx(new FakeIWebLogger()) + .ReadGpxFromFileReturnAfterFirstFieldAsync(stream, "/test.gpx", false); Assert.AreEqual(5.485941, returnItem.Longitude, 0.001); Assert.AreEqual(51.809360, returnItem.Latitude, 0.001); @@ -76,38 +75,38 @@ public void } [TestMethod] - public void ReadGpxFromFileTest_NonValidInput() + public async Task ReadGpxFromFileTest_NonValidInput() { var gpxBytes = Array.Empty(); MemoryStream stream = new MemoryStream(gpxBytes); - var returnItem = + var returnItem = await new ReadMetaGpx(new FakeIWebLogger()) - .ReadGpxFromFileReturnAfterFirstField(stream, "/test.gpx"); + .ReadGpxFromFileReturnAfterFirstFieldAsync(stream, "/test.gpx"); Assert.AreEqual(new DateTime(), returnItem.DateTime); Assert.AreEqual("/test.gpx", returnItem.FilePath); } [TestMethod] - public void ReadGpxFromFileTest_TestFileName() + public async Task ReadGpxFromFileTest_TestFileName() { var gpxBytes = CreateAnGpx.Bytes.ToArray(); MemoryStream stream = new MemoryStream(gpxBytes); - var returnItem = + var returnItem = await new ReadMetaGpx(new FakeIWebLogger()) - .ReadGpxFromFileReturnAfterFirstField(stream, "/test.gpx"); + .ReadGpxFromFileReturnAfterFirstFieldAsync(stream, "/test.gpx"); Assert.AreEqual("test.gpx", returnItem.FileName); Assert.AreEqual("/", returnItem.ParentDirectory); } [TestMethod] - public void ReadGpxFromFileTest_ReadFile() + public async Task ReadGpxFromFileTest_ReadFile() { var gpxBytes = CreateAnGpx.Bytes.ToArray(); MemoryStream stream = new MemoryStream(gpxBytes); - var returnItem = - new ReadMetaGpx(new FakeIWebLogger()).ReadGpxFile(stream); + var returnItem = await + new ReadMetaGpx(new FakeIWebLogger()).ReadGpxFileAsync(stream); Assert.AreEqual(5.485941, returnItem.FirstOrDefault()!.Longitude, 0.001); Assert.AreEqual(51.809360, returnItem.FirstOrDefault()!.Latitude, diff --git a/starsky/starskytest/Services/ReadMeta_ReadMetaBoth_Cache_Test.cs b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_ReadMetaBoth_Cache_Test.cs similarity index 61% rename from starsky/starskytest/Services/ReadMeta_ReadMetaBoth_Cache_Test.cs rename to starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_ReadMetaBoth_Cache_Test.cs index d229d3c808..f31b84eded 100644 --- a/starsky/starskytest/Services/ReadMeta_ReadMetaBoth_Cache_Test.cs +++ b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_ReadMetaBoth_Cache_Test.cs @@ -1,17 +1,15 @@ using System.Collections.Generic; using System.Linq; -using Microsoft.Extensions.Caching.Memory; -using Microsoft.Extensions.DependencyInjection; +using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.foundation.database.Models; using starsky.foundation.platform.Models; using starsky.foundation.readmeta.Services; using starsky.foundation.storage.Storage; -using starskycore.Helpers; using starskytest.FakeCreateAn; using starskytest.FakeMocks; -namespace starskytest.Services +namespace starskytest.starsky.foundation.readmeta.Services { [TestClass] public sealed class ReadMeta_ReadMetaBoth_Cache_Test @@ -19,19 +17,18 @@ public sealed class ReadMeta_ReadMetaBoth_Cache_Test [TestMethod] - public void ReadMeta_ReadMetaBothTest_ReadBothWithFilePath() + public async Task ReadMeta_ReadMetaBothTest_ReadBothWithFilePath() { + var appSettings = new AppSettings {StorageFolder = new CreateAnImage().BasePath}; + var iStorage = new StorageSubPathFilesystem(appSettings, new FakeIWebLogger()); - var appsettings = new AppSettings {StorageFolder = new CreateAnImage().BasePath}; - var iStorage = new StorageSubPathFilesystem(appsettings, new FakeIWebLogger()); - - var listofFiles = new List{ new CreateAnImage().DbPath}; + var listOfFiles = new List{ new CreateAnImage().DbPath}; var fakeCache = new FakeMemoryCache(new Dictionary()); - var listOfMetas = new ReadMeta(iStorage,appsettings,fakeCache, new FakeIWebLogger()) - .ReadExifAndXmpFromFileAddFilePathHash(listofFiles); + var listOfMetas = await new ReadMeta(iStorage,appSettings,fakeCache, new FakeIWebLogger()) + .ReadExifAndXmpFromFileAddFilePathHashAsync(listOfFiles); Assert.AreEqual(new CreateAnImage().DbPath.Remove(0,1), - listOfMetas.FirstOrDefault().FileName); + listOfMetas.FirstOrDefault()?.FileName); } [TestMethod] @@ -47,12 +44,15 @@ public void ReadMeta_ReadMetaBothTest_RemoveCache() } [TestMethod] - public void ReadMeta_ReadMetaBothTest_FakeReadEntry() + public async Task ReadMeta_ReadMetaBothTest_FakeReadEntry() { var iStorage = new FakeIStorage(); var fakeCache = new FakeMemoryCache(new Dictionary{{"info_test",new FileIndexItem(){Tags = "test"}}}); - Assert.AreEqual("test",new ReadMeta(iStorage,null, fakeCache, new FakeIWebLogger()).ReadExifAndXmpFromFile("test").Tags); + var result = ( await new ReadMeta(iStorage, null, fakeCache, + new FakeIWebLogger()) + .ReadExifAndXmpFromFileAsync("test") )?.Tags; + Assert.AreEqual("test",result); } } } diff --git a/starsky/starskytest/Services/ReadMeta_XmpReadHelperTest.cs b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_XmpReadHelperTest.cs similarity index 95% rename from starsky/starskytest/Services/ReadMeta_XmpReadHelperTest.cs rename to starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_XmpReadHelperTest.cs index 30e8b6e969..ac457d2689 100644 --- a/starsky/starskytest/Services/ReadMeta_XmpReadHelperTest.cs +++ b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_XmpReadHelperTest.cs @@ -1,18 +1,15 @@ using System; using System.Collections.Generic; using System.Globalization; -using System.IO; using System.Text; +using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.foundation.database.Models; using starsky.foundation.platform.Helpers; using starsky.foundation.readmeta.ReadMetaHelpers; -using starsky.foundation.readmeta.Services; -using starskycore.Helpers; -using starskytest.FakeCreateAn; using starskytest.FakeMocks; -namespace starskytest.Services +namespace starskytest.starsky.foundation.readmeta.Services { [TestClass] public sealed class XmpReadHelperTest @@ -81,7 +78,7 @@ public void XmpReadHelperTest_GetData_usingStringExample() } [TestMethod] - public void XmpReadHelperTest_XmpGetSidecarFile_WithFakeStorage() + public async Task XmpReadHelperTest_XmpGetSidecarFile_WithFakeStorage() { // convert string to stream byte[] xmpByteArray = Encoding.UTF8.GetBytes(Input); @@ -94,7 +91,7 @@ public void XmpReadHelperTest_XmpGetSidecarFile_WithFakeStorage() FileName = "test.arw" }; - var data = new ReadMetaXmp(fakeIStorage, new FakeIWebLogger()).XmpGetSidecarFile(fileIndexItem); + var data = await new ReadMetaXmp(fakeIStorage, new FakeIWebLogger()).XmpGetSidecarFileAsync(fileIndexItem); Assert.AreEqual(52.3451333333,data.Latitude,0.001); @@ -122,7 +119,7 @@ public void XmpReadHelperTest_XmpGetSidecarFile_WithFakeStorage() [TestMethod] - public void XmpReadHelperTest_XmpGetSidecarFile_TestIfOverwrite() + public async Task XmpReadHelperTest_XmpGetSidecarFile_TestIfOverwrite() { // convert string to stream byte[] xmpByteArray = Encoding.UTF8.GetBytes(Input); @@ -143,8 +140,7 @@ public void XmpReadHelperTest_XmpGetSidecarFile_TestIfOverwrite() DateTime = new DateTime(1990,01,01,01,00,00) }; - var data = new ReadMetaXmp(fakeIStorage, new FakeIWebLogger()).XmpGetSidecarFile(fileIndexItem); - + var data = await new ReadMetaXmp(fakeIStorage, new FakeIWebLogger()).XmpGetSidecarFileAsync(fileIndexItem); Assert.AreEqual(52.3451333333,data.Latitude,0.001); Assert.AreEqual(5.930,data.Longitude,0.001); @@ -200,7 +196,7 @@ public void XmpBasicRead_InvalidXml() [TestMethod] - public void XmpGetSidecarFile_LocationCountryCode() + public async Task XmpGetSidecarFile_LocationCountryCode() { const string xmpData = "\n" + "\n" + @@ -217,7 +213,7 @@ public void XmpGetSidecarFile_LocationCountryCode() new List {"/test.arw", "/test.xmp"}, new List{null,xmpByteArray} ); var readMetaXmp = new ReadMetaXmp(fakeIStorage, new FakeIWebLogger()); - var data = readMetaXmp.XmpGetSidecarFile(new FileIndexItem("/test.arw")); + var data = await readMetaXmp.XmpGetSidecarFileAsync(new FileIndexItem("/test.arw")); Assert.AreEqual("NLD", data.LocationCountryCode); } diff --git a/starsky/starskytest/starsky.foundation.realtime/Middleware/DisabledWebSocketsMiddlewareTest.cs b/starsky/starskytest/starsky.foundation.realtime/Middleware/DisabledWebSocketsMiddlewareTest.cs index f7176212c6..3f911d5c81 100644 --- a/starsky/starskytest/starsky.foundation.realtime/Middleware/DisabledWebSocketsMiddlewareTest.cs +++ b/starsky/starskytest/starsky.foundation.realtime/Middleware/DisabledWebSocketsMiddlewareTest.cs @@ -15,7 +15,7 @@ public sealed class DisabledWebSocketsMiddlewareTest public async Task DisabledWebSocketsMiddleware_Invoke() { var httpContext = new DefaultHttpContext(); - var disabledWebSocketsMiddleware = new DisabledWebSocketsMiddleware(next: (innerHttpContext) => Task.FromResult(0)); + var disabledWebSocketsMiddleware = new DisabledWebSocketsMiddleware(next: (_) => Task.FromResult(0)); await disabledWebSocketsMiddleware.Invoke(httpContext); Assert.AreEqual(400,httpContext.Response.StatusCode); } @@ -25,7 +25,7 @@ public async Task WebSocketConnection_MessageTooBig() { var httpContext = new FakeWebSocketHttpContext(false); - var disabledWebSocketsMiddleware = new DisabledWebSocketsMiddleware(next: (innerHttpContext) => Task.FromResult(0)); + var disabledWebSocketsMiddleware = new DisabledWebSocketsMiddleware(next: (_) => Task.FromResult(0)); await disabledWebSocketsMiddleware.Invoke(httpContext); var socketManager = httpContext.WebSockets as FakeWebSocketManager; diff --git a/starsky/starskytest/starsky.foundation.storage/ArchiveFormats/TarBalTest.cs b/starsky/starskytest/starsky.foundation.storage/ArchiveFormats/TarBalTest.cs index 1b24c0b40e..20cbf1d575 100644 --- a/starsky/starskytest/starsky.foundation.storage/ArchiveFormats/TarBalTest.cs +++ b/starsky/starskytest/starsky.foundation.storage/ArchiveFormats/TarBalTest.cs @@ -60,7 +60,7 @@ public async Task ExtractTarGz_LongerThan100Chars() Assert.IsTrue(storage.ExistFile($"/test/{CreateAnTagGzLongerThan100CharsFileName.FileName}")); var file = storage.ReadStream($"/test/{CreateAnTagGzLongerThan100CharsFileName.FileName}"); // the filename is written as content in the file - Assert.AreEqual(CreateAnTagGzLongerThan100CharsFileName.FileName,PlainTextFileHelper.StreamToString(file).Trim()); + Assert.AreEqual(CreateAnTagGzLongerThan100CharsFileName.FileName,(await StreamToStringHelper.StreamToStringAsync(file)).Trim()); } } } diff --git a/starsky/starskytest/starsky.foundation.storage/Helpers/DeserializeJsonTest.cs b/starsky/starskytest/starsky.foundation.storage/Helpers/DeserializeJsonTest.cs index 087b8fc839..4283d99c28 100644 --- a/starsky/starskytest/starsky.foundation.storage/Helpers/DeserializeJsonTest.cs +++ b/starsky/starskytest/starsky.foundation.storage/Helpers/DeserializeJsonTest.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.foundation.database.Models; using starsky.foundation.storage.Helpers; @@ -11,18 +12,18 @@ namespace starskytest.starsky.foundation.storage.Helpers public sealed class DeserializeJsonTest { [TestMethod] - public void ReadTest_FromCopiedText_T_Model() + public async Task ReadTest_FromCopiedText_T_Model() { var input = "{\n \"Title\": \"Title\",\n \"Price\": 200,\n \"ShowButtons\": " + "true}"; var fakeStorage = new FakeIStorage(); - fakeStorage.WriteStream( - PlainTextFileHelper.StringToStream(input), "/test.json"); + await fakeStorage.WriteStreamAsync( + StringToStreamHelper.StringToStream(input), "/test.json"); var itemJsonParser = new DeserializeJson(fakeStorage); - var result = itemJsonParser.Read("/test.json"); + var result = await itemJsonParser.ReadAsync("/test.json"); Assert.AreEqual(200, result.Price); Assert.AreEqual("Title", result.Title); @@ -30,7 +31,7 @@ public void ReadTest_FromCopiedText_T_Model() } [TestMethod] - public void Item() + public async Task Item() { const string input = "{ \"$id\": \"https://docs.qdraw.nl/schema/meta-data-container.json\", " + "\"$schema\": \"https://json-schema.org/draft/2020-12/schema\", \"item\": { " + @@ -49,27 +50,29 @@ public void Item() "\"lensModel\": \"\", \"focalLength\": 200, \"size\": 0, " + "\"imageStabilisation\": \"Unknown\", \"lastChanged\": [] }}"; var fakeStorage = new FakeIStorage(); - fakeStorage.WriteStream( - PlainTextFileHelper.StringToStream(input), "/test.json"); + await fakeStorage.WriteStreamAsync( + StringToStreamHelper.StringToStream(input), "/test.json"); var itemJsonParser = new DeserializeJson(fakeStorage); - var result = itemJsonParser.Read("/test.json"); + var result = await itemJsonParser.ReadAsync("/test.json"); - Assert.AreEqual("/test.jpg", result.Item.FilePath); + Assert.AreEqual("/test.jpg", result.Item?.FilePath); } [TestMethod] [ExpectedException(typeof(FileNotFoundException))] - public void ReadTest_NotFound() + public async Task ReadTest_NotFound() { var fakeStorage = new FakeIStorage(); var itemJsonParser = new DeserializeJson(fakeStorage); - itemJsonParser.Read("/notfound.json"); + await itemJsonParser.ReadAsync("/notfound.json"); // expect error } } + // ReSharper disable once InconsistentNaming + // ReSharper disable once ClassNeverInstantiated.Global public class FileIndexItemJsonParserTest_TestModel { public string Title { get; set; } diff --git a/starsky/starskytest/Services/FileHashTest.cs b/starsky/starskytest/starsky.foundation.storage/Services/FileHashTest.cs similarity index 97% rename from starsky/starskytest/Services/FileHashTest.cs rename to starsky/starskytest/starsky.foundation.storage/Services/FileHashTest.cs index b9b42d885f..023b9f3f71 100644 --- a/starsky/starskytest/Services/FileHashTest.cs +++ b/starsky/starskytest/starsky.foundation.storage/Services/FileHashTest.cs @@ -7,7 +7,7 @@ using starskytest.FakeCreateAn; using starskytest.FakeMocks; -namespace starskytest.Services +namespace starskytest.starsky.foundation.storage.Services { [TestClass] public sealed class FileHashTest diff --git a/starsky/starskytest/starsky.foundation.storage/Storage/StorageSubPathFilesystemTest.cs b/starsky/starskytest/starsky.foundation.storage/Storage/StorageSubPathFilesystemTest.cs index d3f9a6a59c..20490071bc 100644 --- a/starsky/starskytest/starsky.foundation.storage/Storage/StorageSubPathFilesystemTest.cs +++ b/starsky/starskytest/starsky.foundation.storage/Storage/StorageSubPathFilesystemTest.cs @@ -70,7 +70,7 @@ public void GetAllFilesInDirectoryRecursive() _storage.CreateDirectory("/test_GetAllFilesInDirectoryRecursive"); _storage.CreateDirectory("/test_GetAllFilesInDirectoryRecursive/test"); var fileAlreadyExistSubPath = "/test_GetAllFilesInDirectoryRecursive/test/already_09010.tmp"; - _storage.WriteStream(PlainTextFileHelper.StringToStream("test"), + _storage.WriteStream(StringToStreamHelper.StringToStream("test"), fileAlreadyExistSubPath); var filesInFolder = _storage.GetAllFilesInDirectoryRecursive( @@ -98,7 +98,7 @@ public void FileCopy() const string from = "/test_file_copy.tmp"; const string to = "/test_file_copy_2.tmp"; - _storage.WriteStream(PlainTextFileHelper.StringToStream("test"), + _storage.WriteStream(StringToStreamHelper.StringToStream("test"), from); _storage.FileCopy(from,to); @@ -115,7 +115,7 @@ public void FileMove() const string from = "/test_file_move.tmp"; const string to = "/test_file_move_2.tmp"; - _storage.WriteStream(PlainTextFileHelper.StringToStream("test"), + _storage.WriteStream(StringToStreamHelper.StringToStream("test"), from); _storage.FileMove(from,to); diff --git a/starsky/starskytest/starsky.foundation.sync/Helpers/NewItemTest.cs b/starsky/starskytest/starsky.foundation.sync/Helpers/NewItemTest.cs index 409f2d70a6..af59b8dc23 100644 --- a/starsky/starskytest/starsky.foundation.sync/Helpers/NewItemTest.cs +++ b/starsky/starskytest/starsky.foundation.sync/Helpers/NewItemTest.cs @@ -14,7 +14,7 @@ public class NewItemTest public async Task NewItemTest_KeepDefault() { var storage = new FakeIStorage(new List{"/"}, new List{"/test.jpg"}); - var newItem = await new NewItem(storage, new FakeReadMeta()).PrepareUpdateFileItem(new FileIndexItem("/test.jpg") + var newItem = await new NewItem(storage, new FakeReadMeta()).PrepareUpdateFileItemAsync(new FileIndexItem("/test.jpg") { LastChanged = new List{"test"} }, 100); @@ -28,7 +28,7 @@ public async Task NewItemTest_KeepDefault() public async Task NewItemTest_SetOkAndSame() { var storage = new FakeIStorage(new List{"/"}, new List{"/test.jpg"}); - var newItem = await new NewItem(storage, new FakeReadMeta()).PrepareUpdateFileItem(new FileIndexItem("/test.jpg") + var newItem = await new NewItem(storage, new FakeReadMeta()).PrepareUpdateFileItemAsync(new FileIndexItem("/test.jpg") { Tags = "test, fake read meta", LastChanged = new List() diff --git a/starsky/starskytest/starsky.foundation.thumbnailgeneration/Helpers/ThumbnailTest.cs b/starsky/starskytest/starsky.foundation.thumbnailgeneration/Helpers/ThumbnailTest.cs index 11a3ff3730..af87ba5402 100644 --- a/starsky/starskytest/starsky.foundation.thumbnailgeneration/Helpers/ThumbnailTest.cs +++ b/starsky/starskytest/starsky.foundation.thumbnailgeneration/Helpers/ThumbnailTest.cs @@ -127,13 +127,13 @@ public async Task CreateThumbTest_1arg_ThumbnailAlreadyExist() var hash = (await new FileHash(storage).GetHashCodeAsync(_fakeIStorageImageSubPath)).Key; await storage.WriteStreamAsync( - PlainTextFileHelper.StringToStream("not 0 bytes"), + StringToStreamHelper.StringToStream("not 0 bytes"), ThumbnailNameHelper.Combine(hash, ThumbnailSize.ExtraLarge)); await storage.WriteStreamAsync( - PlainTextFileHelper.StringToStream("not 0 bytes"), + StringToStreamHelper.StringToStream("not 0 bytes"), ThumbnailNameHelper.Combine(hash, ThumbnailSize.Large)); await storage.WriteStreamAsync( - PlainTextFileHelper.StringToStream("not 0 bytes"), + StringToStreamHelper.StringToStream("not 0 bytes"), ThumbnailNameHelper.Combine(hash, ThumbnailSize.Small)); var isCreated = await new Thumbnail(storage, diff --git a/starsky/starskytest/starsky.foundation.thumbnailmeta/Services/ReadMetaThumbnailTest.cs b/starsky/starskytest/starsky.foundation.thumbnailmeta/Services/ReadMetaThumbnailTest.cs index dc3f9691f0..29e1f10f70 100644 --- a/starsky/starskytest/starsky.foundation.thumbnailmeta/Services/ReadMetaThumbnailTest.cs +++ b/starsky/starskytest/starsky.foundation.thumbnailmeta/Services/ReadMetaThumbnailTest.cs @@ -6,7 +6,6 @@ using starsky.foundation.thumbnailmeta.Services; using starsky.foundation.platform.Models; using starsky.foundation.storage.Helpers; -using starsky.foundation.storage.Services; using starsky.foundation.storage.Storage; using starskytest.FakeCreateAn; using starskytest.FakeCreateAn.CreateAnImageWithThumbnail; @@ -18,7 +17,6 @@ namespace starskytest.starsky.foundation.thumbnailmeta.Services public sealed class MetaExifThumbnailServiceTest { private readonly FakeIStorage _iStorageFake; - private readonly string _exampleHash; public MetaExifThumbnailServiceTest() { @@ -27,8 +25,6 @@ public MetaExifThumbnailServiceTest() new List{"/no_thumbnail.jpg", "/poppy.jpg", ThumbnailNameHelper.Combine("test",ThumbnailSize.TinyMeta)}, new List{CreateAnImage.Bytes.ToArray(), new CreateAnImageWithThumbnail().Bytes, CreateAnImage.Bytes.ToArray()} ); - - _exampleHash = new FileHash(_iStorageFake).GetHashCode("/no_thumbnail.jpg").Key; } [TestMethod] @@ -81,7 +77,7 @@ public async Task AddMetaThumbnail_stringString_Fake_NoHashIncluded() var result = await new MetaExifThumbnailService(new AppSettings(), selectorStorage, new FakeIOffsetDataMetaExifThumbnail(), new FakeIWriteMetaThumbnailService(), logger) - .AddMetaThumbnail("/poppy.jpg",null); + .AddMetaThumbnail("/poppy.jpg",null!); Assert.IsTrue(result.Item1); } @@ -172,7 +168,7 @@ public async Task AddMetaThumbnail_Fake_stringString_NotFound() [TestMethod] public async Task AddMetaThumbnail_Fake_Corrupt() { - await _iStorageFake.WriteStreamAsync(PlainTextFileHelper.StringToStream("test"), "/poppy_corrupt_22.jpg"); + await _iStorageFake.WriteStreamAsync(StringToStreamHelper.StringToStream("test"), "/poppy_corrupt_22.jpg"); var selectorStorage = new FakeSelectorStorage(_iStorageFake); var logger = new FakeIWebLogger(); diff --git a/starsky/starskytest/starsky.foundation.writemeta/Helpers/ExifToolDownloadTest.cs b/starsky/starskytest/starsky.foundation.writemeta/Helpers/ExifToolDownloadTest.cs index bacf7d9a34..68ad5b9a7f 100644 --- a/starsky/starskytest/starsky.foundation.writemeta/Helpers/ExifToolDownloadTest.cs +++ b/starsky/starskytest/starsky.foundation.writemeta/Helpers/ExifToolDownloadTest.cs @@ -156,7 +156,7 @@ private async Task CreateTempFolderWithExifTool(string name = "test var appSettings = new AppSettings{DependenciesFolder = Path.Combine(_createAnImage.BasePath,name)}; Directory.CreateDirectory(appSettings.DependenciesFolder); Directory.CreateDirectory(Path.Combine(appSettings.DependenciesFolder,"exiftool-unix")); - var stream = PlainTextFileHelper.StringToStream("#!/bin/bash"); + var stream = StringToStreamHelper.StringToStream("#!/bin/bash"); try { await new StorageHostFullPathFilesystem().WriteStreamAsync(stream, @@ -312,7 +312,7 @@ public async Task DownloadExifTool_Windows_existVerbose() Directory.CreateDirectory(Path.Combine(appSettings.DependenciesFolder,"exiftool-windows")); var debugString = "\n\necho \"Fake ExifTool\"\n\n\n\necho 'test'"; - var stream = PlainTextFileHelper.StringToStream("#!/bin/bash\n"+ debugString+ debugString + var stream = StringToStreamHelper.StringToStream("#!/bin/bash\n"+ debugString+ debugString +debugString+debugString+debugString); await new StorageHostFullPathFilesystem().WriteStreamAsync(stream, Path.Combine(appSettings.DependenciesFolder, "exiftool-windows", "exiftool.exe")); diff --git a/starsky/starskytest/starsky.foundation.writemeta/Helpers/ExifToolTest.cs b/starsky/starskytest/starsky.foundation.writemeta/Helpers/ExifToolTest.cs index 27b08b69c2..85140a8181 100644 --- a/starsky/starskytest/starsky.foundation.writemeta/Helpers/ExifToolTest.cs +++ b/starsky/starskytest/starsky.foundation.writemeta/Helpers/ExifToolTest.cs @@ -5,8 +5,10 @@ using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.foundation.platform.Models; +using starsky.foundation.storage.Helpers; using starsky.foundation.writemeta.Helpers; using starsky.foundation.writemeta.Services; +using starskytest.FakeCreateAn; using starskytest.FakeMocks; namespace starskytest.starsky.foundation.writemeta.Helpers @@ -110,6 +112,9 @@ public async Task RunProcessAsync_RunChildObject_UnixOnly() var runner = new StreamToStreamRunner(appSettings, new MemoryStream(Array.Empty()), new FakeIWebLogger()); var result = await runner.RunProcessAsync(string.Empty); + + var test = await StreamToStringHelper.StreamToStringAsync(result, false); + Assert.AreEqual(0, result.Length); } diff --git a/starsky/starskytest/starsky.foundation.writemeta/JsonService/FileIndexItemJsonWriterTest.cs b/starsky/starskytest/starsky.foundation.writemeta/JsonService/FileIndexItemJsonWriterTest.cs index f233678ea7..52e0e36a55 100644 --- a/starsky/starskytest/starsky.foundation.writemeta/JsonService/FileIndexItemJsonWriterTest.cs +++ b/starsky/starskytest/starsky.foundation.writemeta/JsonService/FileIndexItemJsonWriterTest.cs @@ -77,7 +77,7 @@ public async Task Json_Write_Read() var itemJsonParser = new FileIndexItemJsonParser(fakeStorage); await itemJsonParser.WriteAsync(ExampleItem); - var result = itemJsonParser.Read(new FileIndexItem("/test.jpg")); + var result = await itemJsonParser.ReadAsync(new FileIndexItem("/test.jpg")); Assert.IsNotNull(result); Assert.AreEqual(ExampleItem.Tags, result.Tags); @@ -108,7 +108,7 @@ public async Task Json_Write_Read() } [TestMethod] - public void ReadTest_OldFormat_Unsupported() + public async Task ReadTest_OldFormat_Unsupported() { const string input = "{\n \"FilePath\": \"/test.jpg\",\n " + " \"FileName\": \"test.jpg\",\n \"FileHash\": " + @@ -135,18 +135,18 @@ public void ReadTest_OldFormat_Unsupported() var fakeStorage = new FakeIStorage(); var jsonSubPath = "/.starsky." + "test.jpg" + ".json"; - fakeStorage.WriteStream( - PlainTextFileHelper.StringToStream(input), jsonSubPath); + await fakeStorage.WriteStreamAsync( + StringToStreamHelper.StringToStream(input), jsonSubPath); var itemJsonParser = new FileIndexItemJsonParser(fakeStorage); - var result = itemJsonParser.Read(new FileIndexItem("/test.jpg")); + var result = await itemJsonParser.ReadAsync(new FileIndexItem("/test.jpg")); Assert.AreEqual(string.Empty, result.Tags); } [TestMethod] - public void ReadTest_FromCopiedText() + public async Task ReadTest_FromCopiedText() { const string input = "{ \"item\": {\n \"FilePath\": \"/test.jpg\",\n " + " \"FileName\": \"test.jpg\",\n \"FileHash\": " + @@ -174,12 +174,12 @@ public void ReadTest_FromCopiedText() var fakeStorage = new FakeIStorage(); var jsonSubPath = "/.starsky." + "test.jpg" + ".json"; - fakeStorage.WriteStream( - PlainTextFileHelper.StringToStream(input), jsonSubPath); + await fakeStorage.WriteStreamAsync( + StringToStreamHelper.StringToStream(input), jsonSubPath); var itemJsonParser = new FileIndexItemJsonParser(fakeStorage); - var result = itemJsonParser.Read(new FileIndexItem("/test.jpg")); + var result = await itemJsonParser.ReadAsync(new FileIndexItem("/test.jpg")); Assert.AreEqual(ExampleItem.Tags, result.Tags); Assert.AreEqual(ExampleItem.FileHash, result.FileHash); diff --git a/starsky/starskytest/Services/ExifCopyTest.cs b/starsky/starskytest/starsky.foundation.writemeta/Services/ExifCopyTest.cs similarity index 92% rename from starsky/starskytest/Services/ExifCopyTest.cs rename to starsky/starskytest/starsky.foundation.writemeta/Services/ExifCopyTest.cs index 689eda8acc..7d463d3e54 100644 --- a/starsky/starskytest/Services/ExifCopyTest.cs +++ b/starsky/starskytest/starsky.foundation.writemeta/Services/ExifCopyTest.cs @@ -9,7 +9,7 @@ using starskytest.FakeMocks; using starskytest.Models; -namespace starskytest.Services +namespace starskytest.starsky.foundation.writemeta.Services { [TestClass] public sealed class ExifCopyTest @@ -57,7 +57,7 @@ public async Task ExifToolCmdHelper_XmpSync() } [TestMethod] - public void ExifToolCmdHelper_XmpCreate() + public async Task ExifToolCmdHelper_XmpCreate() { var folderPaths = new List{"/"}; var inputSubPaths = new List{"/test.dng"}; @@ -71,7 +71,7 @@ public void ExifToolCmdHelper_XmpCreate() new ExifCopy(storage, storage, fakeExifTool, fakeReadMeta, new FakeIThumbnailQuery()) .XmpCreate("/test.xmp"); - var result = PlainTextFileHelper.StreamToString(storage.ReadStream("/test.xmp")); + var result = await StreamToStringHelper.StreamToStringAsync(storage.ReadStream("/test.xmp")); Assert.AreEqual("\n" + "\n\n",result); } @@ -95,7 +95,7 @@ public async Task ExifToolCmdHelper_TestForFakeExifToolInjection() Assert.AreEqual(true,storage.ExistFile("/test.xmp")); var xmpContentReadStream = storage.ReadStream("/test.xmp"); - var xmpContent = await PlainTextFileHelper.StreamToStringAsync(xmpContentReadStream); + var xmpContent = await StreamToStringHelper.StreamToStringAsync(xmpContentReadStream); // Those values are injected by fakeExifTool Assert.AreEqual(true,xmpContent.Contains("")); diff --git a/starsky/starskytest/starsky.foundation.writemeta/Services/ExifToolServiceTest.cs b/starsky/starskytest/starsky.foundation.writemeta/Services/ExifToolServiceTest.cs index 04c61bea18..fb083f0e5a 100644 --- a/starsky/starskytest/starsky.foundation.writemeta/Services/ExifToolServiceTest.cs +++ b/starsky/starskytest/starsky.foundation.writemeta/Services/ExifToolServiceTest.cs @@ -23,7 +23,7 @@ public ExifToolServiceTest() { if ( !new AppSettings().IsWindows ) { - var stream = PlainTextFileHelper.StringToStream("#!/bin/bash\necho Fake ExifTool"); + var stream = StringToStreamHelper.StringToStream("#!/bin/bash\necho Fake ExifTool"); _exifToolPath = Path.Join(new CreateAnImage().BasePath, "exiftool-tmp"); new StorageHostFullPathFilesystem().WriteStream(stream, _exifToolPath); diff --git a/starsky/starskywebftpcli/Program.cs b/starsky/starskywebftpcli/Program.cs index 8da13ebab8..b0b51d9d17 100644 --- a/starsky/starskywebftpcli/Program.cs +++ b/starsky/starskywebftpcli/Program.cs @@ -31,7 +31,7 @@ public static async Task Main(string[] args) var console = serviceProvider.GetRequiredService(); var webRequestFactory = serviceProvider.GetRequiredService(); - new WebFtpCli(appSettings, storageSelector, console, webRequestFactory).Run(args); + await new WebFtpCli(appSettings, storageSelector, console, webRequestFactory).RunAsync(args); } } } From 54d9d78c9049befc7b18461260295a4ff14d32fe Mon Sep 17 00:00:00 2001 From: Dion Date: Sun, 21 Jan 2024 11:19:35 +0100 Subject: [PATCH 14/31] add push --- documentation/package-lock.json | 4 ++-- starsky/starskytest/root/ProgramTest.cs | 10 +++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/documentation/package-lock.json b/documentation/package-lock.json index 408a7cbd2f..cd57be3ef3 100644 --- a/documentation/package-lock.json +++ b/documentation/package-lock.json @@ -1,12 +1,12 @@ { "name": "starsky", - "version": "0.5.13", + "version": "0.5.14", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "starsky", - "version": "0.5.13", + "version": "0.5.14", "dependencies": { "@cmfcmf/docusaurus-search-local": "^1.1.0", "@docusaurus/core": "3.0.1", diff --git a/starsky/starskytest/root/ProgramTest.cs b/starsky/starskytest/root/ProgramTest.cs index 04d03e9e61..3ee9bada68 100644 --- a/starsky/starskytest/root/ProgramTest.cs +++ b/starsky/starskytest/root/ProgramTest.cs @@ -77,18 +77,22 @@ public async Task Program_RunAsync_Null_False() } [TestMethod] - [Timeout(15000)] + [Timeout(20000)] [ExpectedException(typeof(TimeoutException))] public async Task Program_RunAsync_WebApplication_CreateBuilder_TimeoutException() { - Environment.SetEnvironmentVariable("ASPNETCORE_URLS","http://*:7518"); + var number = new Random().Next(7500, 7900); + var url = $"http://*:{number}"; + await Console.Out.WriteLineAsync(url); + + Environment.SetEnvironmentVariable("ASPNETCORE_URLS", url); var builder = WebApplication.CreateBuilder(Array.Empty()); var app = builder.Build(); await Program.RunAsync(app).TimeoutAfter(1000); } - + [TestMethod] [Timeout(9000)] [ExpectedException(typeof(FormatException))] From eef1c9d95b2eaf4dbfade82e51cb938031e32f0f Mon Sep 17 00:00:00 2001 From: Dion van Velde Date: Sun, 21 Jan 2024 16:38:42 +0100 Subject: [PATCH 15/31] Add check if run is not a PR run --- .github/workflows/auto-update-swagger-dotnet.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/auto-update-swagger-dotnet.yml b/.github/workflows/auto-update-swagger-dotnet.yml index 75ec5ba76c..e264ec8230 100644 --- a/.github/workflows/auto-update-swagger-dotnet.yml +++ b/.github/workflows/auto-update-swagger-dotnet.yml @@ -63,9 +63,10 @@ jobs: shell: bash working-directory: ./documentation run: node scripts/openapi.js - - - name: Commit changes + + - name: Commit changes openapi.json (if push to branch) uses: EndBug/add-and-commit@v9 + if: github.event_name != 'pull_request' with: author_name: SwaggerUpdateBot author_email: qdraw@users.noreply.github.com @@ -73,8 +74,9 @@ jobs: add: "documentation/static/openapi/openapi.json" github_token: ${{ secrets.GITHUB_TOKEN }} - - name: Commit changes + - name: Commit changes docs/api/readme.md (if push to branch) uses: EndBug/add-and-commit@v9 + if: github.event_name != 'pull_request' with: author_name: SwaggerUpdateBot author_email: qdraw@users.noreply.github.com From 04a0fc19b10f68cec4fd0c591e1367e9b8fb52f8 Mon Sep 17 00:00:00 2001 From: Dion Date: Sun, 21 Jan 2024 16:42:13 +0100 Subject: [PATCH 16/31] WIP breaking build --- starsky-tools/.gitignore | 2 + .../Services/CleanDemoDataService.cs | 2 +- .../Services/GeoBackgroundTask.cs | 3 +- .../Services/GeoCli.cs | 2 +- .../Services/GeoIndexGpx.cs | 5 +- .../UpdateCheck/Services/CheckForUpdates.cs | 19 +++- .../Helpers/UpdateImportTransformations.cs | 12 +- .../starsky.feature.import/Services/Import.cs | 31 +++-- .../Interfaces/IUpdateAppSettingsByPath.cs | 10 ++ .../Models/UpdateAppSettingsStatusModel.cs | 10 ++ .../Services/UpdateAppSettingsByPath.cs | 67 +++++++++++ .../starsky.feature.settings.csproj | 19 ++++ .../Helpers/PublishManifest.cs | 12 +- .../Models/PublishManifestModel.cs | 2 +- .../Services/WebHtmlPublishService.cs | 18 +-- .../JsonConverter/DefaultJsonSerializer.cs | 19 ++++ .../ContentSecurityPolicyMiddleware.cs | 8 +- .../Interfaces/IReadMeta.cs | 2 +- .../ReadMetaHelpers/ReadMetaGpx.cs | 2 +- .../Helpers/NewItem.cs | 2 +- .../WatcherHelpers/SyncWatcherConnector.cs | 2 +- .../Helpers/Thumbnail.cs | 7 +- starsky/starsky.sln | 7 ++ .../Controllers/AppSettingsController.cs | 43 ++----- starsky/starsky/starsky.csproj | 1 + .../Controllers/AppSettingsControllerTest.cs | 41 +++---- .../FakeMocks/FakeIUpdateAppSettingsByPath.cs | 31 +++++ .../Helpers/CheckForUpdatesHelperTest.cs | 8 +- .../Services/UpdateAppSettingsByPathTest.cs | 107 ++++++++++++++++++ .../Helpers/ExportManifestTest.cs | 26 ++++- starsky/starskytest/starskytest.csproj | 1 + 31 files changed, 414 insertions(+), 107 deletions(-) create mode 100644 starsky-tools/.gitignore create mode 100644 starsky/starsky.feature.settings/Interfaces/IUpdateAppSettingsByPath.cs create mode 100644 starsky/starsky.feature.settings/Models/UpdateAppSettingsStatusModel.cs create mode 100644 starsky/starsky.feature.settings/Services/UpdateAppSettingsByPath.cs create mode 100644 starsky/starsky.feature.settings/starsky.feature.settings.csproj create mode 100644 starsky/starskytest/FakeMocks/FakeIUpdateAppSettingsByPath.cs create mode 100644 starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs diff --git a/starsky-tools/.gitignore b/starsky-tools/.gitignore new file mode 100644 index 0000000000..2409344858 --- /dev/null +++ b/starsky-tools/.gitignore @@ -0,0 +1,2 @@ +create-docusaurus-tmp-folder/** + diff --git a/starsky/starsky.feature.demo/Services/CleanDemoDataService.cs b/starsky/starsky.feature.demo/Services/CleanDemoDataService.cs index 0376f751f0..7b22bcb694 100644 --- a/starsky/starsky.feature.demo/Services/CleanDemoDataService.cs +++ b/starsky/starsky.feature.demo/Services/CleanDemoDataService.cs @@ -103,7 +103,7 @@ internal static void CleanData(IStorage subStorage, IWebLogger logger) internal async Task PushToSockets(List updatedList) { var filtered = updatedList.Where(p => p.FilePath != "/").ToList(); - if ( !filtered.Any() ) + if ( filtered.Count == 0 ) { return false; } diff --git a/starsky/starsky.feature.geolookup/Services/GeoBackgroundTask.cs b/starsky/starsky.feature.geolookup/Services/GeoBackgroundTask.cs index 3ea7a52054..93709bbbe0 100644 --- a/starsky/starsky.feature.geolookup/Services/GeoBackgroundTask.cs +++ b/starsky/starsky.feature.geolookup/Services/GeoBackgroundTask.cs @@ -9,7 +9,6 @@ using starsky.foundation.platform.Helpers; using starsky.foundation.platform.Interfaces; using starsky.foundation.platform.Models; -using starsky.foundation.readmeta.Interfaces; using starsky.foundation.readmeta.Services; using starsky.foundation.storage.Interfaces; using starsky.foundation.storage.Services; @@ -22,7 +21,7 @@ namespace starsky.feature.geolookup.Services public class GeoBackgroundTask : IGeoBackgroundTask { private readonly AppSettings _appSettings; - private readonly IReadMeta _readMeta; + private readonly ReadMeta _readMeta; private readonly IStorage _thumbnailStorage; private readonly IStorage _iStorage; private readonly IGeoLocationWrite _geoLocationWrite; diff --git a/starsky/starsky.feature.geolookup/Services/GeoCli.cs b/starsky/starsky.feature.geolookup/Services/GeoCli.cs index a4dae6e7e7..2d17454d8e 100644 --- a/starsky/starsky.feature.geolookup/Services/GeoCli.cs +++ b/starsky/starsky.feature.geolookup/Services/GeoCli.cs @@ -31,7 +31,7 @@ public sealed class GeoCli private readonly IGeoLocationWrite _geoLocationWrite; private readonly IStorage _iStorage; private readonly IStorage _thumbnailStorage; - private readonly IReadMeta _readMeta; + private readonly ReadMeta _readMeta; private readonly IGeoFileDownload _geoFileDownload; private readonly IExifToolDownload _exifToolDownload; private readonly IWebLogger _logger; diff --git a/starsky/starsky.feature.geolookup/Services/GeoIndexGpx.cs b/starsky/starsky.feature.geolookup/Services/GeoIndexGpx.cs index d21e64ad73..df01ca750f 100644 --- a/starsky/starsky.feature.geolookup/Services/GeoIndexGpx.cs +++ b/starsky/starsky.feature.geolookup/Services/GeoIndexGpx.cs @@ -87,7 +87,10 @@ public async Task> LoopFolderAsync(List metaF var toUpdateMetaFiles = new List(); var gpxList = await GetGpxFileAsync(metaFilesInDirectory); - if(!gpxList.Any()) return toUpdateMetaFiles; + if ( gpxList.Count == 0 ) + { + return toUpdateMetaFiles; + } metaFilesInDirectory = GetNoLocationItems(metaFilesInDirectory); diff --git a/starsky/starsky.feature.health/UpdateCheck/Services/CheckForUpdates.cs b/starsky/starsky.feature.health/UpdateCheck/Services/CheckForUpdates.cs index 5f83afeb06..dafd8888f9 100644 --- a/starsky/starsky.feature.health/UpdateCheck/Services/CheckForUpdates.cs +++ b/starsky/starsky.feature.health/UpdateCheck/Services/CheckForUpdates.cs @@ -11,6 +11,7 @@ using starsky.feature.health.UpdateCheck.Models; using starsky.foundation.http.Interfaces; using starsky.foundation.injection; +using starsky.foundation.platform.JsonConverter; using starsky.foundation.platform.Models; using starsky.foundation.platform.VersionHelpers; @@ -20,7 +21,7 @@ namespace starsky.feature.health.UpdateCheck.Services [Service(typeof(ICheckForUpdates), InjectionLifetime = InjectionLifetime.Singleton)] public class CheckForUpdates : ICheckForUpdates { - internal const string GithubApi = "https://api.github.com/repos/qdraw/starsky/releases"; + internal const string GithubStarskyReleaseApi = "https://api.github.com/repos/qdraw/starsky/releases"; private readonly AppSettings? _appSettings; private readonly IMemoryCache? _cache; @@ -73,14 +74,20 @@ public async Task> IsUpdateNeeded(string curr internal async Task?> QueryIsUpdateNeededAsync() { // argument check is done in QueryIsUpdateNeeded - var (key, value) = await _httpClientHelper.ReadString(GithubApi); - return !key ? new List() : JsonSerializer.Deserialize>(value, new JsonSerializerOptions()); + var (key, value) = await _httpClientHelper.ReadString(GithubStarskyReleaseApi); + return !key ? new List() : + JsonSerializer.Deserialize>(value, DefaultJsonSerializer.CamelCase); } - internal static KeyValuePair Parse(IEnumerable? releaseModelList, string currentVersion ) + internal static KeyValuePair Parse(IEnumerable? releaseModelList, + string currentVersion ) { - var orderedReleaseModelList = releaseModelList?.OrderByDescending(p => p.TagName); - var tagName = orderedReleaseModelList?.FirstOrDefault(p => p is { Draft: false, PreRelease: false })?.TagName; + var orderedReleaseModelList = + releaseModelList?.OrderByDescending(p => p.TagName); + + var tagName = orderedReleaseModelList? + .FirstOrDefault(p => p is { Draft: false, PreRelease: false })?.TagName; + if ( string.IsNullOrWhiteSpace(tagName) || !tagName.StartsWith('v') ) { diff --git a/starsky/starsky.feature.import/Helpers/UpdateImportTransformations.cs b/starsky/starsky.feature.import/Helpers/UpdateImportTransformations.cs index 674f255bef..007f4dfd88 100644 --- a/starsky/starsky.feature.import/Helpers/UpdateImportTransformations.cs +++ b/starsky/starsky.feature.import/Helpers/UpdateImportTransformations.cs @@ -1,10 +1,8 @@ #nullable enable using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; using starsky.foundation.database.Interfaces; using starsky.foundation.database.Models; -using starsky.foundation.platform.Enums; using starsky.foundation.platform.Helpers; using starsky.foundation.platform.Interfaces; using starsky.foundation.platform.Models; @@ -70,7 +68,10 @@ internal async Task UpdateTransformations( comparedNamesList = ColorClassComparedNamesList(comparedNamesList); } - if ( !comparedNamesList.Any() ) return fileIndexItem; + if ( comparedNamesList.Count == 0 ) + { + return fileIndexItem; + } var exifToolCmdHelper = new ExifToolCmdHelper(_exifTool, _subPathStorage, _thumbnailStorage, @@ -79,7 +80,10 @@ internal async Task UpdateTransformations( await exifToolCmdHelper.UpdateAsync(fileIndexItem, comparedNamesList); // Only update database when indexMode is true - if ( !indexMode || queryUpdateDelegate == null) return fileIndexItem; + if ( !indexMode || queryUpdateDelegate == null ) + { + return fileIndexItem; + } // Hash is changed after transformation fileIndexItem.FileHash = (await new FileHash(_subPathStorage).GetHashCodeAsync(fileIndexItem.FilePath!)).Key; diff --git a/starsky/starsky.feature.import/Services/Import.cs b/starsky/starsky.feature.import/Services/Import.cs index e33ff9e415..5c429b2079 100644 --- a/starsky/starsky.feature.import/Services/Import.cs +++ b/starsky/starsky.feature.import/Services/Import.cs @@ -25,7 +25,6 @@ using starsky.foundation.platform.Helpers; using starsky.foundation.platform.Interfaces; using starsky.foundation.platform.Models; -using starsky.foundation.readmeta.Interfaces; using starsky.foundation.readmeta.Services; using starsky.foundation.storage.Interfaces; using starsky.foundation.storage.Models; @@ -52,7 +51,7 @@ public class Import : IImport private readonly AppSettings _appSettings; - private readonly IReadMeta _readMetaHost; + private readonly ReadMeta _readMetaHost; private readonly IExifTool _exifTool; private readonly IQuery _query; @@ -118,7 +117,10 @@ public async Task> Preflight(List fullFilePathsLis importSettings).ToList(); // When Directory is Empty - if ( !includedDirectoryFilePaths.Any() ) return new List(); + if ( includedDirectoryFilePaths.Count == 0 ) + { + return new List(); + } var importIndexItemsList = (await includedDirectoryFilePaths .ForEachAsync( @@ -136,7 +138,10 @@ public async Task> Preflight(List fullFilePathsLis internal List>> CheckForReadOnlyFileSystems( List importIndexItemsList, bool deleteAfter = true) { - if ( !deleteAfter ) return new List>>(); + if ( !deleteAfter ) + { + return new List>>(); + } var parentFolders = new List>>(); foreach ( var itemSourceFullFilePath in importIndexItemsList.Select(item => item.SourceFullFilePath) ) @@ -493,7 +498,10 @@ public async Task> Importer(IEnumerable inputFullP var preflightItemList = await Preflight(inputFullPathList.ToList(), importSettings); // When directory is empty - if ( !preflightItemList.Any() ) return new List(); + if ( preflightItemList.Count == 0 ) + { + return new List(); + } var directoriesContent = ParentFoldersDictionary(preflightItemList); if ( importSettings.IndexMode ) await CreateParentFolders(directoriesContent); @@ -516,11 +524,20 @@ public async Task> Importer(IEnumerable inputFullP internal async Task> CreateMataThumbnail(IEnumerable importIndexItemsList, ImportSettingsModel importSettings) { - if ( _appSettings.MetaThumbnailOnImport == false || !importSettings.IndexMode) return new List<(bool, bool, string, string?)>(); + if ( _appSettings.MetaThumbnailOnImport == false || + !importSettings.IndexMode ) + { + return new List<(bool, bool, string, string?)>(); + } + var items = importIndexItemsList .Where(p => p.Status == ImportStatus.Ok) .Select(p => (p.FilePath, p.FileIndexItem!.FileHash)).Cast<(string,string)>().ToList(); - if ( !items.Any() ) return new List<(bool, bool, string, string?)>(); + + if ( items.Count == 0 ) + { + return new List<(bool, bool, string, string?)>(); + } return await _metaExifThumbnailService.AddMetaThumbnail(items); } diff --git a/starsky/starsky.feature.settings/Interfaces/IUpdateAppSettingsByPath.cs b/starsky/starsky.feature.settings/Interfaces/IUpdateAppSettingsByPath.cs new file mode 100644 index 0000000000..ff25028858 --- /dev/null +++ b/starsky/starsky.feature.settings/Interfaces/IUpdateAppSettingsByPath.cs @@ -0,0 +1,10 @@ +using starsky.feature.settings.Models; +using starsky.foundation.platform.Models; + +namespace starsky.feature.settings.Interfaces; + +public interface IUpdateAppSettingsByPath +{ + Task UpdateAppSettingsAsync( + AppSettingsTransferObject appSettingTransferObject); +} diff --git a/starsky/starsky.feature.settings/Models/UpdateAppSettingsStatusModel.cs b/starsky/starsky.feature.settings/Models/UpdateAppSettingsStatusModel.cs new file mode 100644 index 0000000000..24e26cc79a --- /dev/null +++ b/starsky/starsky.feature.settings/Models/UpdateAppSettingsStatusModel.cs @@ -0,0 +1,10 @@ +namespace starsky.feature.settings.Models; + +public class UpdateAppSettingsStatusModel +{ + public int StatusCode { get; set; } = 200; + + public bool IsError => StatusCode >= 400; + + public string Message { get; set; } = string.Empty; +} diff --git a/starsky/starsky.feature.settings/Services/UpdateAppSettingsByPath.cs b/starsky/starsky.feature.settings/Services/UpdateAppSettingsByPath.cs new file mode 100644 index 0000000000..59c8cd5cce --- /dev/null +++ b/starsky/starsky.feature.settings/Services/UpdateAppSettingsByPath.cs @@ -0,0 +1,67 @@ +using System.Text.Json; +using starsky.feature.settings.Interfaces; +using starsky.feature.settings.Models; +using starsky.foundation.injection; +using starsky.foundation.platform.Helpers; +using starsky.foundation.platform.JsonConverter; +using starsky.foundation.platform.Models; +using starsky.foundation.storage.Helpers; +using starsky.foundation.storage.Interfaces; +using starsky.foundation.storage.Storage; + +namespace starsky.feature.settings.Services; + +[Service(typeof(IUpdateAppSettingsByPath), InjectionLifetime = InjectionLifetime.Scoped)] +public class UpdateAppSettingsByPath : IUpdateAppSettingsByPath +{ + private readonly AppSettings _appSettings; + private readonly IStorage _hostStorage; + + public UpdateAppSettingsByPath(AppSettings appSettings, ISelectorStorage selectorStorage) + { + _appSettings = appSettings; + _hostStorage = + selectorStorage.Get(SelectorStorage.StorageServices.HostFilesystem); + } + + public async Task UpdateAppSettingsAsync(AppSettingsTransferObject appSettingTransferObject) + { + if ( !string.IsNullOrEmpty(appSettingTransferObject.StorageFolder)) + { + if ( !_appSettings.StorageFolderAllowEdit ) + { + return new UpdateAppSettingsStatusModel + { + StatusCode = 403, + Message = + "There is an Environment variable set so you can't update it here" + }; + } + if (!_hostStorage.ExistFolder(appSettingTransferObject.StorageFolder) ) + { + return new UpdateAppSettingsStatusModel + { + StatusCode = 404, + Message = + "Location of StorageFolder on disk not found" + }; + } + } + + // To update current session + AppSettingsCompareHelper.Compare(_appSettings, appSettingTransferObject); + + // should not forget app: prefix + var jsonOutput = JsonSerializer.Serialize(new { app = appSettingTransferObject }, DefaultJsonSerializer.NoNamingPolicy); + + await _hostStorage.WriteStreamAsync( + StringToStreamHelper.StringToStream(jsonOutput), + _appSettings.AppSettingsPath); + + return new UpdateAppSettingsStatusModel + { + StatusCode = 200, + Message = "Updated" + }; + } +} diff --git a/starsky/starsky.feature.settings/starsky.feature.settings.csproj b/starsky/starsky.feature.settings/starsky.feature.settings.csproj new file mode 100644 index 0000000000..8dab16e831 --- /dev/null +++ b/starsky/starsky.feature.settings/starsky.feature.settings.csproj @@ -0,0 +1,19 @@ + + + net8.0 + {67a8a132-6551-4042-96a4-3ec507b0cb83} + 0.5.14 + enable + enable + + + + + + + + + true + + + diff --git a/starsky/starsky.feature.webhtmlpublish/Helpers/PublishManifest.cs b/starsky/starsky.feature.webhtmlpublish/Helpers/PublishManifest.cs index 1c29f9f72f..a171fe9721 100644 --- a/starsky/starsky.feature.webhtmlpublish/Helpers/PublishManifest.cs +++ b/starsky/starsky.feature.webhtmlpublish/Helpers/PublishManifest.cs @@ -3,6 +3,7 @@ using System.Text.Json; using System.Text.Json.Serialization; using starsky.feature.webhtmlpublish.Models; +using starsky.foundation.platform.JsonConverter; using starsky.foundation.storage.Helpers; using starsky.foundation.storage.Interfaces; @@ -25,7 +26,7 @@ public PublishManifest(IStorage storage) /// without ManifestName /// /// - public void ExportManifest( string parentFullFilePath, string itemName, + public PublishManifestModel ExportManifest( string parentFullFilePath, string itemName, Dictionary copyContent) { var manifest = new PublishManifestModel @@ -33,16 +34,13 @@ public void ExportManifest( string parentFullFilePath, string itemName, Name = itemName, Copy = copyContent }; - var output = JsonSerializer.Serialize(manifest, - new JsonSerializerOptions - { - DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, - WriteIndented = true - }); + var output = JsonSerializer.Serialize(manifest, DefaultJsonSerializer.NoNamingPolicy); var outputLocation = Path.Combine(parentFullFilePath, ManifestName); _storage.FileDelete(outputLocation); _storage.WriteStream(StringToStreamHelper.StringToStream(output), outputLocation); + + return manifest; } } } diff --git a/starsky/starsky.feature.webhtmlpublish/Models/PublishManifestModel.cs b/starsky/starsky.feature.webhtmlpublish/Models/PublishManifestModel.cs index 6c51fe4633..4f75aef9b2 100644 --- a/starsky/starsky.feature.webhtmlpublish/Models/PublishManifestModel.cs +++ b/starsky/starsky.feature.webhtmlpublish/Models/PublishManifestModel.cs @@ -37,6 +37,6 @@ public string Slug /// /// Starsky Version /// - public string Version => Assembly.GetExecutingAssembly().GetName().Version.ToString(); + public string Version => Assembly.GetExecutingAssembly().GetName().Version?.ToString(); } } diff --git a/starsky/starsky.feature.webhtmlpublish/Services/WebHtmlPublishService.cs b/starsky/starsky.feature.webhtmlpublish/Services/WebHtmlPublishService.cs index 703c405375..ab5ed5f17c 100644 --- a/starsky/starsky.feature.webhtmlpublish/Services/WebHtmlPublishService.cs +++ b/starsky/starsky.feature.webhtmlpublish/Services/WebHtmlPublishService.cs @@ -135,7 +135,7 @@ private async Task> Render(List fileIndex string[] base64ImageArray, string publishProfileName, string itemName, string outputParentFullFilePathFolder, bool moveSourceFiles = false) { - if ( !_appSettings.PublishProfiles.Any() ) + if ( _appSettings.PublishProfiles.Count == 0 ) { _console.WriteLine("There are no config items"); return null; @@ -190,7 +190,10 @@ private async Task> Render(List fileIndex ,true); break; case TemplateContentType.OnlyFirstJpeg: - if ( !fileIndexItemsList.Any() ) break; + if ( fileIndexItemsList.Count == 0 ) + { + break; + } var firstInList = new List{fileIndexItemsList.FirstOrDefault()}; copyResult.AddRangeOverride(await GenerateJpeg(currentProfile, firstInList, outputParentFullFilePathFolder)); @@ -349,13 +352,12 @@ private async Task MetaData(FileIndexItem item, string outputPath) // Output has already rotated the image var rotation = nameof(FileIndexItem.Orientation).ToLowerInvariant(); - if ( comparedNames.Contains(rotation) ) - { - comparedNames.Remove(rotation); - } + + // should already check if it exists + comparedNames.Remove(rotation); - // Write it back - await new ExifToolCmdHelper(_exifTool, _hostFileSystemStorage, + // Write it back + await new ExifToolCmdHelper(_exifTool, _hostFileSystemStorage, _thumbnailStorage, null,null).UpdateAsync(item, new List {outputPath}, comparedNames, false, false); diff --git a/starsky/starsky.foundation.platform/JsonConverter/DefaultJsonSerializer.cs b/starsky/starsky.foundation.platform/JsonConverter/DefaultJsonSerializer.cs index cfc1c9cf83..4da9542e03 100644 --- a/starsky/starsky.foundation.platform/JsonConverter/DefaultJsonSerializer.cs +++ b/starsky/starsky.foundation.platform/JsonConverter/DefaultJsonSerializer.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using System.Text.Json.Serialization; namespace starsky.foundation.platform.JsonConverter { @@ -27,5 +28,23 @@ public static class DefaultJsonSerializer AllowTrailingCommas = true, WriteIndented = true }; + + /// + /// Please use CamelCase if possible + /// Bool is written as quoted string + /// + public static JsonSerializerOptions NoNamingPolicy => + new JsonSerializerOptions + { + PropertyNamingPolicy = null, + DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, + PropertyNameCaseInsensitive = true, + AllowTrailingCommas = true, + WriteIndented = true, + Converters = + { + new JsonBoolQuotedConverter(), + }, + }; } } diff --git a/starsky/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddleware.cs b/starsky/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddleware.cs index 6d9a77cb15..d3c8f613db 100644 --- a/starsky/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddleware.cs +++ b/starsky/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddleware.cs @@ -20,7 +20,7 @@ public async Task Invoke(HttpContext httpContext) { // For Error pages (for example 404) this middleware will be executed double, // so Adding a Header that already exist give an Error 500 - if (string.IsNullOrEmpty(httpContext.Response.Headers["Content-Security-Policy"]) ) + if (string.IsNullOrEmpty(httpContext.Response.Headers.ContentSecurityPolicy) ) { // CSP 2.0 nonce // used in ApplicationInsightsJsHelper var nonce = Guid.NewGuid().ToString("N"); @@ -85,19 +85,19 @@ public async Task Invoke(HttpContext httpContext) .Append("Referrer-Policy", "no-referrer"); } - if (string.IsNullOrEmpty(httpContext.Response.Headers["X-Frame-Options"]) ) + if (string.IsNullOrEmpty(httpContext.Response.Headers.XFrameOptions) ) { httpContext.Response.Headers .Append("X-Frame-Options", "DENY"); } - if (string.IsNullOrEmpty(httpContext.Response.Headers["X-Xss-Protection"]) ) + if (string.IsNullOrEmpty(httpContext.Response.Headers.XXSSProtection) ) { httpContext.Response.Headers .Append("X-Xss-Protection", "1; mode=block"); } - if (string.IsNullOrEmpty(httpContext.Response.Headers["X-Content-Type-Options"]) ) + if (string.IsNullOrEmpty(httpContext.Response.Headers.XContentTypeOptions) ) { httpContext.Response.Headers .Append("X-Content-Type-Options", "nosniff"); diff --git a/starsky/starsky.foundation.readmeta/Interfaces/IReadMeta.cs b/starsky/starsky.foundation.readmeta/Interfaces/IReadMeta.cs index d9d1c9420e..9d86e4ef41 100644 --- a/starsky/starsky.foundation.readmeta/Interfaces/IReadMeta.cs +++ b/starsky/starsky.foundation.readmeta/Interfaces/IReadMeta.cs @@ -13,7 +13,7 @@ public interface IReadMeta /// subPath /// Task ReadExifAndXmpFromFileAsync(string subPath); - Task> ReadExifAndXmpFromFileAddFilePathHashAsync(List subPathList, List fileHashes = null); + Task> ReadExifAndXmpFromFileAddFilePathHashAsync(List subPathList, List? fileHashes = null); bool? RemoveReadMetaCache(string fullFilePath); void UpdateReadMetaCache(IEnumerable objectExifToolModel); } diff --git a/starsky/starsky.foundation.readmeta/ReadMetaHelpers/ReadMetaGpx.cs b/starsky/starsky.foundation.readmeta/ReadMetaHelpers/ReadMetaGpx.cs index bac9e8e416..86c0e23430 100644 --- a/starsky/starsky.foundation.readmeta/ReadMetaHelpers/ReadMetaGpx.cs +++ b/starsky/starsky.foundation.readmeta/ReadMetaHelpers/ReadMetaGpx.cs @@ -41,7 +41,7 @@ public async Task ReadGpxFromFileReturnAfterFirstFieldAsync(Strea var readGpxFile = await ReadGpxFileAsync(stream, null, 1); - if ( !readGpxFile.Any() ) + if ( readGpxFile.Count == 0 ) { _logger.LogInformation($"[ReadMetaGpx] SystemXmlXmlException for {subPath}"); return new FileIndexItem(subPath) diff --git a/starsky/starsky.foundation.sync/Helpers/NewItem.cs b/starsky/starsky.foundation.sync/Helpers/NewItem.cs index 86c631dc6c..513854573d 100644 --- a/starsky/starsky.foundation.sync/Helpers/NewItem.cs +++ b/starsky/starsky.foundation.sync/Helpers/NewItem.cs @@ -86,7 +86,7 @@ public async Task PrepareUpdateFileItemAsync(FileIndexItem dbItem dbItem.Size = size; await SetFileHashStatus(dbItem.FilePath, dbItem.FileHash, dbItem); dbItem.LastChanged.AddRange(compare); - if ( !compare.Any() ) + if ( compare.Count == 0 ) { dbItem.Status = FileIndexItem.ExifStatus.OkAndSame; } diff --git a/starsky/starsky.foundation.sync/WatcherHelpers/SyncWatcherConnector.cs b/starsky/starsky.foundation.sync/WatcherHelpers/SyncWatcherConnector.cs index c4bb0d9dc1..ddf0c942a2 100644 --- a/starsky/starsky.foundation.sync/WatcherHelpers/SyncWatcherConnector.cs +++ b/starsky/starsky.foundation.sync/WatcherHelpers/SyncWatcherConnector.cs @@ -162,7 +162,7 @@ private async Task> SyncTaskInternal(Tuple p.FileName).ToArray()) + " ~ " + diff --git a/starsky/starsky.foundation.thumbnailgeneration/Helpers/Thumbnail.cs b/starsky/starsky.foundation.thumbnailgeneration/Helpers/Thumbnail.cs index a9c73de5b8..4bbf4c9d83 100644 --- a/starsky/starsky.foundation.thumbnailgeneration/Helpers/Thumbnail.cs +++ b/starsky/starsky.foundation.thumbnailgeneration/Helpers/Thumbnail.cs @@ -153,7 +153,7 @@ private async Task> CreateThumbInternal(strin var largeImageResult = await CreateLargestImageFromSource(fileHash, largeThumbnailHash, subPath, thumbnailToSourceSize); // when all images are already created - if ( !thumbnailFromThumbnailUpdateList.Any() ) + if ( thumbnailFromThumbnailUpdateList.Count == 0 ) { return ThumbnailNameHelper.GeneratedThumbnailSizes.Select(size => new GenerationResultModel { @@ -424,10 +424,7 @@ internal static Task SaveThumbnailImageFormat(Image image, ExtensionRolesHelper.ImageFormat imageFormat, MemoryStream outputStream) { - if ( outputStream == null ) - { - throw new ArgumentNullException(nameof(outputStream)); - } + ArgumentNullException.ThrowIfNull(outputStream); return SaveThumbnailImageFormatInternal(image, imageFormat, outputStream); } diff --git a/starsky/starsky.sln b/starsky/starsky.sln index 8ee10ff2ff..5fd79f26ca 100644 --- a/starsky/starsky.sln +++ b/starsky/starsky.sln @@ -166,6 +166,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "starsky.foundation.native", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "starsky.feature.trash", "starsky.feature.trash\starsky.feature.trash.csproj", "{A62C129C-5D0C-4A0A-B5AA-261E041FF55D}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "starsky.feature.settings", "starsky.feature.settings\starsky.feature.settings.csproj", "{F2C4C9DE-22A1-4B34-AC1D-0F08353E0742}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -368,6 +370,10 @@ Global {A62C129C-5D0C-4A0A-B5AA-261E041FF55D}.Debug|Any CPU.Build.0 = Debug|Any CPU {A62C129C-5D0C-4A0A-B5AA-261E041FF55D}.Release|Any CPU.ActiveCfg = Release|Any CPU {A62C129C-5D0C-4A0A-B5AA-261E041FF55D}.Release|Any CPU.Build.0 = Release|Any CPU + {F2C4C9DE-22A1-4B34-AC1D-0F08353E0742}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F2C4C9DE-22A1-4B34-AC1D-0F08353E0742}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F2C4C9DE-22A1-4B34-AC1D-0F08353E0742}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F2C4C9DE-22A1-4B34-AC1D-0F08353E0742}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -428,5 +434,6 @@ Global {35222B74-4D4C-4848-A5E3-7C3E084FB2FD} = {E638B7CE-3CAC-4772-8D3B-49A202D0975A} {0072F697-4E18-4B5F-80DF-530361D3E847} = {1C1EB4A5-08D0-4014-AE1F-962642A4E5D3} {A62C129C-5D0C-4A0A-B5AA-261E041FF55D} = {4B9276C3-651E-48D3-B3A7-3F4D74F3D01A} + {F2C4C9DE-22A1-4B34-AC1D-0F08353E0742} = {4B9276C3-651E-48D3-B3A7-3F4D74F3D01A} EndGlobalSection EndGlobal diff --git a/starsky/starsky/Controllers/AppSettingsController.cs b/starsky/starsky/Controllers/AppSettingsController.cs index 4c07a8341b..1e7ada77c2 100644 --- a/starsky/starsky/Controllers/AppSettingsController.cs +++ b/starsky/starsky/Controllers/AppSettingsController.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using starsky.Attributes; +using starsky.feature.settings.Interfaces; using starsky.foundation.accountmanagement.Services; using starsky.foundation.platform.Helpers; using starsky.foundation.platform.JsonConverter; @@ -20,12 +21,12 @@ namespace starsky.Controllers public sealed class AppSettingsController : Controller { private readonly AppSettings _appSettings; - private readonly IStorage _hostStorage; + private readonly IUpdateAppSettingsByPath _updateAppSettingsByPath; - public AppSettingsController(AppSettings appSettings, ISelectorStorage selectorStorage) + public AppSettingsController(AppSettings appSettings, IUpdateAppSettingsByPath updateAppSettingsByPath) { _appSettings = appSettings; - _hostStorage = selectorStorage.Get( SelectorStorage.StorageServices.HostFilesystem); + _updateAppSettingsByPath = updateAppSettingsByPath; } /// @@ -61,38 +62,16 @@ public IActionResult Env() [Permission(UserManager.AppPermissions.AppSettingsWrite)] public async Task UpdateAppSettings(AppSettingsTransferObject appSettingTransferObject ) { - if ( !string.IsNullOrEmpty(appSettingTransferObject.StorageFolder)) - { - if ( !_appSettings.StorageFolderAllowEdit ) - { - Response.StatusCode = 403; - return Content("There is an Environment variable set so you can't update it here"); - } - if (!_hostStorage.ExistFolder(appSettingTransferObject.StorageFolder) ) - { - return NotFound("Location on disk not found"); - } - } - - // To update current session - AppSettingsCompareHelper.Compare(_appSettings, appSettingTransferObject); + var result = await _updateAppSettingsByPath.UpdateAppSettingsAsync( + appSettingTransferObject); - // should not forget app: prefix - var jsonOutput = JsonSerializer.Serialize(new { app = appSettingTransferObject }, new JsonSerializerOptions + if ( !result.IsError ) { - WriteIndented = true, - Converters = - { - new JsonBoolQuotedConverter(), - }, - DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull, - }); - - await _hostStorage.WriteStreamAsync( - StringToStreamHelper.StringToStream(jsonOutput), - _appSettings.AppSettingsPath); + return Env(); + } - return Env(); + Response.StatusCode = result.StatusCode; + return Content(result.Message); } } } diff --git a/starsky/starsky/starsky.csproj b/starsky/starsky/starsky.csproj index 85c3331a4b..b07de4253c 100644 --- a/starsky/starsky/starsky.csproj +++ b/starsky/starsky/starsky.csproj @@ -141,6 +141,7 @@ + diff --git a/starsky/starskytest/Controllers/AppSettingsControllerTest.cs b/starsky/starskytest/Controllers/AppSettingsControllerTest.cs index 55f559a2d9..8ffe25a287 100644 --- a/starsky/starskytest/Controllers/AppSettingsControllerTest.cs +++ b/starsky/starskytest/Controllers/AppSettingsControllerTest.cs @@ -6,6 +6,8 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.Controllers; +using starsky.feature.settings.Models; +using starsky.feature.settings.Services; using starsky.foundation.platform.Helpers; using starsky.foundation.platform.Models; using starsky.foundation.storage.Helpers; @@ -20,7 +22,7 @@ public sealed class AppSettingsControllerTest [TestMethod] public void ENV_StarskyTestEnv() { - var controller = new AppSettingsController(new AppSettings(),new FakeSelectorStorage()); + var controller = new AppSettingsController(new AppSettings(),new FakeIUpdateAppSettingsByPath()); var actionResult = controller.Env() as JsonResult; var resultAppSettings = actionResult?.Value as AppSettings; Assert.AreEqual("Starsky", resultAppSettings?.Name); @@ -30,7 +32,7 @@ public void ENV_StarskyTestEnv() public void ENV_StarskyTestEnv_ForceHtml() { var controller = new AppSettingsController(new AppSettings(), - new FakeSelectorStorage()); + new FakeIUpdateAppSettingsByPath()); controller.ControllerContext.HttpContext = new DefaultHttpContext(); controller.ControllerContext.HttpContext.Request.Headers.Append("x-force-html", "true"); var actionResult = controller.Env() as JsonResult; @@ -43,7 +45,7 @@ public void ENV_StarskyTestEnv_ForceHtml() [TestMethod] public async Task UpdateAppSettings_Verbose() { - var controller = new AppSettingsController(new AppSettings(), new FakeSelectorStorage()); + var controller = new AppSettingsController(new AppSettings(), new FakeIUpdateAppSettingsByPath()); var actionResult = await controller.UpdateAppSettings(new AppSettingsTransferObject {Verbose = true}) as JsonResult; var result = actionResult?.Value as AppSettings; Assert.IsTrue(result?.Verbose); @@ -52,14 +54,15 @@ public async Task UpdateAppSettings_Verbose() [TestMethod] public async Task UpdateAppSettings_StorageFolder() { - var storage = new FakeIStorage(new List { "test" }); - Environment.SetEnvironmentVariable("app__storageFolder", string.Empty); - - var controller = new AppSettingsController(new AppSettings(), new FakeSelectorStorage(storage)); + var appSettings = new AppSettings(); + var controller = new AppSettingsController(appSettings, new UpdateAppSettingsByPath(appSettings,new FakeSelectorStorage(new FakeIStorage()))); + controller.ControllerContext.HttpContext = new DefaultHttpContext(); + var actionResult = await controller.UpdateAppSettings(new AppSettingsTransferObject { Verbose = true, StorageFolder = "test" }) as JsonResult; + var result = actionResult?.Value as AppSettings; Assert.IsTrue(result?.Verbose); Assert.AreEqual(PathHelper.AddBackslash("test"),result?.StorageFolder); @@ -68,13 +71,14 @@ public async Task UpdateAppSettings_StorageFolder() [TestMethod] public async Task UpdateAppSettingsTest_IgnoreWhenEnvIsSet() { - var storage = new FakeIStorage(new List { "test" }); - Environment.SetEnvironmentVariable("app__storageFolder", "any_value"); var appSettings = new AppSettings(); - var controller = new AppSettingsController(appSettings, new FakeSelectorStorage(storage)); + var controller = new AppSettingsController(appSettings, new FakeIUpdateAppSettingsByPath(new UpdateAppSettingsStatusModel + { + StatusCode = 403 + })); controller.ControllerContext.HttpContext = new DefaultHttpContext(); await controller.UpdateAppSettings( new AppSettingsTransferObject @@ -88,12 +92,11 @@ await controller.UpdateAppSettings( [TestMethod] public async Task UpdateAppSettingsTest_DirNotFound() { - var storage = new FakeIStorage(new List { "test" }); - - Environment.SetEnvironmentVariable("app__storageFolder",string.Empty); - var appSettings = new AppSettings(); - var controller = new AppSettingsController(appSettings, new FakeSelectorStorage(storage)); + var controller = new AppSettingsController(appSettings, new FakeIUpdateAppSettingsByPath(new UpdateAppSettingsStatusModel + { + StatusCode = 404 + })); controller.ControllerContext.HttpContext = new DefaultHttpContext(); var actionResult = (await controller.UpdateAppSettings( new AppSettingsTransferObject @@ -114,7 +117,7 @@ public async Task UpdateAppSettingsTest_StorageFolder_JsonCheck() { AppSettingsPath = $"{Path.DirectorySeparatorChar}temp{Path.DirectorySeparatorChar}appsettings.json" }; - var controller = new AppSettingsController(appSettings, new FakeSelectorStorage(storage)); + var controller = new AppSettingsController(appSettings, new UpdateAppSettingsByPath(appSettings,new FakeSelectorStorage(storage))); await controller.UpdateAppSettings( new AppSettingsTransferObject { @@ -133,7 +136,7 @@ await controller.UpdateAppSettings( [TestMethod] public async Task UpdateAppSettings_UseLocalDesktopUi() { - var controller = new AppSettingsController(new AppSettings(), new FakeSelectorStorage()); + var controller = new AppSettingsController(new AppSettings(), new FakeIUpdateAppSettingsByPath()); var actionResult = await controller.UpdateAppSettings(new AppSettingsTransferObject {UseLocalDesktopUi = true}) as JsonResult; var result = actionResult?.Value as AppSettings; Assert.IsTrue(result?.UseLocalDesktopUi); @@ -142,7 +145,7 @@ public async Task UpdateAppSettings_UseLocalDesktopUi() [TestMethod] public async Task UpdateAppSettings_UseSystemTrash() { - var controller = new AppSettingsController(new AppSettings(), new FakeSelectorStorage()); + var controller = new AppSettingsController(new AppSettings(), new FakeIUpdateAppSettingsByPath()); var actionResult = await controller.UpdateAppSettings(new AppSettingsTransferObject {UseSystemTrash = true}) as JsonResult; var result = actionResult?.Value as AppSettings; Assert.IsTrue(result?.UseSystemTrash); @@ -152,7 +155,7 @@ public async Task UpdateAppSettings_UseSystemTrash() public async Task UpdateAppSettings_Verbose_IgnoreSystemTrashValue() { var appSettings = new AppSettings(); - var controller = new AppSettingsController(appSettings, new FakeSelectorStorage()); + var controller = new AppSettingsController(appSettings, new FakeIUpdateAppSettingsByPath()); var actionResult = await controller.UpdateAppSettings(new AppSettingsTransferObject {Verbose = true}) as JsonResult; var result = actionResult?.Value as AppSettings; diff --git a/starsky/starskytest/FakeMocks/FakeIUpdateAppSettingsByPath.cs b/starsky/starskytest/FakeMocks/FakeIUpdateAppSettingsByPath.cs new file mode 100644 index 0000000000..0d3bff8633 --- /dev/null +++ b/starsky/starskytest/FakeMocks/FakeIUpdateAppSettingsByPath.cs @@ -0,0 +1,31 @@ +#nullable enable +using System.Threading.Tasks; +using starsky.feature.settings.Interfaces; +using starsky.feature.settings.Models; +using starsky.foundation.platform.Models; + +namespace starskytest.FakeMocks; + +public class FakeIUpdateAppSettingsByPath : IUpdateAppSettingsByPath +{ + private readonly UpdateAppSettingsStatusModel? _updateAppSettingsStatusModel; + + public FakeIUpdateAppSettingsByPath(UpdateAppSettingsStatusModel? updateAppSettingsStatusModel = null) + { + _updateAppSettingsStatusModel = updateAppSettingsStatusModel; + } + + public Task UpdateAppSettingsAsync(AppSettingsTransferObject appSettingTransferObject) + { + if ( _updateAppSettingsStatusModel == null ) + { + return Task.FromResult(new UpdateAppSettingsStatusModel + { + Message = "Ok", + StatusCode = 200 + }); + } + + return Task.FromResult(_updateAppSettingsStatusModel); + } +} diff --git a/starsky/starskytest/starsky.feature.health/Helpers/CheckForUpdatesHelperTest.cs b/starsky/starskytest/starsky.feature.health/Helpers/CheckForUpdatesHelperTest.cs index e016d1b2f9..444be53fc5 100644 --- a/starsky/starskytest/starsky.feature.health/Helpers/CheckForUpdatesHelperTest.cs +++ b/starsky/starskytest/starsky.feature.health/Helpers/CheckForUpdatesHelperTest.cs @@ -60,7 +60,7 @@ public async Task QueryIsUpdateNeeded() var replace = ExamplePublicReleases.Replace("vtest__remove_this_version", "v0.9"); var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary { - {CheckForUpdates.GithubApi, new StringContent(replace)}, + {CheckForUpdates.GithubStarskyReleaseApi, new StringContent(replace)}, }); var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger()); @@ -202,7 +202,7 @@ public async Task IsUpdateNeeded_CacheIsFilled() var replace = ExamplePublicReleases.Replace("vtest__remove_this_version", "v0.9"); var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary { - {CheckForUpdates.GithubApi, new StringContent(replace)}, + {CheckForUpdates.GithubStarskyReleaseApi, new StringContent(replace)}, }); var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger()); @@ -265,7 +265,7 @@ public async Task IsUpdateNeeded_CacheExistButDisableInSettings() var replace = ExamplePublicReleases.Replace("vtest__remove_this_version", "test"); var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary { - {CheckForUpdates.GithubApi, new StringContent(replace)}, + {CheckForUpdates.GithubStarskyReleaseApi, new StringContent(replace)}, }); var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger()); @@ -282,7 +282,7 @@ public async Task IsUpdateNeeded_CacheIsNull() var replace = ExamplePublicReleases.Replace("vtest__remove_this_version", "test"); var fakeIHttpProvider = new FakeIHttpProvider(new Dictionary { - {CheckForUpdates.GithubApi, new StringContent(replace)}, + {CheckForUpdates.GithubStarskyReleaseApi, new StringContent(replace)}, }); var httpClientHelper = new HttpClientHelper(fakeIHttpProvider, _serviceScopeFactory, new FakeIWebLogger()); diff --git a/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs b/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs new file mode 100644 index 0000000000..4663df5f04 --- /dev/null +++ b/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs @@ -0,0 +1,107 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using starsky.feature.settings.Services; +using starsky.foundation.platform.Models; +using starsky.foundation.storage.Helpers; +using starskytest.FakeMocks; + +namespace starskytest.starsky.feature.settings.Services +{ + [TestClass] + public class UpdateAppSettingsByPathTests + { + + [TestMethod] + public async Task UpdateAppSettingsAsync_ValidInput_Success() + { + // Arrange + var storage = new FakeIStorage(new List{"/"}); + var selectorStorage = new FakeSelectorStorage(storage); + var updateAppSettingsByPath = new UpdateAppSettingsByPath(new AppSettings(), selectorStorage); + var appSettingTransferObject = new AppSettingsTransferObject + { + StorageFolder = "/", + Verbose = true + }; + + // Act + var result = await updateAppSettingsByPath.UpdateAppSettingsAsync(appSettingTransferObject); + + // Assert + Assert.AreEqual(200, result.StatusCode); + Assert.AreEqual("Updated", result.Message); + } + + [TestMethod] + public async Task UpdateAppSettingsAsync_ValidInput_Success_CompareJson() + { + // Arrange + var storage = new FakeIStorage(new List{"/"}); + var selectorStorage = new FakeSelectorStorage(storage); + var appSettings = new AppSettings(); + var updateAppSettingsByPath = new UpdateAppSettingsByPath(appSettings, selectorStorage); + var appSettingTransferObject = new AppSettingsTransferObject + { + StorageFolder = "/", + Verbose = true + }; + + // Act + await updateAppSettingsByPath.UpdateAppSettingsAsync(appSettingTransferObject); + + var result = await StreamToStringHelper.StreamToStringAsync(storage.ReadStream(appSettings.AppSettingsPath)) ; + + // Assert + const string expectedResult = "{\n \"app\": {\n \"Verbose\": \"true\",\n \"StorageFolder\": \"/\"\n }\n}"; + + Assert.AreEqual(expectedResult, result); + } + + [TestMethod] + public async Task UpdateAppSettingsAsync_InvalidStorageFolder_Returns404() + { + // Arrange + var selectorStorage = new FakeSelectorStorage(); + var updateAppSettingsByPath = new UpdateAppSettingsByPath(new AppSettings(), selectorStorage); + var appSettingTransferObject = new AppSettingsTransferObject + { + StorageFolder = "NonExistentFolder" + }; + + // Act + var result = await updateAppSettingsByPath.UpdateAppSettingsAsync(appSettingTransferObject); + + // Assert + Assert.AreEqual(404, result.StatusCode); + Assert.AreEqual("Location of StorageFolder on disk not found", result.Message); + } + + [TestMethod] + public async Task UpdateAppSettingsAsync_InvalidStorageFolder_Returns403() + { + var before = Environment.GetEnvironmentVariable("app__storageFolder"); + Environment.SetEnvironmentVariable("app__storageFolder", "test"); + + // Arrange + var selectorStorage = new FakeSelectorStorage(new FakeIStorage(new List{"/"})); + var updateAppSettingsByPath = new UpdateAppSettingsByPath(new AppSettings(), selectorStorage); + var appSettingTransferObject = new AppSettingsTransferObject + { + StorageFolder = "/" + }; + + // Act + var result = await updateAppSettingsByPath.UpdateAppSettingsAsync(appSettingTransferObject); + + // Set back to what is was before + Environment.SetEnvironmentVariable("app__storageFolder", before); + + // Assert + Assert.AreEqual(403, result.StatusCode); + Assert.AreEqual("There is an Environment variable set so you can't update it here", result.Message); + } + + } +} diff --git a/starsky/starskytest/starsky.feature.webhtmlpublish/Helpers/ExportManifestTest.cs b/starsky/starskytest/starsky.feature.webhtmlpublish/Helpers/ExportManifestTest.cs index c162918636..8c2974d86d 100644 --- a/starsky/starskytest/starsky.feature.webhtmlpublish/Helpers/ExportManifestTest.cs +++ b/starsky/starskytest/starsky.feature.webhtmlpublish/Helpers/ExportManifestTest.cs @@ -1,8 +1,11 @@ +using System; using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.feature.webhtmlpublish.Helpers; using starsky.foundation.platform.Models; +using starsky.foundation.storage.Helpers; using starskytest.FakeMocks; namespace starskytest.starsky.feature.webhtmlpublish.Helpers @@ -24,6 +27,27 @@ public void ExportManifestTest_Export() var expectedPath = Path.Combine(appSettings.StorageFolder, "_settings.json"); Assert.IsTrue(storage.ExistFile(expectedPath)); } - + + [TestMethod] + public async Task ExportManifestTest_Export_JsonCompare() + { + var appSettings = new AppSettings(); + + var storage = new FakeIStorage(); + var manifest = new PublishManifest(storage) + .ExportManifest(appSettings.StorageFolder, "Test", + new Dictionary()); + + var expectedPath = Path.Combine(appSettings.StorageFolder, "_settings.json"); + var output = await + StreamToStringHelper.StreamToStringAsync( + storage.ReadStream(expectedPath)); + + var expectedOutput = + $"{{\n \"Name\": \"Test\",\n \"Copy\": {{}},\n \"Slug\": \"test\",\n" + + $" \"Export\": \"{manifest.Export}\",\n \"Version\": \"{manifest.Version}\"\n}}"; + + Assert.AreEqual(expectedOutput, output); + } } } diff --git a/starsky/starskytest/starskytest.csproj b/starsky/starskytest/starskytest.csproj index 7a42b42cdf..e6661478b6 100644 --- a/starsky/starskytest/starskytest.csproj +++ b/starsky/starskytest/starskytest.csproj @@ -45,6 +45,7 @@ + From 9fc86d751570b594f418051e552dddb6cd80a87d Mon Sep 17 00:00:00 2001 From: Dion Date: Sun, 21 Jan 2024 16:43:01 +0100 Subject: [PATCH 17/31] update docusaurus + core to v310 --- documentation/package-lock.json | 1090 ++++++++++++++++--------------- documentation/package.json | 4 +- 2 files changed, 559 insertions(+), 535 deletions(-) diff --git a/documentation/package-lock.json b/documentation/package-lock.json index cd57be3ef3..35d0a333dd 100644 --- a/documentation/package-lock.json +++ b/documentation/package-lock.json @@ -9,8 +9,8 @@ "version": "0.5.14", "dependencies": { "@cmfcmf/docusaurus-search-local": "^1.1.0", - "@docusaurus/core": "3.0.1", - "@docusaurus/preset-classic": "3.0.1", + "@docusaurus/core": "3.1.0", + "@docusaurus/preset-classic": "3.1.0", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "prism-react-renderer": "^2.3.0", @@ -37,13 +37,13 @@ } }, "node_modules/@algolia/autocomplete-js": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-js/-/autocomplete-js-1.12.2.tgz", - "integrity": "sha512-urCborbT4qJHZJ8atCe1YNicWQ0rJPRK6KWoufmukqZV0ktxXcRlJCstRV9j/8CqxOheB/eDWo/Rm3v9nXSJLg==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-js/-/autocomplete-js-1.15.0.tgz", + "integrity": "sha512-2wfk4VBM3jr57ALkPXI2s1MTiy3Qg1y1BZHFOgu9CwfMtJpec21rr8TNbj1aaYpJY1ePyzqMElCIDTtl3KYh7A==", "dependencies": { - "@algolia/autocomplete-core": "1.12.2", - "@algolia/autocomplete-preset-algolia": "1.12.2", - "@algolia/autocomplete-shared": "1.12.2", + "@algolia/autocomplete-core": "1.15.0", + "@algolia/autocomplete-preset-algolia": "1.15.0", + "@algolia/autocomplete-shared": "1.15.0", "htm": "^3.1.1", "preact": "^10.13.2" }, @@ -53,31 +53,31 @@ } }, "node_modules/@algolia/autocomplete-js/node_modules/@algolia/autocomplete-core": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.12.2.tgz", - "integrity": "sha512-9H11byD/LotKdsAQW8LKfJRwTKde33nxieKgBRbG8jhPErnREsiAmdF82910mv2zimu66T4f9BL9zT1kGEF74g==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.15.0.tgz", + "integrity": "sha512-3rlfgvQdDCJFdIEEvwLDm6ul7Q04OwmdvIocee0qLr2eEr6RDjI4E+WRHRzbpIQt85I6hdGwv3zoxMkT5Flk1w==", "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.12.2", - "@algolia/autocomplete-shared": "1.12.2" + "@algolia/autocomplete-plugin-algolia-insights": "1.15.0", + "@algolia/autocomplete-shared": "1.15.0" } }, "node_modules/@algolia/autocomplete-js/node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.12.2.tgz", - "integrity": "sha512-jPlBXFZs3ukUl5bn27kF3D6JHsWwK9g2bcjIeFBld2UaZnH6ec8tcldVeYbUy6QzDevmFyTohzhb1j6MtSZBrQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.15.0.tgz", + "integrity": "sha512-qGbliYnTEEODwPFqh+vaoJXIGNczRi4E7twQiofCw7u29KTt04u40qMHvv6lTZd/9kACKuw/+tRls2tjmeG3Zw==", "dependencies": { - "@algolia/autocomplete-shared": "1.12.2" + "@algolia/autocomplete-shared": "1.15.0" }, "peerDependencies": { "search-insights": ">= 1 < 3" } }, "node_modules/@algolia/autocomplete-js/node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.12.2.tgz", - "integrity": "sha512-eIKg14xSr5nHp4Qc9ddl59iVTGmJzOTN8KSZMR/cp76Wa78VvYG5SWSU3Qi+visFrlPWH6I0aM8RrevsnhprtQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.15.0.tgz", + "integrity": "sha512-tG1jDcMhcsoW1Xtjc1a7Us/70F5cIcXLGIzwyLkZ6Xvav+ID4q7OksmPUauuLqNtylW6Xc+bZz9eykC1QdN9pA==", "dependencies": { - "@algolia/autocomplete-shared": "1.12.2" + "@algolia/autocomplete-shared": "1.15.0" }, "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", @@ -85,9 +85,9 @@ } }, "node_modules/@algolia/autocomplete-js/node_modules/@algolia/autocomplete-shared": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.12.2.tgz", - "integrity": "sha512-XOaJ0LeXh8jgLKgR1FF2l3aF/8pw4gdjNWucaZh2NfwU1EfXmgjsvUHS7GglJgvxUcSHDoQglr2I5zUo3piSbA==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.15.0.tgz", + "integrity": "sha512-T62F7vTSKLeuoX8zl4yB2fOr/Ixs0qahkV1Tw2vxerWB7/C5fgFAZ9M285AYKIGSM/vFmlben6nE3osuqzVgKA==", "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" @@ -126,79 +126,79 @@ } }, "node_modules/@algolia/autocomplete-theme-classic": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-theme-classic/-/autocomplete-theme-classic-1.12.2.tgz", - "integrity": "sha512-0AZzaX4jiN9fc/uO00PTZ4GUYMS/W5BIjCVMF6Rry21VhH5RYBnhH1VLNw3WUH++K2xwcyIoDIBV+tCInF0lOg==" + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-theme-classic/-/autocomplete-theme-classic-1.15.0.tgz", + "integrity": "sha512-9x2zPmLYLzMSEZTsixcgqxYBAdnbBhhGZRTFt2d72Ts3rnXt30XP09yh99I+eVe4UPg1RhqLcYSvDFoWKZeyBQ==" }, "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.0.tgz", - "integrity": "sha512-uZ1uZMLDZb4qODLfTSNHxSi4fH9RdrQf7DXEzW01dS8XK7QFtFh29N5NGKa9S+Yudf1vUMIF+/RiL4i/J0pWlQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.22.1.tgz", + "integrity": "sha512-Sw6IAmOCvvP6QNgY9j+Hv09mvkvEIDKjYW8ow0UDDAxSXy664RBNQk3i/0nt7gvceOJ6jGmOTimaZoY1THmU7g==", "dependencies": { - "@algolia/cache-common": "4.22.0" + "@algolia/cache-common": "4.22.1" } }, "node_modules/@algolia/cache-common": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.22.0.tgz", - "integrity": "sha512-TPwUMlIGPN16eW67qamNQUmxNiGHg/WBqWcrOoCddhqNTqGDPVqmgfaM85LPbt24t3r1z0zEz/tdsmuq3Q6oaA==" + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.22.1.tgz", + "integrity": "sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==" }, "node_modules/@algolia/cache-in-memory": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.22.0.tgz", - "integrity": "sha512-kf4Cio9NpPjzp1+uXQgL4jsMDeck7MP89BYThSvXSjf2A6qV/0KeqQf90TL2ECS02ovLOBXkk98P7qVarM+zGA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.22.1.tgz", + "integrity": "sha512-ve+6Ac2LhwpufuWavM/aHjLoNz/Z/sYSgNIXsinGofWOysPilQZPUetqLj8vbvi+DHZZaYSEP9H5SRVXnpsNNw==", "dependencies": { - "@algolia/cache-common": "4.22.0" + "@algolia/cache-common": "4.22.1" } }, "node_modules/@algolia/client-account": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.22.0.tgz", - "integrity": "sha512-Bjb5UXpWmJT+yGWiqAJL0prkENyEZTBzdC+N1vBuHjwIJcjLMjPB6j1hNBRbT12Lmwi55uzqeMIKS69w+0aPzA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.22.1.tgz", + "integrity": "sha512-k8m+oegM2zlns/TwZyi4YgCtyToackkOpE+xCaKCYfBfDtdGOaVZCM5YvGPtK+HGaJMIN/DoTL8asbM3NzHonw==", "dependencies": { - "@algolia/client-common": "4.22.0", - "@algolia/client-search": "4.22.0", - "@algolia/transporter": "4.22.0" + "@algolia/client-common": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/transporter": "4.22.1" } }, "node_modules/@algolia/client-analytics": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.22.0.tgz", - "integrity": "sha512-os2K+kHUcwwRa4ArFl5p/3YbF9lN3TLOPkbXXXxOvDpqFh62n9IRZuzfxpHxMPKAQS3Et1s0BkKavnNP02E9Hg==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.22.1.tgz", + "integrity": "sha512-1ssi9pyxyQNN4a7Ji9R50nSdISIumMFDwKNuwZipB6TkauJ8J7ha/uO60sPJFqQyqvvI+px7RSNRQT3Zrvzieg==", "dependencies": { - "@algolia/client-common": "4.22.0", - "@algolia/client-search": "4.22.0", - "@algolia/requester-common": "4.22.0", - "@algolia/transporter": "4.22.0" + "@algolia/client-common": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" } }, "node_modules/@algolia/client-common": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.22.0.tgz", - "integrity": "sha512-BlbkF4qXVWuwTmYxVWvqtatCR3lzXwxx628p1wj1Q7QP2+LsTmGt1DiUYRuy9jG7iMsnlExby6kRMOOlbhv2Ag==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.22.1.tgz", + "integrity": "sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==", "dependencies": { - "@algolia/requester-common": "4.22.0", - "@algolia/transporter": "4.22.0" + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" } }, "node_modules/@algolia/client-personalization": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.22.0.tgz", - "integrity": "sha512-pEOftCxeBdG5pL97WngOBi9w5Vxr5KCV2j2D+xMVZH8MuU/JX7CglDSDDb0ffQWYqcUN+40Ry+xtXEYaGXTGow==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.22.1.tgz", + "integrity": "sha512-sl+/klQJ93+4yaqZ7ezOttMQ/nczly/3GmgZXJ1xmoewP5jmdP/X/nV5U7EHHH3hCUEHeN7X1nsIhGPVt9E1cQ==", "dependencies": { - "@algolia/client-common": "4.22.0", - "@algolia/requester-common": "4.22.0", - "@algolia/transporter": "4.22.0" + "@algolia/client-common": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" } }, "node_modules/@algolia/client-search": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.22.0.tgz", - "integrity": "sha512-bn4qQiIdRPBGCwsNuuqB8rdHhGKKWIij9OqidM1UkQxnSG8yzxHdb7CujM30pvp5EnV7jTqDZRbxacbjYVW20Q==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.22.1.tgz", + "integrity": "sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==", "dependencies": { - "@algolia/client-common": "4.22.0", - "@algolia/requester-common": "4.22.0", - "@algolia/transporter": "4.22.0" + "@algolia/client-common": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/transporter": "4.22.1" } }, "node_modules/@algolia/events": { @@ -207,47 +207,47 @@ "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, "node_modules/@algolia/logger-common": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.22.0.tgz", - "integrity": "sha512-HMUQTID0ucxNCXs5d1eBJ5q/HuKg8rFVE/vOiLaM4Abfeq1YnTtGV3+rFEhOPWhRQxNDd+YHa4q864IMc0zHpQ==" + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.22.1.tgz", + "integrity": "sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==" }, "node_modules/@algolia/logger-console": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.22.0.tgz", - "integrity": "sha512-7JKb6hgcY64H7CRm3u6DRAiiEVXMvCJV5gRE672QFOUgDxo4aiDpfU61g6Uzy8NKjlEzHMmgG4e2fklELmPXhQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.22.1.tgz", + "integrity": "sha512-O99rcqpVPKN1RlpgD6H3khUWylU24OXlzkavUAMy6QZd1776QAcauE3oP8CmD43nbaTjBexZj2nGsBH9Tc0FVA==", "dependencies": { - "@algolia/logger-common": "4.22.0" + "@algolia/logger-common": "4.22.1" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.0.tgz", - "integrity": "sha512-BHfv1h7P9/SyvcDJDaRuIwDu2yrDLlXlYmjvaLZTtPw6Ok/ZVhBR55JqW832XN/Fsl6k3LjdkYHHR7xnsa5Wvg==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.22.1.tgz", + "integrity": "sha512-dtQGYIg6MteqT1Uay3J/0NDqD+UciHy3QgRbk7bNddOJu+p3hzjTRYESqEnoX/DpEkaNYdRHUKNylsqMpgwaEw==", "dependencies": { - "@algolia/requester-common": "4.22.0" + "@algolia/requester-common": "4.22.1" } }, "node_modules/@algolia/requester-common": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.22.0.tgz", - "integrity": "sha512-Y9cEH/cKjIIZgzvI1aI0ARdtR/xRrOR13g5psCxkdhpgRN0Vcorx+zePhmAa4jdQNqexpxtkUdcKYugBzMZJgQ==" + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.22.1.tgz", + "integrity": "sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==" }, "node_modules/@algolia/requester-node-http": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.22.0.tgz", - "integrity": "sha512-8xHoGpxVhz3u2MYIieHIB6MsnX+vfd5PS4REgglejJ6lPigftRhTdBCToe6zbwq4p0anZXjjPDvNWMlgK2+xYA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.22.1.tgz", + "integrity": "sha512-JfmZ3MVFQkAU+zug8H3s8rZ6h0ahHZL/SpMaSasTCGYR5EEJsCc8SI5UZ6raPN2tjxa5bxS13BRpGSBUens7EA==", "dependencies": { - "@algolia/requester-common": "4.22.0" + "@algolia/requester-common": "4.22.1" } }, "node_modules/@algolia/transporter": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.22.0.tgz", - "integrity": "sha512-ieO1k8x2o77GNvOoC+vAkFKppydQSVfbjM3YrSjLmgywiBejPTvU1R1nEvG59JIIUvtSLrZsLGPkd6vL14zopA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.22.1.tgz", + "integrity": "sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==", "dependencies": { - "@algolia/cache-common": "4.22.0", - "@algolia/logger-common": "4.22.0", - "@algolia/requester-common": "4.22.0" + "@algolia/cache-common": "4.22.1", + "@algolia/logger-common": "4.22.1", + "@algolia/requester-common": "4.22.1" } }, "node_modules/@ampproject/remapping": { @@ -347,19 +347,19 @@ } }, "node_modules/@babel/core": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", - "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz", + "integrity": "sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.6", + "@babel/helpers": "^7.23.7", "@babel/parser": "^7.23.6", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", + "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -443,9 +443,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.6.tgz", - "integrity": "sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz", + "integrity": "sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.20", @@ -497,9 +497,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", - "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -704,12 +704,12 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", - "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.8.tgz", + "integrity": "sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==", "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", + "@babel/traverse": "^7.23.7", "@babel/types": "^7.23.6" }, "engines": { @@ -835,9 +835,9 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", - "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz", + "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-plugin-utils": "^7.22.5" @@ -1120,9 +1120,9 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz", - "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz", + "integrity": "sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==", "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-plugin-utils": "^7.22.5", @@ -1212,15 +1212,14 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz", - "integrity": "sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", + "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5", "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-split-export-declaration": "^7.22.6", @@ -1776,15 +1775,15 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.6.tgz", - "integrity": "sha512-kF1Zg62aPseQ11orDhFRw+aPG/eynNQtI+TyY+m33qJa2cJ5EEvza2P2BNTIA9E5MyqFABHEyY6CPHwgdy9aNg==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.7.tgz", + "integrity": "sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw==", "dependencies": { "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", + "babel-plugin-polyfill-corejs2": "^0.4.7", + "babel-plugin-polyfill-corejs3": "^0.8.7", + "babel-plugin-polyfill-regenerator": "^0.5.4", "semver": "^6.3.1" }, "engines": { @@ -1950,9 +1949,9 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.6.tgz", - "integrity": "sha512-2XPn/BqKkZCpzYhUUNZ1ssXw7DcXfKQEjv/uXZUXgaebCMYmkEsfZ2yY+vv+xtXv50WmL5SGhyB6/xsWxIvvOQ==", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.8.tgz", + "integrity": "sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA==", "dependencies": { "@babel/compat-data": "^7.23.5", "@babel/helper-compilation-targets": "^7.23.6", @@ -1960,7 +1959,7 @@ "@babel/helper-validator-option": "^7.23.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -1981,13 +1980,13 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.23.3", - "@babel/plugin-transform-async-generator-functions": "^7.23.4", + "@babel/plugin-transform-async-generator-functions": "^7.23.7", "@babel/plugin-transform-async-to-generator": "^7.23.3", "@babel/plugin-transform-block-scoped-functions": "^7.23.3", "@babel/plugin-transform-block-scoping": "^7.23.4", "@babel/plugin-transform-class-properties": "^7.23.3", "@babel/plugin-transform-class-static-block": "^7.23.4", - "@babel/plugin-transform-classes": "^7.23.5", + "@babel/plugin-transform-classes": "^7.23.8", "@babel/plugin-transform-computed-properties": "^7.23.3", "@babel/plugin-transform-destructuring": "^7.23.3", "@babel/plugin-transform-dotall-regex": "^7.23.3", @@ -2029,9 +2028,9 @@ "@babel/plugin-transform-unicode-regex": "^7.23.3", "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.6", - "babel-plugin-polyfill-corejs3": "^0.8.5", - "babel-plugin-polyfill-regenerator": "^0.5.3", + "babel-plugin-polyfill-corejs2": "^0.4.7", + "babel-plugin-polyfill-corejs3": "^0.8.7", + "babel-plugin-polyfill-regenerator": "^0.5.4", "core-js-compat": "^3.31.0", "semver": "^6.3.1" }, @@ -2106,9 +2105,9 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", - "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.8.tgz", + "integrity": "sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2117,9 +2116,9 @@ } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.23.6.tgz", - "integrity": "sha512-Djs/ZTAnpyj0nyg7p1J6oiE/tZ9G2stqAFlLGZynrW+F3k2w2jGK2mLOBxzYIOcZYA89+c3d3wXKpYLcpwcU6w==", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.23.8.tgz", + "integrity": "sha512-2ZzmcDugdm0/YQKFVYsXiwUN7USPX8PM7cytpb4PFl87fM+qYPSvTZX//8tyeJB1j0YDmafBJEbl5f8NfLyuKw==", "dependencies": { "core-js-pure": "^3.30.2", "regenerator-runtime": "^0.14.0" @@ -2142,9 +2141,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", - "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", + "version": "7.23.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz", + "integrity": "sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==", "dependencies": { "@babel/code-frame": "^7.23.5", "@babel/generator": "^7.23.6", @@ -2260,9 +2259,9 @@ } }, "node_modules/@docusaurus/core": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.0.1.tgz", - "integrity": "sha512-CXrLpOnW+dJdSv8M5FAJ3JBwXtL6mhUWxFA8aS0ozK6jBG/wgxERk5uvH28fCeFxOGbAT9v1e9dOMo1X2IEVhQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.1.0.tgz", + "integrity": "sha512-GWudMGYA9v26ssbAWJNfgeDZk+lrudUTclLPRsmxiknEBk7UMp7Rglonhqbsf3IKHOyHkMU4Fr5jFyg5SBx9jQ==", "dependencies": { "@babel/core": "^7.23.3", "@babel/generator": "^7.23.3", @@ -2274,13 +2273,13 @@ "@babel/runtime": "^7.22.6", "@babel/runtime-corejs3": "^7.22.6", "@babel/traverse": "^7.22.8", - "@docusaurus/cssnano-preset": "3.0.1", - "@docusaurus/logger": "3.0.1", - "@docusaurus/mdx-loader": "3.0.1", + "@docusaurus/cssnano-preset": "3.1.0", + "@docusaurus/logger": "3.1.0", + "@docusaurus/mdx-loader": "3.1.0", "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/utils": "3.0.1", - "@docusaurus/utils-common": "3.0.1", - "@docusaurus/utils-validation": "3.0.1", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-common": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", "@slorber/static-site-generator-webpack-plugin": "^4.0.7", "@svgr/webpack": "^6.5.1", "autoprefixer": "^10.4.14", @@ -2346,9 +2345,9 @@ } }, "node_modules/@docusaurus/cssnano-preset": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.0.1.tgz", - "integrity": "sha512-wjuXzkHMW+ig4BD6Ya1Yevx9UJadO4smNZCEljqBoQfIQrQskTswBs7lZ8InHP7mCt273a/y/rm36EZhqJhknQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.1.0.tgz", + "integrity": "sha512-ned7qsgCqSv/e7KyugFNroAfiszuxLwnvMW7gmT2Ywxb/Nyt61yIw7KHyAZCMKglOalrqnYA4gMhLUCK/mVePA==", "dependencies": { "cssnano-preset-advanced": "^5.3.10", "postcss": "^8.4.26", @@ -2360,9 +2359,9 @@ } }, "node_modules/@docusaurus/logger": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.0.1.tgz", - "integrity": "sha512-I5L6Nk8OJzkVA91O2uftmo71LBSxe1vmOn9AMR6JRCzYeEBrqneWMH02AqMvjJ2NpMiviO+t0CyPjyYV7nxCWQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.1.0.tgz", + "integrity": "sha512-p740M+HCst1VnKKzL60Hru9xfG4EUYJDarjlEC4hHeBy9+afPmY3BNPoSHx9/8zxuYfUlv/psf7I9NvRVdmdvg==", "dependencies": { "chalk": "^4.1.2", "tslib": "^2.6.0" @@ -2372,15 +2371,15 @@ } }, "node_modules/@docusaurus/mdx-loader": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.0.1.tgz", - "integrity": "sha512-ldnTmvnvlrONUq45oKESrpy+lXtbnTcTsFkOTIDswe5xx5iWJjt6eSa0f99ZaWlnm24mlojcIGoUWNCS53qVlQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.1.0.tgz", + "integrity": "sha512-D7onDz/3mgBonexWoQXPw3V2E5Bc4+jYRf9gGUUK+KoQwU8xMDaDkUUfsr7t6UBa/xox9p5+/3zwLuXOYMzGSg==", "dependencies": { "@babel/parser": "^7.22.7", "@babel/traverse": "^7.22.8", - "@docusaurus/logger": "3.0.1", - "@docusaurus/utils": "3.0.1", - "@docusaurus/utils-validation": "3.0.1", + "@docusaurus/logger": "3.1.0", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", "@mdx-js/mdx": "^3.0.0", "@slorber/remark-comment": "^1.0.0", "escape-html": "^1.0.3", @@ -2432,17 +2431,17 @@ } }, "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.0.1.tgz", - "integrity": "sha512-cLOvtvAyaMQFLI8vm4j26svg3ktxMPSXpuUJ7EERKoGbfpJSsgtowNHcRsaBVmfuCsRSk1HZ/yHBsUkTmHFEsg==", - "dependencies": { - "@docusaurus/core": "3.0.1", - "@docusaurus/logger": "3.0.1", - "@docusaurus/mdx-loader": "3.0.1", - "@docusaurus/types": "3.0.1", - "@docusaurus/utils": "3.0.1", - "@docusaurus/utils-common": "3.0.1", - "@docusaurus/utils-validation": "3.0.1", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.1.0.tgz", + "integrity": "sha512-iMa6WBaaEdYuxckvJtLcq/HQdlA4oEbCXf/OFfsYJCCULcDX7GDZpKxLF3X1fLsax3sSm5bmsU+CA0WD+R1g3A==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/logger": "3.1.0", + "@docusaurus/mdx-loader": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-common": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", "cheerio": "^1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^11.1.1", @@ -2463,10 +2462,11 @@ } }, "node_modules/@docusaurus/plugin-content-blog/node_modules/@docusaurus/types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.0.1.tgz", - "integrity": "sha512-plyX2iU1tcUsF46uQ01pAd4JhexR7n0iiQ5MSnBFX6M6NSJgDYdru/i1/YNPKOnQHBoXGLHv0dNT6OAlDWNjrg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.0.tgz", + "integrity": "sha512-VaczOZf7+re8aFBIWnex1XENomwHdsSTkrdX43zyor7G/FY4OIsP6X28Xc3o0jiY0YdNuvIDyA5TNwOtpgkCVw==", "dependencies": { + "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", "@types/react": "*", "commander": "^5.1.0", @@ -2482,17 +2482,17 @@ } }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.0.1.tgz", - "integrity": "sha512-dRfAOA5Ivo+sdzzJGXEu33yAtvGg8dlZkvt/NEJ7nwi1F2j4LEdsxtfX2GKeETB2fP6XoGNSQnFXqa2NYGrHFg==", - "dependencies": { - "@docusaurus/core": "3.0.1", - "@docusaurus/logger": "3.0.1", - "@docusaurus/mdx-loader": "3.0.1", - "@docusaurus/module-type-aliases": "3.0.1", - "@docusaurus/types": "3.0.1", - "@docusaurus/utils": "3.0.1", - "@docusaurus/utils-validation": "3.0.1", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.1.0.tgz", + "integrity": "sha512-el5GxhT8BLrsWD0qGa8Rq+Ttb/Ni6V3DGT2oAPio0qcs/mUAxeyXEAmihkvmLCnAgp6xD27Ce7dISZ5c6BXeqA==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/logger": "3.1.0", + "@docusaurus/mdx-loader": "3.1.0", + "@docusaurus/module-type-aliases": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", "@types/react-router-config": "^5.0.7", "combine-promises": "^1.1.0", "fs-extra": "^11.1.1", @@ -2511,12 +2511,12 @@ } }, "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/module-type-aliases": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.0.1.tgz", - "integrity": "sha512-DEHpeqUDsLynl3AhQQiO7AbC7/z/lBra34jTcdYuvp9eGm01pfH1wTVq8YqWZq6Jyx0BgcVl/VJqtE9StRd9Ag==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.1.0.tgz", + "integrity": "sha512-XUl7Z4PWlKg4l6KF05JQ3iDHQxnPxbQUqTNKvviHyuHdlalOFv6qeDAm7IbzyQPJD5VA6y4dpRbTWSqP9ClwPg==", "dependencies": { "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "3.0.1", + "@docusaurus/types": "3.1.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2530,10 +2530,11 @@ } }, "node_modules/@docusaurus/plugin-content-docs/node_modules/@docusaurus/types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.0.1.tgz", - "integrity": "sha512-plyX2iU1tcUsF46uQ01pAd4JhexR7n0iiQ5MSnBFX6M6NSJgDYdru/i1/YNPKOnQHBoXGLHv0dNT6OAlDWNjrg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.0.tgz", + "integrity": "sha512-VaczOZf7+re8aFBIWnex1XENomwHdsSTkrdX43zyor7G/FY4OIsP6X28Xc3o0jiY0YdNuvIDyA5TNwOtpgkCVw==", "dependencies": { + "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", "@types/react": "*", "commander": "^5.1.0", @@ -2549,15 +2550,15 @@ } }, "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.0.1.tgz", - "integrity": "sha512-oP7PoYizKAXyEttcvVzfX3OoBIXEmXTMzCdfmC4oSwjG4SPcJsRge3mmI6O8jcZBgUPjIzXD21bVGWEE1iu8gg==", - "dependencies": { - "@docusaurus/core": "3.0.1", - "@docusaurus/mdx-loader": "3.0.1", - "@docusaurus/types": "3.0.1", - "@docusaurus/utils": "3.0.1", - "@docusaurus/utils-validation": "3.0.1", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.1.0.tgz", + "integrity": "sha512-9gntYQFpk+93+Xl7gYczJu8I9uWoyRLnRwS0+NUFcs9iZtHKsdqKWPRrONC9elfN3wJ9ORwTbcVzsTiB8jvYlg==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/mdx-loader": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", "fs-extra": "^11.1.1", "tslib": "^2.6.0", "webpack": "^5.88.1" @@ -2571,10 +2572,11 @@ } }, "node_modules/@docusaurus/plugin-content-pages/node_modules/@docusaurus/types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.0.1.tgz", - "integrity": "sha512-plyX2iU1tcUsF46uQ01pAd4JhexR7n0iiQ5MSnBFX6M6NSJgDYdru/i1/YNPKOnQHBoXGLHv0dNT6OAlDWNjrg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.0.tgz", + "integrity": "sha512-VaczOZf7+re8aFBIWnex1XENomwHdsSTkrdX43zyor7G/FY4OIsP6X28Xc3o0jiY0YdNuvIDyA5TNwOtpgkCVw==", "dependencies": { + "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", "@types/react": "*", "commander": "^5.1.0", @@ -2590,13 +2592,13 @@ } }, "node_modules/@docusaurus/plugin-debug": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.0.1.tgz", - "integrity": "sha512-09dxZMdATky4qdsZGzhzlUvvC+ilQ2hKbYF+wez+cM2mGo4qHbv8+qKXqxq0CQZyimwlAOWQLoSozIXU0g0i7g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.1.0.tgz", + "integrity": "sha512-AbvJwCVRbmQ8w9d8QXbF4Iq/ui0bjPZNYFIhtducGFnm2YQRN1mraK8mCEQb0Aq0T8SqRRvSfC/far4n/s531w==", "dependencies": { - "@docusaurus/core": "3.0.1", - "@docusaurus/types": "3.0.1", - "@docusaurus/utils": "3.0.1", + "@docusaurus/core": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils": "3.1.0", "fs-extra": "^11.1.1", "react-json-view-lite": "^1.2.0", "tslib": "^2.6.0" @@ -2610,10 +2612,11 @@ } }, "node_modules/@docusaurus/plugin-debug/node_modules/@docusaurus/types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.0.1.tgz", - "integrity": "sha512-plyX2iU1tcUsF46uQ01pAd4JhexR7n0iiQ5MSnBFX6M6NSJgDYdru/i1/YNPKOnQHBoXGLHv0dNT6OAlDWNjrg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.0.tgz", + "integrity": "sha512-VaczOZf7+re8aFBIWnex1XENomwHdsSTkrdX43zyor7G/FY4OIsP6X28Xc3o0jiY0YdNuvIDyA5TNwOtpgkCVw==", "dependencies": { + "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", "@types/react": "*", "commander": "^5.1.0", @@ -2629,13 +2632,13 @@ } }, "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.0.1.tgz", - "integrity": "sha512-jwseSz1E+g9rXQwDdr0ZdYNjn8leZBnKPjjQhMBEiwDoenL3JYFcNW0+p0sWoVF/f2z5t7HkKA+cYObrUh18gg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.1.0.tgz", + "integrity": "sha512-zvUOMzu9Uhz0ciqnSbtnp/5i1zEYlzarQrOXG90P3Is3efQI43p2YLW/rzSGdLb5MfQo2HvKT6Q5+tioMO045Q==", "dependencies": { - "@docusaurus/core": "3.0.1", - "@docusaurus/types": "3.0.1", - "@docusaurus/utils-validation": "3.0.1", + "@docusaurus/core": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", "tslib": "^2.6.0" }, "engines": { @@ -2647,10 +2650,11 @@ } }, "node_modules/@docusaurus/plugin-google-analytics/node_modules/@docusaurus/types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.0.1.tgz", - "integrity": "sha512-plyX2iU1tcUsF46uQ01pAd4JhexR7n0iiQ5MSnBFX6M6NSJgDYdru/i1/YNPKOnQHBoXGLHv0dNT6OAlDWNjrg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.0.tgz", + "integrity": "sha512-VaczOZf7+re8aFBIWnex1XENomwHdsSTkrdX43zyor7G/FY4OIsP6X28Xc3o0jiY0YdNuvIDyA5TNwOtpgkCVw==", "dependencies": { + "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", "@types/react": "*", "commander": "^5.1.0", @@ -2666,13 +2670,13 @@ } }, "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.0.1.tgz", - "integrity": "sha512-UFTDvXniAWrajsulKUJ1DB6qplui1BlKLQZjX4F7qS/qfJ+qkKqSkhJ/F4VuGQ2JYeZstYb+KaUzUzvaPK1aRQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.1.0.tgz", + "integrity": "sha512-0txshvaY8qIBdkk2UATdVcfiCLGq3KAUfuRQD2cRNgO39iIf4/ihQxH9NXcRTwKs4Q5d9yYHoix3xT6pFuEYOg==", "dependencies": { - "@docusaurus/core": "3.0.1", - "@docusaurus/types": "3.0.1", - "@docusaurus/utils-validation": "3.0.1", + "@docusaurus/core": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", "@types/gtag.js": "^0.0.12", "tslib": "^2.6.0" }, @@ -2685,10 +2689,11 @@ } }, "node_modules/@docusaurus/plugin-google-gtag/node_modules/@docusaurus/types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.0.1.tgz", - "integrity": "sha512-plyX2iU1tcUsF46uQ01pAd4JhexR7n0iiQ5MSnBFX6M6NSJgDYdru/i1/YNPKOnQHBoXGLHv0dNT6OAlDWNjrg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.0.tgz", + "integrity": "sha512-VaczOZf7+re8aFBIWnex1XENomwHdsSTkrdX43zyor7G/FY4OIsP6X28Xc3o0jiY0YdNuvIDyA5TNwOtpgkCVw==", "dependencies": { + "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", "@types/react": "*", "commander": "^5.1.0", @@ -2704,13 +2709,13 @@ } }, "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.0.1.tgz", - "integrity": "sha512-IPFvuz83aFuheZcWpTlAdiiX1RqWIHM+OH8wS66JgwAKOiQMR3+nLywGjkLV4bp52x7nCnwhNk1rE85Cpy/CIw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.1.0.tgz", + "integrity": "sha512-zOWPEi8kMyyPtwG0vhyXrdbLs8fIZmY5vlbi9lUU+v8VsroO5iHmfR2V3SMsrsfOanw5oV/ciWqbxezY00qEZg==", "dependencies": { - "@docusaurus/core": "3.0.1", - "@docusaurus/types": "3.0.1", - "@docusaurus/utils-validation": "3.0.1", + "@docusaurus/core": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", "tslib": "^2.6.0" }, "engines": { @@ -2722,10 +2727,11 @@ } }, "node_modules/@docusaurus/plugin-google-tag-manager/node_modules/@docusaurus/types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.0.1.tgz", - "integrity": "sha512-plyX2iU1tcUsF46uQ01pAd4JhexR7n0iiQ5MSnBFX6M6NSJgDYdru/i1/YNPKOnQHBoXGLHv0dNT6OAlDWNjrg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.0.tgz", + "integrity": "sha512-VaczOZf7+re8aFBIWnex1XENomwHdsSTkrdX43zyor7G/FY4OIsP6X28Xc3o0jiY0YdNuvIDyA5TNwOtpgkCVw==", "dependencies": { + "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", "@types/react": "*", "commander": "^5.1.0", @@ -2741,16 +2747,16 @@ } }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.0.1.tgz", - "integrity": "sha512-xARiWnjtVvoEniZudlCq5T9ifnhCu/GAZ5nA7XgyLfPcNpHQa241HZdsTlLtVcecEVVdllevBKOp7qknBBaMGw==", - "dependencies": { - "@docusaurus/core": "3.0.1", - "@docusaurus/logger": "3.0.1", - "@docusaurus/types": "3.0.1", - "@docusaurus/utils": "3.0.1", - "@docusaurus/utils-common": "3.0.1", - "@docusaurus/utils-validation": "3.0.1", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.1.0.tgz", + "integrity": "sha512-TkR5vGBpUooEB9SoW42thahqqwKzfHrQQhkB+JrEGERsl4bKODSuJNle4aA4h6LSkg4IyfXOW8XOI0NIPWb9Cg==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/logger": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-common": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", "fs-extra": "^11.1.1", "sitemap": "^7.1.1", "tslib": "^2.6.0" @@ -2764,10 +2770,11 @@ } }, "node_modules/@docusaurus/plugin-sitemap/node_modules/@docusaurus/types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.0.1.tgz", - "integrity": "sha512-plyX2iU1tcUsF46uQ01pAd4JhexR7n0iiQ5MSnBFX6M6NSJgDYdru/i1/YNPKOnQHBoXGLHv0dNT6OAlDWNjrg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.0.tgz", + "integrity": "sha512-VaczOZf7+re8aFBIWnex1XENomwHdsSTkrdX43zyor7G/FY4OIsP6X28Xc3o0jiY0YdNuvIDyA5TNwOtpgkCVw==", "dependencies": { + "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", "@types/react": "*", "commander": "^5.1.0", @@ -2783,23 +2790,23 @@ } }, "node_modules/@docusaurus/preset-classic": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.0.1.tgz", - "integrity": "sha512-il9m9xZKKjoXn6h0cRcdnt6wce0Pv1y5t4xk2Wx7zBGhKG1idu4IFHtikHlD0QPuZ9fizpXspXcTzjL5FXc1Gw==", - "dependencies": { - "@docusaurus/core": "3.0.1", - "@docusaurus/plugin-content-blog": "3.0.1", - "@docusaurus/plugin-content-docs": "3.0.1", - "@docusaurus/plugin-content-pages": "3.0.1", - "@docusaurus/plugin-debug": "3.0.1", - "@docusaurus/plugin-google-analytics": "3.0.1", - "@docusaurus/plugin-google-gtag": "3.0.1", - "@docusaurus/plugin-google-tag-manager": "3.0.1", - "@docusaurus/plugin-sitemap": "3.0.1", - "@docusaurus/theme-classic": "3.0.1", - "@docusaurus/theme-common": "3.0.1", - "@docusaurus/theme-search-algolia": "3.0.1", - "@docusaurus/types": "3.0.1" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.1.0.tgz", + "integrity": "sha512-xGLQRFmmT9IinAGUDVRYZ54Ys28USNbA3OTXQXnSJLPr1rCY7CYnHI4XoOnKWrNnDiAI4ruMzunXWyaElUYCKQ==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/plugin-content-blog": "3.1.0", + "@docusaurus/plugin-content-docs": "3.1.0", + "@docusaurus/plugin-content-pages": "3.1.0", + "@docusaurus/plugin-debug": "3.1.0", + "@docusaurus/plugin-google-analytics": "3.1.0", + "@docusaurus/plugin-google-gtag": "3.1.0", + "@docusaurus/plugin-google-tag-manager": "3.1.0", + "@docusaurus/plugin-sitemap": "3.1.0", + "@docusaurus/theme-classic": "3.1.0", + "@docusaurus/theme-common": "3.1.0", + "@docusaurus/theme-search-algolia": "3.1.0", + "@docusaurus/types": "3.1.0" }, "engines": { "node": ">=18.0" @@ -2810,10 +2817,11 @@ } }, "node_modules/@docusaurus/preset-classic/node_modules/@docusaurus/types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.0.1.tgz", - "integrity": "sha512-plyX2iU1tcUsF46uQ01pAd4JhexR7n0iiQ5MSnBFX6M6NSJgDYdru/i1/YNPKOnQHBoXGLHv0dNT6OAlDWNjrg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.0.tgz", + "integrity": "sha512-VaczOZf7+re8aFBIWnex1XENomwHdsSTkrdX43zyor7G/FY4OIsP6X28Xc3o0jiY0YdNuvIDyA5TNwOtpgkCVw==", "dependencies": { + "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", "@types/react": "*", "commander": "^5.1.0", @@ -2841,22 +2849,22 @@ } }, "node_modules/@docusaurus/theme-classic": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.0.1.tgz", - "integrity": "sha512-XD1FRXaJiDlmYaiHHdm27PNhhPboUah9rqIH0lMpBt5kYtsGjJzhqa27KuZvHLzOP2OEpqd2+GZ5b6YPq7Q05Q==", - "dependencies": { - "@docusaurus/core": "3.0.1", - "@docusaurus/mdx-loader": "3.0.1", - "@docusaurus/module-type-aliases": "3.0.1", - "@docusaurus/plugin-content-blog": "3.0.1", - "@docusaurus/plugin-content-docs": "3.0.1", - "@docusaurus/plugin-content-pages": "3.0.1", - "@docusaurus/theme-common": "3.0.1", - "@docusaurus/theme-translations": "3.0.1", - "@docusaurus/types": "3.0.1", - "@docusaurus/utils": "3.0.1", - "@docusaurus/utils-common": "3.0.1", - "@docusaurus/utils-validation": "3.0.1", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.1.0.tgz", + "integrity": "sha512-/+jMl2Z9O8QQxves5AtHdt91gWsEZFgOV3La/6eyKEd7QLqQUtM5fxEJ40rq9NKYjqCd1HzZ9egIMeJoWwillw==", + "dependencies": { + "@docusaurus/core": "3.1.0", + "@docusaurus/mdx-loader": "3.1.0", + "@docusaurus/module-type-aliases": "3.1.0", + "@docusaurus/plugin-content-blog": "3.1.0", + "@docusaurus/plugin-content-docs": "3.1.0", + "@docusaurus/plugin-content-pages": "3.1.0", + "@docusaurus/theme-common": "3.1.0", + "@docusaurus/theme-translations": "3.1.0", + "@docusaurus/types": "3.1.0", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-common": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "copy-text-to-clipboard": "^3.2.0", @@ -2880,12 +2888,12 @@ } }, "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/module-type-aliases": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.0.1.tgz", - "integrity": "sha512-DEHpeqUDsLynl3AhQQiO7AbC7/z/lBra34jTcdYuvp9eGm01pfH1wTVq8YqWZq6Jyx0BgcVl/VJqtE9StRd9Ag==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.1.0.tgz", + "integrity": "sha512-XUl7Z4PWlKg4l6KF05JQ3iDHQxnPxbQUqTNKvviHyuHdlalOFv6qeDAm7IbzyQPJD5VA6y4dpRbTWSqP9ClwPg==", "dependencies": { "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "3.0.1", + "@docusaurus/types": "3.1.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2899,10 +2907,11 @@ } }, "node_modules/@docusaurus/theme-classic/node_modules/@docusaurus/types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.0.1.tgz", - "integrity": "sha512-plyX2iU1tcUsF46uQ01pAd4JhexR7n0iiQ5MSnBFX6M6NSJgDYdru/i1/YNPKOnQHBoXGLHv0dNT6OAlDWNjrg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.0.tgz", + "integrity": "sha512-VaczOZf7+re8aFBIWnex1XENomwHdsSTkrdX43zyor7G/FY4OIsP6X28Xc3o0jiY0YdNuvIDyA5TNwOtpgkCVw==", "dependencies": { + "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", "@types/react": "*", "commander": "^5.1.0", @@ -2918,17 +2927,17 @@ } }, "node_modules/@docusaurus/theme-common": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.0.1.tgz", - "integrity": "sha512-cr9TOWXuIOL0PUfuXv6L5lPlTgaphKP+22NdVBOYah5jSq5XAAulJTjfe+IfLsEG4L7lJttLbhW7LXDFSAI7Ag==", - "dependencies": { - "@docusaurus/mdx-loader": "3.0.1", - "@docusaurus/module-type-aliases": "3.0.1", - "@docusaurus/plugin-content-blog": "3.0.1", - "@docusaurus/plugin-content-docs": "3.0.1", - "@docusaurus/plugin-content-pages": "3.0.1", - "@docusaurus/utils": "3.0.1", - "@docusaurus/utils-common": "3.0.1", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.1.0.tgz", + "integrity": "sha512-YGwEFALLIbF5ocW/Fy6Ae7tFWUOugEN3iwxTx8UkLAcLqYUboDSadesYtVBmRCEB4FVA2qoP7YaW3lu3apUPPw==", + "dependencies": { + "@docusaurus/mdx-loader": "3.1.0", + "@docusaurus/module-type-aliases": "3.1.0", + "@docusaurus/plugin-content-blog": "3.1.0", + "@docusaurus/plugin-content-docs": "3.1.0", + "@docusaurus/plugin-content-pages": "3.1.0", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-common": "3.1.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2947,12 +2956,12 @@ } }, "node_modules/@docusaurus/theme-common/node_modules/@docusaurus/module-type-aliases": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.0.1.tgz", - "integrity": "sha512-DEHpeqUDsLynl3AhQQiO7AbC7/z/lBra34jTcdYuvp9eGm01pfH1wTVq8YqWZq6Jyx0BgcVl/VJqtE9StRd9Ag==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.1.0.tgz", + "integrity": "sha512-XUl7Z4PWlKg4l6KF05JQ3iDHQxnPxbQUqTNKvviHyuHdlalOFv6qeDAm7IbzyQPJD5VA6y4dpRbTWSqP9ClwPg==", "dependencies": { "@docusaurus/react-loadable": "5.5.2", - "@docusaurus/types": "3.0.1", + "@docusaurus/types": "3.1.0", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2966,10 +2975,11 @@ } }, "node_modules/@docusaurus/theme-common/node_modules/@docusaurus/types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.0.1.tgz", - "integrity": "sha512-plyX2iU1tcUsF46uQ01pAd4JhexR7n0iiQ5MSnBFX6M6NSJgDYdru/i1/YNPKOnQHBoXGLHv0dNT6OAlDWNjrg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.1.0.tgz", + "integrity": "sha512-VaczOZf7+re8aFBIWnex1XENomwHdsSTkrdX43zyor7G/FY4OIsP6X28Xc3o0jiY0YdNuvIDyA5TNwOtpgkCVw==", "dependencies": { + "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", "@types/react": "*", "commander": "^5.1.0", @@ -2985,18 +2995,18 @@ } }, "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.0.1.tgz", - "integrity": "sha512-DDiPc0/xmKSEdwFkXNf1/vH1SzJPzuJBar8kMcBbDAZk/SAmo/4lf6GU2drou4Ae60lN2waix+jYWTWcJRahSA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.1.0.tgz", + "integrity": "sha512-8cJH0ZhPsEDjq3jR3I+wHmWzVY2bXMQJ59v2QxUmsTZxbWA4u+IzccJMIJx4ooFl9J6iYynwYsFuHxyx/KUmfQ==", "dependencies": { "@docsearch/react": "^3.5.2", - "@docusaurus/core": "3.0.1", - "@docusaurus/logger": "3.0.1", - "@docusaurus/plugin-content-docs": "3.0.1", - "@docusaurus/theme-common": "3.0.1", - "@docusaurus/theme-translations": "3.0.1", - "@docusaurus/utils": "3.0.1", - "@docusaurus/utils-validation": "3.0.1", + "@docusaurus/core": "3.1.0", + "@docusaurus/logger": "3.1.0", + "@docusaurus/plugin-content-docs": "3.1.0", + "@docusaurus/theme-common": "3.1.0", + "@docusaurus/theme-translations": "3.1.0", + "@docusaurus/utils": "3.1.0", + "@docusaurus/utils-validation": "3.1.0", "algoliasearch": "^4.18.0", "algoliasearch-helper": "^3.13.3", "clsx": "^2.0.0", @@ -3015,9 +3025,9 @@ } }, "node_modules/@docusaurus/theme-translations": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.0.1.tgz", - "integrity": "sha512-6UrbpzCTN6NIJnAtZ6Ne9492vmPVX+7Fsz4kmp+yor3KQwA1+MCzQP7ItDNkP38UmVLnvB/cYk/IvehCUqS3dg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.1.0.tgz", + "integrity": "sha512-DApE4AbDI+WBajihxB54L4scWQhVGNZAochlC9fkbciPuFAgdRBD3NREb0rgfbKexDC/rioppu/WJA0u8tS+yA==", "dependencies": { "fs-extra": "^11.1.1", "tslib": "^2.6.0" @@ -3053,11 +3063,11 @@ } }, "node_modules/@docusaurus/utils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.0.1.tgz", - "integrity": "sha512-TwZ33Am0q4IIbvjhUOs+zpjtD/mXNmLmEgeTGuRq01QzulLHuPhaBTTAC/DHu6kFx3wDgmgpAlaRuCHfTcXv8g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.1.0.tgz", + "integrity": "sha512-LgZfp0D+UBqAh7PZ//MUNSFBMavmAPku6Si9x8x3V+S318IGCNJ6hUr2O29UO0oLybEWUjD5Jnj9IUN6XyZeeg==", "dependencies": { - "@docusaurus/logger": "3.0.1", + "@docusaurus/logger": "3.1.0", "@svgr/webpack": "^6.5.1", "escape-string-regexp": "^4.0.0", "file-loader": "^6.2.0", @@ -3088,9 +3098,9 @@ } }, "node_modules/@docusaurus/utils-common": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.0.1.tgz", - "integrity": "sha512-W0AxD6w6T8g6bNro8nBRWf7PeZ/nn7geEWM335qHU2DDDjHuV4UZjgUGP1AQsdcSikPrlIqTJJbKzer1lRSlIg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.1.0.tgz", + "integrity": "sha512-SfvnRLHoZ9bwTw67knkSs7IcUR0GY2SaGkpdB/J9pChrDiGhwzKNUhcieoPyPYrOWGRPk3rVNYtoy+Bc7psPAw==", "dependencies": { "tslib": "^2.6.0" }, @@ -3107,12 +3117,12 @@ } }, "node_modules/@docusaurus/utils-validation": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.0.1.tgz", - "integrity": "sha512-ujTnqSfyGQ7/4iZdB4RRuHKY/Nwm58IIb+41s5tCXOv/MBU2wGAjOHq3U+AEyJ8aKQcHbxvTKJaRchNHYUVUQg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.1.0.tgz", + "integrity": "sha512-dFxhs1NLxPOSzmcTk/eeKxLY5R+U4cua22g9MsAMiRWcwFKStZ2W3/GDY0GmnJGqNS8QAQepJrxQoyxXkJNDeg==", "dependencies": { - "@docusaurus/logger": "3.0.1", - "@docusaurus/utils": "3.0.1", + "@docusaurus/logger": "3.1.0", + "@docusaurus/utils": "3.1.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", "tslib": "^2.6.0" @@ -3205,9 +3215,9 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -3712,9 +3722,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.44.9", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.9.tgz", - "integrity": "sha512-6yBxcvwnnYoYT1Uk2d+jvIfsuP4mb2EdIxFnrPABj5a/838qe5bGkNLFOiipX4ULQ7XVQvTxOh7jO+BTAiqsEw==", + "version": "8.56.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", + "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -3855,17 +3865,17 @@ "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/node": { - "version": "20.10.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", - "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", + "version": "20.11.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.5.tgz", + "integrity": "sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==", "dependencies": { "undici-types": "~5.26.4" } }, "node_modules/@types/node-forge": { - "version": "1.3.10", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.10.tgz", - "integrity": "sha512-y6PJDYN4xYBxwd22l+OVH35N+1fCYWiuC3aiP2SlXVE6Lo7SS+rSx9r89hLxrP4pn6n1lBGhHJ12pj3F3Mpttw==", + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", "dependencies": { "@types/node": "*" } @@ -3886,9 +3896,9 @@ "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" }, "node_modules/@types/qs": { - "version": "6.9.10", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", - "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==" + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==" }, "node_modules/@types/range-parser": { "version": "1.2.7", @@ -3896,9 +3906,9 @@ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" }, "node_modules/@types/react": { - "version": "18.2.45", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.45.tgz", - "integrity": "sha512-TtAxCNrlrBp8GoeEp1npd5g+d/OejJHFxS3OWmrPBMFaVQMSN0OFySozJio5BHxTuTeug00AVXVAjfDSfk+lUg==", + "version": "18.2.48", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.48.tgz", + "integrity": "sha512-qboRCl6Ie70DQQG9hhNREz81jqC1cs9EVNcjQ1AU+jH6NFfSAhVVbrrY/+nSF+Bsk4AOwm9Qa61InvMCyV+H3w==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -4191,9 +4201,9 @@ } }, "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "bin": { "acorn": "bin/acorn" }, @@ -4218,9 +4228,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", - "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "engines": { "node": ">=0.4.0" } @@ -4288,30 +4298,30 @@ } }, "node_modules/algoliasearch": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.22.0.tgz", - "integrity": "sha512-gfceltjkwh7PxXwtkS8KVvdfK+TSNQAWUeNSxf4dA29qW5tf2EGwa8jkJujlT9jLm17cixMVoGNc+GJFO1Mxhg==", - "dependencies": { - "@algolia/cache-browser-local-storage": "4.22.0", - "@algolia/cache-common": "4.22.0", - "@algolia/cache-in-memory": "4.22.0", - "@algolia/client-account": "4.22.0", - "@algolia/client-analytics": "4.22.0", - "@algolia/client-common": "4.22.0", - "@algolia/client-personalization": "4.22.0", - "@algolia/client-search": "4.22.0", - "@algolia/logger-common": "4.22.0", - "@algolia/logger-console": "4.22.0", - "@algolia/requester-browser-xhr": "4.22.0", - "@algolia/requester-common": "4.22.0", - "@algolia/requester-node-http": "4.22.0", - "@algolia/transporter": "4.22.0" + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.22.1.tgz", + "integrity": "sha512-jwydKFQJKIx9kIZ8Jm44SdpigFwRGPESaxZBaHSV0XWN2yBJAOT4mT7ppvlrpA4UGzz92pqFnVKr/kaZXrcreg==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.22.1", + "@algolia/cache-common": "4.22.1", + "@algolia/cache-in-memory": "4.22.1", + "@algolia/client-account": "4.22.1", + "@algolia/client-analytics": "4.22.1", + "@algolia/client-common": "4.22.1", + "@algolia/client-personalization": "4.22.1", + "@algolia/client-search": "4.22.1", + "@algolia/logger-common": "4.22.1", + "@algolia/logger-console": "4.22.1", + "@algolia/requester-browser-xhr": "4.22.1", + "@algolia/requester-common": "4.22.1", + "@algolia/requester-node-http": "4.22.1", + "@algolia/transporter": "4.22.1" } }, "node_modules/algoliasearch-helper": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.16.0.tgz", - "integrity": "sha512-RxOtBafSQwyqD5BLO/q9VsVw/zuNz8kjb51OZhCIWLr33uvKB+vrRis+QK+JFlNQXbXf+w28fsTWiBupc1pHew==", + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.16.1.tgz", + "integrity": "sha512-qxAHVjjmT7USVvrM8q6gZGaJlCK1fl4APfdAA7o8O6iXEc68G0xMNrzRkxoB/HmhhvyHnoteS/iMTiHiTcQQcg==", "dependencies": { "@algolia/events": "^4.0.1" }, @@ -4401,9 +4411,9 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "node_modules/array-union": { "version": "2.1.0", @@ -4430,9 +4440,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "version": "10.4.17", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.17.tgz", + "integrity": "sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==", "funding": [ { "type": "opencollective", @@ -4448,9 +4458,9 @@ } ], "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", + "browserslist": "^4.22.2", + "caniuse-lite": "^1.0.30001578", + "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -4490,12 +4500,12 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz", - "integrity": "sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==", + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz", + "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.4", + "@babel/helper-define-polyfill-provider": "^0.5.0", "semver": "^6.3.1" }, "peerDependencies": { @@ -4522,12 +4532,27 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, + "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz", - "integrity": "sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.4" + "@babel/helper-define-polyfill-provider": "^0.5.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -4613,12 +4638,10 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/bonjour-service": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", - "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" } @@ -4802,9 +4825,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001570", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz", - "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==", + "version": "1.0.30001579", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001579.tgz", + "integrity": "sha512-u5AUVkixruKHJjw/pj9wISlcMpgFWzSrczLZbrqBSxukQixmg0SJ5sZTpvaFvxU0HoQKd4yoyAogyrAz9pzJnA==", "funding": [ { "type": "opencollective", @@ -5067,9 +5090,9 @@ } }, "node_modules/clsx": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", - "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz", + "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==", "engines": { "node": ">=6" } @@ -5347,9 +5370,9 @@ } }, "node_modules/core-js": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.34.0.tgz", - "integrity": "sha512-aDdvlDder8QmY91H88GzNi9EtQi2TjvQhpCX6B1v/dAZHU1AuLgHvRh54RiOerpEhEW46Tkf+vgAViB/CWC0ag==", + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.35.1.tgz", + "integrity": "sha512-IgdsbxNyMskrTFxa9lWHyMwAJU5gXOPP+1yO+K59d50VLVAIDAbs7gIv705KzALModfK3ZrSZTPNpC0PQgIZuw==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -5357,9 +5380,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.34.0.tgz", - "integrity": "sha512-4ZIyeNbW/Cn1wkMMDy+mvrRUxrwFNjKwbhCfQpDd+eLgYipDqp8oGFGtLmhh18EDPKA0g3VUBYOxQGGwvWLVpA==", + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", + "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", "dependencies": { "browserslist": "^4.22.2" }, @@ -5369,9 +5392,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.34.0.tgz", - "integrity": "sha512-pmhivkYXkymswFfbXsANmBAewXx86UBfmagP+w0wkK06kLsLlTK5oQmsURPivzMkIBQiYq2cjamcZExIwlFQIg==", + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.35.1.tgz", + "integrity": "sha512-zcIdi/CL3MWbBJYo5YCeVAAx+Sy9yJE9I3/u9LkFABwbeaPhTMRWraM8mYFp9jW5Z50hOy7FVzCc8dCrpZqtIQ==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -5448,18 +5471,18 @@ } }, "node_modules/css-loader": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", - "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.9.1.tgz", + "integrity": "sha512-OzABOh0+26JKFdMzlK6PY1u5Zx8+Ck7CVRlcGNZoY9qwJjdfu2VWFuprTIpPW+Av5TZTVViYWcFQaEEQURLknQ==", "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.21", + "postcss": "^8.4.33", "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.3", - "postcss-modules-scope": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.4", + "postcss-modules-scope": "^3.1.1", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "engines": { "node": ">= 12.13.0" @@ -5934,11 +5957,6 @@ "node": ">=8" } }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" - }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", @@ -6056,9 +6074,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.613", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.613.tgz", - "integrity": "sha512-r4x5+FowKG6q+/Wj0W9nidx7QO31BJwmR2uEo+Qh3YLGQ8SbBAFuDFpTxzly/I2gsbrFwBuIjrMp423L3O5U3w==" + "version": "1.4.640", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.640.tgz", + "integrity": "sha512-z/6oZ/Muqk4BaE7P69bXhUhpJbUM9ZJeka43ZwxsDshKtePns4mhBlh8bU5+yrnOnz3fhG82XLzGUXazOmsWnA==" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -6418,11 +6436,6 @@ "node": ">= 0.10.0" } }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, "node_modules/express/node_modules/content-disposition": { "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", @@ -6510,9 +6523,9 @@ } }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz", + "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", "dependencies": { "reusify": "^1.0.4" } @@ -6703,9 +6716,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", "funding": [ { "type": "individual", @@ -7290,9 +7303,9 @@ } }, "node_modules/hast-util-raw": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.1.tgz", - "integrity": "sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.2.tgz", + "integrity": "sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -7571,9 +7584,9 @@ } }, "node_modules/html-webpack-plugin": { - "version": "5.5.4", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.4.tgz", - "integrity": "sha512-3wNSaVVxdxcu0jd4FpQFoICdqgxs4zIQQvj+2yQKFfBOnLETQ6X5CDWdeasuGlSsooFlMkEioWDTqBv1wvw5Iw==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", "dependencies": { "@types/html-minifier-terser": "^6.0.0", "html-minifier-terser": "^6.0.2", @@ -7589,7 +7602,16 @@ "url": "https://opencollective.com/html-webpack-plugin" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/html-webpack-plugin/node_modules/commander": { @@ -7766,9 +7788,9 @@ } }, "node_modules/image-size": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz", - "integrity": "sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", + "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", "dependencies": { "queue": "6.0.2" }, @@ -7776,7 +7798,7 @@ "image-size": "bin/image-size.js" }, "engines": { - "node": ">=14.0.0" + "node": ">=16.x" } }, "node_modules/immer": { @@ -8217,13 +8239,13 @@ } }, "node_modules/joi": { - "version": "17.11.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", - "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", + "version": "17.12.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.0.tgz", + "integrity": "sha512-HSLsmSmXz+PV9PYoi3p7cgIbj06WnEBNT28n+bbBNcPZXZFqCzzvGqpTBPujx/Z0nh1+KNQPDrNgdmQ8dq0qYw==", "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.4", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } @@ -8820,9 +8842,9 @@ } }, "node_modules/mdast-util-to-hast": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.0.2.tgz", - "integrity": "sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", + "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -8831,7 +8853,8 @@ "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", - "unist-util-visit": "^5.0.0" + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" }, "funding": { "type": "opencollective", @@ -10652,9 +10675,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.7.6", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", - "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "version": "2.7.7", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.7.tgz", + "integrity": "sha512-+0n11YGyRavUR3IlaOzJ0/4Il1avMvJ1VJfhWfCn24ITQXhRr1gghbhhrda6tgtNcpZaWKdSuwKq20Jb7fnlyw==", "dependencies": { "schema-utils": "^4.0.0" }, @@ -10694,9 +10717,9 @@ } }, "node_modules/mrmime": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", - "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", "engines": { "node": ">=10" } @@ -11300,9 +11323,9 @@ } }, "node_modules/postcss": { - "version": "8.4.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", - "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", + "version": "8.4.33", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz", + "integrity": "sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==", "funding": [ { "type": "opencollective", @@ -11429,13 +11452,13 @@ } }, "node_modules/postcss-loader": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", - "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", + "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", "dependencies": { - "cosmiconfig": "^8.2.0", - "jiti": "^1.18.2", - "semver": "^7.3.8" + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" }, "engines": { "node": ">= 14.15.0" @@ -11593,9 +11616,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", - "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", + "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -11609,9 +11632,9 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", + "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -11820,9 +11843,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "version": "6.0.15", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", + "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -11917,9 +11940,9 @@ } }, "node_modules/prism-react-renderer": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.3.0.tgz", - "integrity": "sha512-UYRg2TkVIaI6tRVHC5OJ4/BxqPUxJkJvq/odLT/ykpt1zGYXooNperUxQcCvi87LyRnR4nCh81ceOA+e7nrydg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.3.1.tgz", + "integrity": "sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==", "dependencies": { "@types/prismjs": "^1.26.0", "clsx": "^2.0.0" @@ -12455,9 +12478,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regenerator-transform": { "version": "0.15.2", @@ -12640,9 +12663,9 @@ } }, "node_modules/remark-rehype": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.0.0.tgz", - "integrity": "sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", + "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -13084,9 +13107,9 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dependencies": { "randombytes": "^2.1.0" } @@ -13196,14 +13219,15 @@ } }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz", + "integrity": "sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==", "dependencies": { "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.2", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -13292,12 +13316,12 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/sirv": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", - "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", "dependencies": { - "@polka/url": "^1.0.0-next.20", - "mrmime": "^1.0.0", + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", "totalist": "^3.0.0" }, "engines": { @@ -13470,9 +13494,9 @@ } }, "node_modules/std-env": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.6.0.tgz", - "integrity": "sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg==" + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==" }, "node_modules/string_decoder": { "version": "1.3.0", @@ -13737,9 +13761,9 @@ } }, "node_modules/terser": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", - "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", + "version": "5.27.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", + "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -13754,15 +13778,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -14405,9 +14429,9 @@ "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" }, "node_modules/utility-types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", - "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", "engines": { "node": ">= 4" } @@ -14698,9 +14722,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.15.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.15.1.tgz", - "integrity": "sha512-W5OZiCjXEmk0yZ66ZN82beM5Sz7l7coYxpRkzS+p9PP+ToQry8szKh+61eNktr7EA9DOwvFGhfC605jDHbP6QQ==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "engines": { "node": ">=10.0.0" }, diff --git a/documentation/package.json b/documentation/package.json index 66756f7413..697d60fc44 100644 --- a/documentation/package.json +++ b/documentation/package.json @@ -23,8 +23,8 @@ }, "dependencies": { "@cmfcmf/docusaurus-search-local": "^1.1.0", - "@docusaurus/core": "3.0.1", - "@docusaurus/preset-classic": "3.0.1", + "@docusaurus/core": "3.1.0", + "@docusaurus/preset-classic": "3.1.0", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "prism-react-renderer": "^2.3.0", From c5028124429067cfaa63ac49b64618521b862a09 Mon Sep 17 00:00:00 2001 From: Dion Date: Sun, 21 Jan 2024 17:05:29 +0100 Subject: [PATCH 18/31] fix some tests --- .../Controllers/AppSettingsControllerTest.cs | 35 +++++++++++++------ 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/starsky/starskytest/Controllers/AppSettingsControllerTest.cs b/starsky/starskytest/Controllers/AppSettingsControllerTest.cs index 8ffe25a287..177d824484 100644 --- a/starsky/starskytest/Controllers/AppSettingsControllerTest.cs +++ b/starsky/starskytest/Controllers/AppSettingsControllerTest.cs @@ -45,7 +45,10 @@ public void ENV_StarskyTestEnv_ForceHtml() [TestMethod] public async Task UpdateAppSettings_Verbose() { - var controller = new AppSettingsController(new AppSettings(), new FakeIUpdateAppSettingsByPath()); + var appSettings = new AppSettings(); + var storage = new FakeIStorage(new List { "/" }); + var controller = new AppSettingsController(appSettings, new UpdateAppSettingsByPath(appSettings,new FakeSelectorStorage(storage))); + var actionResult = await controller.UpdateAppSettings(new AppSettingsTransferObject {Verbose = true}) as JsonResult; var result = actionResult?.Value as AppSettings; Assert.IsTrue(result?.Verbose); @@ -55,17 +58,20 @@ public async Task UpdateAppSettings_Verbose() public async Task UpdateAppSettings_StorageFolder() { var appSettings = new AppSettings(); - var controller = new AppSettingsController(appSettings, new UpdateAppSettingsByPath(appSettings,new FakeSelectorStorage(new FakeIStorage()))); + var controller = new AppSettingsController(appSettings, new UpdateAppSettingsByPath(appSettings, + new FakeSelectorStorage(new FakeIStorage(new List{ $"{Path.DirectorySeparatorChar}test"})))); + controller.ControllerContext.HttpContext = new DefaultHttpContext(); var actionResult = await controller.UpdateAppSettings(new AppSettingsTransferObject { - Verbose = true, StorageFolder = "test" + Verbose = true, + StorageFolder = $"{Path.DirectorySeparatorChar}test" }) as JsonResult; var result = actionResult?.Value as AppSettings; Assert.IsTrue(result?.Verbose); - Assert.AreEqual(PathHelper.AddBackslash("test"),result?.StorageFolder); + Assert.AreEqual(Path.DirectorySeparatorChar + PathHelper.AddBackslash("test"),result?.StorageFolder); } [TestMethod] @@ -98,13 +104,14 @@ public async Task UpdateAppSettingsTest_DirNotFound() StatusCode = 404 })); controller.ControllerContext.HttpContext = new DefaultHttpContext(); - var actionResult = (await controller.UpdateAppSettings( + + await controller.UpdateAppSettings( new AppSettingsTransferObject { StorageFolder = "not_found" - })) as NotFoundObjectResult; + }); - Assert.AreEqual(404, actionResult?.StatusCode); + Assert.AreEqual(404, controller.Response.StatusCode); } [TestMethod] @@ -136,7 +143,10 @@ await controller.UpdateAppSettings( [TestMethod] public async Task UpdateAppSettings_UseLocalDesktopUi() { - var controller = new AppSettingsController(new AppSettings(), new FakeIUpdateAppSettingsByPath()); + var appSettings = new AppSettings(); + var storage = new FakeIStorage(new List { "/" }); + var controller = new AppSettingsController(appSettings, new UpdateAppSettingsByPath(appSettings,new FakeSelectorStorage(storage))); + var actionResult = await controller.UpdateAppSettings(new AppSettingsTransferObject {UseLocalDesktopUi = true}) as JsonResult; var result = actionResult?.Value as AppSettings; Assert.IsTrue(result?.UseLocalDesktopUi); @@ -145,7 +155,10 @@ public async Task UpdateAppSettings_UseLocalDesktopUi() [TestMethod] public async Task UpdateAppSettings_UseSystemTrash() { - var controller = new AppSettingsController(new AppSettings(), new FakeIUpdateAppSettingsByPath()); + var appSettings = new AppSettings(); + var storage = new FakeIStorage(new List { "/" }); + var controller = new AppSettingsController(appSettings, new UpdateAppSettingsByPath(appSettings,new FakeSelectorStorage(storage))); + var actionResult = await controller.UpdateAppSettings(new AppSettingsTransferObject {UseSystemTrash = true}) as JsonResult; var result = actionResult?.Value as AppSettings; Assert.IsTrue(result?.UseSystemTrash); @@ -155,7 +168,9 @@ public async Task UpdateAppSettings_UseSystemTrash() public async Task UpdateAppSettings_Verbose_IgnoreSystemTrashValue() { var appSettings = new AppSettings(); - var controller = new AppSettingsController(appSettings, new FakeIUpdateAppSettingsByPath()); + var storage = new FakeIStorage(new List { "/" }); + var controller = new AppSettingsController(appSettings, new UpdateAppSettingsByPath(appSettings,new FakeSelectorStorage(storage))); + var actionResult = await controller.UpdateAppSettings(new AppSettingsTransferObject {Verbose = true}) as JsonResult; var result = actionResult?.Value as AppSettings; From 0f4dbc003dd88b5ae3c7261276d5bd6f027c217b Mon Sep 17 00:00:00 2001 From: Dion Date: Sun, 21 Jan 2024 22:00:18 +0100 Subject: [PATCH 19/31] add tests --- .../Services/UpdateAppSettingsByPath.cs | 6 ++- .../Models/AppSettings.cs | 36 +++++++++++++++ .../Services/UpdateAppSettingsByPathTest.cs | 45 ++++++++++++++++++- .../Models/AppSettingsTest.cs | 43 ++++++++++++++++++ 4 files changed, 126 insertions(+), 4 deletions(-) diff --git a/starsky/starsky.feature.settings/Services/UpdateAppSettingsByPath.cs b/starsky/starsky.feature.settings/Services/UpdateAppSettingsByPath.cs index 59c8cd5cce..e249534447 100644 --- a/starsky/starsky.feature.settings/Services/UpdateAppSettingsByPath.cs +++ b/starsky/starsky.feature.settings/Services/UpdateAppSettingsByPath.cs @@ -48,11 +48,11 @@ public async Task UpdateAppSettingsAsync(AppSettin } } - // To update current session AppSettingsCompareHelper.Compare(_appSettings, appSettingTransferObject); + var transfer = ( AppSettingsTransferObject ) _appSettings; // should not forget app: prefix - var jsonOutput = JsonSerializer.Serialize(new { app = appSettingTransferObject }, DefaultJsonSerializer.NoNamingPolicy); + var jsonOutput = JsonSerializer.Serialize(new { app = transfer }, DefaultJsonSerializer.NoNamingPolicy); await _hostStorage.WriteStreamAsync( StringToStreamHelper.StringToStream(jsonOutput), @@ -64,4 +64,6 @@ await _hostStorage.WriteStreamAsync( Message = "Updated" }; } + + } diff --git a/starsky/starsky.foundation.platform/Models/AppSettings.cs b/starsky/starsky.foundation.platform/Models/AppSettings.cs index 73946ff904..93ccdc0015 100644 --- a/starsky/starsky.foundation.platform/Models/AppSettings.cs +++ b/starsky/starsky.foundation.platform/Models/AppSettings.cs @@ -1,6 +1,8 @@ +#nullable enable using System.Text.Json.Serialization; using System; using System.Collections.Generic; +using System.ComponentModel; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; @@ -1112,6 +1114,40 @@ public string SqLiteFullPath(string connectionString, string baseDirectoryProjec Path.DirectorySeparatorChar+ databaseFileName; return dataSource; } + + public static explicit operator AppSettingsTransferObject(AppSettings appSettings) + { + var transferObject = new AppSettingsTransferObject(); + CopyProperties(appSettings, transferObject); + return transferObject; + } + + public static explicit operator AppSettings(AppSettingsTransferObject transferObject) + { + var appSettings = new AppSettings(); + CopyProperties(transferObject, appSettings); + return appSettings; + } + + internal static void CopyProperties(object source, object destination) + { + var sourceType = source.GetType(); + var destinationType = destination.GetType(); + + var sourceProperties = sourceType.GetProperties(); + foreach (var sourceProperty in sourceProperties) + { + var destinationProperty = destinationType.GetProperty(sourceProperty.Name); + + if ( destinationProperty == null || + !destinationProperty.CanWrite ) + { + continue; + } + var value = sourceProperty.GetValue(source); + destinationProperty.SetValue(destination, value); + } + } } } diff --git a/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs b/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs index 4663df5f04..6266ebdc2d 100644 --- a/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs +++ b/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs @@ -1,8 +1,11 @@ using System; using System.Collections.Generic; +using System.Text.Json; +using System.Text.Json.Serialization; using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.feature.settings.Services; +using starsky.foundation.platform.JsonConverter; using starsky.foundation.platform.Models; using starsky.foundation.storage.Helpers; using starskytest.FakeMocks; @@ -38,6 +41,7 @@ public async Task UpdateAppSettingsAsync_ValidInput_Success() public async Task UpdateAppSettingsAsync_ValidInput_Success_CompareJson() { // Arrange + var storage = new FakeIStorage(new List{"/"}); var selectorStorage = new FakeSelectorStorage(storage); var appSettings = new AppSettings(); @@ -45,7 +49,8 @@ public async Task UpdateAppSettingsAsync_ValidInput_Success_CompareJson() var appSettingTransferObject = new AppSettingsTransferObject { StorageFolder = "/", - Verbose = true + Verbose = true, + UseLocalDesktopUi = null }; // Act @@ -54,7 +59,7 @@ public async Task UpdateAppSettingsAsync_ValidInput_Success_CompareJson() var result = await StreamToStringHelper.StreamToStringAsync(storage.ReadStream(appSettings.AppSettingsPath)) ; // Assert - const string expectedResult = "{\n \"app\": {\n \"Verbose\": \"true\",\n \"StorageFolder\": \"/\"\n }\n}"; + const string expectedResult = "{\n \"app\": {\n \"Verbose\": \"true\",\n \"StorageFolder\": \"/\",\n \"UseLocalDesktopUi\": \"false\"\n }\n}"; Assert.AreEqual(expectedResult, result); } @@ -103,5 +108,41 @@ public async Task UpdateAppSettingsAsync_InvalidStorageFolder_Returns403() Assert.AreEqual("There is an Environment variable set so you can't update it here", result.Message); } + + [TestMethod] + public async Task UpdateAppSettingsAsync_ValidInput_TwoTimes_Success() + { + // Arrange + var storage = new FakeIStorage(new List{"/"}); + var appSettings = new AppSettings(); + var selectorStorage = new FakeSelectorStorage(storage); + var updateAppSettingsByPath = new UpdateAppSettingsByPath(appSettings, selectorStorage); + var appSettingTransferObject1 = new AppSettingsTransferObject + { + Verbose = true + }; + + // Act + await updateAppSettingsByPath.UpdateAppSettingsAsync(appSettingTransferObject1); + + var fileResultString1 = await StreamToStringHelper.StreamToStringAsync(storage.ReadStream(appSettings.AppSettingsPath)); + var fileResult1 = JsonSerializer.Deserialize(fileResultString1, DefaultJsonSerializer.NoNamingPolicy); + + Assert.IsTrue(fileResult1.App.Verbose); + + var appSettingTransferObject2 = new AppSettingsTransferObject + { + StorageFolder = "/" + }; + + await updateAppSettingsByPath.UpdateAppSettingsAsync(appSettingTransferObject2); + + var fileResultString2 = await StreamToStringHelper.StreamToStringAsync(storage.ReadStream(appSettings.AppSettingsPath)); + var fileResult2 = JsonSerializer.Deserialize(fileResultString2, DefaultJsonSerializer.NoNamingPolicy); + + Assert.AreEqual("/", fileResult2.App.StorageFolder); + Assert.IsTrue(fileResult2.App.Verbose); + } + } } diff --git a/starsky/starskytest/starsky.foundation.platform/Models/AppSettingsTest.cs b/starsky/starskytest/starsky.foundation.platform/Models/AppSettingsTest.cs index 7c84008cc2..c11848d288 100644 --- a/starsky/starskytest/starsky.foundation.platform/Models/AppSettingsTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Models/AppSettingsTest.cs @@ -562,5 +562,48 @@ public void DatabasePathToFilePath_NoNull() Assert.IsNotNull(result); } + + [TestMethod] + public void AppSettingsToTransferObjectConversion() + { + // Arrange + var appSettings = new AppSettings { StorageFolder = "Value1", Verbose = true }; + + // Act + AppSettingsTransferObject transferObject = (AppSettingsTransferObject)appSettings; + + // Assert + Assert.AreEqual(appSettings.StorageFolder, transferObject.StorageFolder); + Assert.AreEqual(appSettings.Verbose, transferObject.Verbose); + } + + [TestMethod] + public void TransferObjectToAppSettingsConversion() + { + // Arrange + var transferObject = new AppSettingsTransferObject { StorageFolder = "Value1/", Verbose = true }; + + // Act + var appSettings = (AppSettings)transferObject; + + // Assert + Assert.AreEqual(appSettings.StorageFolder, transferObject.StorageFolder); + Assert.AreEqual(appSettings.Verbose, transferObject.Verbose); + } + + [TestMethod] + public void CopyProperties_CopiesPropertiesCorrectly() + { + // Arrange + AppSettings source = new AppSettings { StorageFolder = "Value1", Verbose = true }; + AppSettings destination = new AppSettings(); + + // Act + AppSettings.CopyProperties(source, destination); + + // Assert + Assert.AreEqual(source.StorageFolder, destination.StorageFolder); + Assert.AreEqual(source.Verbose, destination.Verbose); + } } } From 8a06a6eafb2ea1d74259ee8f25dc2aa57964a136 Mon Sep 17 00:00:00 2001 From: Dion Date: Sun, 21 Jan 2024 22:21:19 +0100 Subject: [PATCH 20/31] one test fails --- .../Services/UpdateAppSettingsByPathTest.cs | 29 ++++++++++++------- .../Helpers/ExportManifestTest.cs | 4 +-- .../Models/AppSettingsTest.cs | 5 +++- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs b/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs index 6266ebdc2d..0a2128250c 100644 --- a/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs +++ b/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.IO; using System.Text.Json; using System.Text.Json.Serialization; using System.Threading.Tasks; @@ -40,15 +41,17 @@ public async Task UpdateAppSettingsAsync_ValidInput_Success() [TestMethod] public async Task UpdateAppSettingsAsync_ValidInput_Success_CompareJson() { - // Arrange - - var storage = new FakeIStorage(new List{"/"}); + // Arrange + + var testFolderPath = Path.DirectorySeparatorChar.ToString() + "test" + Path.DirectorySeparatorChar.ToString(); + + var storage = new FakeIStorage(new List{"/", testFolderPath }); var selectorStorage = new FakeSelectorStorage(storage); var appSettings = new AppSettings(); var updateAppSettingsByPath = new UpdateAppSettingsByPath(appSettings, selectorStorage); var appSettingTransferObject = new AppSettingsTransferObject { - StorageFolder = "/", + StorageFolder = testFolderPath, Verbose = true, UseLocalDesktopUi = null }; @@ -56,10 +59,11 @@ public async Task UpdateAppSettingsAsync_ValidInput_Success_CompareJson() // Act await updateAppSettingsByPath.UpdateAppSettingsAsync(appSettingTransferObject); - var result = await StreamToStringHelper.StreamToStringAsync(storage.ReadStream(appSettings.AppSettingsPath)) ; + var result = (await StreamToStringHelper.StreamToStringAsync(storage.ReadStream(appSettings.AppSettingsPath))).Replace("\r\n","\n"); // Assert - const string expectedResult = "{\n \"app\": {\n \"Verbose\": \"true\",\n \"StorageFolder\": \"/\",\n \"UseLocalDesktopUi\": \"false\"\n }\n}"; + var expectedResult = "{\n \"app\": {\n \"Verbose\": \"true\",\n \"StorageFolder\": \"" + + testFolderPath + "\",\n \"UseLocalDesktopUi\": \"false\"\n }\n}"; Assert.AreEqual(expectedResult, result); } @@ -112,8 +116,11 @@ public async Task UpdateAppSettingsAsync_InvalidStorageFolder_Returns403() [TestMethod] public async Task UpdateAppSettingsAsync_ValidInput_TwoTimes_Success() { - // Arrange - var storage = new FakeIStorage(new List{"/"}); + // Arrange + var testFolderPath = Path.DirectorySeparatorChar.ToString() + "test" + Path.DirectorySeparatorChar.ToString(); + + var storage = new FakeIStorage(new List{ + "/", testFolderPath }); var appSettings = new AppSettings(); var selectorStorage = new FakeSelectorStorage(storage); var updateAppSettingsByPath = new UpdateAppSettingsByPath(appSettings, selectorStorage); @@ -132,15 +139,15 @@ public async Task UpdateAppSettingsAsync_ValidInput_TwoTimes_Success() var appSettingTransferObject2 = new AppSettingsTransferObject { - StorageFolder = "/" - }; + StorageFolder = testFolderPath + }; await updateAppSettingsByPath.UpdateAppSettingsAsync(appSettingTransferObject2); var fileResultString2 = await StreamToStringHelper.StreamToStringAsync(storage.ReadStream(appSettings.AppSettingsPath)); var fileResult2 = JsonSerializer.Deserialize(fileResultString2, DefaultJsonSerializer.NoNamingPolicy); - Assert.AreEqual("/", fileResult2.App.StorageFolder); + Assert.AreEqual(testFolderPath, fileResult2.App.StorageFolder); Assert.IsTrue(fileResult2.App.Verbose); } diff --git a/starsky/starskytest/starsky.feature.webhtmlpublish/Helpers/ExportManifestTest.cs b/starsky/starskytest/starsky.feature.webhtmlpublish/Helpers/ExportManifestTest.cs index 8c2974d86d..6a8624f8af 100644 --- a/starsky/starskytest/starsky.feature.webhtmlpublish/Helpers/ExportManifestTest.cs +++ b/starsky/starskytest/starsky.feature.webhtmlpublish/Helpers/ExportManifestTest.cs @@ -39,9 +39,9 @@ public async Task ExportManifestTest_Export_JsonCompare() new Dictionary()); var expectedPath = Path.Combine(appSettings.StorageFolder, "_settings.json"); - var output = await + var output = (await StreamToStringHelper.StreamToStringAsync( - storage.ReadStream(expectedPath)); + storage.ReadStream(expectedPath))).Replace("\r\n","\n"); var expectedOutput = $"{{\n \"Name\": \"Test\",\n \"Copy\": {{}},\n \"Slug\": \"test\",\n" + diff --git a/starsky/starskytest/starsky.foundation.platform/Models/AppSettingsTest.cs b/starsky/starskytest/starsky.foundation.platform/Models/AppSettingsTest.cs index c11848d288..0cd891f867 100644 --- a/starsky/starskytest/starsky.foundation.platform/Models/AppSettingsTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Models/AppSettingsTest.cs @@ -581,7 +581,10 @@ public void AppSettingsToTransferObjectConversion() public void TransferObjectToAppSettingsConversion() { // Arrange - var transferObject = new AppSettingsTransferObject { StorageFolder = "Value1/", Verbose = true }; + var transferObject = new AppSettingsTransferObject { + StorageFolder = $"Value1{Path.DirectorySeparatorChar}", + Verbose = true + }; // Act var appSettings = (AppSettings)transferObject; From 141a0e3c5b1f88f75fe8e40c41d6cbcb8a597ca0 Mon Sep 17 00:00:00 2001 From: Dion Date: Sun, 21 Jan 2024 22:32:45 +0100 Subject: [PATCH 21/31] windows tests --- .../Services/UpdateAppSettingsByPathTest.cs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs b/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs index 0a2128250c..2538c1e8b3 100644 --- a/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs +++ b/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.IO; using System.Text.Json; -using System.Text.Json.Serialization; using System.Threading.Tasks; using Microsoft.VisualStudio.TestTools.UnitTesting; using starsky.feature.settings.Services; @@ -13,7 +12,7 @@ namespace starskytest.starsky.feature.settings.Services { - [TestClass] + [TestClass] public class UpdateAppSettingsByPathTests { @@ -60,10 +59,13 @@ public async Task UpdateAppSettingsAsync_ValidInput_Success_CompareJson() await updateAppSettingsByPath.UpdateAppSettingsAsync(appSettingTransferObject); var result = (await StreamToStringHelper.StreamToStringAsync(storage.ReadStream(appSettings.AppSettingsPath))).Replace("\r\n","\n"); - - // Assert - var expectedResult = "{\n \"app\": {\n \"Verbose\": \"true\",\n \"StorageFolder\": \"" + - testFolderPath + "\",\n \"UseLocalDesktopUi\": \"false\"\n }\n}"; + + var storageFolderJson = JsonSerializer.Serialize(testFolderPath, DefaultJsonSerializer.NoNamingPolicy); + + + // Assert + var expectedResult = "{\n \"app\": {\n \"Verbose\": \"true\",\n \"StorageFolder\": " + // rm quotes + storageFolderJson + ",\n \"UseLocalDesktopUi\": \"false\"\n }\n}"; Assert.AreEqual(expectedResult, result); } From f6f8cc15ebb68b8256bf0633ff4d1497fdb39f06 Mon Sep 17 00:00:00 2001 From: Dion Date: Sun, 21 Jan 2024 22:33:20 +0100 Subject: [PATCH 22/31] fix code smells --- .../Services/CleanDemoDataService.cs | 2 +- .../Models/AppSettings.cs | 20 ++++++--- .../starsky/Controllers/UploadController.cs | 2 +- .../Controllers/CacheIndexControllerTest.cs | 2 +- .../Controllers/ImportControllerTest.cs | 2 +- .../ImportThumbnailControllerTest.cs | 2 +- .../Controllers/ThumbnailControllerTest.cs | 4 +- .../Controllers/UploadControllerTest.cs | 10 ++--- .../FakeMocks/FakeIThumbnailService.cs | 5 ++- .../Services/GeoFileDownloadTest.cs | 2 +- .../Services/ImportTest.cs | 2 +- .../Helpers/WebFtpCliTest.cs | 6 +-- .../QueryTest/QueryGetAllRecursiveTest.cs | 9 ++-- .../QueryTest/QueryTest.cs | 2 +- .../TelemetryServiceExceptionTest.cs | 4 ++ .../ContentSecurityPolicyMiddlewareTest.cs | 42 +++++++++++-------- .../Storage/StorageSubPathFilesystemTest.cs | 4 +- 17 files changed, 71 insertions(+), 49 deletions(-) diff --git a/starsky/starsky.feature.demo/Services/CleanDemoDataService.cs b/starsky/starsky.feature.demo/Services/CleanDemoDataService.cs index 7b22bcb694..0e9608688a 100644 --- a/starsky/starsky.feature.demo/Services/CleanDemoDataService.cs +++ b/starsky/starsky.feature.demo/Services/CleanDemoDataService.cs @@ -143,7 +143,7 @@ internal static async Task DownloadAsync(AppSettings appSettings, IHttpClientHelper httpClientHelper, IStorage hostStorage, IStorage subStorage, IWebLogger webLogger) { - if ( !appSettings.DemoData.Any() ) + if ( appSettings.DemoData.Count == 0 ) { webLogger.LogError("DemoData is empty"); return false; diff --git a/starsky/starsky.foundation.platform/Models/AppSettings.cs b/starsky/starsky.foundation.platform/Models/AppSettings.cs index 93ccdc0015..f43650f0a7 100644 --- a/starsky/starsky.foundation.platform/Models/AppSettings.cs +++ b/starsky/starsky.foundation.platform/Models/AppSettings.cs @@ -169,8 +169,10 @@ public string AppVersion [PackageTelemetry] public DateTime AppVersionBuildDateTime => DateAssembly.GetBuildDate(Assembly.GetExecutingAssembly()); - // Can be used in the cli session to select files out of the file database system - private string _storageFolder; + /// + /// Can be used in the cli session to select files out of the file database system + /// + private string _storageFolder = string.Empty; /// /// Main Storage provider on disk @@ -518,7 +520,10 @@ public string ExifToolPath /// true = don't edit public bool IsReadOnly(string f) { - if (!ReadOnlyFolders.Any() ) return false; + if ( ReadOnlyFolders.Count == 0 ) + { + return false; + } var result = ReadOnlyFolders.Find(f.Contains); return result != null; @@ -688,7 +693,12 @@ public string ApplicationInsightsConnectionString { { if ( string.IsNullOrWhiteSpace(ApplicationInsightsConnectionStringPrivate) ) { - return Environment.GetEnvironmentVariable("APPLICATIONINSIGHTS_CONNECTION_STRING"); + var connectionString = + Environment.GetEnvironmentVariable( + "APPLICATIONINSIGHTS_CONNECTION_STRING"); + connectionString = connectionString ??= + string.Empty; + return connectionString; } return ApplicationInsightsConnectionStringPrivate; } @@ -1054,7 +1064,7 @@ private string _pathToFilePathStyle(string subPath) /// databaseFilePath /// checkIfExist /// - public string DatabasePathToFilePath(string databaseFilePath, bool checkIfExist = true) + public string? DatabasePathToFilePath(string databaseFilePath, bool checkIfExist = true) { var filepath = StorageFolder + databaseFilePath; diff --git a/starsky/starsky/Controllers/UploadController.cs b/starsky/starsky/Controllers/UploadController.cs index e65d41e436..14d440c066 100644 --- a/starsky/starsky/Controllers/UploadController.cs +++ b/starsky/starsky/Controllers/UploadController.cs @@ -287,7 +287,7 @@ public async Task UploadToFolderSidecarFile() _logger.LogInformation($"delete {tempImportSinglePath} is {deleteStatus}"); } - if ( !importedList.Any() ) + if ( importedList.Count == 0 ) { Response.StatusCode = 415; } diff --git a/starsky/starskytest/Controllers/CacheIndexControllerTest.cs b/starsky/starskytest/Controllers/CacheIndexControllerTest.cs index 82b6bbcfcb..da9cab487c 100644 --- a/starsky/starskytest/Controllers/CacheIndexControllerTest.cs +++ b/starsky/starskytest/Controllers/CacheIndexControllerTest.cs @@ -29,7 +29,7 @@ namespace starskytest.Controllers [TestClass] public sealed class CacheIndexControllerTest { - private readonly IQuery _query; + private readonly Query _query; private readonly AppSettings _appSettings; private readonly ApplicationDbContext _context; diff --git a/starsky/starskytest/Controllers/ImportControllerTest.cs b/starsky/starskytest/Controllers/ImportControllerTest.cs index 95b4ccc816..7c01a0d793 100644 --- a/starsky/starskytest/Controllers/ImportControllerTest.cs +++ b/starsky/starskytest/Controllers/ImportControllerTest.cs @@ -68,7 +68,7 @@ public ImportControllerTest() private static ControllerContext RequestWithFile() { var httpContext = new DefaultHttpContext(); - httpContext.Request.Headers.Add("Content-Type", "application/octet-stream"); + httpContext.Request.Headers.Append("Content-Type", "application/octet-stream"); httpContext.Request.Body = new MemoryStream(CreateAnImage.Bytes.ToArray()); var actionContext = new ActionContext(httpContext, new RouteData(), diff --git a/starsky/starskytest/Controllers/ImportThumbnailControllerTest.cs b/starsky/starskytest/Controllers/ImportThumbnailControllerTest.cs index adcb2b556f..1b7497586e 100644 --- a/starsky/starskytest/Controllers/ImportThumbnailControllerTest.cs +++ b/starsky/starskytest/Controllers/ImportThumbnailControllerTest.cs @@ -33,7 +33,7 @@ public ImportThumbnailControllerTest() private static ControllerContext RequestWithFile() { var httpContext = new DefaultHttpContext(); - httpContext.Request.Headers.Add("Content-Type", "application/octet-stream"); + httpContext.Request.Headers.Append("Content-Type", "application/octet-stream"); httpContext.Request.Body = new MemoryStream(CreateAnImage.Bytes.ToArray()); var actionContext = new ActionContext(httpContext, new RouteData(), diff --git a/starsky/starskytest/Controllers/ThumbnailControllerTest.cs b/starsky/starskytest/Controllers/ThumbnailControllerTest.cs index d4309bf5b3..d2f2ee5aa6 100644 --- a/starsky/starskytest/Controllers/ThumbnailControllerTest.cs +++ b/starsky/starskytest/Controllers/ThumbnailControllerTest.cs @@ -28,7 +28,7 @@ namespace starskytest.Controllers [TestClass] public sealed class ThumbnailControllerTest { - private readonly IQuery _query; + private readonly Query _query; public ThumbnailControllerTest() { @@ -63,7 +63,7 @@ private async Task InsertSearchData() return item; } - private static IStorage ArrangeStorage() + private static FakeIStorage ArrangeStorage() { var folderPaths = new List{"/"}; var inputSubPaths = new List{"/test.jpg","/test2.jpg", "/test.dng"}; diff --git a/starsky/starskytest/Controllers/UploadControllerTest.cs b/starsky/starskytest/Controllers/UploadControllerTest.cs index 50b28c15dd..960b6fd506 100644 --- a/starsky/starskytest/Controllers/UploadControllerTest.cs +++ b/starsky/starskytest/Controllers/UploadControllerTest.cs @@ -39,8 +39,8 @@ namespace starskytest.Controllers [TestClass] public sealed class UploadControllerTest { - private readonly IQuery _query; - private readonly IStorage _iStorage; + private readonly Query _query; + private readonly FakeIStorage _iStorage; private readonly AppSettings _appSettings; private readonly Import _import; private readonly IMemoryCache _memoryCache; @@ -107,7 +107,7 @@ private static ControllerContext RequestWithFile(byte[] bytes = null) // ReSharper disable once ConvertIfStatementToNullCoalescingAssignment if ( bytes == null ) bytes = CreateAnImage.Bytes.ToArray(); var httpContext = new DefaultHttpContext(); - httpContext.Request.Headers.Add("Content-Type", "application/octet-stream"); + httpContext.Request.Headers.Append("Content-Type", "application/octet-stream"); httpContext.Request.Body = new MemoryStream(bytes); var actionContext = new ActionContext(httpContext, new RouteData(), new ControllerActionDescriptor()); @@ -359,7 +359,7 @@ public void GetParentDirectoryFromRequestHeader_InputToAsSubPath_TestDirectFolde public void GetParentDirectoryFromRequestHeader_InputToAsSubPath_NonExistFolder() { var controllerContext = RequestWithFile(); - controllerContext.HttpContext.Request.Headers.Add("to", "/non-exist/test.jpg"); + controllerContext.HttpContext.Request.Headers.Append("to", "/non-exist/test.jpg"); var controller = new UploadController(_import, _appSettings, @@ -381,7 +381,7 @@ public void GetParentDirectoryFromRequestHeader_InputToAsSubPath_NonExistFolder( private static ControllerContext RequestWithSidecar() { var httpContext = new DefaultHttpContext(); - httpContext.Request.Headers.Add("Content-Type", "application/octet-stream"); + httpContext.Request.Headers.Append("Content-Type", "application/octet-stream"); httpContext.Request.Body = new MemoryStream(CreateAnXmp.Bytes.ToArray()); var actionContext = new ActionContext(httpContext, new RouteData(), new ControllerActionDescriptor()); diff --git a/starsky/starskytest/FakeMocks/FakeIThumbnailService.cs b/starsky/starskytest/FakeMocks/FakeIThumbnailService.cs index 791741d510..336572c360 100644 --- a/starsky/starskytest/FakeMocks/FakeIThumbnailService.cs +++ b/starsky/starskytest/FakeMocks/FakeIThumbnailService.cs @@ -30,12 +30,13 @@ public FakeIThumbnailService(FakeSelectorStorage? selectorStorage = null, Except public Task> CreateThumbnailAsync(string subPath) { if ( _exception != null ) throw _exception; + if ( _subPathStorage == null ) throw new NullReferenceException("_subPathStorage not be null"); - _subPathStorage?.WriteStream( + _subPathStorage.WriteStream( StringToStreamHelper.StringToStream("test"), subPath); Inputs.Add(new Tuple(subPath, null)); - var items = _subPathStorage?.GetAllFilesInDirectory(subPath); + var items = _subPathStorage.GetAllFilesInDirectory(subPath); if ( items == null ) { return Task.FromResult(new List{new GenerationResultModel() diff --git a/starsky/starskytest/starsky.feature.geolookup/Services/GeoFileDownloadTest.cs b/starsky/starskytest/starsky.feature.geolookup/Services/GeoFileDownloadTest.cs index c88b976def..7e13fca7c5 100644 --- a/starsky/starskytest/starsky.feature.geolookup/Services/GeoFileDownloadTest.cs +++ b/starsky/starskytest/starsky.feature.geolookup/Services/GeoFileDownloadTest.cs @@ -126,7 +126,7 @@ await storage.WriteStreamAsync(StringToStreamHelper.StringToStream("1"), await geoFileDownload.DownloadAsync(); // Assert - Assert.IsTrue(!httpClientHelper.UrlsCalled.Any()); + Assert.IsTrue(httpClientHelper.UrlsCalled.Count == 0); storage.FolderDelete(_dependenciesFolder3); } diff --git a/starsky/starskytest/starsky.feature.import/Services/ImportTest.cs b/starsky/starskytest/starsky.feature.import/Services/ImportTest.cs index a911e81a06..a775905824 100644 --- a/starsky/starskytest/starsky.feature.import/Services/ImportTest.cs +++ b/starsky/starskytest/starsky.feature.import/Services/ImportTest.cs @@ -430,7 +430,7 @@ public async Task Importer_EmptyDirectory() new ImportSettingsModel()); Assert.IsNotNull(result); - Assert.IsTrue(!result.Any()); + Assert.IsTrue(result.Count == 0); } [TestMethod] diff --git a/starsky/starskytest/starsky.feature.webftppublish/Helpers/WebFtpCliTest.cs b/starsky/starskytest/starsky.feature.webftppublish/Helpers/WebFtpCliTest.cs index 514dc5f82b..75606904d5 100644 --- a/starsky/starskytest/starsky.feature.webftppublish/Helpers/WebFtpCliTest.cs +++ b/starsky/starskytest/starsky.feature.webftppublish/Helpers/WebFtpCliTest.cs @@ -42,7 +42,7 @@ public async Task Run_Help() { var console = new FakeConsoleWrapper(); await new WebFtpCli(_appSettings, new FakeSelectorStorage(), console,_webRequestFactory ) - .RunAsync(new []{"-h"}); + .RunAsync(["-h"]); Assert.IsTrue(console.WrittenLines.FirstOrDefault()?.Contains("Starsky WebFtp Cli ~ Help:")); Assert.IsTrue(console.WrittenLines.LastOrDefault()?.Contains(" use -v -help to show settings: ")); @@ -63,7 +63,7 @@ public async Task Run_PathArg() { var console = new FakeConsoleWrapper(); await new WebFtpCli(_appSettings, new FakeSelectorStorage(), console, _webRequestFactory) - .RunAsync(new []{"-p"}); + .RunAsync(["-p"]); Assert.IsTrue(console.WrittenLines.LastOrDefault()?.Contains("is not found")); } @@ -88,7 +88,7 @@ public async Task Run_NoSettingsFileInFolder() var fakeSelectorStorage = new FakeSelectorStorage(new FakeIStorage(new List{"/test"})); await new WebFtpCli(_appSettings,fakeSelectorStorage , console, _webRequestFactory) - .RunAsync(new []{"-p", "/test"}); + .RunAsync(["-p", "/test"]); Assert.IsTrue(console.WrittenLines.LastOrDefault()?.Contains("generate a settings file")); } diff --git a/starsky/starskytest/starsky.foundation.database/QueryTest/QueryGetAllRecursiveTest.cs b/starsky/starskytest/starsky.foundation.database/QueryTest/QueryGetAllRecursiveTest.cs index 767d04c250..f72a2bcaeb 100644 --- a/starsky/starskytest/starsky.foundation.database/QueryTest/QueryGetAllRecursiveTest.cs +++ b/starsky/starskytest/starsky.foundation.database/QueryTest/QueryGetAllRecursiveTest.cs @@ -22,10 +22,9 @@ namespace starskytest.starsky.foundation.database.QueryTest [TestClass] public sealed class QueryGetAllRecursiveTest { - private readonly IMemoryCache? _memoryCache; - private readonly IQuery _query; + private readonly Query _query; - private IServiceScopeFactory CreateNewScope() + private static IServiceScopeFactory CreateNewScope() { var services = new ServiceCollection(); services.AddDbContext(options => options.UseInMemoryDatabase(nameof(QueryGetAllFilesTest))); @@ -38,12 +37,12 @@ public QueryGetAllRecursiveTest() var provider = new ServiceCollection() .AddMemoryCache() .BuildServiceProvider(); - _memoryCache = provider.GetService(); + var memoryCache = provider.GetService(); var serviceScope = CreateNewScope(); var scope = serviceScope.CreateScope(); var dbContext = scope.ServiceProvider.GetRequiredService(); _query = new Query(dbContext, - new AppSettings{Verbose = true}, serviceScope, new FakeIWebLogger(),_memoryCache); + new AppSettings{Verbose = true}, serviceScope, new FakeIWebLogger(),memoryCache); } [TestMethod] diff --git a/starsky/starskytest/starsky.foundation.database/QueryTest/QueryTest.cs b/starsky/starskytest/starsky.foundation.database/QueryTest/QueryTest.cs index 8364f825bd..f15c16fad0 100644 --- a/starsky/starskytest/starsky.foundation.database/QueryTest/QueryTest.cs +++ b/starsky/starskytest/starsky.foundation.database/QueryTest/QueryTest.cs @@ -1106,7 +1106,7 @@ public void CacheUpdateItem_Skip_ShouldSetItem() // already verbose _query.CacheUpdateItem(new List{item1}); - Assert.IsTrue(_logger.TrackedInformation.Any()); + Assert.IsTrue(_logger.TrackedInformation.Count != 0); Assert.IsTrue(_logger.TrackedInformation.FirstOrDefault().Item2.Contains("[CacheUpdateItem]")); } diff --git a/starsky/starskytest/starsky.foundation.platform/Exceptions/TelemetryServiceExceptionTest.cs b/starsky/starskytest/starsky.foundation.platform/Exceptions/TelemetryServiceExceptionTest.cs index 706f66d2bb..b81a0cc3b5 100644 --- a/starsky/starskytest/starsky.foundation.platform/Exceptions/TelemetryServiceExceptionTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Exceptions/TelemetryServiceExceptionTest.cs @@ -16,8 +16,10 @@ public class TelemetryServiceExceptionTest [ExpectedException(typeof(TelemetryServiceException))] public void TelemetryServiceException() { +#pragma warning disable SYSLIB0050 var info = new SerializationInfo(typeof(Exception), new FormatterConverter()); +#pragma warning restore SYSLIB0050 info.AddValue("Message", ""); info.AddValue("InnerException", new Exception()); @@ -34,7 +36,9 @@ public void TelemetryServiceException() ( TelemetryServiceException ) ctor!.Invoke(new object[] { info, +#pragma warning disable SYSLIB0050 new StreamingContext(StreamingContextStates.All) +#pragma warning restore SYSLIB0050 }); throw instance; diff --git a/starsky/starskytest/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddlewareTest.cs b/starsky/starskytest/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddlewareTest.cs index 09e15e9c6d..9510010239 100644 --- a/starsky/starskytest/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddlewareTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddlewareTest.cs @@ -35,14 +35,16 @@ public async Task MiddlewareExtensionsTest_CSPBasicSetupTest() public async Task ContentSecurityPolicyMiddlewareTest_invoke_testContent() { // Arrange - var httpContext = new DefaultHttpContext(); - httpContext.Request.Scheme = "http"; + var httpContext = new DefaultHttpContext { Request = + { + Scheme = "http" + } }; var authMiddleware = new ContentSecurityPolicyMiddleware(next: (_) => Task.FromResult(0)); // Act await authMiddleware.Invoke(httpContext); //test - var csp = httpContext.Response.Headers["Content-Security-Policy"].ToString(); + var csp = httpContext.Response.Headers.ContentSecurityPolicy.ToString(); Assert.AreEqual(true,csp.Contains("default-src")); Assert.AreEqual(true,csp.Contains("ws://")); } @@ -59,7 +61,7 @@ public async Task invoke_httpsTest_websockets() // Act await authMiddleware.Invoke(httpContext); //test - var csp = httpContext.Response.Headers["Content-Security-Policy"].ToString(); + var csp = httpContext.Response.Headers.ContentSecurityPolicy.ToString(); Assert.AreEqual(true,csp.Contains("default-src")); Assert.AreEqual(true,csp.Contains("wss://")); @@ -69,16 +71,18 @@ public async Task invoke_httpsTest_websockets() public async Task invoke_httpsTest_websockets_localhostWithPort9000() { // Arrange - var httpContext = new DefaultHttpContext(); - httpContext.Request.Scheme = "https"; - httpContext.Request.Host = new HostString("localhost", 9000); - + var httpContext = new DefaultHttpContext { Request = + { + Scheme = "https", + Host = new HostString("localhost", 9000) + } }; + var authMiddleware = new ContentSecurityPolicyMiddleware(next: (_) => Task.FromResult(0)); // Act await authMiddleware.Invoke(httpContext); //test - var csp = httpContext.Response.Headers["Content-Security-Policy"].ToString(); + var csp = httpContext.Response.Headers.ContentSecurityPolicy.ToString(); Assert.AreEqual(true,csp.Contains("default-src")); Assert.AreEqual(true,csp.Contains("wss://localhost")); @@ -89,16 +93,18 @@ public async Task invoke_httpsTest_websockets_localhostWithPort9000() public async Task invoke_httpsTest_websockets_localhostWithNoPort() { // Arrange - var httpContext = new DefaultHttpContext(); - httpContext.Request.Scheme = "https"; - httpContext.Request.Host = new HostString("localhost"); - + var httpContext = new DefaultHttpContext { Request = + { + Scheme = "https", + Host = new HostString("localhost") + } }; + var authMiddleware = new ContentSecurityPolicyMiddleware(next: (_) => Task.FromResult(0)); // Act await authMiddleware.Invoke(httpContext); //test - var csp = httpContext.Response.Headers["Content-Security-Policy"].ToString(); + var csp = httpContext.Response.Headers.ContentSecurityPolicy.ToString(); Assert.AreEqual(true,csp.Contains("default-src")); Assert.AreEqual(true,csp.Contains("wss://localhost")); @@ -109,8 +115,10 @@ public async Task invoke_httpsTest_websockets_localhostWithNoPort() public async Task ContentSecurityPolicyMiddlewareTest_invoke_otherTypes() { // Arrange - var httpContext = new DefaultHttpContext(); - httpContext.Request.Scheme = "http"; + var httpContext = new DefaultHttpContext { Request = + { + Scheme = "http" + } }; var authMiddleware = new ContentSecurityPolicyMiddleware((_) => Task.FromResult(0)); // Act @@ -148,7 +156,7 @@ public async Task // Act await authMiddleware.Invoke(httpContext); - var csp = httpContext.Response.Headers["Content-Security-Policy"].ToString(); + var csp = httpContext.Response.Headers.ContentSecurityPolicy.ToString(); Assert.AreEqual(true,csp.Contains("require-trusted-types-for")); } diff --git a/starsky/starskytest/starsky.foundation.storage/Storage/StorageSubPathFilesystemTest.cs b/starsky/starskytest/starsky.foundation.storage/Storage/StorageSubPathFilesystemTest.cs index 20490071bc..bec714c693 100644 --- a/starsky/starskytest/starsky.foundation.storage/Storage/StorageSubPathFilesystemTest.cs +++ b/starsky/starskytest/starsky.foundation.storage/Storage/StorageSubPathFilesystemTest.cs @@ -37,7 +37,7 @@ public void StorageFilesystem_GetAllFilesDirectoryTest() _storage.CreateDirectory("/test"); var filesInFolder = _storage.GetDirectoryRecursive("/").Select(p => p.Key).ToList(); - Assert.AreEqual(true,filesInFolder.Any()); + Assert.AreEqual(true,filesInFolder.Count != 0); _storage.FolderDelete("/test"); } @@ -76,7 +76,7 @@ public void GetAllFilesInDirectoryRecursive() var filesInFolder = _storage.GetAllFilesInDirectoryRecursive( "/test_GetAllFilesInDirectoryRecursive").ToList(); - Assert.AreEqual(true,filesInFolder.Any()); + Assert.AreEqual(true,filesInFolder.Count != 0); Assert.AreEqual("/test_GetAllFilesInDirectoryRecursive/test", filesInFolder[0]); Assert.AreEqual("/test_GetAllFilesInDirectoryRecursive/test/already_09010.tmp", filesInFolder[1]); From b7b9998a1ed8c8389618ce079012a64ea04660d0 Mon Sep 17 00:00:00 2001 From: Dion Date: Sun, 21 Jan 2024 22:34:41 +0100 Subject: [PATCH 23/31] fix tests --- .../ThumbnailGenerationControllerTest.cs | 7 +++++-- .../ManualThumbnailGenerationServiceTest.cs | 6 ++++-- .../Helpers/ThumbnailCliTest.cs | 20 +++++++++---------- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/starsky/starskytest/Controllers/ThumbnailGenerationControllerTest.cs b/starsky/starskytest/Controllers/ThumbnailGenerationControllerTest.cs index b5aa2949a5..70a832cfe2 100644 --- a/starsky/starskytest/Controllers/ThumbnailGenerationControllerTest.cs +++ b/starsky/starskytest/Controllers/ThumbnailGenerationControllerTest.cs @@ -30,8 +30,11 @@ public ThumbnailGenerationControllerTest() public async Task ThumbnailGeneration_Endpoint() { var selectorStorage = new FakeSelectorStorage(new FakeIStorage(new List{"/"})); - var controller = new ThumbnailGenerationController(selectorStorage, new ManualThumbnailGenerationService( new FakeIQuery(), - new FakeIWebLogger(), new FakeIWebSocketConnectionsService(), new FakeIThumbnailService(), new FakeThumbnailBackgroundTaskQueue())); + var controller = new ThumbnailGenerationController(selectorStorage, + new ManualThumbnailGenerationService( new FakeIQuery(), + new FakeIWebLogger(), new FakeIWebSocketConnectionsService(), + new FakeIThumbnailService(selectorStorage), + new FakeThumbnailBackgroundTaskQueue())); var json = await controller.ThumbnailGeneration("/") as JsonResult; Assert.IsNotNull(json); diff --git a/starsky/starskytest/starsky.feature.thumbnail/Services/ManualThumbnailGenerationServiceTest.cs b/starsky/starskytest/starsky.feature.thumbnail/Services/ManualThumbnailGenerationServiceTest.cs index 3beb4fb47b..33a3b9184f 100644 --- a/starsky/starskytest/starsky.feature.thumbnail/Services/ManualThumbnailGenerationServiceTest.cs +++ b/starsky/starskytest/starsky.feature.thumbnail/Services/ManualThumbnailGenerationServiceTest.cs @@ -26,7 +26,8 @@ public async Task ThumbnailGenerationTest_CheckIfGenerated() var selectorStorage = new FakeSelectorStorage(storage); var controller = new ManualThumbnailGenerationService( new FakeIQuery( new List{new FileIndexItem("/test.jpg")} - ), new FakeIWebLogger(), new FakeIWebSocketConnectionsService(), new FakeIThumbnailService(selectorStorage), new FakeThumbnailBackgroundTaskQueue()); + ), new FakeIWebLogger(), new FakeIWebSocketConnectionsService(), + new FakeIThumbnailService(selectorStorage), new FakeThumbnailBackgroundTaskQueue()); await controller.WorkThumbnailGeneration("/"); @@ -59,7 +60,8 @@ public async Task ThumbnailGenerationTest_CheckIfGenerated_Socket_NoResultsInDat { var socket = new FakeIWebSocketConnectionsService(); var controller = new ManualThumbnailGenerationService( new FakeIQuery( - new List()), new FakeIWebLogger(), socket, new FakeIThumbnailService(), new FakeThumbnailBackgroundTaskQueue()); + new List()), new FakeIWebLogger(), socket, + new FakeIThumbnailService(new FakeSelectorStorage()), new FakeThumbnailBackgroundTaskQueue()); await controller.WorkThumbnailGeneration("/"); diff --git a/starsky/starskytest/starsky.foundation.thumbnailgeneration/Helpers/ThumbnailCliTest.cs b/starsky/starskytest/starsky.foundation.thumbnailgeneration/Helpers/ThumbnailCliTest.cs index 48df5727da..cf561279e4 100644 --- a/starsky/starskytest/starsky.foundation.thumbnailgeneration/Helpers/ThumbnailCliTest.cs +++ b/starsky/starskytest/starsky.foundation.thumbnailgeneration/Helpers/ThumbnailCliTest.cs @@ -20,7 +20,7 @@ public async Task Thumbnail_NoArgs_Assume_T_True() var fakeConsole = new FakeConsoleWrapper(); var storage = new FakeIStorage(new List {"/"}, new List {"/test.jpg"}); var thumbnailService = new ThumbnailCli(new AppSettings(), fakeConsole, - new FakeIThumbnailService(), new FakeIThumbnailCleaner(), + new FakeIThumbnailService(new FakeSelectorStorage(storage)), new FakeIThumbnailCleaner(), new FakeSelectorStorage(storage)); await thumbnailService.Thumbnail(Array.Empty()); @@ -76,9 +76,9 @@ public async Task Thumbnail_Disable_T_Param() public async Task Thumbnail_MinusP_FullPath() { var fakeConsole = new FakeConsoleWrapper(); - var fakeIThumbnailService = new FakeIThumbnailService(); - var appSettings = new AppSettings(); var storage = new FakeIStorage(new List {"/"}, new List {"/test.jpg"}); + var fakeIThumbnailService = new FakeIThumbnailService(new FakeSelectorStorage(storage)); + var appSettings = new AppSettings(); var thumbnailService = new ThumbnailCli(appSettings, fakeConsole, fakeIThumbnailService, new FakeIThumbnailCleaner(), new FakeSelectorStorage(storage)); @@ -92,9 +92,9 @@ public async Task Thumbnail_MinusP_FullPath() public async Task Thumbnail_MinusS_SubPath() { var fakeConsole = new FakeConsoleWrapper(); - var fakeIThumbnailService = new FakeIThumbnailService(); - var appSettings = new AppSettings(); var storage = new FakeIStorage(new List {"/"}, new List {"/test.jpg"}); + var fakeIThumbnailService = new FakeIThumbnailService(new FakeSelectorStorage(storage)); + var appSettings = new AppSettings(); var thumbnailService = new ThumbnailCli(appSettings, fakeConsole, fakeIThumbnailService, new FakeIThumbnailCleaner(), new FakeSelectorStorage(storage)); @@ -108,9 +108,9 @@ public async Task Thumbnail_MinusS_SubPath() public async Task Thumbnail_MinusS_SubPath_Direct() { var fakeConsole = new FakeConsoleWrapper(); - var fakeIThumbnailService = new FakeIThumbnailService(); - var appSettings = new AppSettings(); var storage = new FakeIStorage(new List {"/"}, new List {"/test.jpg"}); + var fakeIThumbnailService = new FakeIThumbnailService(new FakeSelectorStorage(storage)); + var appSettings = new AppSettings(); var thumbnailService = new ThumbnailCli(appSettings, fakeConsole, fakeIThumbnailService, new FakeIThumbnailCleaner(), new FakeSelectorStorage(storage)); @@ -127,9 +127,9 @@ public async Task Thumbnail_MinusS_SubPath_Direct() public async Task Thumbnail_MinusG_Relative() { var fakeConsole = new FakeConsoleWrapper(); - var fakeIThumbnailService = new FakeIThumbnailService(); - var appSettings = new AppSettings(); var storage = new FakeIStorage(new List {"/"}, new List {"/test.jpg"}); + var fakeIThumbnailService = new FakeIThumbnailService(new FakeSelectorStorage(storage)); + var appSettings = new AppSettings(); var thumbnailService = new ThumbnailCli(appSettings, fakeConsole, fakeIThumbnailService, new FakeIThumbnailCleaner(), new FakeSelectorStorage(storage)); @@ -149,7 +149,7 @@ public async Task Thumbnail_MinusX_CleanAllUnusedFiles() var storage = new FakeIStorage(new List {"/"}, new List {"/test.jpg"}); var fakeIThumbnailCleaner = new FakeIThumbnailCleaner(); var thumbnailService = new ThumbnailCli(new AppSettings(), fakeConsole, - new FakeIThumbnailService(), fakeIThumbnailCleaner, + new FakeIThumbnailService(new FakeSelectorStorage(storage)), fakeIThumbnailCleaner, new FakeSelectorStorage(storage)); await thumbnailService.Thumbnail(new []{"--clean","true"}); From 8f059186bae48614b88a62458e4bad4f23a16248 Mon Sep 17 00:00:00 2001 From: Dion Date: Sun, 21 Jan 2024 22:35:07 +0100 Subject: [PATCH 24/31] code smells --- .../Services/GeoCli.cs | 9 ++--- .../Models/AppSettings.cs | 36 +++++++++---------- starsky/starsky.sln.DotSettings | 1 + .../FakeMocks/FakeReadMetaSubPathStorage.cs | 2 +- starsky/starskytest/root/ProgramTest.cs | 2 +- .../Helpers/WebFtpCliTest.cs | 6 ++-- .../ContentSecurityPolicyMiddlewareTest.cs | 26 +++++++------- .../Services/ReadMeta_ExifReadTest.cs | 8 +++-- .../DisabledWebSocketsMiddlewareTest.cs | 6 ++-- .../Helpers/ThumbnailCliTest.cs | 17 ++++----- .../Helpers/ExifToolDownloadTest.cs | 10 +++--- 11 files changed, 65 insertions(+), 58 deletions(-) diff --git a/starsky/starsky.feature.geolookup/Services/GeoCli.cs b/starsky/starsky.feature.geolookup/Services/GeoCli.cs index 2d17454d8e..274ef94924 100644 --- a/starsky/starsky.feature.geolookup/Services/GeoCli.cs +++ b/starsky/starsky.feature.geolookup/Services/GeoCli.cs @@ -8,7 +8,6 @@ using starsky.foundation.platform.Helpers; using starsky.foundation.platform.Interfaces; using starsky.foundation.platform.Models; -using starsky.foundation.readmeta.Interfaces; using starsky.foundation.readmeta.Services; using starsky.foundation.storage.Interfaces; using starsky.foundation.storage.Models; @@ -87,9 +86,10 @@ public async Task CommandLineAsync(string[] args) // -s = if subPath || -p is path if ( ArgsHelper.IsSubPathOrPath(args) ) { - inputPath = _appSettings.DatabasePathToFilePath( + var path = _appSettings.DatabasePathToFilePath( ArgsHelper.GetSubPathFormArgs(args) ); + inputPath = !string.IsNullOrEmpty(path) ? path : string.Empty; } else { @@ -103,9 +103,10 @@ public async Task CommandLineAsync(string[] args) if (getSubPathRelative != null) { var dateTime = DateTime.Now.AddDays(( double ) getSubPathRelative); - inputPath = _appSettings.DatabasePathToFilePath( + var path = _appSettings.DatabasePathToFilePath( new StructureService(_iStorage, _appSettings.Structure) - .ParseSubfolders(dateTime),false); + .ParseSubfolders(dateTime), false); + inputPath = !string.IsNullOrEmpty(path) ? path : string.Empty; } // used in this session to find the files back diff --git a/starsky/starsky.foundation.platform/Models/AppSettings.cs b/starsky/starsky.foundation.platform/Models/AppSettings.cs index f43650f0a7..b4197dc60d 100644 --- a/starsky/starsky.foundation.platform/Models/AppSettings.cs +++ b/starsky/starsky.foundation.platform/Models/AppSettings.cs @@ -2,7 +2,6 @@ using System.Text.Json.Serialization; using System; using System.Collections.Generic; -using System.ComponentModel; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Linq; @@ -209,7 +208,7 @@ public bool IsVerbose() // Used in the webHtmlCli to store the log item name // used for the url - private string _name; + private string? _name; [PackageTelemetry] public string Name @@ -284,7 +283,7 @@ public enum DatabaseTypeList } // DatabaseType > above this one - private string _databaseConnection; + private string _databaseConnection = string.Empty; /// /// Connection string for the database @@ -302,7 +301,7 @@ public string DatabaseConnection /// /// Internal Structure save location /// - private string _structure; + private string? _structure; /// /// Auto storage structure @@ -372,7 +371,7 @@ internal static TimeZoneInfo ConvertTimeZoneId(string value) } [JsonIgnore] - public TimeZoneInfo CameraTimeZoneInfo { get; set; } + public TimeZoneInfo? CameraTimeZoneInfo { get; set; } /// /// To Check if the structure is any good @@ -396,14 +395,14 @@ public static void StructureCheck(string structure) /// /// Private: Location of storage of Thumbnails /// - private string _thumbnailTempFolder; + private string? _thumbnailTempFolder; /// /// Location of storage of Thumbnails /// public string ThumbnailTempFolder { - get => _thumbnailTempFolder; + get => _thumbnailTempFolder ??= string.Empty; set { var thumbnailTempFolder = ReplaceEnvironmentVariable(value); @@ -414,7 +413,7 @@ public string ThumbnailTempFolder /// /// Private: Location of temp folder /// - private string _tempFolder; + private string? _tempFolder; /// /// Location of temp folder @@ -432,7 +431,7 @@ public string TempFolder /// /// Private: Location of dependencies folder /// - private string _dependenciesFolder; + private string? _dependenciesFolder; /// /// Location of dependencies folder @@ -450,7 +449,7 @@ public string DependenciesFolder /// /// Private: Location of AppSettings Path /// - private string _appSettingsPathPrivate; + private string? _appSettingsPathPrivate; /// /// To store the settings by user in the AppData folder @@ -471,7 +470,7 @@ public string AppSettingsPath /// /// Private Location of ExifTool.exe /// - private string ExifToolPathPrivate { get; set; } + private string? ExifToolPathPrivate { get; set; } /// /// Set in ctor on startup @@ -575,7 +574,7 @@ public bool IsReadOnly(string f) /// /// Internal location for webFtp credentials /// - private string _webFtp; + private string? _webFtp; /// /// Connection string for FTP @@ -613,7 +612,7 @@ public string WebFtp /// Publishing profiles used within the publishing module (Order by Key) /// [PackageTelemetry] - public Dictionary> PublishProfiles { + public Dictionary>? PublishProfiles { get => PublishProfilesPrivate; set { @@ -661,7 +660,7 @@ public Dictionary> PublishProfiles { /// /// { "demo@qdraw.nl": "Administrator" } /// - public Dictionary AccountRolesByEmailRegisterOverwrite { + public Dictionary? AccountRolesByEmailRegisterOverwrite { get => AccountRolesByEmailRegisterOverwritePrivate; init { @@ -696,9 +695,7 @@ public string ApplicationInsightsConnectionString { var connectionString = Environment.GetEnvironmentVariable( "APPLICATIONINSIGHTS_CONNECTION_STRING"); - connectionString = connectionString ??= - string.Empty; - return connectionString; + return !string.IsNullOrEmpty(connectionString) ? connectionString : string.Empty ; } return ApplicationInsightsConnectionStringPrivate; } @@ -857,8 +854,9 @@ public bool? EnablePackageTelemetry // ------------------- Modifiers ------------------- // ------------------------------------------------- - private string AssemblyDirectoryReplacer(string value) + private string AssemblyDirectoryReplacer(string? value) { + value ??= string.Empty; return value.Replace("{AssemblyDirectory}", BaseDirectoryProject); } @@ -891,7 +889,7 @@ private string AssemblyDirectoryReplacer(string value) /// public bool? ExiftoolSkipDownloadOnStartup { get; set; } = false; - public OpenTelemetrySettings OpenTelemetry { get; set; } = + public OpenTelemetrySettings? OpenTelemetry { get; set; } = new OpenTelemetrySettings(); /// AppSettings duplicated diff --git a/starsky/starsky.sln.DotSettings b/starsky/starsky.sln.DotSettings index 391011bceb..e416a4928a 100644 --- a/starsky/starsky.sln.DotSettings +++ b/starsky/starsky.sln.DotSettings @@ -11,6 +11,7 @@ True True True + True True True True diff --git a/starsky/starskytest/FakeMocks/FakeReadMetaSubPathStorage.cs b/starsky/starskytest/FakeMocks/FakeReadMetaSubPathStorage.cs index 9bf49638ec..32369db11c 100644 --- a/starsky/starskytest/FakeMocks/FakeReadMetaSubPathStorage.cs +++ b/starsky/starskytest/FakeMocks/FakeReadMetaSubPathStorage.cs @@ -8,7 +8,7 @@ namespace starskytest.FakeMocks { public class FakeReadMetaSubPathStorage : IReadMetaSubPathStorage { - private readonly IReadMeta _readMeta; + private readonly FakeReadMeta _readMeta; public FakeReadMetaSubPathStorage() { diff --git a/starsky/starskytest/root/ProgramTest.cs b/starsky/starskytest/root/ProgramTest.cs index 3ee9bada68..cabdc0b1cb 100644 --- a/starsky/starskytest/root/ProgramTest.cs +++ b/starsky/starskytest/root/ProgramTest.cs @@ -61,7 +61,7 @@ public async Task Program_Main_NoAddress_UnixOnly() Environment.SetEnvironmentVariable("app__ExiftoolSkipDownloadOnStartup","true"); Environment.SetEnvironmentVariable("app__EnablePackageTelemetry","false"); - await Program.Main(new []{"--do-not-start"}); + await Program.Main(["--do-not-start"]); using HttpClient client = new(); await client.GetAsync("http://localhost:7514").TimeoutAfter(3000); diff --git a/starsky/starskytest/starsky.feature.webftppublish/Helpers/WebFtpCliTest.cs b/starsky/starskytest/starsky.feature.webftppublish/Helpers/WebFtpCliTest.cs index 75606904d5..9339c94672 100644 --- a/starsky/starskytest/starsky.feature.webftppublish/Helpers/WebFtpCliTest.cs +++ b/starsky/starskytest/starsky.feature.webftppublish/Helpers/WebFtpCliTest.cs @@ -53,7 +53,7 @@ public async Task Run_Default() { var console = new FakeConsoleWrapper(); await new WebFtpCli(_appSettings, new FakeSelectorStorage(), console, _webRequestFactory) - .RunAsync(new []{""}); + .RunAsync([""]); Assert.IsTrue(console.WrittenLines.FirstOrDefault()?.Contains("Please use the -p to add a path first")); } @@ -76,7 +76,7 @@ public async Task Run_NoFtpSettings() // no ftp settings await new WebFtpCli(new AppSettings(),fakeSelectorStorage , console, _webRequestFactory) - .RunAsync(new []{"-p", "/test"}); + .RunAsync(["-p", "/test"]); Assert.IsTrue(console.WrittenLines.LastOrDefault()?.Contains("WebFtp settings")); } @@ -104,7 +104,7 @@ public async Task Run_SettingsFile_successful() // instead of new byte[0] await new WebFtpCli(_appSettings, fakeSelectorStorage , console, _webRequestFactory) - .RunAsync(new []{"-p", "/test"}); + .RunAsync(["-p", "/test"]); var isSuccess = console.WrittenLines?.LastOrDefault()? .Contains("Ftp copy successful done"); diff --git a/starsky/starskytest/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddlewareTest.cs b/starsky/starskytest/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddlewareTest.cs index 9510010239..b9b94afac9 100644 --- a/starsky/starskytest/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddlewareTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddlewareTest.cs @@ -39,8 +39,8 @@ public async Task ContentSecurityPolicyMiddlewareTest_invoke_testContent() { Scheme = "http" } }; - var authMiddleware = new ContentSecurityPolicyMiddleware(next: (_) => Task.FromResult(0)); - + var authMiddleware = new ContentSecurityPolicyMiddleware(next: (_) => Task.CompletedTask); + // Act await authMiddleware.Invoke(httpContext); //test @@ -53,10 +53,12 @@ public async Task ContentSecurityPolicyMiddlewareTest_invoke_testContent() public async Task invoke_httpsTest_websockets() { // Arrange - var httpContext = new DefaultHttpContext(); - httpContext.Request.Scheme = "https"; - - var authMiddleware = new ContentSecurityPolicyMiddleware(next: (_) => Task.FromResult(0)); + var httpContext = new DefaultHttpContext { Request = + { + Scheme = "https" + } }; + + var authMiddleware = new ContentSecurityPolicyMiddleware(next: (_) => Task.CompletedTask); // Act await authMiddleware.Invoke(httpContext); @@ -77,7 +79,7 @@ public async Task invoke_httpsTest_websockets_localhostWithPort9000() Host = new HostString("localhost", 9000) } }; - var authMiddleware = new ContentSecurityPolicyMiddleware(next: (_) => Task.FromResult(0)); + var authMiddleware = new ContentSecurityPolicyMiddleware(next: (_) => Task.CompletedTask); // Act await authMiddleware.Invoke(httpContext); @@ -99,7 +101,7 @@ public async Task invoke_httpsTest_websockets_localhostWithNoPort() Host = new HostString("localhost") } }; - var authMiddleware = new ContentSecurityPolicyMiddleware(next: (_) => Task.FromResult(0)); + var authMiddleware = new ContentSecurityPolicyMiddleware(next: (_) => Task.CompletedTask); // Act await authMiddleware.Invoke(httpContext); @@ -119,7 +121,7 @@ public async Task ContentSecurityPolicyMiddlewareTest_invoke_otherTypes() { Scheme = "http" } }; - var authMiddleware = new ContentSecurityPolicyMiddleware((_) => Task.FromResult(0)); + var authMiddleware = new ContentSecurityPolicyMiddleware(next: (_) => Task.CompletedTask); // Act await authMiddleware.Invoke(httpContext); @@ -132,11 +134,11 @@ public async Task ContentSecurityPolicyMiddlewareTest_invoke_otherTypes() Assert.AreEqual( "DENY",frameOptions); // X-Xss-Protection - var xssProtection = httpContext.Response.Headers["X-Xss-Protection"].ToString(); + var xssProtection = httpContext.Response.Headers.XXSSProtection.ToString(); Assert.AreEqual( "1; mode=block",xssProtection); // X-Content-Type-Options - var contentTypeOptions = httpContext.Response.Headers["X-Content-Type-Options"].ToString(); + var contentTypeOptions = httpContext.Response.Headers.XContentTypeOptions.ToString(); Assert.AreEqual( "nosniff",contentTypeOptions); } @@ -151,7 +153,7 @@ public async Task Scheme = "http" } }; httpContext.Request.Headers.Append("User-Agent","Chrome"); - var authMiddleware = new ContentSecurityPolicyMiddleware((_) => Task.FromResult(0)); + var authMiddleware = new ContentSecurityPolicyMiddleware(next: (_) => Task.CompletedTask); // Act await authMiddleware.Invoke(httpContext); diff --git a/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_ExifReadTest.cs b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_ExifReadTest.cs index fc57dfdc19..dd5b67eef0 100644 --- a/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_ExifReadTest.cs +++ b/starsky/starskytest/starsky.foundation.readmeta/Services/ReadMeta_ExifReadTest.cs @@ -674,8 +674,12 @@ public void ExifRead_DataParsingCorruptStreamNull() Assert.AreEqual(FileIndexItem.ExifStatus.OperationNotSupported, item.Status); } - // https://github.com/drewnoakes/metadata-extractor-dotnet/blob/master/MetadataExtractor.Tests/DirectoryExtensionsTest.cs - private static Directory BuildDirectory(IEnumerable values) + /// + /// @see: https://github.com/drewnoakes/metadata-extractor-dotnet/blob/master/MetadataExtractor.Tests/DirectoryExtensionsTest.cs + /// + /// values to put in + /// a mock dir + private static MockDirectory BuildDirectory(IEnumerable values) { var directory = new MockDirectory(null); diff --git a/starsky/starskytest/starsky.foundation.realtime/Middleware/DisabledWebSocketsMiddlewareTest.cs b/starsky/starskytest/starsky.foundation.realtime/Middleware/DisabledWebSocketsMiddlewareTest.cs index 3f911d5c81..6e1930fabf 100644 --- a/starsky/starskytest/starsky.foundation.realtime/Middleware/DisabledWebSocketsMiddlewareTest.cs +++ b/starsky/starskytest/starsky.foundation.realtime/Middleware/DisabledWebSocketsMiddlewareTest.cs @@ -15,7 +15,7 @@ public sealed class DisabledWebSocketsMiddlewareTest public async Task DisabledWebSocketsMiddleware_Invoke() { var httpContext = new DefaultHttpContext(); - var disabledWebSocketsMiddleware = new DisabledWebSocketsMiddleware(next: (_) => Task.FromResult(0)); + var disabledWebSocketsMiddleware = new DisabledWebSocketsMiddleware(next: (_) => Task.CompletedTask); await disabledWebSocketsMiddleware.Invoke(httpContext); Assert.AreEqual(400,httpContext.Response.StatusCode); } @@ -25,12 +25,12 @@ public async Task WebSocketConnection_MessageTooBig() { var httpContext = new FakeWebSocketHttpContext(false); - var disabledWebSocketsMiddleware = new DisabledWebSocketsMiddleware(next: (_) => Task.FromResult(0)); + var disabledWebSocketsMiddleware = new DisabledWebSocketsMiddleware(next: (_) => Task.CompletedTask); await disabledWebSocketsMiddleware.Invoke(httpContext); var socketManager = httpContext.WebSockets as FakeWebSocketManager; Assert.AreEqual(WebSocketCloseStatus.MessageTooBig, - (socketManager.FakeWebSocket as FakeWebSocket).FakeCloseOutputAsync.LastOrDefault()); + (socketManager?.FakeWebSocket as FakeWebSocket)?.FakeCloseOutputAsync.LastOrDefault()); } } } diff --git a/starsky/starskytest/starsky.foundation.thumbnailgeneration/Helpers/ThumbnailCliTest.cs b/starsky/starskytest/starsky.foundation.thumbnailgeneration/Helpers/ThumbnailCliTest.cs index cf561279e4..a4a075dc9b 100644 --- a/starsky/starskytest/starsky.foundation.thumbnailgeneration/Helpers/ThumbnailCliTest.cs +++ b/starsky/starskytest/starsky.foundation.thumbnailgeneration/Helpers/ThumbnailCliTest.cs @@ -38,7 +38,7 @@ public async Task Thumbnail_Enable_T_Param_AssumeHome() fakeIThumbnailService, new FakeIThumbnailCleaner(), new FakeSelectorStorage(storage)); - await thumbnailService.Thumbnail(new []{"-t", "true"}); + await thumbnailService.Thumbnail(["-t", "true"]); Assert.AreEqual("/", fakeIThumbnailService.Inputs[0].Item1); } @@ -52,7 +52,7 @@ public async Task Thumbnail_Help() new FakeIThumbnailService(), new FakeIThumbnailCleaner(), new FakeSelectorStorage(storage)); - await thumbnailService.Thumbnail(new []{"-h"}); + await thumbnailService.Thumbnail(["-h"]); Assert.IsTrue(fakeConsole.WrittenLines[0].Contains("Help")); } @@ -67,7 +67,7 @@ public async Task Thumbnail_Disable_T_Param() fakeThumbnail, new FakeIThumbnailCleaner(), new FakeSelectorStorage(storage)); - await thumbnailService.Thumbnail(new []{"-t", "false"}); + await thumbnailService.Thumbnail(["-t", "false"]); Assert.AreEqual(0, fakeThumbnail.Inputs.Count); } @@ -83,7 +83,8 @@ public async Task Thumbnail_MinusP_FullPath() fakeIThumbnailService, new FakeIThumbnailCleaner(), new FakeSelectorStorage(storage)); - await thumbnailService.Thumbnail(new []{"-v", "true", "-t","true", "-p", Path.Combine(appSettings.StorageFolder, "test")}); + await thumbnailService.Thumbnail(["-v", "true", "-t","true", "-p", Path.Combine(appSettings.StorageFolder, "test") + ]); Assert.AreEqual("/test", fakeIThumbnailService.Inputs[0].Item1); } @@ -99,7 +100,7 @@ public async Task Thumbnail_MinusS_SubPath() fakeIThumbnailService, new FakeIThumbnailCleaner(), new FakeSelectorStorage(storage)); - await thumbnailService.Thumbnail(new []{"-t","true", "-s", "/test"}); + await thumbnailService.Thumbnail(["-t","true", "-s", "/test"]); Assert.AreEqual("/test", fakeIThumbnailService.Inputs[0].Item1); } @@ -115,7 +116,7 @@ public async Task Thumbnail_MinusS_SubPath_Direct() fakeIThumbnailService, new FakeIThumbnailCleaner(), new FakeSelectorStorage(storage)); - await thumbnailService.Thumbnail(new []{"-t","true", "-s", "/test.jpg"}); + await thumbnailService.Thumbnail(["-t","true", "-s", "/test.jpg"]); Assert.AreEqual("/test.jpg", fakeIThumbnailService.Inputs[0].Item1); @@ -134,7 +135,7 @@ public async Task Thumbnail_MinusG_Relative() fakeIThumbnailService, new FakeIThumbnailCleaner(), new FakeSelectorStorage(storage)); - await thumbnailService.Thumbnail(new []{"-t","true", "-g", "0"}); + await thumbnailService.Thumbnail(["-t","true", "-g", "0"]); var subPathRelative = new StructureService(new FakeIStorage(),appSettings.Structure) .ParseSubfolders(0); @@ -152,7 +153,7 @@ public async Task Thumbnail_MinusX_CleanAllUnusedFiles() new FakeIThumbnailService(new FakeSelectorStorage(storage)), fakeIThumbnailCleaner, new FakeSelectorStorage(storage)); - await thumbnailService.Thumbnail(new []{"--clean","true"}); + await thumbnailService.Thumbnail(["--clean","true"]); Assert.IsTrue(fakeIThumbnailCleaner.Inputs[0]); } diff --git a/starsky/starskytest/starsky.foundation.writemeta/Helpers/ExifToolDownloadTest.cs b/starsky/starskytest/starsky.foundation.writemeta/Helpers/ExifToolDownloadTest.cs index 68ad5b9a7f..68d49a9863 100644 --- a/starsky/starskytest/starsky.foundation.writemeta/Helpers/ExifToolDownloadTest.cs +++ b/starsky/starskytest/starsky.foundation.writemeta/Helpers/ExifToolDownloadTest.cs @@ -23,7 +23,7 @@ public sealed class ExifToolDownloadTest { private readonly IServiceScopeFactory _serviceScopeFactory; private readonly AppSettings _appSettings; - private readonly IStorage _hostFileSystem; + private readonly StorageHostFullPathFilesystem _hostFileSystem; /// /// shasum -a 1 file.zip @@ -89,8 +89,8 @@ public async Task DownloadCheckSums_BaseChecksumDoesExist() // Happy flow var result = await new ExifToolDownload(httpClientHelper,_appSettings, new FakeIWebLogger() ) .DownloadCheckSums(); - Assert.AreEqual(ExampleCheckSum, result.Value.Value); - Assert.AreEqual(true, result.Value.Key); + Assert.AreEqual(ExampleCheckSum, result?.Value); + Assert.AreEqual(true, result?.Key); } [TestMethod] @@ -107,8 +107,8 @@ public async Task DownloadCheckSums_BaseChecksumDoesNotExist() var result = await new ExifToolDownload(httpClientHelper,_appSettings, new FakeIWebLogger() ) .DownloadCheckSums(); - Assert.AreEqual(ExampleCheckSum, result.Value.Value); - Assert.AreEqual(false, result.Value.Key); + Assert.AreEqual(ExampleCheckSum, result?.Value); + Assert.AreEqual(false, result?.Key); } [TestMethod] From 452478f590cf0697c908a6f2a5b18910c52237f3 Mon Sep 17 00:00:00 2001 From: Dion Date: Sun, 21 Jan 2024 22:36:54 +0100 Subject: [PATCH 25/31] fix some code smells --- starsky/starsky.feature.geolookup/Services/GeoIndexGpx.cs | 7 +++++-- .../Extensions/OpenTelemetryExtension.cs | 5 +++++ .../Middleware/ContentSecurityPolicyMiddlewareTest.cs | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/starsky/starsky.feature.geolookup/Services/GeoIndexGpx.cs b/starsky/starsky.feature.geolookup/Services/GeoIndexGpx.cs index df01ca750f..d621fb467b 100644 --- a/starsky/starsky.feature.geolookup/Services/GeoIndexGpx.cs +++ b/starsky/starsky.feature.geolookup/Services/GeoIndexGpx.cs @@ -69,10 +69,13 @@ private async Task> GetGpxFileAsync(List metaFi /// DateTime Kind should not be Local internal DateTime ConvertTimeZone(DateTime valueDateTime, string subPath = "") { - if ( valueDateTime.Kind == DateTimeKind.Utc ) return valueDateTime; + if ( valueDateTime.Kind == DateTimeKind.Utc ) + { + return valueDateTime; + } // Not supported by TimeZoneInfo convert - if ( valueDateTime.Kind != DateTimeKind.Unspecified ) + if ( valueDateTime.Kind != DateTimeKind.Unspecified || _appSettings.CameraTimeZoneInfo == null ) { throw new ArgumentException($"valueDateTime DateTime-Kind '{valueDateTime.Kind}' " + $"'{subPath}' should be Unspecified", nameof(valueDateTime)); diff --git a/starsky/starsky.foundation.webtelemetry/Extensions/OpenTelemetryExtension.cs b/starsky/starsky.foundation.webtelemetry/Extensions/OpenTelemetryExtension.cs index a1a0dfeeeb..d231be561b 100644 --- a/starsky/starsky.foundation.webtelemetry/Extensions/OpenTelemetryExtension.cs +++ b/starsky/starsky.foundation.webtelemetry/Extensions/OpenTelemetryExtension.cs @@ -23,6 +23,11 @@ public static class OpenTelemetryExtension public static void AddOpenTelemetryMonitoring( this IServiceCollection services, AppSettings appSettings) { + if ( appSettings.OpenTelemetry == null ) + { + return; + } + var telemetryBuilder = services.AddOpenTelemetry() .ConfigureResource(resource => resource.AddService( serviceNamespace: appSettings.OpenTelemetry.GetServiceName(), diff --git a/starsky/starskytest/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddlewareTest.cs b/starsky/starskytest/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddlewareTest.cs index b9b94afac9..b68f7ae235 100644 --- a/starsky/starskytest/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddlewareTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Middleware/ContentSecurityPolicyMiddlewareTest.cs @@ -130,7 +130,7 @@ public async Task ContentSecurityPolicyMiddlewareTest_invoke_otherTypes() var referrerPolicy = httpContext.Response.Headers["Referrer-Policy"].ToString(); Assert.AreEqual( "no-referrer",referrerPolicy); - var frameOptions = httpContext.Response.Headers["X-Frame-Options"].ToString(); + var frameOptions = httpContext.Response.Headers.XFrameOptions.ToString(); Assert.AreEqual( "DENY",frameOptions); // X-Xss-Protection From 0ea8faf2a7720b125a601e04690627d5f0dea1f8 Mon Sep 17 00:00:00 2001 From: Dion Date: Sun, 21 Jan 2024 22:37:12 +0100 Subject: [PATCH 26/31] try this --- .../Services/UpdateAppSettingsByPathTest.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs b/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs index 2538c1e8b3..077d1e0085 100644 --- a/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs +++ b/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs @@ -19,13 +19,15 @@ public class UpdateAppSettingsByPathTests [TestMethod] public async Task UpdateAppSettingsAsync_ValidInput_Success() { - // Arrange - var storage = new FakeIStorage(new List{"/"}); + // Arrange + var testFolderPath = Path.DirectorySeparatorChar.ToString() + "test" + Path.DirectorySeparatorChar.ToString(); + + var storage = new FakeIStorage(new List{"/", testFolderPath }); var selectorStorage = new FakeSelectorStorage(storage); var updateAppSettingsByPath = new UpdateAppSettingsByPath(new AppSettings(), selectorStorage); var appSettingTransferObject = new AppSettingsTransferObject { - StorageFolder = "/", + StorageFolder = testFolderPath, Verbose = true }; @@ -41,7 +43,6 @@ public async Task UpdateAppSettingsAsync_ValidInput_Success() public async Task UpdateAppSettingsAsync_ValidInput_Success_CompareJson() { // Arrange - var testFolderPath = Path.DirectorySeparatorChar.ToString() + "test" + Path.DirectorySeparatorChar.ToString(); var storage = new FakeIStorage(new List{"/", testFolderPath }); From b8e7251576df4a342a891f7e65b8ffbafba19542 Mon Sep 17 00:00:00 2001 From: Dion Date: Sun, 21 Jan 2024 22:38:06 +0100 Subject: [PATCH 27/31] add check --- starsky/starsky.foundation.webtelemetry/Helpers/SetupLogging.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/starsky/starsky.foundation.webtelemetry/Helpers/SetupLogging.cs b/starsky/starsky.foundation.webtelemetry/Helpers/SetupLogging.cs index 4b4bfeab37..e222ab25f6 100644 --- a/starsky/starsky.foundation.webtelemetry/Helpers/SetupLogging.cs +++ b/starsky/starsky.foundation.webtelemetry/Helpers/SetupLogging.cs @@ -21,7 +21,7 @@ public static void AddTelemetryLogging(this IServiceCollection services, AppSett logging.ClearProviders(); logging.AddConsole(); - if ( !string.IsNullOrEmpty(appSettings.OpenTelemetry.LogsEndpoint) ) + if ( !string.IsNullOrEmpty(appSettings.OpenTelemetry?.LogsEndpoint) ) { logging.AddOpenTelemetry(builder => builder.AddOtlpExporter( From 8bc55b9e7f2d6b779f9e35555cc3aac9ffe8f8e7 Mon Sep 17 00:00:00 2001 From: Dion Date: Sun, 21 Jan 2024 22:39:29 +0100 Subject: [PATCH 28/31] code smells --- .../Services/MoveToTrashService.cs | 8 ++++--- .../Services/UserManager.cs | 24 +++++++++---------- .../Exceptions/DecodingException.cs | 2 ++ .../Storage/StorageSubPathFilesystem.cs | 10 ++++---- .../Exceptions/ToManyUsageException.cs | 2 ++ .../Exceptions/ToManyUsageExceptionTest.cs | 2 ++ 6 files changed, 28 insertions(+), 20 deletions(-) diff --git a/starsky/starsky.feature.trash/Services/MoveToTrashService.cs b/starsky/starsky.feature.trash/Services/MoveToTrashService.cs index 81b504f369..b5854e8c5c 100644 --- a/starsky/starsky.feature.trash/Services/MoveToTrashService.cs +++ b/starsky/starsky.feature.trash/Services/MoveToTrashService.cs @@ -120,7 +120,7 @@ await _metaUpdateService.UpdateAsync(changedFileIndexItemName, .Select(p => p.FilePath).Cast() .ToList(); - if ( !parentSubPaths.Any() ) + if ( parentSubPaths.Count == 0 ) { return ( moveToTrash, changedFileIndexItemName ); } @@ -142,12 +142,14 @@ await _metaUpdateService.UpdateAsync(changedFileIndexItemName, return (moveToTrash,changedFileIndexItemName); } - internal async Task SystemTrashInQueue(List moveToTrash) + private async Task SystemTrashInQueue(List moveToTrash) { var fullFilePaths = moveToTrash .Where(p => p.FilePath != null) - .Select(p => _appSettings.DatabasePathToFilePath(p.FilePath, false)) + .Select(p => _appSettings.DatabasePathToFilePath(p.FilePath!, false)) + .Cast() .ToList(); + _systemTrashService.Trash(fullFilePaths); await _query.RemoveItemAsync(moveToTrash); diff --git a/starsky/starsky.foundation.accountmanagement/Services/UserManager.cs b/starsky/starsky.foundation.accountmanagement/Services/UserManager.cs index 24d2bc746d..9ada536487 100644 --- a/starsky/starsky.foundation.accountmanagement/Services/UserManager.cs +++ b/starsky/starsky.foundation.accountmanagement/Services/UserManager.cs @@ -49,8 +49,7 @@ public UserManager(ApplicationDbContext dbContext, AppSettings appSettings, IWeb private bool IsCacheEnabled() { // || _appSettings?.AddMemoryCache == false > disabled - if( _cache == null ) return false; - return true; + return _cache != null; } /// @@ -134,7 +133,7 @@ public async Task AllUsersAsync() { if (IsCacheEnabled() && _cache?.TryGetValue(AllUsersCacheKey, out var objectAllUsersResult) == true) { - return new UserOverviewModel(( List ) objectAllUsersResult); + return new UserOverviewModel(( List? ) objectAllUsersResult); } try @@ -142,7 +141,7 @@ public async Task AllUsersAsync() var allUsers = await _dbContext.Users.TagWith("AllUsersAsync").ToListAsync(); if ( IsCacheEnabled() ) { - _cache.Set(AllUsersCacheKey, allUsers, + _cache!.Set(AllUsersCacheKey, allUsers, new TimeSpan(99,0,0)); } return new UserOverviewModel(allUsers); @@ -173,7 +172,7 @@ internal async Task AddUserToCache(User user) { allUsers.Add(user); } - _cache.Set(AllUsersCacheKey, allUsers, + _cache!.Set(AllUsersCacheKey, allUsers, new TimeSpan(99,0,0)); } @@ -185,7 +184,7 @@ private async Task RemoveUserFromCacheAsync(User user) if ( !IsCacheEnabled() ) return; var allUsers = (await AllUsersAsync()).Users; allUsers.Remove(user); - _cache.Set(AllUsersCacheKey, allUsers, + _cache!.Set(AllUsersCacheKey, allUsers, new TimeSpan(99,0,0)); } @@ -230,7 +229,8 @@ internal string GetRoleAddToUser(string identifier, User user) return AccountRoles.AppAccountRoles.Administrator.ToString(); } - if ( _appSettings.AccountRolesByEmailRegisterOverwrite + if (_appSettings.AccountRolesByEmailRegisterOverwrite != null + && _appSettings.AccountRolesByEmailRegisterOverwrite .TryGetValue(identifier, out var emailsForConfig) && AccountRoles.GetAllRoles().Contains(emailsForConfig) ) { @@ -407,7 +407,7 @@ public ChangeSecretResult ChangeSecret(string credentialTypeCode, string identif if ( IsCacheEnabled() ) { - _cache.Set(CredentialCacheKey(credentialType, identifier), + _cache!.Set(CredentialCacheKey(credentialType, identifier), credential,new TimeSpan(99,0,0)); } @@ -433,7 +433,7 @@ internal static string CredentialCacheKey(CredentialType credentialType, string if (IsCacheEnabled() && _cache?.TryGetValue(key, out var objectCredentialTypeCode) == true) { - return ( Credential ) objectCredentialTypeCode; + return ( Credential? ) objectCredentialTypeCode; } @@ -460,7 +460,7 @@ internal static string CredentialCacheKey(CredentialType credentialType, string if ( IsCacheEnabled()) { - _cache.Set(key, credential,new TimeSpan(99,0,0)); + _cache!.Set(key, credential,new TimeSpan(99,0,0)); } return credential; @@ -479,7 +479,7 @@ internal static string CredentialCacheKey(CredentialType credentialType, string if (IsCacheEnabled() && _cache?.TryGetValue(cacheKey, out var objectCredentialTypeCode) == true) { - return ( CredentialType ) objectCredentialTypeCode; + return ( CredentialType? ) objectCredentialTypeCode; } var credentialTypeSelect = _dbContext.CredentialTypes.AsNoTracking().TagWith("CredentialType").Where( @@ -502,7 +502,7 @@ internal static string CredentialCacheKey(CredentialType credentialType, string if ( IsCacheEnabled() ) { - _cache.Set(cacheKey, credentialType, + _cache!.Set(cacheKey, credentialType, new TimeSpan(99,0,0)); } return credentialType; diff --git a/starsky/starsky.foundation.storage/Exceptions/DecodingException.cs b/starsky/starsky.foundation.storage/Exceptions/DecodingException.cs index f34c45b1ee..ef3183ef99 100644 --- a/starsky/starsky.foundation.storage/Exceptions/DecodingException.cs +++ b/starsky/starsky.foundation.storage/Exceptions/DecodingException.cs @@ -20,7 +20,9 @@ public DecodingException(string message) : base(message) /// /// protected DecodingException(SerializationInfo info, StreamingContext context) +#pragma warning disable SYSLIB0051 : base(info, context) +#pragma warning restore SYSLIB0051 { } } diff --git a/starsky/starsky.foundation.storage/Storage/StorageSubPathFilesystem.cs b/starsky/starsky.foundation.storage/Storage/StorageSubPathFilesystem.cs index 2ab505a8df..d7f516993a 100644 --- a/starsky/starsky.foundation.storage/Storage/StorageSubPathFilesystem.cs +++ b/starsky/starsky.foundation.storage/Storage/StorageSubPathFilesystem.cs @@ -30,14 +30,14 @@ public StorageSubPathFilesystem(AppSettings appSettings, IWebLogger logger) /// StorageInfo object public StorageInfo Info(string path) { - var subPath = _appSettings.DatabasePathToFilePath(path, false); + var subPath = _appSettings.DatabasePathToFilePath(path, false)!; return new StorageHostFullPathFilesystem(_logger).Info(subPath); } public DateTime SetLastWriteTime(string path, DateTime? dateTime = null) { - var subPath = _appSettings.DatabasePathToFilePath(path, false); + var subPath = _appSettings.DatabasePathToFilePath(path, false)!; return new StorageHostFullPathFilesystem(_logger).SetLastWriteTime(subPath, dateTime); } @@ -72,7 +72,7 @@ public bool ExistFolder(string path) /// is file, folder or deleted public FolderOrFileModel.FolderOrFileTypeList IsFolderOrFile(string path) { - var fullFilePath = _appSettings.DatabasePathToFilePath(path,false); + var fullFilePath = _appSettings.DatabasePathToFilePath(path,false)!; return new StorageHostFullPathFilesystem(_logger).IsFolderOrFile(fullFilePath); } @@ -83,8 +83,8 @@ public FolderOrFileModel.FolderOrFileTypeList IsFolderOrFile(string path) /// toSubPath public void FolderMove(string fromPath, string toPath) { - var inputFileFullPath = _appSettings.DatabasePathToFilePath(fromPath, false); - var toFileFullPath = _appSettings.DatabasePathToFilePath(toPath, false); + var inputFileFullPath = _appSettings.DatabasePathToFilePath(fromPath, false)!; + var toFileFullPath = _appSettings.DatabasePathToFilePath(toPath, false)!; new StorageHostFullPathFilesystem(_logger).FolderMove(inputFileFullPath,toFileFullPath); } diff --git a/starsky/starsky.foundation.worker/ThumbnailServices/Exceptions/ToManyUsageException.cs b/starsky/starsky.foundation.worker/ThumbnailServices/Exceptions/ToManyUsageException.cs index 580cd95e8e..dbc79693ef 100644 --- a/starsky/starsky.foundation.worker/ThumbnailServices/Exceptions/ToManyUsageException.cs +++ b/starsky/starsky.foundation.worker/ThumbnailServices/Exceptions/ToManyUsageException.cs @@ -22,10 +22,12 @@ public ToManyUsageException(string message) /// /// /// +#pragma warning disable SYSLIB0051 protected ToManyUsageException(SerializationInfo info, StreamingContext context) : base(info, context) { } +#pragma warning restore SYSLIB0051 } } diff --git a/starsky/starskytest/starsky.foundation.worker/ThumbnailServices/Exceptions/ToManyUsageExceptionTest.cs b/starsky/starskytest/starsky.foundation.worker/ThumbnailServices/Exceptions/ToManyUsageExceptionTest.cs index 34ef02de8f..92fe59fa04 100644 --- a/starsky/starskytest/starsky.foundation.worker/ThumbnailServices/Exceptions/ToManyUsageExceptionTest.cs +++ b/starsky/starskytest/starsky.foundation.worker/ThumbnailServices/Exceptions/ToManyUsageExceptionTest.cs @@ -28,6 +28,7 @@ public void ToManyUsageExceptionMessage() [ExpectedException(typeof(ToManyUsageException))] public void ToManyUsageException_Protected() { +#pragma warning disable SYSLIB0050 var info = new SerializationInfo(typeof(Exception), new FormatterConverter()); info.AddValue("Message", ""); @@ -50,6 +51,7 @@ public void ToManyUsageException_Protected() }); throw instance; +#pragma warning restore SYSLIB0050 } } } From e67ade0b84f6268e92ff9dcdd3f36b7d9ce4249e Mon Sep 17 00:00:00 2001 From: Dion Date: Sun, 21 Jan 2024 22:40:33 +0100 Subject: [PATCH 29/31] hope this fix windows --- .../Services/UpdateAppSettingsByPathTest.cs | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs b/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs index 077d1e0085..37c52206b5 100644 --- a/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs +++ b/starsky/starskytest/starsky.feature.settings/Services/UpdateAppSettingsByPathTest.cs @@ -19,6 +19,9 @@ public class UpdateAppSettingsByPathTests [TestMethod] public async Task UpdateAppSettingsAsync_ValidInput_Success() { + var before = Environment.GetEnvironmentVariable("app__storageFolder"); + Environment.SetEnvironmentVariable("app__storageFolder", string.Empty); + // Arrange var testFolderPath = Path.DirectorySeparatorChar.ToString() + "test" + Path.DirectorySeparatorChar.ToString(); @@ -34,6 +37,8 @@ public async Task UpdateAppSettingsAsync_ValidInput_Success() // Act var result = await updateAppSettingsByPath.UpdateAppSettingsAsync(appSettingTransferObject); + Environment.SetEnvironmentVariable("app__storageFolder", before); + // Assert Assert.AreEqual(200, result.StatusCode); Assert.AreEqual("Updated", result.Message); @@ -43,6 +48,10 @@ public async Task UpdateAppSettingsAsync_ValidInput_Success() public async Task UpdateAppSettingsAsync_ValidInput_Success_CompareJson() { // Arrange + + var before = Environment.GetEnvironmentVariable("app__storageFolder"); + Environment.SetEnvironmentVariable("app__storageFolder", string.Empty); + var testFolderPath = Path.DirectorySeparatorChar.ToString() + "test" + Path.DirectorySeparatorChar.ToString(); var storage = new FakeIStorage(new List{"/", testFolderPath }); @@ -61,6 +70,9 @@ public async Task UpdateAppSettingsAsync_ValidInput_Success_CompareJson() var result = (await StreamToStringHelper.StreamToStringAsync(storage.ReadStream(appSettings.AppSettingsPath))).Replace("\r\n","\n"); + Environment.SetEnvironmentVariable("app__storageFolder", before); + + var storageFolderJson = JsonSerializer.Serialize(testFolderPath, DefaultJsonSerializer.NoNamingPolicy); @@ -74,6 +86,9 @@ public async Task UpdateAppSettingsAsync_ValidInput_Success_CompareJson() [TestMethod] public async Task UpdateAppSettingsAsync_InvalidStorageFolder_Returns404() { + var before = Environment.GetEnvironmentVariable("app__storageFolder"); + Environment.SetEnvironmentVariable("app__storageFolder", string.Empty); + // Arrange var selectorStorage = new FakeSelectorStorage(); var updateAppSettingsByPath = new UpdateAppSettingsByPath(new AppSettings(), selectorStorage); @@ -85,6 +100,9 @@ public async Task UpdateAppSettingsAsync_InvalidStorageFolder_Returns404() // Act var result = await updateAppSettingsByPath.UpdateAppSettingsAsync(appSettingTransferObject); + Environment.SetEnvironmentVariable("app__storageFolder", before); + + // Assert Assert.AreEqual(404, result.StatusCode); Assert.AreEqual("Location of StorageFolder on disk not found", result.Message); @@ -119,8 +137,11 @@ public async Task UpdateAppSettingsAsync_InvalidStorageFolder_Returns403() [TestMethod] public async Task UpdateAppSettingsAsync_ValidInput_TwoTimes_Success() { + var before = Environment.GetEnvironmentVariable("app__storageFolder"); + Environment.SetEnvironmentVariable("app__storageFolder", string.Empty); + // Arrange - var testFolderPath = Path.DirectorySeparatorChar.ToString() + "test" + Path.DirectorySeparatorChar.ToString(); + var testFolderPath = Path.DirectorySeparatorChar + "test" + Path.DirectorySeparatorChar; var storage = new FakeIStorage(new List{ "/", testFolderPath }); @@ -133,7 +154,8 @@ public async Task UpdateAppSettingsAsync_ValidInput_TwoTimes_Success() }; // Act - await updateAppSettingsByPath.UpdateAppSettingsAsync(appSettingTransferObject1); + var re1 = await updateAppSettingsByPath.UpdateAppSettingsAsync(appSettingTransferObject1); + Assert.IsFalse(re1.IsError); var fileResultString1 = await StreamToStringHelper.StreamToStringAsync(storage.ReadStream(appSettings.AppSettingsPath)); var fileResult1 = JsonSerializer.Deserialize(fileResultString1, DefaultJsonSerializer.NoNamingPolicy); @@ -150,6 +172,10 @@ public async Task UpdateAppSettingsAsync_ValidInput_TwoTimes_Success() var fileResultString2 = await StreamToStringHelper.StreamToStringAsync(storage.ReadStream(appSettings.AppSettingsPath)); var fileResult2 = JsonSerializer.Deserialize(fileResultString2, DefaultJsonSerializer.NoNamingPolicy); + + // Set back to what is was before + Environment.SetEnvironmentVariable("app__storageFolder", before); + Assert.AreEqual(testFolderPath, fileResult2.App.StorageFolder); Assert.IsTrue(fileResult2.App.Verbose); } From 5f6df4cc1e907638eb3f623305a39e2e907aa477 Mon Sep 17 00:00:00 2001 From: Dion Date: Sun, 21 Jan 2024 22:41:53 +0100 Subject: [PATCH 30/31] code smells --- .../Services/ExportService.cs | 4 +- .../Services/GeoCli.cs | 2 +- .../Services/MoveToTrashService.cs | 2 +- .../BasicAuthenticationSignInManager.cs | 2 +- .../Services/UserManager.cs | 14 ++-- .../Helpers/StatusCodesHelper.cs | 6 +- .../20180419182654_importdatabase.Designer.cs | 2 + ...025182759_data-protection-keys.Designer.cs | 2 + .../Models/AppSettings.cs | 13 +--- .../Storage/StorageHostFullPathFilesystem.cs | 7 +- .../Storage/StorageSubPathFilesystem.cs | 68 ++++++++++++------- .../Controllers/ExportControllerTest.cs | 4 +- .../Middleware/MiddlewareExtensionsTest.cs | 51 +------------- .../Services/GeoCliTest.cs | 2 +- .../Extensions/TestConnectionTest.cs | 2 + .../CheckIfAccountExistMiddlewareTest.cs | 13 ++-- .../Middleware/NoAccountMiddlewareTest.cs | 12 ++-- .../Models/AppSettingsTest.cs | 13 +--- .../Exceptions/DecodingExceptionTest.cs | 2 + .../EventQueueOverflowExceptionTest.cs | 2 + 20 files changed, 96 insertions(+), 127 deletions(-) diff --git a/starsky/starsky.feature.export/Services/ExportService.cs b/starsky/starsky.feature.export/Services/ExportService.cs index c4979ab3e5..a597e1c0b0 100644 --- a/starsky/starsky.feature.export/Services/ExportService.cs +++ b/starsky/starsky.feature.export/Services/ExportService.cs @@ -174,7 +174,7 @@ await _thumbnailService continue; } - var sourceFile = _appSettings.DatabasePathToFilePath(item.FilePath, false); + var sourceFile = _appSettings.DatabasePathToFilePath(item.FilePath!); if ( !_hostFileSystemStorage.ExistFile(sourceFile) ) { @@ -192,7 +192,7 @@ await _thumbnailService var xmpFileFullPath = _appSettings.DatabasePathToFilePath( ExtensionRolesHelper.ReplaceExtensionWithXmp( - item.FilePath), false); + item.FilePath)); if ( !_hostFileSystemStorage.ExistFile(xmpFileFullPath) ) { diff --git a/starsky/starsky.feature.geolookup/Services/GeoCli.cs b/starsky/starsky.feature.geolookup/Services/GeoCli.cs index 274ef94924..af3a030d7d 100644 --- a/starsky/starsky.feature.geolookup/Services/GeoCli.cs +++ b/starsky/starsky.feature.geolookup/Services/GeoCli.cs @@ -105,7 +105,7 @@ public async Task CommandLineAsync(string[] args) var dateTime = DateTime.Now.AddDays(( double ) getSubPathRelative); var path = _appSettings.DatabasePathToFilePath( new StructureService(_iStorage, _appSettings.Structure) - .ParseSubfolders(dateTime), false); + .ParseSubfolders(dateTime)); inputPath = !string.IsNullOrEmpty(path) ? path : string.Empty; } diff --git a/starsky/starsky.feature.trash/Services/MoveToTrashService.cs b/starsky/starsky.feature.trash/Services/MoveToTrashService.cs index b5854e8c5c..59531d5653 100644 --- a/starsky/starsky.feature.trash/Services/MoveToTrashService.cs +++ b/starsky/starsky.feature.trash/Services/MoveToTrashService.cs @@ -146,7 +146,7 @@ private async Task SystemTrashInQueue(List moveToTrash) { var fullFilePaths = moveToTrash .Where(p => p.FilePath != null) - .Select(p => _appSettings.DatabasePathToFilePath(p.FilePath!, false)) + .Select(p => _appSettings.DatabasePathToFilePath(p.FilePath!)) .Cast() .ToList(); diff --git a/starsky/starsky.foundation.accountmanagement/Middleware/BasicAuthenticationSignInManager.cs b/starsky/starsky.foundation.accountmanagement/Middleware/BasicAuthenticationSignInManager.cs index a791c979ff..f22889e1bd 100644 --- a/starsky/starsky.foundation.accountmanagement/Middleware/BasicAuthenticationSignInManager.cs +++ b/starsky/starsky.foundation.accountmanagement/Middleware/BasicAuthenticationSignInManager.cs @@ -35,7 +35,7 @@ public async Task TrySignInUser() _context.Response.StatusCode = 401; if(!_context.Response.Headers.ContainsKey("WWW-Authenticate") ) { - _context.Response.Headers.Add("WWW-Authenticate", "Basic realm=\"Starsky " + validateResult.Error + " \""); + _context.Response.Headers.Append("WWW-Authenticate", "Basic realm=\"Starsky " + validateResult.Error + " \""); } return; } diff --git a/starsky/starsky.foundation.accountmanagement/Services/UserManager.cs b/starsky/starsky.foundation.accountmanagement/Services/UserManager.cs index 9ada536487..5a6b809b56 100644 --- a/starsky/starsky.foundation.accountmanagement/Services/UserManager.cs +++ b/starsky/starsky.foundation.accountmanagement/Services/UserManager.cs @@ -106,7 +106,7 @@ private List AddDefaultRoles() .Equals(credentialTypeCode.ToLower())); // When not exist add it - if (credentialType == null && credentialTypeCode.ToLower() == "email" ) + if (credentialType == null && credentialTypeCode.Equals("email", StringComparison.CurrentCultureIgnoreCase) ) { credentialType = new CredentialType { @@ -623,9 +623,15 @@ internal async Task SetLockIfFailedCountIsToHigh(int userId) public async Task SignIn(HttpContext httpContext, User? user, bool isPersistent = false) { - if ( user == null ) return false; + if ( user == null ) + { + return false; + } var claims = GetUserClaims(user).ToList(); - if ( !claims.Any() ) return false; + if ( claims.Count == 0 ) + { + return false; + } ClaimsIdentity identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); ClaimsPrincipal principal = new ClaimsPrincipal(identity); @@ -775,7 +781,7 @@ internal IEnumerable GetUserClaims(User? user) return claims; } - private IEnumerable GetUserRoleClaims(User user) + private List GetUserRoleClaims(User user) { var claims = new List(); IEnumerable roleIds = _dbContext.UserRoles.TagWith("GetUserRoleClaims").Where( diff --git a/starsky/starsky.foundation.database/Helpers/StatusCodesHelper.cs b/starsky/starsky.foundation.database/Helpers/StatusCodesHelper.cs index f94bd19dbf..39bad585b3 100644 --- a/starsky/starsky.foundation.database/Helpers/StatusCodesHelper.cs +++ b/starsky/starsky.foundation.database/Helpers/StatusCodesHelper.cs @@ -16,12 +16,12 @@ public StatusCodesHelper(AppSettings appSettings) public FileIndexItem.ExifStatus IsReadOnlyStatus(FileIndexItem fileIndexItem) { - if (fileIndexItem.IsDirectory == true && _appSettings.IsReadOnly(fileIndexItem.FilePath)) + if (fileIndexItem.IsDirectory == true && _appSettings.IsReadOnly(fileIndexItem.FilePath!)) { return FileIndexItem.ExifStatus.DirReadOnly; } - if ( _appSettings.IsReadOnly(fileIndexItem.ParentDirectory) ) + if ( _appSettings.IsReadOnly(fileIndexItem.ParentDirectory!) ) { return FileIndexItem.ExifStatus.ReadOnly; } @@ -43,7 +43,7 @@ public FileIndexItem.ExifStatus IsReadOnlyStatus(DetailView? detailView) return FileIndexItem.ExifStatus.DirReadOnly; } - if ( _appSettings.IsReadOnly(detailView.FileIndexItem?.ParentDirectory) ) + if ( _appSettings.IsReadOnly(detailView.FileIndexItem?.ParentDirectory!) ) { return FileIndexItem.ExifStatus.ReadOnly; } diff --git a/starsky/starsky.foundation.database/Migrations/20180419182654_importdatabase.Designer.cs b/starsky/starsky.foundation.database/Migrations/20180419182654_importdatabase.Designer.cs index ee13e0b22a..d433f6745d 100644 --- a/starsky/starsky.foundation.database/Migrations/20180419182654_importdatabase.Designer.cs +++ b/starsky/starsky.foundation.database/Migrations/20180419182654_importdatabase.Designer.cs @@ -10,7 +10,9 @@ namespace starsky.foundation.database.Migrations { [DbContext(typeof(ApplicationDbContext))] [Migration("20180419182654_importdatabase")] +#pragma warning disable CS8981 // The type name only contains lower-cased ascii characters. Such names may become reserved for the language. partial class importdatabase +#pragma warning restore CS8981 // The type name only contains lower-cased ascii characters. Such names may become reserved for the language. { protected override void BuildTargetModel(ModelBuilder modelBuilder) { diff --git a/starsky/starsky.foundation.database/Migrations/20221025182759_data-protection-keys.Designer.cs b/starsky/starsky.foundation.database/Migrations/20221025182759_data-protection-keys.Designer.cs index 67d4a1b02d..acd47bd45e 100644 --- a/starsky/starsky.foundation.database/Migrations/20221025182759_data-protection-keys.Designer.cs +++ b/starsky/starsky.foundation.database/Migrations/20221025182759_data-protection-keys.Designer.cs @@ -13,7 +13,9 @@ namespace starsky.foundation.database.Migrations { [DbContext(typeof(ApplicationDbContext))] [Migration("20221025182759_data-protection-keys")] +#pragma warning disable CS8981 // The type name only contains lower-cased ascii characters. Such names may become reserved for the language. partial class dataprotectionkeys +#pragma warning restore CS8981 // The type name only contains lower-cased ascii characters. Such names may become reserved for the language. { protected override void BuildTargetModel(ModelBuilder modelBuilder) { diff --git a/starsky/starsky.foundation.platform/Models/AppSettings.cs b/starsky/starsky.foundation.platform/Models/AppSettings.cs index b4197dc60d..3be8a8ef3e 100644 --- a/starsky/starsky.foundation.platform/Models/AppSettings.cs +++ b/starsky/starsky.foundation.platform/Models/AppSettings.cs @@ -1060,23 +1060,14 @@ private string _pathToFilePathStyle(string subPath) /// from relative database path => file location path /// /// databaseFilePath - /// checkIfExist /// - public string? DatabasePathToFilePath(string databaseFilePath, bool checkIfExist = true) + public string DatabasePathToFilePath(string databaseFilePath) { var filepath = StorageFolder + databaseFilePath; filepath = _pathToFilePathStyle(filepath); - // Used for deleted files - if (!checkIfExist) return filepath; - - var fileExist = File.Exists(filepath) ? filepath : null; - if (fileExist != null) - { - return fileExist; - } - return Directory.Exists(filepath) ? filepath : null; + return filepath; } /// diff --git a/starsky/starsky.foundation.storage/Storage/StorageHostFullPathFilesystem.cs b/starsky/starsky.foundation.storage/Storage/StorageHostFullPathFilesystem.cs index e3fcc7782e..124eb7917d 100644 --- a/starsky/starsky.foundation.storage/Storage/StorageHostFullPathFilesystem.cs +++ b/starsky/starsky.foundation.storage/Storage/StorageHostFullPathFilesystem.cs @@ -304,7 +304,11 @@ public void FileCopy(string fromPath, string toPath) public bool FileDelete(string path) { - if ( !File.Exists(path) ) return false; + if ( !File.Exists(path) ) + { + return false; + } + bool LocalRun() { File.Delete(path); @@ -384,7 +388,6 @@ async Task LocalRun() FileOptions.Asynchronous | FileOptions.SequentialScan)) { await stream.CopyToAsync(fileStream); - await fileStream.DisposeAsync(); } await stream.DisposeAsync(); return true; diff --git a/starsky/starsky.foundation.storage/Storage/StorageSubPathFilesystem.cs b/starsky/starsky.foundation.storage/Storage/StorageSubPathFilesystem.cs index d7f516993a..7f15db11ba 100644 --- a/starsky/starsky.foundation.storage/Storage/StorageSubPathFilesystem.cs +++ b/starsky/starsky.foundation.storage/Storage/StorageSubPathFilesystem.cs @@ -30,14 +30,14 @@ public StorageSubPathFilesystem(AppSettings appSettings, IWebLogger logger) /// StorageInfo object public StorageInfo Info(string path) { - var subPath = _appSettings.DatabasePathToFilePath(path, false)!; + var subPath = _appSettings.DatabasePathToFilePath(path); return new StorageHostFullPathFilesystem(_logger).Info(subPath); } public DateTime SetLastWriteTime(string path, DateTime? dateTime = null) { - var subPath = _appSettings.DatabasePathToFilePath(path, false)!; + var subPath = _appSettings.DatabasePathToFilePath(path); return new StorageHostFullPathFilesystem(_logger).SetLastWriteTime(subPath, dateTime); } @@ -72,7 +72,7 @@ public bool ExistFolder(string path) /// is file, folder or deleted public FolderOrFileModel.FolderOrFileTypeList IsFolderOrFile(string path) { - var fullFilePath = _appSettings.DatabasePathToFilePath(path,false)!; + var fullFilePath = _appSettings.DatabasePathToFilePath(path); return new StorageHostFullPathFilesystem(_logger).IsFolderOrFile(fullFilePath); } @@ -83,8 +83,8 @@ public FolderOrFileModel.FolderOrFileTypeList IsFolderOrFile(string path) /// toSubPath public void FolderMove(string fromPath, string toPath) { - var inputFileFullPath = _appSettings.DatabasePathToFilePath(fromPath, false)!; - var toFileFullPath = _appSettings.DatabasePathToFilePath(toPath, false)!; + var inputFileFullPath = _appSettings.DatabasePathToFilePath(fromPath); + var toFileFullPath = _appSettings.DatabasePathToFilePath(toPath); new StorageHostFullPathFilesystem(_logger).FolderMove(inputFileFullPath,toFileFullPath); } @@ -95,8 +95,8 @@ public void FolderMove(string fromPath, string toPath) /// toSubPath public void FileMove(string fromPath, string toPath) { - var inputFileFullPath = _appSettings.DatabasePathToFilePath(fromPath, false); - var toFileFullPath = _appSettings.DatabasePathToFilePath(toPath, false); + var inputFileFullPath = _appSettings.DatabasePathToFilePath(fromPath); + var toFileFullPath = _appSettings.DatabasePathToFilePath(toPath); new StorageHostFullPathFilesystem(_logger).FileMove(inputFileFullPath,toFileFullPath); } @@ -107,8 +107,8 @@ public void FileMove(string fromPath, string toPath) /// toSubPath public void FileCopy(string fromPath, string toPath) { - var inputFileFullPath = _appSettings.DatabasePathToFilePath(fromPath, false); - var toFileFullPath = _appSettings.DatabasePathToFilePath(toPath, false); + var inputFileFullPath = _appSettings.DatabasePathToFilePath(fromPath); + var toFileFullPath = _appSettings.DatabasePathToFilePath(toPath); new StorageHostFullPathFilesystem(_logger).FileCopy(inputFileFullPath,toFileFullPath); } @@ -119,7 +119,7 @@ public void FileCopy(string fromPath, string toPath) /// bool public bool FileDelete(string path) { - var inputFileFullPath = _appSettings.DatabasePathToFilePath(path, false); + var inputFileFullPath = _appSettings.DatabasePathToFilePath(path); return new StorageHostFullPathFilesystem(_logger).FileDelete(inputFileFullPath); } @@ -129,7 +129,7 @@ public bool FileDelete(string path) /// subPath location public void CreateDirectory(string path) { - var inputFileFullPath = _appSettings.DatabasePathToFilePath(path, false); + var inputFileFullPath = _appSettings.DatabasePathToFilePath(path); Directory.CreateDirectory(inputFileFullPath); } @@ -140,7 +140,7 @@ public void CreateDirectory(string path) /// bool public bool FolderDelete(string path) { - var inputFileFullPath = _appSettings.DatabasePathToFilePath(path, false); + var inputFileFullPath = _appSettings.DatabasePathToFilePath(path); return new StorageHostFullPathFilesystem(_logger).FolderDelete(inputFileFullPath); } @@ -154,11 +154,15 @@ public bool FolderDelete(string path) /// public IEnumerable GetAllFilesInDirectory(string path) { + var storage = new StorageHostFullPathFilesystem(_logger); var fullFilePath = _appSettings.DatabasePathToFilePath(path); - // null is not found - if (fullFilePath == null) return Enumerable.Empty(); - var imageFilesList = new StorageHostFullPathFilesystem(_logger).GetAllFilesInDirectory(fullFilePath); + if ( !storage.ExistFolder(fullFilePath) ) + { + return Enumerable.Empty(); + } + + var imageFilesList = storage.GetAllFilesInDirectory(fullFilePath); // to filter use: // ..etAllFilesInDirectory(subPath) @@ -180,9 +184,14 @@ public IEnumerable GetAllFilesInDirectory(string path) public IEnumerable GetAllFilesInDirectoryRecursive(string path) { var fullFilePath = _appSettings.DatabasePathToFilePath(path); - if (fullFilePath == null) return Enumerable.Empty(); + var storage = new StorageHostFullPathFilesystem(_logger); + + if ( !storage.ExistFolder(fullFilePath) ) + { + return Enumerable.Empty(); + } - var imageFilesList = new StorageHostFullPathFilesystem(_logger).GetAllFilesInDirectoryRecursive(fullFilePath); + var imageFilesList = storage.GetAllFilesInDirectoryRecursive(fullFilePath); // to filter use: // ..etAllFilesInDirectory(subPath) @@ -202,9 +211,15 @@ public IEnumerable GetAllFilesInDirectoryRecursive(string path) public IEnumerable GetDirectories(string path) { var fullFilePath = _appSettings.DatabasePathToFilePath(path); - if (fullFilePath == null) return Enumerable.Empty(); + var storage = new StorageHostFullPathFilesystem(_logger); + + if ( !storage.ExistFolder(fullFilePath) ) + { + return Enumerable.Empty(); + } + + var folders = storage.GetDirectories(fullFilePath); - var folders = new StorageHostFullPathFilesystem(_logger).GetDirectories(fullFilePath); // Used For subfolders // convert back to subPath style return _appSettings.RenameListItemsToDbStyle(folders.ToList()); @@ -218,10 +233,15 @@ public IEnumerable GetDirectories(string path) /// list of paths public IEnumerable> GetDirectoryRecursive(string path) { + var storage = new StorageHostFullPathFilesystem(_logger); + var fullFilePath = _appSettings.DatabasePathToFilePath(path); - if (fullFilePath == null) return Enumerable.Empty>(); + if ( !storage.ExistFolder(fullFilePath) ) + { + return Enumerable.Empty>(); + } - var folders = new StorageHostFullPathFilesystem(_logger).GetDirectoryRecursive(fullFilePath); + var folders = storage.GetDirectoryRecursive(fullFilePath); // Used For subfolders // convert back to subPath style @@ -242,7 +262,7 @@ public Stream ReadStream(string path, int maxRead = -1) Stream LocalGet() { - var fullFilePath = _appSettings.DatabasePathToFilePath(path,false); + var fullFilePath = _appSettings.DatabasePathToFilePath(path); var fileStream = new FileStream(fullFilePath, FileMode.Open, FileAccess.Read); if ( maxRead <= 1 ) { @@ -274,7 +294,7 @@ Stream LocalGet() public bool WriteStream(Stream stream, string path) { // should be able to write files that are not exist yet - var fullFilePath = _appSettings.DatabasePathToFilePath(path,false); + var fullFilePath = _appSettings.DatabasePathToFilePath(path); return new StorageHostFullPathFilesystem(_logger).WriteStream(stream, fullFilePath); } @@ -286,7 +306,7 @@ public bool WriteStreamOpenOrCreate(Stream stream, string path) public Task WriteStreamAsync(Stream stream, string path) { - var fullFilePath = _appSettings.DatabasePathToFilePath(path,false); + var fullFilePath = _appSettings.DatabasePathToFilePath(path); return new StorageHostFullPathFilesystem(_logger).WriteStreamAsync(stream, fullFilePath); } } diff --git a/starsky/starskytest/Controllers/ExportControllerTest.cs b/starsky/starskytest/Controllers/ExportControllerTest.cs index e6e9e1320d..630a152787 100644 --- a/starsky/starskytest/Controllers/ExportControllerTest.cs +++ b/starsky/starskytest/Controllers/ExportControllerTest.cs @@ -280,8 +280,8 @@ public async Task ExportControllerTest__ThumbFalse_AddXmpFile_CreateListToExport { var storage = new FakeIStorage(new List{"/"}, new List { - _appSettings.DatabasePathToFilePath("/test.dng", false), - _appSettings.DatabasePathToFilePath("/test.xmp", false), + _appSettings.DatabasePathToFilePath("/test.dng"), + _appSettings.DatabasePathToFilePath("/test.xmp"), "/test.dng", "/test.xmp" }); diff --git a/starsky/starskytest/Middleware/MiddlewareExtensionsTest.cs b/starsky/starskytest/Middleware/MiddlewareExtensionsTest.cs index f84ffe0ae5..1fb55693e8 100644 --- a/starsky/starskytest/Middleware/MiddlewareExtensionsTest.cs +++ b/starsky/starskytest/Middleware/MiddlewareExtensionsTest.cs @@ -1,13 +1,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Http; -using Microsoft.EntityFrameworkCore; using Microsoft.VisualStudio.TestTools.UnitTesting; -using starsky.foundation.accountmanagement.Interfaces; using starsky.foundation.accountmanagement.Middleware; -using starsky.foundation.accountmanagement.Services; -using starsky.foundation.database.Data; -using starsky.foundation.platform.Models; -using starskytest.FakeMocks; namespace starskytest.Middleware { @@ -21,55 +15,12 @@ public async Task MiddlewareExtensionsBasicAuthenticationMiddlewareNotSignedIn() { // Arrange var httpContext = new DefaultHttpContext(); - var authMiddleware = new BasicAuthenticationMiddleware(next: (innerHttpContext) => Task.FromResult(0)); + var authMiddleware = new BasicAuthenticationMiddleware(next: (_) => Task.CompletedTask); // Act await authMiddleware.Invoke(httpContext); Assert.IsNotNull(httpContext); } - - -// [TestMethod] -// public async Task MiddlewareExtensionsBasicAuthenticationMiddlewareSignedIn() -// { -// // // Arrange -// // var httpContext = new DefaultHttpContext(); -// // var authMiddleware = new BasicAuthenticationMiddleware(next: (innerHttpContext) => Task.FromResult(0)); -// -// var httpContext = new DefaultHttpContext(); -// -// var services = new ServiceCollection() -// // .AddDbContext(options => options.UseInMemoryDatabase("starsky")) -// .AddIdentity(options => -// { -// // Password settings -// options.Password.RequireDigit = false; -// options.Password.RequiredLength = 10; -// options.Password.RequiredUniqueChars = 0; -// options.Password.RequireLowercase = false; -// options.Password.RequireNonAlphanumeric = false; -// options.Password.RequireUppercase = false; -// }) -// .AddEntityFrameworkStores() -// .AddDefaultTokenProviders(); -// -// var serviceProvider = services..BuildServiceProvider(); -// -// serviceProvider.Services. -// // var userManager = httpContext.RequestServices.GetRequiredService>(); -// -// var user = new ApplicationUser { UserName = "test", Email = "test" }; -// var result = await userManager.CreateAsync(user, "model.Password"); -// -// -// var t = await userManager.FindByNameAsync("test"); -// -// -// Console.WriteLine(); -// // Act -// // await authMiddleware.Invoke(httpContext); -// } - } } diff --git a/starsky/starskytest/starsky.feature.geolookup/Services/GeoCliTest.cs b/starsky/starskytest/starsky.feature.geolookup/Services/GeoCliTest.cs index cd3897726c..105d6ad21e 100644 --- a/starsky/starskytest/starsky.feature.geolookup/Services/GeoCliTest.cs +++ b/starsky/starskytest/starsky.feature.geolookup/Services/GeoCliTest.cs @@ -49,7 +49,7 @@ public async Task GeoCliInput_RelativeUrl_HappyFlow() { var relativeParentFolder = new AppSettings().DatabasePathToFilePath( new StructureService(new FakeIStorage(), new AppSettings().Structure) - .ParseSubfolders(0),false); + .ParseSubfolders(0)!); var storage = new FakeIStorage(new List {"/"}, new List {"/test.jpg"}, diff --git a/starsky/starskytest/starsky.foundation.database/Extensions/TestConnectionTest.cs b/starsky/starskytest/starsky.foundation.database/Extensions/TestConnectionTest.cs index 0e7cbb606f..84666d2caf 100644 --- a/starsky/starskytest/starsky.foundation.database/Extensions/TestConnectionTest.cs +++ b/starsky/starskytest/starsky.foundation.database/Extensions/TestConnectionTest.cs @@ -33,6 +33,7 @@ public override DatabaseFacade Database return null; } +#pragma warning disable SYSLIB0050 var info = new SerializationInfo(typeof(Exception), new FormatterConverter()); info.AddValue("Number", 1); @@ -57,6 +58,7 @@ public override DatabaseFacade Database info, new StreamingContext(StreamingContextStates.All) }); +#pragma warning restore SYSLIB0050 throw instance; } diff --git a/starsky/starskytest/starsky.foundation.platform/Middleware/CheckIfAccountExistMiddlewareTest.cs b/starsky/starskytest/starsky.foundation.platform/Middleware/CheckIfAccountExistMiddlewareTest.cs index 7aa9c64b21..7a3477b5bb 100644 --- a/starsky/starskytest/starsky.foundation.platform/Middleware/CheckIfAccountExistMiddlewareTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Middleware/CheckIfAccountExistMiddlewareTest.cs @@ -74,7 +74,7 @@ public async Task NotLoggedIn() (_) => { invoked = true; - return Task.FromResult(0); + return Task.CompletedTask; }); var httpContext = new DefaultHttpContext @@ -96,7 +96,7 @@ public async Task HasClaim_AndAuthenticated() (_) => { invoked = true; - return Task.FromResult(0); + return Task.CompletedTask; }); var httpContextAccessor = _serviceProvider.GetRequiredService(); @@ -109,7 +109,7 @@ public async Task HasClaim_AndAuthenticated() await middleware.Invoke(httpContextAccessor.HttpContext); Assert.IsTrue(invoked); - Assert.IsTrue(httpContextAccessor.HttpContext.User.Identity.IsAuthenticated); + Assert.IsTrue(httpContextAccessor.HttpContext?.User.Identity?.IsAuthenticated); } @@ -122,7 +122,7 @@ public async Task HasClaim_AndAuthenticated_ButRemoved() (_) => { invoked = true; - return Task.FromResult(0); + return Task.CompletedTask; }); var httpContextAccessor = _serviceProvider.GetRequiredService(); @@ -134,12 +134,11 @@ public async Task HasClaim_AndAuthenticated_ButRemoved() // and remove user await userManager.RemoveUser("email", "test"); - await middleware.Invoke(httpContextAccessor.HttpContext); Assert.IsFalse(invoked); - Assert.AreEqual(401,httpContextAccessor.HttpContext.Response.StatusCode); + Assert.AreEqual(401,httpContextAccessor.HttpContext?.Response.StatusCode); } [TestMethod] @@ -153,7 +152,7 @@ public void GetUserTableIdFromClaims_NameIdentifierNull() [TestMethod] public void GetUserTableIdFromClaims_Valid() { - var userId = "2"; + const string userId = "2"; var httpContext = new DefaultHttpContext(); var claims = new List { new Claim(ClaimTypes.NameIdentifier, userId) }; httpContext.User = new ClaimsPrincipal(new ClaimsIdentity(claims)); diff --git a/starsky/starskytest/starsky.foundation.platform/Middleware/NoAccountMiddlewareTest.cs b/starsky/starskytest/starsky.foundation.platform/Middleware/NoAccountMiddlewareTest.cs index a1876c0cce..3121a703bd 100644 --- a/starsky/starskytest/starsky.foundation.platform/Middleware/NoAccountMiddlewareTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Middleware/NoAccountMiddlewareTest.cs @@ -74,7 +74,7 @@ public async Task OnHomePageNotLoginShouldAutoLogin() (_) => { invoked = true; - return Task.FromResult(0); + return Task.CompletedTask; }, new AppSettings()); var services = new ServiceCollection(); @@ -106,7 +106,7 @@ public async Task OnHomePageNotLoginShouldAutoLogin_DemoModeOn() (_) => { invoked = true; - return Task.FromResult(0); + return Task.CompletedTask; }, new AppSettings{DemoUnsafeDeleteStorageFolder = true}); var services = new ServiceCollection(); @@ -138,7 +138,7 @@ public async Task OnApiPageNotLoginShouldIgnore() (_) => { invoked = true; - return Task.FromResult(0); + return Task.CompletedTask; },new AppSettings()); var services = new ServiceCollection(); @@ -170,7 +170,7 @@ public async Task NullNotLoginShouldCreate() (_) => { invoked = true; - return Task.FromResult(0); + return Task.CompletedTask; }, new AppSettings()); var services = new ServiceCollection(); @@ -199,7 +199,7 @@ public async Task HasClaim_AndAuthenticated() (_) => { invoked = true; - return Task.FromResult(0); + return Task.CompletedTask; },new AppSettings()); var httpContextAccessor = _serviceProvider.GetRequiredService(); @@ -224,7 +224,7 @@ public async Task OnHomePageNotLoginShouldIgnoreDueOffNetwork() (_) => { invoked = true; - return Task.FromResult(0); + return Task.CompletedTask; },new AppSettings()); var services = new ServiceCollection(); diff --git a/starsky/starskytest/starsky.foundation.platform/Models/AppSettingsTest.cs b/starsky/starskytest/starsky.foundation.platform/Models/AppSettingsTest.cs index 0cd891f867..c9120bbeed 100644 --- a/starsky/starskytest/starsky.foundation.platform/Models/AppSettingsTest.cs +++ b/starsky/starskytest/starsky.foundation.platform/Models/AppSettingsTest.cs @@ -541,24 +541,13 @@ public void AccountRolesByEmailRegisterOverwrite_ValidRole2() Assert.AreEqual(2,appSettings.AccountRolesByEmailRegisterOverwrite.Count); Assert.AreEqual("Administrator", appSettings.AccountRolesByEmailRegisterOverwrite["bogusEmail2"]); } - - - [TestMethod] - public void DatabasePathToFilePath_Null() - { - var appSettings = new AppSettings(); - - var result = appSettings.DatabasePathToFilePath("\\test"); - - Assert.IsNull(result); - } [TestMethod] public void DatabasePathToFilePath_NoNull() { var appSettings = new AppSettings(); - var result = appSettings.DatabasePathToFilePath("\\test",false); + var result = appSettings.DatabasePathToFilePath("\\test"); Assert.IsNotNull(result); } diff --git a/starsky/starskytest/starsky.foundation.storage/Exceptions/DecodingExceptionTest.cs b/starsky/starskytest/starsky.foundation.storage/Exceptions/DecodingExceptionTest.cs index 6a86807ecd..a5046151ec 100644 --- a/starsky/starskytest/starsky.foundation.storage/Exceptions/DecodingExceptionTest.cs +++ b/starsky/starskytest/starsky.foundation.storage/Exceptions/DecodingExceptionTest.cs @@ -14,6 +14,7 @@ public sealed class DecodingExceptionTest [ExpectedException(typeof(DecodingException))] public void DecodingException() { +#pragma warning disable SYSLIB0050 var info = new SerializationInfo(typeof(Exception), new FormatterConverter()); info.AddValue("Message", ""); @@ -35,6 +36,7 @@ public void DecodingException() }); throw instance; +#pragma warning restore SYSLIB0050 } } } diff --git a/starsky/starskytest/starsky.foundation.sync/WatcherHelpers/EventQueueOverflowExceptionTest.cs b/starsky/starskytest/starsky.foundation.sync/WatcherHelpers/EventQueueOverflowExceptionTest.cs index 46deb3ecb3..15c54f0e73 100644 --- a/starsky/starskytest/starsky.foundation.sync/WatcherHelpers/EventQueueOverflowExceptionTest.cs +++ b/starsky/starskytest/starsky.foundation.sync/WatcherHelpers/EventQueueOverflowExceptionTest.cs @@ -28,6 +28,7 @@ public void EventQueueOverflowExceptionMessage() [ExpectedException(typeof(EventQueueOverflowException))] public void EventQueueOverflowException_Protected() { +#pragma warning disable SYSLIB0050 var info = new SerializationInfo(typeof(Exception), new FormatterConverter()); info.AddValue("Message", ""); @@ -50,6 +51,7 @@ public void EventQueueOverflowException_Protected() }); throw instance; +#pragma warning restore SYSLIB0050 } } } From 0a001a34cf359391968b1d81e02d5f4ec3a236fb Mon Sep 17 00:00:00 2001 From: Dion Date: Sun, 21 Jan 2024 22:42:46 +0100 Subject: [PATCH 31/31] code smells --- starsky/starsky.feature.trash/Services/MoveToTrashService.cs | 1 - starsky/starskytest/Controllers/ExportControllerTest.cs | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/starsky/starsky.feature.trash/Services/MoveToTrashService.cs b/starsky/starsky.feature.trash/Services/MoveToTrashService.cs index 59531d5653..457a417774 100644 --- a/starsky/starsky.feature.trash/Services/MoveToTrashService.cs +++ b/starsky/starsky.feature.trash/Services/MoveToTrashService.cs @@ -147,7 +147,6 @@ private async Task SystemTrashInQueue(List moveToTrash) var fullFilePaths = moveToTrash .Where(p => p.FilePath != null) .Select(p => _appSettings.DatabasePathToFilePath(p.FilePath!)) - .Cast() .ToList(); _systemTrashService.Trash(fullFilePaths); diff --git a/starsky/starskytest/Controllers/ExportControllerTest.cs b/starsky/starskytest/Controllers/ExportControllerTest.cs index 630a152787..3c0e1aefd5 100644 --- a/starsky/starskytest/Controllers/ExportControllerTest.cs +++ b/starsky/starskytest/Controllers/ExportControllerTest.cs @@ -15,7 +15,6 @@ using starsky.Controllers; using starsky.feature.export.Services; using starsky.foundation.database.Data; -using starsky.foundation.database.Interfaces; using starsky.foundation.database.Models; using starsky.foundation.database.Query; using starsky.foundation.platform.Extensions; @@ -39,7 +38,7 @@ namespace starskytest.Controllers [TestClass] public sealed class ExportControllerTest { - private readonly IQuery _query; + private readonly Query _query; private readonly AppSettings _appSettings; private readonly CreateAnImage _createAnImage; private readonly IUpdateBackgroundTaskQueue _bgTaskQueue; @@ -66,7 +65,6 @@ public ExportControllerTest() // Fake the readMeta output services.AddSingleton(); - // Inject Config helper services.AddSingleton(new ConfigurationBuilder().Build());