From 6c765b97864904b00b192bef2c64f95b43bc4dfb Mon Sep 17 00:00:00 2001 From: Eric Brunner Date: Thu, 23 Jan 2025 12:12:18 +0100 Subject: [PATCH 1/4] feat: added configuration, eventbus, pns --- .../AdminCli/src/AdminCli/AdminCli.csproj | 10 +++ .../Announcements/AnnouncementCommand.cs | 70 +++++++++++++++++++ .../src/AdminCli/Commands/RootCommand.cs | 2 + .../Configuration/AdminCliConfiguration.cs | 25 +++++++ .../Configuration/DevicesCliConfiguration.cs | 16 +++++ Applications/AdminCli/src/AdminCli/Dockerfile | 3 + .../AdminCli/Properties/launchSettings.json | 15 +++- .../AdminCli/src/AdminCli/ServiceLocator.cs | 31 +++++++- .../AdminCli/src/AdminCli/appsettings.json | 39 +++++++++++ .../PushNotificationTextProvider.cs | 1 - .../Sse/ServerSentEventsConnectorTests.cs | 1 - .../Controllers/TokensController.cs | 1 - 12 files changed, 207 insertions(+), 7 deletions(-) create mode 100644 Applications/AdminCli/src/AdminCli/Commands/Announcements/AnnouncementCommand.cs create mode 100644 Applications/AdminCli/src/AdminCli/Configuration/AdminCliConfiguration.cs create mode 100644 Applications/AdminCli/src/AdminCli/Configuration/DevicesCliConfiguration.cs create mode 100644 Applications/AdminCli/src/AdminCli/appsettings.json diff --git a/Applications/AdminCli/src/AdminCli/AdminCli.csproj b/Applications/AdminCli/src/AdminCli/AdminCli.csproj index be12fe5d50..bcb4ad4fdc 100644 --- a/Applications/AdminCli/src/AdminCli/AdminCli.csproj +++ b/Applications/AdminCli/src/AdminCli/AdminCli.csproj @@ -14,7 +14,17 @@ + + + + + + + PreserveNewest + + + diff --git a/Applications/AdminCli/src/AdminCli/Commands/Announcements/AnnouncementCommand.cs b/Applications/AdminCli/src/AdminCli/Commands/Announcements/AnnouncementCommand.cs new file mode 100644 index 0000000000..9c1dcd9127 --- /dev/null +++ b/Applications/AdminCli/src/AdminCli/Commands/Announcements/AnnouncementCommand.cs @@ -0,0 +1,70 @@ +using System.CommandLine; +using System.Text.Json; +using Backbone.AdminCli.Commands.BaseClasses; +using Backbone.Modules.Announcements.Application.Announcements.Commands.CreateAnnouncement; +using Backbone.Modules.Announcements.Domain.Entities; +using MediatR; + +namespace Backbone.AdminCli.Commands.Announcements; + +public class AnnouncementCommand : AdminCliCommand +{ + public AnnouncementCommand(ServiceLocator serviceLocator) : base("announcement", serviceLocator) + { + AddCommand(new SendAnnouncementCommand(serviceLocator)); + } +} + +public class SendAnnouncementCommand : AdminCliDbCommand +{ + public SendAnnouncementCommand(ServiceLocator serviceLocator) : base("send", serviceLocator) + { + var expiresAt = new Option("--expiration") + { + IsRequired = false, + Description = "The expiration date of the announcement." + }; + + var severity = new Option("--severity") + { + IsRequired = true, + Description = "The severity of the announcement." + }; + + AddOption(expiresAt); + AddOption(severity); + + + this.SetHandler(SendAnnouncement, DB_PROVIDER_OPTION, DB_CONNECTION_STRING_OPTION, severity, expiresAt); + } + + private async Task SendAnnouncement(string dbProvider, string dbConnectionString, string? severityInput, string? expiresAtInput) + { + var severity = severityInput switch + { + _ when string.IsNullOrWhiteSpace(severityInput) => AnnouncementSeverity.Low, + _ when Enum.TryParse(severityInput, ignoreCase: true, out var parsedSeverity) => parsedSeverity, + _ => throw new ArgumentException($@"Specified severity '{severityInput}' is not a valid severity.") + }; + + DateTime? expiresAt = expiresAtInput switch + { + _ when string.IsNullOrWhiteSpace(expiresAtInput) => null, + _ when DateTime.TryParse(expiresAtInput, out var parsedDateTime) => parsedDateTime, + _ => throw new ArgumentException($@"Specified expiration datetime '{expiresAtInput}' is not a valid DateTime.") + }; + + var mediator = _serviceLocator.GetService(dbProvider, dbConnectionString); + + var response = await mediator.Send(new CreateAnnouncementCommand + { + Texts = null!, + Severity = severity, + ExpiresAt = expiresAt + }, CancellationToken.None); + + Console.WriteLine(@"Announcement sent successfully"); + + Console.WriteLine(JsonSerializer.Serialize(response, JSON_SERIALIZER_OPTIONS)); + } +} diff --git a/Applications/AdminCli/src/AdminCli/Commands/RootCommand.cs b/Applications/AdminCli/src/AdminCli/Commands/RootCommand.cs index d0825e13a1..7f40dd38b2 100644 --- a/Applications/AdminCli/src/AdminCli/Commands/RootCommand.cs +++ b/Applications/AdminCli/src/AdminCli/Commands/RootCommand.cs @@ -1,3 +1,4 @@ +using Backbone.AdminCli.Commands.Announcements; using Backbone.AdminCli.Commands.Clients; using Backbone.AdminCli.Commands.Tiers; @@ -9,5 +10,6 @@ public RootCommand(ServiceLocator serviceLocator) { AddCommand(new ClientCommand(serviceLocator)); AddCommand(new TierCommand(serviceLocator)); + AddCommand(new AnnouncementCommand(serviceLocator)); } } diff --git a/Applications/AdminCli/src/AdminCli/Configuration/AdminCliConfiguration.cs b/Applications/AdminCli/src/AdminCli/Configuration/AdminCliConfiguration.cs new file mode 100644 index 0000000000..cfb09b003c --- /dev/null +++ b/Applications/AdminCli/src/AdminCli/Configuration/AdminCliConfiguration.cs @@ -0,0 +1,25 @@ +using System.ComponentModel.DataAnnotations; +using Backbone.Infrastructure.EventBus; + +namespace Backbone.AdminCli.Configuration; + +public class AdminCliConfiguration +{ + [Required] + public AdminInfrastructureConfiguration Infrastructure { get; set; } = new(); + + [Required] + public ModulesConfiguration Modules { get; set; } = new(); + + public class AdminInfrastructureConfiguration + { + [Required] + public EventBusConfiguration EventBus { get; set; } = new(); + } + + public class ModulesConfiguration + { + [Required] + public DevicesCliConfiguration Devices { get; set; } = new(); + } +} diff --git a/Applications/AdminCli/src/AdminCli/Configuration/DevicesCliConfiguration.cs b/Applications/AdminCli/src/AdminCli/Configuration/DevicesCliConfiguration.cs new file mode 100644 index 0000000000..367cb9f67f --- /dev/null +++ b/Applications/AdminCli/src/AdminCli/Configuration/DevicesCliConfiguration.cs @@ -0,0 +1,16 @@ +using System.ComponentModel.DataAnnotations; +using Backbone.Modules.Devices.Infrastructure.PushNotifications; + +namespace Backbone.AdminCli.Configuration; + +public class DevicesCliConfiguration +{ + [Required] + public InfrastructureConfiguration Infrastructure { get; set; } = new(); + + public class InfrastructureConfiguration + { + [Required] + public PushNotificationOptions PushNotifications { get; set; } = new(); + } +} diff --git a/Applications/AdminCli/src/AdminCli/Dockerfile b/Applications/AdminCli/src/AdminCli/Dockerfile index d14e004c5e..99cb9bf115 100644 --- a/Applications/AdminCli/src/AdminCli/Dockerfile +++ b/Applications/AdminCli/src/AdminCli/Dockerfile @@ -18,6 +18,9 @@ COPY ["Modules/Devices/src/Devices.Application/Devices.Application.csproj", "Mod COPY ["BuildingBlocks/src/BuildingBlocks.Application/BuildingBlocks.Application.csproj", "BuildingBlocks/src/BuildingBlocks.Application/"] COPY ["BuildingBlocks/src/Crypto/Crypto.csproj", "BuildingBlocks/src/Crypto/"] COPY ["Modules/Devices/src/Devices.Domain/Devices.Domain.csproj", "Modules/Devices/src/Devices.Domain/"] +COPY ["Modules/Announcements/src/Announcements.Application/Announcements.Application.csproj", "Modules/Announcements/src/Announcements.Application/"] +COPY ["Modules/Announcements/src/Announcements.Infrastructure/Announcements.Infrastructure.csproj", "Modules/Announcements/src/Announcements.Infrastructure/"] +COPY ["Infrastructure/Infrastructure.csproj", "Infrastructure/"] RUN dotnet restore /p:ContinuousIntegrationBuild=true "Applications/AdminCli/src/AdminCli/AdminCli.csproj" diff --git a/Applications/AdminCli/src/AdminCli/Properties/launchSettings.json b/Applications/AdminCli/src/AdminCli/Properties/launchSettings.json index c7d0aa16f1..844bcf1b9a 100644 --- a/Applications/AdminCli/src/AdminCli/Properties/launchSettings.json +++ b/Applications/AdminCli/src/AdminCli/Properties/launchSettings.json @@ -10,9 +10,20 @@ "environmentVariables": { "Database__Provider": "Postgres", //"Database__ConnectionString": "Server=localhost;Database=enmeshed;User Id=devices;Password=Passw0rd;TrustServerCertificate=True;" //SqlServer - "Database__ConnectionString": "User ID=devices;Password=Passw0rd;Server=host.docker.internal;Port=5432;Database=enmeshed;" + "Database__ConnectionString": "User ID=postgres;Password=admin;Server=host.docker.internal;Port=5432;Database=enmeshed;" //Postgres } - } + }, + "announcement send": { + "commandName": "Project", + "commandLineArgs": "announcement send --expiration 2025-12-31T23:59:59 --severity medium", + "environmentVariables": { + "Database__Provider": "Postgres", + "Database__ConnectionString": "User ID=postgres;Password=admin;Server=host.docker.internal;Port=5432;Database=enmeshed;" + } + } + + + } } diff --git a/Applications/AdminCli/src/AdminCli/ServiceLocator.cs b/Applications/AdminCli/src/AdminCli/ServiceLocator.cs index 305e18be69..33b0ca9ab9 100644 --- a/Applications/AdminCli/src/AdminCli/ServiceLocator.cs +++ b/Applications/AdminCli/src/AdminCli/ServiceLocator.cs @@ -1,11 +1,17 @@ +using Backbone.AdminCli.Configuration; using Backbone.BuildingBlocks.Application.QuotaCheck; +using Backbone.Infrastructure.EventBus; +using Backbone.Modules.Announcements.Infrastructure.Persistence.Database; using Backbone.Modules.Devices.Application.Extensions; using Backbone.Modules.Devices.Domain.Entities.Identities; using Backbone.Modules.Devices.Infrastructure.OpenIddict; -using Backbone.Modules.Devices.Infrastructure.Persistence; using Backbone.Modules.Devices.Infrastructure.Persistence.Database; +using Backbone.Modules.Devices.Infrastructure.PushNotifications; using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using IServiceCollectionExtensions = Backbone.Modules.Devices.Infrastructure.Persistence.IServiceCollectionExtensions; namespace Backbone.AdminCli; @@ -41,8 +47,29 @@ private static IServiceCollection ConfigureServices(string dbProvider, string db services.AddApplicationWithoutIdentityDeletion(); services.AddSingleton(); - services.AddLogging(); + IServiceCollectionExtensions.AddDatabase(services, options => + { + options.Provider = dbProvider; + options.ConnectionString = dbConnectionString; + }); + + var configuration = new ConfigurationBuilder() + .SetBasePath(Directory.GetCurrentDirectory()) + .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) + .Build(); + services.AddSingleton(configuration); + services.ConfigureAndValidate(configuration.Bind); + + var serviceProvider = services.BuildServiceProvider(); +#pragma warning disable ASP0000 // We retrieve the Configuration via IOptions here so that it is validated + var parsedConfiguration = serviceProvider.GetRequiredService>().Value; +#pragma warning restore ASP0000 + + services.AddEventBus(parsedConfiguration.Infrastructure.EventBus); + services.AddPushNotifications(parsedConfiguration.Modules.Devices.Infrastructure.PushNotifications); + + Modules.Announcements.Application.Extensions.IServiceCollectionExtensions.AddApplication(services); services.AddDatabase(options => { options.Provider = dbProvider; diff --git a/Applications/AdminCli/src/AdminCli/appsettings.json b/Applications/AdminCli/src/AdminCli/appsettings.json new file mode 100644 index 0000000000..23be2ea9b5 --- /dev/null +++ b/Applications/AdminCli/src/AdminCli/appsettings.json @@ -0,0 +1,39 @@ +{ + "Infrastructure": { + "EventBus": { + "SubscriptionClientName": "admincli", + "Vendor": "RabbitMQ", + // possible values: InMemory, RabbitMQ, GoogleCloud, Azure + "ConnectionInfo": "localhost", + "RabbitMQEnableSsl": false, + "RabbitMQUsername": "guest", + // only available for RabbitMQ + "RabbitMQPassword": "guest", + // only available for RabbitMQ + "ConnectionRetryCount": 5, + // only available for RabbitMQ + + "GcpPubSubProjectId": "", + // only available for Google Cloud Pub/Sub + "GcpPubSubTopicName": "" + // only available for Google Cloud Pub/Sub + } + }, + "Modules": { + "Devices": { + "Infrastructure": { + "PushNotifications": { + "Providers": { + "dummy": { + "enabled": true + }, + "sse": { + "enabled": true, + "SseServerBaseAddress": "http://localhost:8083" + } + } + } + } + } + } +} diff --git a/Modules/Devices/src/Devices.Infrastructure/PushNotifications/NotificationTexts/PushNotificationTextProvider.cs b/Modules/Devices/src/Devices.Infrastructure/PushNotifications/NotificationTexts/PushNotificationTextProvider.cs index b2ab915f23..6227c48c5f 100644 --- a/Modules/Devices/src/Devices.Infrastructure/PushNotifications/NotificationTexts/PushNotificationTextProvider.cs +++ b/Modules/Devices/src/Devices.Infrastructure/PushNotifications/NotificationTexts/PushNotificationTextProvider.cs @@ -2,7 +2,6 @@ using System.Resources; using Backbone.BuildingBlocks.Application.PushNotifications; using Backbone.Modules.Devices.Domain.Entities.Identities; -using Backbone.Tooling.Extensions; namespace Backbone.Modules.Devices.Infrastructure.PushNotifications.NotificationTexts; diff --git a/Modules/Devices/test/Devices.Infrastructure.Tests/Tests/PushNotifications/Connectors/Sse/ServerSentEventsConnectorTests.cs b/Modules/Devices/test/Devices.Infrastructure.Tests/Tests/PushNotifications/Connectors/Sse/ServerSentEventsConnectorTests.cs index 606740845f..b3e16d4236 100644 --- a/Modules/Devices/test/Devices.Infrastructure.Tests/Tests/PushNotifications/Connectors/Sse/ServerSentEventsConnectorTests.cs +++ b/Modules/Devices/test/Devices.Infrastructure.Tests/Tests/PushNotifications/Connectors/Sse/ServerSentEventsConnectorTests.cs @@ -3,7 +3,6 @@ using Backbone.Modules.Devices.Infrastructure.PushNotifications.Responses; using FakeItEasy; using Microsoft.Extensions.Logging; -using static Backbone.Modules.Devices.Infrastructure.Tests.TestDataGenerator; namespace Backbone.Modules.Devices.Infrastructure.Tests.Tests.PushNotifications.Connectors.Sse; diff --git a/Modules/Tokens/src/Tokens.ConsumerApi/Controllers/TokensController.cs b/Modules/Tokens/src/Tokens.ConsumerApi/Controllers/TokensController.cs index c4c2b766ac..7881a9ddc6 100644 --- a/Modules/Tokens/src/Tokens.ConsumerApi/Controllers/TokensController.cs +++ b/Modules/Tokens/src/Tokens.ConsumerApi/Controllers/TokensController.cs @@ -1,4 +1,3 @@ -using System.Text.Json; using Backbone.BuildingBlocks.API; using Backbone.BuildingBlocks.API.Mvc; using Backbone.BuildingBlocks.API.Mvc.ControllerAttributes; From 18155289ca01f9b3a8f26bcb0c2f19c6b144d32a Mon Sep 17 00:00:00 2001 From: Eric Brunner Date: Thu, 23 Jan 2025 13:11:49 +0100 Subject: [PATCH 2/4] feat: added read text loop from cli --- .../Announcements/AnnouncementCommand.cs | 100 ++++++++++++++---- Applications/AdminCli/src/AdminCli/Dockerfile | 2 + .../AdminCli/Properties/launchSettings.json | 2 +- 3 files changed, 84 insertions(+), 20 deletions(-) diff --git a/Applications/AdminCli/src/AdminCli/Commands/Announcements/AnnouncementCommand.cs b/Applications/AdminCli/src/AdminCli/Commands/Announcements/AnnouncementCommand.cs index 9c1dcd9127..d07cee2c96 100644 --- a/Applications/AdminCli/src/AdminCli/Commands/Announcements/AnnouncementCommand.cs +++ b/Applications/AdminCli/src/AdminCli/Commands/Announcements/AnnouncementCommand.cs @@ -34,37 +34,99 @@ public SendAnnouncementCommand(ServiceLocator serviceLocator) : base("send", ser AddOption(expiresAt); AddOption(severity); - this.SetHandler(SendAnnouncement, DB_PROVIDER_OPTION, DB_CONNECTION_STRING_OPTION, severity, expiresAt); } private async Task SendAnnouncement(string dbProvider, string dbConnectionString, string? severityInput, string? expiresAtInput) { - var severity = severityInput switch + try { - _ when string.IsNullOrWhiteSpace(severityInput) => AnnouncementSeverity.Low, - _ when Enum.TryParse(severityInput, ignoreCase: true, out var parsedSeverity) => parsedSeverity, - _ => throw new ArgumentException($@"Specified severity '{severityInput}' is not a valid severity.") - }; + var severity = severityInput switch + { + _ when string.IsNullOrWhiteSpace(severityInput) => AnnouncementSeverity.Low, + _ when Enum.TryParse(severityInput, ignoreCase: true, out var parsedSeverity) => parsedSeverity, + _ => throw new ArgumentException($@"Specified severity '{severityInput}' is not a valid severity.") + }; + + DateTime? expiresAt = expiresAtInput switch + { + _ when string.IsNullOrWhiteSpace(expiresAtInput) => null, + _ when DateTime.TryParse(expiresAtInput, out var parsedDateTime) => parsedDateTime, + _ => throw new ArgumentException($@"Specified expiration datetime '{expiresAtInput}' is not a valid DateTime.") + }; + + var texts = ReadTextsFromCommandLineInput(); + + if (texts.Count == 0) + { + Console.WriteLine(@"No texts provided. Exiting..."); + return; + } - DateTime? expiresAt = expiresAtInput switch + var mediator = _serviceLocator.GetService(dbProvider, dbConnectionString); + + var response = await mediator.Send(new CreateAnnouncementCommand + { + Texts = texts, + Severity = severity, + ExpiresAt = expiresAt + }, CancellationToken.None); + + Console.WriteLine(@"Announcement sent successfully"); + Console.WriteLine(JsonSerializer.Serialize(response, JSON_SERIALIZER_OPTIONS)); + } + catch (Exception e) { - _ when string.IsNullOrWhiteSpace(expiresAtInput) => null, - _ when DateTime.TryParse(expiresAtInput, out var parsedDateTime) => parsedDateTime, - _ => throw new ArgumentException($@"Specified expiration datetime '{expiresAtInput}' is not a valid DateTime.") - }; + Console.WriteLine($@"An error occurred: {e.Message}"); + } + } - var mediator = _serviceLocator.GetService(dbProvider, dbConnectionString); + private static List ReadTextsFromCommandLineInput() + { + var texts = new List(); + bool addAnotherLanguage; + do + { + var language = PromptForInput(@"Enter language (e.g. en, de, it, nl). At least 1 must be in english: "); + var title = PromptForInput(@"Enter title: "); + var body = PromptForInput(@"Enter body: "); + + if (language == null || title == null || body == null) + { + break; + } + + texts.Add(new CreateAnnouncementCommandText + { + Language = language, + Title = title, + Body = body + }); - var response = await mediator.Send(new CreateAnnouncementCommand + var input = PromptForInput(@"Do you want to add another language? ([y]es/[n]o): "); + addAnotherLanguage = input?.Trim().ToLower() is "yes" or "y"; + } while (addAnotherLanguage); + + return texts; + } + + private static string? PromptForInput(string prompt) + { + Console.Write(prompt); + var input = Console.ReadLine(); + + while (string.IsNullOrWhiteSpace(input)) { - Texts = null!, - Severity = severity, - ExpiresAt = expiresAt - }, CancellationToken.None); + Console.WriteLine($@"Input cannot be empty. Press x to exit."); + Console.Write(prompt); + input = Console.ReadLine(); + + if (input == null || !input.Trim().Equals("x", StringComparison.CurrentCultureIgnoreCase)) continue; - Console.WriteLine(@"Announcement sent successfully"); + input = null; + break; + } - Console.WriteLine(JsonSerializer.Serialize(response, JSON_SERIALIZER_OPTIONS)); + return input; } } diff --git a/Applications/AdminCli/src/AdminCli/Dockerfile b/Applications/AdminCli/src/AdminCli/Dockerfile index 99cb9bf115..9aca4c8239 100644 --- a/Applications/AdminCli/src/AdminCli/Dockerfile +++ b/Applications/AdminCli/src/AdminCli/Dockerfile @@ -20,8 +20,10 @@ COPY ["BuildingBlocks/src/Crypto/Crypto.csproj", "BuildingBlocks/src/Crypto/"] COPY ["Modules/Devices/src/Devices.Domain/Devices.Domain.csproj", "Modules/Devices/src/Devices.Domain/"] COPY ["Modules/Announcements/src/Announcements.Application/Announcements.Application.csproj", "Modules/Announcements/src/Announcements.Application/"] COPY ["Modules/Announcements/src/Announcements.Infrastructure/Announcements.Infrastructure.csproj", "Modules/Announcements/src/Announcements.Infrastructure/"] +COPY ["Modules/Announcements/src/Announcements.Domain/Announcements.Domain.csproj", "Modules/Announcements/src/Announcements.Domain/"] COPY ["Infrastructure/Infrastructure.csproj", "Infrastructure/"] + RUN dotnet restore /p:ContinuousIntegrationBuild=true "Applications/AdminCli/src/AdminCli/AdminCli.csproj" COPY . . diff --git a/Applications/AdminCli/src/AdminCli/Properties/launchSettings.json b/Applications/AdminCli/src/AdminCli/Properties/launchSettings.json index 844bcf1b9a..4e2f910f9c 100644 --- a/Applications/AdminCli/src/AdminCli/Properties/launchSettings.json +++ b/Applications/AdminCli/src/AdminCli/Properties/launchSettings.json @@ -16,7 +16,7 @@ }, "announcement send": { "commandName": "Project", - "commandLineArgs": "announcement send --expiration 2025-12-31T23:59:59 --severity medium", + "commandLineArgs": "announcement send --expiration 2025-12-31 --severity medium", "environmentVariables": { "Database__Provider": "Postgres", "Database__ConnectionString": "User ID=postgres;Password=admin;Server=host.docker.internal;Port=5432;Database=enmeshed;" From 030d9e1374188d3362fd69806afc5d17093436f4 Mon Sep 17 00:00:00 2001 From: Eric Brunner Date: Thu, 23 Jan 2025 13:48:47 +0100 Subject: [PATCH 3/4] fix: added required AutoFac --- .../AdminCli/src/AdminCli/AdminCli.csproj | 1 + .../Announcements/AnnouncementCommand.cs | 2 ++ .../AdminCli/src/AdminCli/ServiceLocator.cs | 17 ++++++++++++----- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Applications/AdminCli/src/AdminCli/AdminCli.csproj b/Applications/AdminCli/src/AdminCli/AdminCli.csproj index bcb4ad4fdc..e74710da78 100644 --- a/Applications/AdminCli/src/AdminCli/AdminCli.csproj +++ b/Applications/AdminCli/src/AdminCli/AdminCli.csproj @@ -10,6 +10,7 @@ + diff --git a/Applications/AdminCli/src/AdminCli/Commands/Announcements/AnnouncementCommand.cs b/Applications/AdminCli/src/AdminCli/Commands/Announcements/AnnouncementCommand.cs index d07cee2c96..a58e971a87 100644 --- a/Applications/AdminCli/src/AdminCli/Commands/Announcements/AnnouncementCommand.cs +++ b/Applications/AdminCli/src/AdminCli/Commands/Announcements/AnnouncementCommand.cs @@ -63,6 +63,8 @@ _ when DateTime.TryParse(expiresAtInput, out var parsedDateTime) => parsedDateTi return; } + Console.WriteLine(@"Sending announcement..."); + var mediator = _serviceLocator.GetService(dbProvider, dbConnectionString); var response = await mediator.Send(new CreateAnnouncementCommand diff --git a/Applications/AdminCli/src/AdminCli/ServiceLocator.cs b/Applications/AdminCli/src/AdminCli/ServiceLocator.cs index 33b0ca9ab9..50db3d549d 100644 --- a/Applications/AdminCli/src/AdminCli/ServiceLocator.cs +++ b/Applications/AdminCli/src/AdminCli/ServiceLocator.cs @@ -1,3 +1,5 @@ +using Autofac; +using Autofac.Extensions.DependencyInjection; using Backbone.AdminCli.Configuration; using Backbone.BuildingBlocks.Application.QuotaCheck; using Backbone.Infrastructure.EventBus; @@ -13,6 +15,7 @@ using Microsoft.Extensions.Options; using IServiceCollectionExtensions = Backbone.Modules.Devices.Infrastructure.Persistence.IServiceCollectionExtensions; + namespace Backbone.AdminCli; public class ServiceLocator @@ -20,14 +23,15 @@ public class ServiceLocator public T GetService(string dbProvider, string dbConnectionString) where T : notnull { var services = ConfigureServices(dbProvider, dbConnectionString); - - var serviceProvider = services.BuildServiceProvider(); - return serviceProvider.GetRequiredService(); + return services.GetRequiredService(); } - private static IServiceCollection ConfigureServices(string dbProvider, string dbConnectionString) + private static IServiceProvider ConfigureServices(string dbProvider, string dbConnectionString) { var services = new ServiceCollection(); + + services.AddAutofac(); + services .AddIdentity() .AddEntityFrameworkStores(); @@ -76,6 +80,9 @@ private static IServiceCollection ConfigureServices(string dbProvider, string db options.ConnectionString = dbConnectionString; }); - return services; + var containerBuilder = new ContainerBuilder(); + containerBuilder.Populate(services); + var container = containerBuilder.Build(); + return new AutofacServiceProvider(container); } } From 27e09a070c26a2ef054287eb8b0f9733f5275db3 Mon Sep 17 00:00:00 2001 From: Eric Brunner Date: Thu, 23 Jan 2025 14:43:34 +0100 Subject: [PATCH 4/4] fix: add appsetting to DOCKERFILE --- Applications/AdminCli/src/AdminCli/Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Applications/AdminCli/src/AdminCli/Dockerfile b/Applications/AdminCli/src/AdminCli/Dockerfile index 9aca4c8239..4bf40c65fe 100644 --- a/Applications/AdminCli/src/AdminCli/Dockerfile +++ b/Applications/AdminCli/src/AdminCli/Dockerfile @@ -37,6 +37,9 @@ FROM base AS final WORKDIR /app COPY --from=build /app/publish/Backbone.AdminCli ./backbone +# Ensure the appsettings.json file is copied to the correct location +COPY appsettings.json /app/appsettings.json + ENV PATH="$PATH:/app" LABEL org.opencontainers.image.source="https://github.com/nmshd/backbone"