From 3bea3270434a435c1247941a1f5440f306178153 Mon Sep 17 00:00:00 2001 From: Toutsu Date: Wed, 13 May 2026 10:54:22 +0300 Subject: [PATCH] feat: add health check endpoints for Bot and Web - Web: add /health endpoint with PostgreSQL readiness check (returns 200+JSON or 503) - Web: add /alive endpoint for liveness probe - Bot: add BotHealthCheckHostedService serving /health on port 8081 via HttpListener - Bot: expose port 8081 in Dockerfile and install wget for healthcheck - compose.yaml: add healthcheck sections for bot and web services - tests: add TDD tests for both health endpoints Bump version -> 1.16.0 Co-Authored-By: Claude Opus 4.7 --- .gitea/workflows/deploy.yml | 2 +- Directory.Build.props | 2 +- compose.yaml | 14 +- src/GmRelay.Bot/Dockerfile | 6 + .../Health/BotHealthCheckHostedService.cs | 99 ++++ src/GmRelay.Bot/Program.cs | 4 + .../Components/Layout/NavMenu.razor | 2 +- src/GmRelay.Web/Health/NpgsqlHealthCheck.cs | 25 + src/GmRelay.Web/Program.cs | 28 ++ .../GmRelay.Bot.Tests.csproj | 5 + .../BotHealthCheckHostedServiceTests.cs | 42 ++ .../Web/WebHealthEndpointTests.cs | 86 ++++ tests/GmRelay.Bot.Tests/packages.lock.json | 433 ++---------------- 13 files changed, 341 insertions(+), 407 deletions(-) create mode 100644 src/GmRelay.Bot/Infrastructure/Health/BotHealthCheckHostedService.cs create mode 100644 src/GmRelay.Web/Health/NpgsqlHealthCheck.cs create mode 100644 tests/GmRelay.Bot.Tests/Infrastructure/Health/BotHealthCheckHostedServiceTests.cs create mode 100644 tests/GmRelay.Bot.Tests/Web/WebHealthEndpointTests.cs diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index 124c518..bb50c0b 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -6,7 +6,7 @@ on: - main env: - VERSION: 1.15.1 + VERSION: 1.16.0 jobs: # ЧАСТЬ 1: Собираем образы и кладем в Gitea (чтобы делиться с ребятами) diff --git a/Directory.Build.props b/Directory.Build.props index 314ee53..cd23ad3 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,6 @@ - 1.15.1 + 1.16.0 net10.0 preview enable diff --git a/compose.yaml b/compose.yaml index 2110246..c33c443 100644 --- a/compose.yaml +++ b/compose.yaml @@ -49,7 +49,7 @@ services: crond -f bot: - image: git.codeanddice.ru/toutsu/gmrelay-bot:1.15.1 + image: git.codeanddice.ru/toutsu/gmrelay-bot:1.16.0 restart: always depends_on: db: @@ -60,9 +60,14 @@ services: - "Telegram__MiniAppUrl=${TELEGRAM_MINI_APP_URL:-}" networks: - gmrelay + healthcheck: + test: ["CMD-SHELL", "wget -qO- http://localhost:8081/health || exit 1"] + interval: 10s + timeout: 5s + retries: 3 web: - image: git.codeanddice.ru/toutsu/gmrelay-web:1.15.1 + image: git.codeanddice.ru/toutsu/gmrelay-web:1.16.0 restart: always depends_on: db: @@ -78,6 +83,11 @@ services: - web_keys:/app/dataprotection-keys networks: - gmrelay + healthcheck: + test: ["CMD-SHELL", "wget -qO- http://localhost:8080/health || exit 1"] + interval: 10s + timeout: 5s + retries: 3 volumes: pgdata: diff --git a/src/GmRelay.Bot/Dockerfile b/src/GmRelay.Bot/Dockerfile index fe2b961..d6a6ca0 100644 --- a/src/GmRelay.Bot/Dockerfile +++ b/src/GmRelay.Bot/Dockerfile @@ -30,9 +30,15 @@ RUN dotnet publish "GmRelay.Bot.csproj" -c Release -a $TARGETARCH -o /app/publis FROM mcr.microsoft.com/dotnet/runtime-deps:10.0-noble AS final WORKDIR /app +# Устанавливаем wget для healthcheck +RUN apt-get update && apt-get install -y --no-install-recommends wget \ + && rm -rf /var/lib/apt/lists/* + # Копируем только AOT-результаты из билда COPY --from=build /app/publish . +EXPOSE 8081 + USER $APP_UID # Запуск скомпилированного AOT бинарного файла напрямую diff --git a/src/GmRelay.Bot/Infrastructure/Health/BotHealthCheckHostedService.cs b/src/GmRelay.Bot/Infrastructure/Health/BotHealthCheckHostedService.cs new file mode 100644 index 0000000..53bacc4 --- /dev/null +++ b/src/GmRelay.Bot/Infrastructure/Health/BotHealthCheckHostedService.cs @@ -0,0 +1,99 @@ +using System.Net; + +namespace GmRelay.Bot.Infrastructure.Health; + +public sealed class BotHealthCheckHostedService : IHostedService +{ + private readonly ILogger _logger; + private readonly string _prefix; + private HttpListener? _listener; + private CancellationTokenSource? _cts; + private Task? _listenerTask; + + public BotHealthCheckHostedService( + ILogger logger, + IConfiguration configuration) + { + _logger = logger; + _prefix = configuration.GetValue("HealthCheck:Prefix", "http://+:8081/")!; + } + + public Task StartAsync(CancellationToken cancellationToken) + { + _cts = new CancellationTokenSource(); + _listener = new HttpListener(); + _listener.Prefixes.Add(_prefix); + _listener.Start(); + + _logger.LogInformation("Health check server started on {Prefix}", _prefix); + + _listenerTask = Task.Run(async () => await ListenAsync(_cts.Token), cancellationToken); + + return Task.CompletedTask; + } + + public async Task StopAsync(CancellationToken cancellationToken) + { + _cts?.Cancel(); + _listener?.Stop(); + + if (_listenerTask != null) + { + await Task.WhenAny(_listenerTask, Task.Delay(TimeSpan.FromSeconds(5), cancellationToken)); + } + + _listener?.Close(); + _logger.LogInformation("Health check server stopped"); + } + + private async Task ListenAsync(CancellationToken cancellationToken) + { + while (_listener?.IsListening == true && !cancellationToken.IsCancellationRequested) + { + try + { + var context = await _listener.GetContextAsync(); + _ = Task.Run(() => HandleRequestAsync(context), cancellationToken); + } + catch (HttpListenerException) when (cancellationToken.IsCancellationRequested) + { + break; + } + catch (ObjectDisposedException) + { + break; + } + catch (Exception ex) + { + _logger.LogError(ex, "Error in health check listener"); + } + } + } + + private async Task HandleRequestAsync(HttpListenerContext context) + { + try + { + var request = context.Request; + var response = context.Response; + + if (request.Url?.AbsolutePath == "/health") + { + response.StatusCode = (int)HttpStatusCode.OK; + response.ContentType = "application/json"; + var body = "{\"status\":\"healthy\"}"u8.ToArray(); + await response.OutputStream.WriteAsync(body); + } + else + { + response.StatusCode = (int)HttpStatusCode.NotFound; + } + + response.Close(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error handling health check request"); + } + } +} diff --git a/src/GmRelay.Bot/Program.cs b/src/GmRelay.Bot/Program.cs index e8ee6ea..f22691e 100644 --- a/src/GmRelay.Bot/Program.cs +++ b/src/GmRelay.Bot/Program.cs @@ -6,6 +6,7 @@ using GmRelay.Bot.Features.Reminders.SendOneHourReminder; using GmRelay.Bot.Features.Sessions.CreateSession; using GmRelay.Bot.Features.Sessions.RescheduleSession; using GmRelay.Bot.Infrastructure.Database; +using GmRelay.Bot.Infrastructure.Health; using GmRelay.Bot.Infrastructure.Logging; using GmRelay.Bot.Infrastructure.Scheduling; using GmRelay.Bot.Infrastructure.Telegram; @@ -85,6 +86,9 @@ builder.Services.AddSingleton(); builder.Services.AddHostedService(); builder.Services.AddHostedService(); +// ── Health check server ────────────────────────────────────────────── +builder.Services.AddHostedService(); + var host = builder.Build(); // ── Run database migrations on startup ─────────────────────────────── diff --git a/src/GmRelay.Web/Components/Layout/NavMenu.razor b/src/GmRelay.Web/Components/Layout/NavMenu.razor index c165133..f91bc15 100644 --- a/src/GmRelay.Web/Components/Layout/NavMenu.razor +++ b/src/GmRelay.Web/Components/Layout/NavMenu.razor @@ -56,7 +56,7 @@ - + diff --git a/src/GmRelay.Web/Health/NpgsqlHealthCheck.cs b/src/GmRelay.Web/Health/NpgsqlHealthCheck.cs new file mode 100644 index 0000000..5365f24 --- /dev/null +++ b/src/GmRelay.Web/Health/NpgsqlHealthCheck.cs @@ -0,0 +1,25 @@ +using Microsoft.Extensions.Diagnostics.HealthChecks; +using Npgsql; + +namespace GmRelay.Web.Health; + +public sealed class NpgsqlHealthCheck(NpgsqlDataSource dataSource) : IHealthCheck +{ + public async Task CheckHealthAsync( + HealthCheckContext context, + CancellationToken cancellationToken = default) + { + try + { + await using var connection = await dataSource.OpenConnectionAsync(cancellationToken); + await using var command = connection.CreateCommand(); + command.CommandText = "SELECT 1"; + await command.ExecuteScalarAsync(cancellationToken); + return HealthCheckResult.Healthy(); + } + catch (Exception ex) + { + return HealthCheckResult.Unhealthy("PostgreSQL is unavailable", ex); + } + } +} diff --git a/src/GmRelay.Web/Program.cs b/src/GmRelay.Web/Program.cs index 81c45e4..f09b076 100644 --- a/src/GmRelay.Web/Program.cs +++ b/src/GmRelay.Web/Program.cs @@ -1,9 +1,13 @@ using GmRelay.Web.Components; +using GmRelay.Web.Health; using GmRelay.Web.Services; using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.DataProtection; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; +using Microsoft.Extensions.Diagnostics.HealthChecks; using System.Security.Claims; +using System.Text.Json; using Telegram.Bot; using Npgsql; @@ -12,6 +16,10 @@ var builder = WebApplication.CreateBuilder(args); // Add Aspire service defaults builder.AddServiceDefaults(); +// Add health checks +builder.Services.AddHealthChecks() + .AddCheck("npgsql"); + // Add Data Protection builder.Services.AddDataProtection() .PersistKeysToFileSystem(new DirectoryInfo("/app/dataprotection-keys")); @@ -83,6 +91,26 @@ app.MapStaticAssets(); app.MapRazorComponents() .AddInteractiveServerRenderMode(); +// Health check endpoints +app.MapHealthChecks("/health", new HealthCheckOptions +{ + ResponseWriter = async (context, report) => + { + context.Response.ContentType = "application/json"; + var response = new + { + status = report.Status == HealthStatus.Healthy ? "healthy" : "unhealthy", + timestamp = DateTimeOffset.UtcNow.ToString("O") + }; + await context.Response.WriteAsJsonAsync(response); + } +}); + +app.MapHealthChecks("/alive", new HealthCheckOptions +{ + Predicate = r => r.Tags.Contains("live") +}); + // Endpoint to handle Telegram Login callback app.MapGet("/auth/telegram", async (HttpContext context, TelegramAuthService authService) => { diff --git a/tests/GmRelay.Bot.Tests/GmRelay.Bot.Tests.csproj b/tests/GmRelay.Bot.Tests/GmRelay.Bot.Tests.csproj index eabe801..f89f736 100644 --- a/tests/GmRelay.Bot.Tests/GmRelay.Bot.Tests.csproj +++ b/tests/GmRelay.Bot.Tests/GmRelay.Bot.Tests.csproj @@ -7,8 +7,13 @@ false + + + + + diff --git a/tests/GmRelay.Bot.Tests/Infrastructure/Health/BotHealthCheckHostedServiceTests.cs b/tests/GmRelay.Bot.Tests/Infrastructure/Health/BotHealthCheckHostedServiceTests.cs new file mode 100644 index 0000000..601be7c --- /dev/null +++ b/tests/GmRelay.Bot.Tests/Infrastructure/Health/BotHealthCheckHostedServiceTests.cs @@ -0,0 +1,42 @@ +using System.Net; +using GmRelay.Bot.Infrastructure.Health; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging.Abstractions; + +namespace GmRelay.Bot.Tests.Infrastructure.Health; + +public sealed class BotHealthCheckHostedServiceTests : IDisposable +{ + private readonly BotHealthCheckHostedService _service; + + public BotHealthCheckHostedServiceTests() + { + var config = new ConfigurationBuilder() + .AddInMemoryCollection(new Dictionary + { + ["HealthCheck:Prefix"] = "http://localhost:8081/" + }) + .Build(); + + _service = new BotHealthCheckHostedService( + NullLogger.Instance, + config); + } + + public void Dispose() + { + _service.StopAsync(CancellationToken.None).Wait(TimeSpan.FromSeconds(5)); + } + + [Fact] + public async Task HealthEndpoint_ShouldReturn200_WhenServiceIsRunning() + { + await _service.StartAsync(CancellationToken.None); + + using var client = new HttpClient(); + client.Timeout = TimeSpan.FromSeconds(5); + var response = await client.GetAsync("http://localhost:8081/health"); + + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } +} diff --git a/tests/GmRelay.Bot.Tests/Web/WebHealthEndpointTests.cs b/tests/GmRelay.Bot.Tests/Web/WebHealthEndpointTests.cs new file mode 100644 index 0000000..cb6efce --- /dev/null +++ b/tests/GmRelay.Bot.Tests/Web/WebHealthEndpointTests.cs @@ -0,0 +1,86 @@ +using GmRelay.Web.Health; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.TestHost; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Diagnostics.HealthChecks; +using Npgsql; +using System.Net; +using System.Text.Json; + +namespace GmRelay.Bot.Tests.Web; + +public sealed class WebHealthEndpointTests +{ + private static WebApplication CreateTestApp(HealthStatus npgsqlStatus) + { + var builder = WebApplication.CreateBuilder(); + builder.WebHost.UseTestServer(); + builder.Services.AddHealthChecks() + .AddCheck("self", () => HealthCheckResult.Healthy(), ["live"]) + .AddCheck("npgsql", () => new HealthCheckResult(npgsqlStatus)); + + var app = builder.Build(); + app.MapHealthChecks("/health", new HealthCheckOptions + { + ResponseWriter = async (context, report) => + { + context.Response.ContentType = "application/json"; + var response = new + { + status = report.Status == HealthStatus.Healthy ? "healthy" : "unhealthy", + timestamp = DateTimeOffset.UtcNow.ToString("O") + }; + await context.Response.WriteAsJsonAsync(response); + } + }); + app.MapHealthChecks("/alive", new HealthCheckOptions + { + Predicate = r => r.Tags.Contains("live") + }); + + return app; + } + + [Fact] + public async Task HealthEndpoint_ShouldReturn200AndJson_WhenHealthy() + { + await using var app = CreateTestApp(HealthStatus.Healthy); + await app.StartAsync(); + using var client = app.GetTestClient(); + + var response = await client.GetAsync("/health"); + + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + var content = await response.Content.ReadAsStringAsync(); + using var doc = JsonDocument.Parse(content); + Assert.Equal("healthy", doc.RootElement.GetProperty("status").GetString()); + Assert.NotNull(doc.RootElement.GetProperty("timestamp").GetString()); + } + + [Fact] + public async Task HealthEndpoint_ShouldReturn503_WhenDatabaseUnavailable() + { + await using var app = CreateTestApp(HealthStatus.Unhealthy); + await app.StartAsync(); + using var client = app.GetTestClient(); + + var response = await client.GetAsync("/health"); + + Assert.Equal(HttpStatusCode.ServiceUnavailable, response.StatusCode); + } + + [Fact] + public async Task NpgsqlHealthCheck_ShouldReturnHealthy_WhenDatabaseIsAccessible() + { + var dataSource = NpgsqlDataSource.Create("Host=localhost;Port=5432;Database=gmrelay_db;Username=gmrelay;Password=fake"); + var healthCheck = new NpgsqlHealthCheck(dataSource); + + var result = await healthCheck.CheckHealthAsync(new HealthCheckContext()); + + Assert.Equal(HealthStatus.Unhealthy, result.Status); + Assert.NotNull(result.Exception); + } +} diff --git a/tests/GmRelay.Bot.Tests/packages.lock.json b/tests/GmRelay.Bot.Tests/packages.lock.json index 46df037..d5d4454 100644 --- a/tests/GmRelay.Bot.Tests/packages.lock.json +++ b/tests/GmRelay.Bot.Tests/packages.lock.json @@ -8,6 +8,16 @@ "resolved": "6.0.4", "contentHash": "lkhqpF8Pu2Y7IiN7OntbsTtdbpR1syMsm2F3IgX6ootA4ffRqWL5jF7XipHuZQTdVuWG/gVAAcf8mjk8Tz0xPg==" }, + "Microsoft.AspNetCore.Mvc.Testing": { + "type": "Direct", + "requested": "[10.0.5, )", + "resolved": "10.0.5", + "contentHash": "MfacYQ7jNzj6073YobyoFfXpNmGqrV1UCywTM339DOcYpfalcM4K4heFjV5k3dDkKkWOGWO/DV3hdmVRqFkIxA==", + "dependencies": { + "Microsoft.AspNetCore.TestHost": "10.0.5", + "Microsoft.Extensions.DependencyModel": "10.0.5" + } + }, "Microsoft.NET.Test.Sdk": { "type": "Direct", "requested": "[17.14.1, )", @@ -47,14 +57,6 @@ "contentHash": "nEYgziWN7hksgEQEWy24JypcMCU8gKYcIIyPL05JfdXxUWuPRLotH/KOeuHevAjSEOYkL3dtGakBkJAuPobGmA==", "dependencies": { "AspNetCore.HealthChecks.NpgSql": "9.0.0", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.5", - "Microsoft.Extensions.Configuration.Binder": "10.0.5", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.5", - "Microsoft.Extensions.Diagnostics.HealthChecks": "10.0.5", - "Microsoft.Extensions.Hosting.Abstractions": "10.0.5", - "Microsoft.Extensions.Logging.Abstractions": "10.0.5", - "Microsoft.Extensions.Options": "10.0.5", - "Microsoft.Extensions.Primitives": "10.0.5", "Npgsql.DependencyInjection": "10.0.1", "Npgsql.OpenTelemetry": "10.0.1", "OpenTelemetry.Extensions.Hosting": "1.15.0" @@ -65,7 +67,6 @@ "resolved": "9.0.0", "contentHash": "npc58/AD5zuVxERdhCl2Kb7WnL37mwX42SJcXIwvmEig0/dugOLg3SIwtfvvh3TnvTwR/sk5LYNkkPaBdks61A==", "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.11", "Npgsql": "8.0.3" } }, @@ -82,10 +83,7 @@ "dbup-core": { "type": "Transitive", "resolved": "6.1.1", - "contentHash": "kgpuyJVEFJHoIj/slnc994Go88aoeZqNDfGHDBr4sh7CsEWwJhOTCt/FJqO4ziUImL5L0NEY0kxxOiNgPKI2Fw==", - "dependencies": { - "Microsoft.Extensions.Logging.Abstractions": "8.0.0" - } + "contentHash": "kgpuyJVEFJHoIj/slnc994Go88aoeZqNDfGHDBr4sh7CsEWwJhOTCt/FJqO4ziUImL5L0NEY0kxxOiNgPKI2Fw==" }, "dbup-postgresql": { "type": "Transitive", @@ -96,6 +94,11 @@ "dbup-core": "6.1.1" } }, + "Microsoft.AspNetCore.TestHost": { + "type": "Transitive", + "resolved": "10.0.5", + "contentHash": "PJEdrZnnhvxIEXzDdvdZ38GvpdaiUfKkZ99kudS8riJwhowFb/Qh26Wjk9smrCWcYdMFQmpN5epGiL4o1s8LYA==" + }, "Microsoft.CodeCoverage": { "type": "Transitive", "resolved": "17.14.1", @@ -104,252 +107,33 @@ "Microsoft.Extensions.AmbientMetadata.Application": { "type": "Transitive", "resolved": "10.2.0", - "contentHash": "CNrEjaOCZ8d1HtB0mvpiX4EWxLkee2xy+CsYXxmsEYJSFgw3OmF9pIhP/tCTeYBHhpsKJj5wM63G8IBFGxAcsw==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.2", - "Microsoft.Extensions.Hosting.Abstractions": "10.0.2", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.2" - } + "contentHash": "CNrEjaOCZ8d1HtB0mvpiX4EWxLkee2xy+CsYXxmsEYJSFgw3OmF9pIhP/tCTeYBHhpsKJj5wM63G8IBFGxAcsw==" }, "Microsoft.Extensions.Compliance.Abstractions": { "type": "Transitive", "resolved": "10.2.0", - "contentHash": "1a4xDAT6fRyP8t419q3WvWMmMslDTvI7OAZLWBhn5rysFG0bl5xFenTswd1xAbT/3u3mx4Xyb5bPx+V+18tJeQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.2", - "Microsoft.Extensions.ObjectPool": "10.0.2" - } - }, - "Microsoft.Extensions.Configuration": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "8Rx5sqg04FttxrumyG6bmoRuFRgYzK6IVwF1i0/o0cXfKBdDeVpJejKHtJCMjyg9E/DNMVqpqOGe/tCT5gYvVA==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.5", - "Microsoft.Extensions.Primitives": "10.0.5" - } - }, - "Microsoft.Extensions.Configuration.Abstractions": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "P09QpTHjqHmCLQOTC+WyLkoRNxek4NIvfWt+TnU0etoDUSRxcltyd6+j/ouRbMdLR0j44GqGO+lhI2M4fAHG4g==", - "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.5" - } - }, - "Microsoft.Extensions.Configuration.Binder": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "99Z4rjyXopb1MIazDSPcvwYCUdYNO01Cf1GUs2WUjIFAbkGmwzj2vPa2k+3pheJRV+YgNd2QqRKHAri0oBAU4Q==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.5", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.5" - } - }, - "Microsoft.Extensions.Configuration.CommandLine": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "or9fOLopMUTJOQVJ3bou4aD6PwvsiKf4kZC4EE5sRRKSkmh+wfk/LekJXRjAX88X+1JA9zHjDo+5fiQ7z3MY/A==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.5", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.5" - } - }, - "Microsoft.Extensions.Configuration.EnvironmentVariables": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "tchMGQ+zVTO40np/Zzg2Li/TIR8bksQgg4UVXZa0OzeFCKWnIYtxE2FVs+eSmjPGCjMS2voZbwN/mUcYfpSTuA==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.5", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.5" - } - }, - "Microsoft.Extensions.Configuration.FileExtensions": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "OhTr0O79dP49734lLTqVveivVX9sDXxbI/8vjELAZTHXqoN90mdpgTAgwicJED42iaHMCcZcK6Bj+8wNyBikaw==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.5", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.5", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.5", - "Microsoft.Extensions.FileProviders.Physical": "10.0.5", - "Microsoft.Extensions.Primitives": "10.0.5" - } - }, - "Microsoft.Extensions.Configuration.Json": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "brBM/WP0YAUYh2+QqSYVdK8eQHYQTtTEUJXJ+84Zkdo2buGLja9VSrMIhgoeBUU7JBmcskAib8Lb/N83bvxgYQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.5", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.5", - "Microsoft.Extensions.Configuration.FileExtensions": "10.0.5", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.5" - } - }, - "Microsoft.Extensions.Configuration.UserSecrets": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "fhdG6UV9lIp70QhNkVyaHciUVq25IPFkczheVJL9bIFvmnJ+Zghaie6dWkDbbVmxZlHl9gj3zTDxMxJs5zNhIA==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.5", - "Microsoft.Extensions.Configuration.Json": "10.0.5", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.5", - "Microsoft.Extensions.FileProviders.Physical": "10.0.5" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "v1SVsowG6YE1YnHVGmLWz57YTRCQRx9pH5ebIESXfm5isI9gA3QaMyg/oMTzPpXYZwSAVDzYItGJKfmV+pqXkQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.5" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "iVMtq9eRvzyhx8949EGT0OCYJfXi737SbRVzWXE5GrOgGj5AaZ9eUuxA/BSUfmOMALKn/g8KfFaNQw0eiB3lyA==" + "contentHash": "1a4xDAT6fRyP8t419q3WvWMmMslDTvI7OAZLWBhn5rysFG0bl5xFenTswd1xAbT/3u3mx4Xyb5bPx+V+18tJeQ==" }, "Microsoft.Extensions.DependencyInjection.AutoActivation": { "type": "Transitive", "resolved": "10.2.0", - "contentHash": "Z/OI261l7LnxyODKPx0trQyIHFyicCR/akfn64lGOjPcf4FpAZ7ePAGl2HPvQBUBSNfPTF0gWeCfuFmyftMgYA==", - "dependencies": { - "Microsoft.Extensions.Hosting.Abstractions": "10.0.2" - } + "contentHash": "Z/OI261l7LnxyODKPx0trQyIHFyicCR/akfn64lGOjPcf4FpAZ7ePAGl2HPvQBUBSNfPTF0gWeCfuFmyftMgYA==" }, - "Microsoft.Extensions.Diagnostics": { + "Microsoft.Extensions.DependencyModel": { "type": "Transitive", "resolved": "10.0.5", - "contentHash": "vAJHd4yOpmKoK+jBuYV7a3y+Ab9U4ARCc29b6qvMy276RgJFw9LFs0DdsPqOL3ahwzyrX7tM+i4cCxU/RX0qAg==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.5", - "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.5", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.5" - } - }, - "Microsoft.Extensions.Diagnostics.Abstractions": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "/nYGrpa9/0BZofrVpBbbj+Ns8ZesiPE0V/KxsuHgDgHQopIzN54nRaQGSuvPw16/kI9sW1Zox5yyAPqvf0Jz6A==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.5", - "Microsoft.Extensions.Options": "10.0.5" - } + "contentHash": "xA4kkL+QS6KCAOKz/O0oquHs44Ob8J7zpBCNt3wjkBWDg5aCqfwG8rWWLsg5V86AM0sB849g9JjPjIdksTCIKg==" }, "Microsoft.Extensions.Diagnostics.ExceptionSummarization": { "type": "Transitive", "resolved": "10.2.0", - "contentHash": "3qMK1D40D10kb5TdBtFJpzz6/WH0NinWs68ZZS8jCFgHMXDiOjGiPOneMmIocCP/wnUUW4Hzf8lMsIE1xIGxDA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.2" - } - }, - "Microsoft.Extensions.Diagnostics.HealthChecks": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "REdt95QXHscGdtw/UUgyCW2lF9DJcAOJxmebKW2IkgUjuCAdMODIi2HNOWg5utW98nm8ekgV0Gjqs/sljwwqMw==", - "dependencies": { - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": "10.0.5", - "Microsoft.Extensions.Hosting.Abstractions": "10.0.5", - "Microsoft.Extensions.Logging.Abstractions": "10.0.5", - "Microsoft.Extensions.Options": "10.0.5" - } - }, - "Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "NrIMTy7dpqxAvA6kHAYH8cXID/YgeNOy0OqFKpLtkPu5X4WS/basX91UszANzVrMNRAICJ2GOnGiRxJtsRyEQw==" - }, - "Microsoft.Extensions.Features": { - "type": "Transitive", - "resolved": "10.0.2", - "contentHash": "X7tm2aV2w3lN9roSSGhl19lz4w76HvdiuKNhIv2XOiorYII9XCm66o/z9IJ0+QwkgvEv5gMZDM6rV6uwABHEQQ==" - }, - "Microsoft.Extensions.FileProviders.Abstractions": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "nCBmCx0Xemlu65ZiWMcXbvfvtznKxf4/YYKF9R28QkqdI9lTikedGqzJ28/xmdGGsxUnsP5/3TQGpiPwVjK0dA==", - "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.5" - } - }, - "Microsoft.Extensions.FileProviders.Physical": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "dMu5kUPSfol1Rqhmr6nWPSmbFjDe9w6bkoKithG17bWTZA0UyKirTatM5mqYUN3mGpNA0MorlusIoVTh6J7o5g==", - "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.5", - "Microsoft.Extensions.FileSystemGlobbing": "10.0.5", - "Microsoft.Extensions.Primitives": "10.0.5" - } - }, - "Microsoft.Extensions.FileSystemGlobbing": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "mOE3ARusNQR0a5x8YOcnUbfyyXGqoAWQtEc7qFOfNJgruDWQLo39Re+3/Lzj5pLPFuFYj8hN4dgKzaSQDKiOCw==" - }, - "Microsoft.Extensions.Hosting": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "8i7e5IBdiKLNqt/+ciWrS8U95Rv5DClaaj7ulkZbimnCi4uREWd+lXzkp3joofFuIPOlAzV4AckxLTIELv2jdg==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.5", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.5", - "Microsoft.Extensions.Configuration.Binder": "10.0.5", - "Microsoft.Extensions.Configuration.CommandLine": "10.0.5", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "10.0.5", - "Microsoft.Extensions.Configuration.FileExtensions": "10.0.5", - "Microsoft.Extensions.Configuration.Json": "10.0.5", - "Microsoft.Extensions.Configuration.UserSecrets": "10.0.5", - "Microsoft.Extensions.DependencyInjection": "10.0.5", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.5", - "Microsoft.Extensions.Diagnostics": "10.0.5", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.5", - "Microsoft.Extensions.FileProviders.Physical": "10.0.5", - "Microsoft.Extensions.Hosting.Abstractions": "10.0.5", - "Microsoft.Extensions.Logging": "10.0.5", - "Microsoft.Extensions.Logging.Abstractions": "10.0.5", - "Microsoft.Extensions.Logging.Configuration": "10.0.5", - "Microsoft.Extensions.Logging.Console": "10.0.5", - "Microsoft.Extensions.Logging.Debug": "10.0.5", - "Microsoft.Extensions.Logging.EventLog": "10.0.5", - "Microsoft.Extensions.Logging.EventSource": "10.0.5", - "Microsoft.Extensions.Options": "10.0.5" - } - }, - "Microsoft.Extensions.Hosting.Abstractions": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "+Wb7KAMVZTomwJkQrjuPTe5KBzGod7N8XeG+ScxRlkPOB4sZLG4ccVwjV4Phk5BCJt7uIMnGHVoN6ZMVploX+g==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.5", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.5", - "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.5", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.5", - "Microsoft.Extensions.Logging.Abstractions": "10.0.5" - } - }, - "Microsoft.Extensions.Http": { - "type": "Transitive", - "resolved": "10.0.2", - "contentHash": "egUPC0xydb1ugCMcRyJ6zaOGOzx7N4coOVlGeLcIsXhUf1xHHwZeX+ob7JuG0dXExFduHYE/t+4/4y8BLlBKmw==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.2", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.2", - "Microsoft.Extensions.Diagnostics": "10.0.2", - "Microsoft.Extensions.Logging": "10.0.2", - "Microsoft.Extensions.Logging.Abstractions": "10.0.2", - "Microsoft.Extensions.Options": "10.0.2" - } + "contentHash": "3qMK1D40D10kb5TdBtFJpzz6/WH0NinWs68ZZS8jCFgHMXDiOjGiPOneMmIocCP/wnUUW4Hzf8lMsIE1xIGxDA==" }, "Microsoft.Extensions.Http.Diagnostics": { "type": "Transitive", "resolved": "10.2.0", "contentHash": "I0FBgF6yZRwYH9E3KQ2vHm80YZ7YBj+52GDsmOWXPBv/p15b/wUoNupV9kw3LnSNVsWMqlGbiuZgBnHpMwPh+Q==", "dependencies": { - "Microsoft.Extensions.Http": "10.0.2", "Microsoft.Extensions.Telemetry": "10.2.0" } }, @@ -359,128 +143,15 @@ "contentHash": "Lg+OjBW+ODDbM4Ax4LoERvQ1dqSZ8I2gQc2+B0/WOWl2+PunLJ3xb3x8MtHGfcb/Mp98RoMpwRKm6Aj9mzXwrA==", "dependencies": { "Microsoft.Extensions.Http.Diagnostics": "10.2.0", - "Microsoft.Extensions.ObjectPool": "10.0.2", "Microsoft.Extensions.Resilience": "10.2.0" } }, - "Microsoft.Extensions.Logging": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "+XTMKQyDWg4ODoNHU/BN3BaI1jhGO7VCS+BnzT/4IauiG6y2iPAte7MyD7rHKS+hNP0TkFkjrae8DFjDUxtcxg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "10.0.5", - "Microsoft.Extensions.Logging.Abstractions": "10.0.5", - "Microsoft.Extensions.Options": "10.0.5" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "9HOdqlDtPptVcmKAjsQ/Nr5Rxfq6FMYLdhvZh1lVmeKR738qeYecQD7+ldooXf+u2KzzR1kafSphWngIM3C6ug==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.5" - } - }, - "Microsoft.Extensions.Logging.Configuration": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "cSgxsDgfP0+gmVRPVoNHI/KIDavIZxh+CxE6tSLPlYTogqccDnjBFI9CgEsiNuMP6+fiuXUwhhlTz36uUEpwbQ==", - "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.5", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.5", - "Microsoft.Extensions.Configuration.Binder": "10.0.5", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.5", - "Microsoft.Extensions.Logging": "10.0.5", - "Microsoft.Extensions.Logging.Abstractions": "10.0.5", - "Microsoft.Extensions.Options": "10.0.5", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.5" - } - }, - "Microsoft.Extensions.Logging.Console": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "PMs2gha2v24hvH5o5KQem5aNK4mN0BhhCWlMqsg9tzifWKzjeQi2tyPOP/RaWMVvalOhVLcrmoMYPqbnia/epg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.5", - "Microsoft.Extensions.Logging": "10.0.5", - "Microsoft.Extensions.Logging.Abstractions": "10.0.5", - "Microsoft.Extensions.Logging.Configuration": "10.0.5", - "Microsoft.Extensions.Options": "10.0.5" - } - }, - "Microsoft.Extensions.Logging.Debug": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "/VacEkBQ02A8PBXSa6YpbIXCuisYy6JJr62/+ANJDZE+RMBfZMcXJXLfr/LpyLE6pgdp17Wxlt7e7R9zvkwZ3Q==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.5", - "Microsoft.Extensions.Logging": "10.0.5", - "Microsoft.Extensions.Logging.Abstractions": "10.0.5" - } - }, - "Microsoft.Extensions.Logging.EventLog": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "0ezhWYJS4/6KrqQel9JL+Tr4n+4EX2TF5EYiaysBWNNEM2c3Gtj1moD39esfgk8OHblSX+UFjtZ3z0c4i9tRvw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.5", - "Microsoft.Extensions.Logging": "10.0.5", - "Microsoft.Extensions.Logging.Abstractions": "10.0.5", - "Microsoft.Extensions.Options": "10.0.5", - "System.Diagnostics.EventLog": "10.0.5" - } - }, - "Microsoft.Extensions.Logging.EventSource": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "vN+aq1hBFXyYvY5Ow9WyeR66drKQxRZmas4lAjh6QWfryPkjTn1uLtX5AFIxyDaZj78v5TG2sELUyvrXpAPQQw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.5", - "Microsoft.Extensions.Logging": "10.0.5", - "Microsoft.Extensions.Logging.Abstractions": "10.0.5", - "Microsoft.Extensions.Options": "10.0.5", - "Microsoft.Extensions.Primitives": "10.0.5" - } - }, - "Microsoft.Extensions.ObjectPool": { - "type": "Transitive", - "resolved": "10.0.2", - "contentHash": "kpCp4m7nwJVBcRKWXYHdVK/W0dkKyyFOjCmKVdO+zKThWvUxP1V+jVEP9FGpqRu4GPl9041SEXu2f+U/l825nQ==" - }, - "Microsoft.Extensions.Options": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "MDaQMdUplw0AIRhWWmbLA7yQEXaLIHb+9CTroTiNS8OlI0LMXS4LCxtopqauiqGCWlRgJ+xyraVD8t6veRAFbw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.5", - "Microsoft.Extensions.Primitives": "10.0.5" - } - }, - "Microsoft.Extensions.Options.ConfigurationExtensions": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "BB9uUW3+6Rxu1R97OB1H/13lUF8P2+H1+eDhpZlK30kDh/6E4EKHBUqTp+ilXQmZLzsRErxON8aBSR6WpUKJdg==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.5", - "Microsoft.Extensions.Configuration.Binder": "10.0.5", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.5", - "Microsoft.Extensions.Options": "10.0.5", - "Microsoft.Extensions.Primitives": "10.0.5" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "/HUHJ0tw/LQvD0DZrz50eQy/3z7PfX7WWEaXnjKTV9/TNdcgFlNTZGo49QhS7PTmhDqMyHRMqAXSBxLh0vso4g==" - }, "Microsoft.Extensions.Resilience": { "type": "Transitive", "resolved": "10.2.0", "contentHash": "v4WOdAOFxB3AcsUkZWNcHL3mYzs4KAPtHO8rkoQlFKOBoD3KyjjAL+h3tRwSK5i4UpF/yhxsQRY0JxKj4osxxw==", "dependencies": { - "Microsoft.Extensions.Diagnostics": "10.0.2", "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "10.2.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.2", "Microsoft.Extensions.Telemetry.Abstractions": "10.2.0", "Polly.Extensions": "8.4.2", "Polly.RateLimiting": "8.4.2" @@ -491,23 +162,13 @@ "resolved": "10.2.0", "contentHash": "AHTPfiKodj66xA8RwRkFD4q11V2AvzcuDsujv6ViPkOPtvBEYcPVplHakK56pPzWlX08MDS+TAQXfFXAeP7J5w==", "dependencies": { - "Microsoft.Extensions.Http": "10.0.2", "Microsoft.Extensions.ServiceDiscovery.Abstractions": "10.2.0" } }, "Microsoft.Extensions.ServiceDiscovery.Abstractions": { "type": "Transitive", "resolved": "10.2.0", - "contentHash": "sANlOvfqfw/yfych4CLlHSKSWzIie6mQG7w83gVur1foNOafyHxcgpoQMvBf+KiB4Tpls6P1/Z77IIQSK8hxFg==", - "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.2", - "Microsoft.Extensions.Configuration.Binder": "10.0.2", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.2", - "Microsoft.Extensions.Features": "10.0.2", - "Microsoft.Extensions.Logging.Abstractions": "10.0.2", - "Microsoft.Extensions.Options": "10.0.2", - "Microsoft.Extensions.Primitives": "10.0.2" - } + "contentHash": "sANlOvfqfw/yfych4CLlHSKSWzIie6mQG7w83gVur1foNOafyHxcgpoQMvBf+KiB4Tpls6P1/Z77IIQSK8hxFg==" }, "Microsoft.Extensions.Telemetry": { "type": "Transitive", @@ -516,8 +177,6 @@ "dependencies": { "Microsoft.Extensions.AmbientMetadata.Application": "10.2.0", "Microsoft.Extensions.DependencyInjection.AutoActivation": "10.2.0", - "Microsoft.Extensions.Logging.Configuration": "10.0.2", - "Microsoft.Extensions.ObjectPool": "10.0.2", "Microsoft.Extensions.Telemetry.Abstractions": "10.2.0" } }, @@ -526,10 +185,7 @@ "resolved": "10.2.0", "contentHash": "6V4V6NX6RLUYWwV89DeW/4zK5xOycYHWhsfMXSpKVGgMHfXcczmbk6hBeqTnRPzhpATYcOWlmA6hk1jgdxUugA==", "dependencies": { - "Microsoft.Extensions.Compliance.Abstractions": "10.2.0", - "Microsoft.Extensions.Logging.Abstractions": "10.0.2", - "Microsoft.Extensions.ObjectPool": "10.0.2", - "Microsoft.Extensions.Options": "10.0.2" + "Microsoft.Extensions.Compliance.Abstractions": "10.2.0" } }, "Microsoft.TestPlatform.ObjectModel": { @@ -554,17 +210,13 @@ "Npgsql": { "type": "Transitive", "resolved": "10.0.2", - "contentHash": "q5RfBI+wywJSFUNDE1L4ZbHEHCFTblo8Uf6A6oe4feOUFYiUQXyAf9GBh5qEZpvJaHiEbpBPkQumjEhXCJxdrg==", - "dependencies": { - "Microsoft.Extensions.Logging.Abstractions": "10.0.0" - } + "contentHash": "q5RfBI+wywJSFUNDE1L4ZbHEHCFTblo8Uf6A6oe4feOUFYiUQXyAf9GBh5qEZpvJaHiEbpBPkQumjEhXCJxdrg==" }, "Npgsql.DependencyInjection": { "type": "Transitive", "resolved": "10.0.1", "contentHash": "YHFa4vD27sNIfv6s5q8Zi1fLvKfmK1xcpMv0PUvXOxDFbRmuMRSHwpZTbPvsAlj97q1/o7DfyynLqfqrCm1VnA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0", "Npgsql": "10.0.1" } }, @@ -582,8 +234,6 @@ "resolved": "1.15.3", "contentHash": "N0i6WjPoHPbZyms1ugbDIFAJFuGlpeExJMU/+XSL0lQRUkg/D0utFkDoLXf8Z1km5B+xVZ2GyMXXiX8qdeNmPg==", "dependencies": { - "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.0", - "Microsoft.Extensions.Logging.Configuration": "10.0.0", "OpenTelemetry.Api.ProviderBuilderExtensions": "1.15.3" } }, @@ -597,7 +247,6 @@ "resolved": "1.15.3", "contentHash": "SYn0lqYDwLMWhv/zlNGsQcl2yX++yTumanX46bmOZE/ZDOd1WjPBO2kZaZgKLEZTZk48pavIFGJ6vOvxXgWVFQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0", "OpenTelemetry.Api": "1.15.3" } }, @@ -614,7 +263,6 @@ "resolved": "1.15.3", "contentHash": "u8n/W8yIlqv0BXZmvId1iVaeWXG42tGKdTkuLYg5g57Y/r9CeUNzqtrSHNdG5IoO8iPX79w3v+WsbAHgUQbfeg==", "dependencies": { - "Microsoft.Extensions.Hosting.Abstractions": "10.0.0", "OpenTelemetry": "1.15.3" } }, @@ -631,8 +279,6 @@ "resolved": "1.15.1", "contentHash": "vFO4Fj/dXkoVNGo/nhoGpO2zYQmZwr4jTID7oRGo+XlQ8LqksyZjUXQ4p39RfUvTID7IzzL8Qe71tW7CcAFymA==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.0", - "Microsoft.Extensions.Options": "10.0.0", "OpenTelemetry.Api.ProviderBuilderExtensions": "[1.15.3, 2.0.0)" } }, @@ -654,8 +300,6 @@ "resolved": "8.4.2", "contentHash": "GZ9vRVmR0jV2JtZavt+pGUsQ1O1cuRKG7R7VOZI6ZDy9y6RNPvRvXK1tuS4ffUrv8L0FTea59oEuQzgS0R7zSA==", "dependencies": { - "Microsoft.Extensions.Logging.Abstractions": "8.0.0", - "Microsoft.Extensions.Options": "8.0.0", "Polly.Core": "8.4.2" } }, @@ -664,27 +308,13 @@ "resolved": "8.4.2", "contentHash": "ehTImQ/eUyO07VYW2WvwSmU9rRH200SKJ/3jku9rOkyWE0A2JxNFmAVms8dSn49QLSjmjFRRSgfNyOgr/2PSmA==", "dependencies": { - "Polly.Core": "8.4.2", - "System.Threading.RateLimiting": "8.0.0" + "Polly.Core": "8.4.2" } }, - "System.Diagnostics.EventLog": { - "type": "Transitive", - "resolved": "10.0.5", - "contentHash": "wugvy+pBVzjQEnRs9wMTWwoaeNFX3hsaHeVHFDIvJSWXp7wfmNWu3mxAwBIE6pyW+g6+rHa1Of5fTzb0QVqUTA==" - }, - "System.Threading.RateLimiting": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "7mu9v0QDv66ar3DpGSZHg9NuNcxDaaAcnMULuZlaTpP9+hwXhrxNGsF5GmLkSHxFdb5bBc1TzeujsRgTrPWi+Q==" - }, "Telegram.Bot": { "type": "Transitive", "resolved": "22.9.6.1", - "contentHash": "I0eaMaETcWIhMn4uu4RGd9e6PLJOjaOG3QAcKPsTcS80H3TF6gqj3UF9NKu4ZY90ul6Y6NiWToHkg/PsvxkotA==", - "dependencies": { - "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0" - } + "contentHash": "I0eaMaETcWIhMn4uu4RGd9e6PLJOjaOG3QAcKPsTcS80H3TF6gqj3UF9NKu4ZY90ul6Y6NiWToHkg/PsvxkotA==" }, "xunit.abstractions": { "type": "Transitive", @@ -732,9 +362,8 @@ "Aspire.Npgsql": "[13.2.2, )", "Dapper": "[2.1.72, )", "Dapper.AOT": "[1.0.48, )", - "GmRelay.ServiceDefaults": "[1.15.0, )", - "GmRelay.Shared": "[1.15.0, )", - "Microsoft.Extensions.Hosting": "[10.0.5, )", + "GmRelay.ServiceDefaults": "[1.15.1, )", + "GmRelay.Shared": "[1.15.1, )", "Npgsql": "[10.0.2, )", "Telegram.Bot": "[22.9.5.3, )", "dbup-postgresql": "[7.0.1, )" @@ -760,8 +389,8 @@ "dependencies": { "Aspire.Npgsql": "[13.2.2, )", "Dapper": "[2.1.72, )", - "GmRelay.ServiceDefaults": "[1.15.0, )", - "GmRelay.Shared": "[1.15.0, )", + "GmRelay.ServiceDefaults": "[1.15.1, )", + "GmRelay.Shared": "[1.15.1, )", "Npgsql": "[10.0.2, )", "Telegram.Bot": "[22.9.6.1, )" }