From e6020cbf16057725ef2e8561b8e8185b314295ec Mon Sep 17 00:00:00 2001 From: Thomas Jespersen Date: Mon, 9 Sep 2024 18:48:46 +0200 Subject: [PATCH] Moment42 - Refactor and improve architecture, fix bugs, and resolve static code analysis warnings --- application/Moment42.sln | 2 +- .../Api/CalendarAssistant.Api.csproj | 16 +--- application/calendar-assistant/Api/Program.cs | 21 ++--- .../Api/appsettings.development.json | 12 --- .../calendar-assistant/Api/appsettings.json | 3 + .../calendar-assistant/CalendarAssistant.slnf | 2 +- .../calendar-assistant/Core/AI/AIAgent.cs | 20 ++--- .../Core/AI/Actions/ActionSchemaBuilder.cs | 2 +- .../Actions/CancelEvent/CancelEventAction.cs | 6 +- .../CancelEvent/CancelEventParameters.cs | 2 +- .../Actions/CreateEvent/CreateEventAction.cs | 10 +-- .../CreateEvent/CreateEventParameters.cs | 2 +- .../GetCalendarScheduleAction.cs | 4 +- .../GetCalendarScheduleParameters.cs | 2 +- .../RescheduleEvent/RescheduleEventAction.cs | 6 +- .../RescheduleEventParameters.cs | 2 +- .../Core/AI/Contracts/AIGptResponse.cs | 4 +- .../Core/AI/Contracts/PlannedAction.cs | 2 +- .../Core/AI/Gpt/AzureOpenAIConfiguration.cs | 2 +- .../Core/AI/Gpt/GptClient.cs | 4 +- .../Core/AI/Gpt/GptMessage.cs | 2 +- .../Core/AI/Gpt/GptMessageRole.cs | 2 +- .../Core/AI/Gpt/GptTokenizer.cs | 2 +- .../Core/AI/Gpt/IGptClient.cs | 2 +- .../Core/AI/Gpt/IGptTokenizer.cs | 2 +- .../Core/AI/Planner/ActionPlanner.cs | 18 ++--- .../Core/AI/Planner/Plan.cs | 4 +- .../Core/AI/Planner/PlannerThoughts.cs | 2 +- .../AuthenticationConfiguration.cs | 2 +- .../Core/Authentication/OAuthProviders.cs | 2 +- ...t.Core.csproj => CalendarAssistant.csproj} | 4 +- .../AdaptiveCards/AdaptiveCardProvider.cs | 2 +- .../Contracts/CreateEventConfirmation.cs | 4 +- .../Contracts/CreateEventResult.cs | 2 +- .../AdaptiveCards/Contracts/WelcomeMessage.cs | 2 +- .../Application/AdaptiveCardActionRoute.cs | 2 +- .../Application/ConversationApplication.cs | 6 +- .../Core/Conversations/Application/Route.cs | 2 +- .../Routes/AuthenticationSignOutRoute.cs | 4 +- .../AuthenticationTokenExchangeRoute.cs | 4 +- .../Routes/AuthenticationVerifyStateRoute.cs | 4 +- .../Routes/CreateEventConfirmationRoute.cs | 14 ++-- .../Application/Routes/MembersAddedRoute.cs | 8 +- .../Application/Routes/SetDebuggingRoute.cs | 2 +- .../Core/Conversations/Application/State.cs | 6 +- .../Conversations/Application/TypingTimer.cs | 2 +- .../Authentication/AuthenticationManager.cs | 6 +- .../Authentication/OAuthAuthentication.cs | 10 +-- .../OAuthDialogStateAccessor.cs | 4 +- .../Authentication/SignInResponse.cs | 2 +- .../Authentication/SignInStatus.cs | 2 +- ...BotFrameworkHttpAdapterWithErrorHandler.cs | 8 +- .../Conversations/ConversationsEndpoints.cs | 2 +- .../AdaptiveCardTemplateExtensions.cs | 2 +- .../Conversations/Users/EntraIdUserInfo.cs | 2 +- .../Database/CalendarAssistantDbContext.cs | 2 +- .../Core/Database/DatabaseMigrations.cs | 2 +- .../Core/DependencyConfiguration.cs | 77 +++++++++---------- .../MicrosoftGraph/IMicrosoftGraphService.cs | 2 +- .../IMicrosoftGraphServiceFactory.cs | 2 +- .../MicrosoftGraph/MicrosoftGraphService.cs | 2 +- .../MicrosoftGraphServiceFactory.cs | 4 +- .../Core/TelemetryEvents/TelemetryEvents.cs | 2 +- .../IdPrefixForAllStronglyTypedUlidTests.cs | 1 - .../ArchitectureTests/PublicClassesTests.cs | 1 - .../calendar-assistant/Tests/BaseTest.cs | 4 +- .../Tests/DatabaseSeeder.cs | 2 +- .../calendar-assistant/Tests/appsettings.json | 5 +- .../Workers/CalendarAssistant.Workers.csproj | 8 +- .../calendar-assistant/Workers/Program.cs | 30 ++++---- .../Workers/appsettings.development.json | 12 --- .../Workers/appsettings.json | 15 ++-- 72 files changed, 196 insertions(+), 243 deletions(-) delete mode 100644 application/calendar-assistant/Api/appsettings.development.json rename application/calendar-assistant/Core/{CalendarAssistant.Core.csproj => CalendarAssistant.csproj} (90%) delete mode 100644 application/calendar-assistant/Workers/appsettings.development.json diff --git a/application/Moment42.sln b/application/Moment42.sln index 35b48e125..b726d52fa 100644 --- a/application/Moment42.sln +++ b/application/Moment42.sln @@ -37,7 +37,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BackOffice.Tests", "back-of EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "calendar-assistant", "calendar-assistant", "{5D0BAB65-65B0-4A2E-8504-3A620E687A4B}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CalendarAssistant.Core", "calendar-assistant\Core\CalendarAssistant.Core.csproj", "{83508F78-E0D5-4159-A470-99879225FEB5}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CalendarAssistant", "calendar-assistant\Core\CalendarAssistant.csproj", "{83508F78-E0D5-4159-A470-99879225FEB5}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CalendarAssistant.Workers", "calendar-assistant\Workers\CalendarAssistant.Workers.csproj", "{541B2F1F-D895-4A4D-AE5B-750AA2824B6A}" EndProject diff --git a/application/calendar-assistant/Api/CalendarAssistant.Api.csproj b/application/calendar-assistant/Api/CalendarAssistant.Api.csproj index b9d663f10..384bbff85 100644 --- a/application/calendar-assistant/Api/CalendarAssistant.Api.csproj +++ b/application/calendar-assistant/Api/CalendarAssistant.Api.csproj @@ -18,20 +18,6 @@ - + - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - appsettings.json - - - diff --git a/application/calendar-assistant/Api/Program.cs b/application/calendar-assistant/Api/Program.cs index 1b15a4882..33cc65046 100644 --- a/application/calendar-assistant/Api/Program.cs +++ b/application/calendar-assistant/Api/Program.cs @@ -1,22 +1,25 @@ -using Moment42.CalendarAssistant.Core; +using Moment42.CalendarAssistant; using PlatformPlatform.SharedKernel; using PlatformPlatform.SharedKernel.SinglePageApp; var builder = WebApplication.CreateBuilder(args); -// Configure services for the Application, Infrastructure, and Api layers like Entity Framework, Repositories, MediatR, -// FluentValidation validators, Pipelines. +// Configure storage infrastructure like Database, BlobStorage, Logging, Telemetry, Entity Framework DB Context, etc. +builder + .AddApiInfrastructure() + .AddDevelopmentPort(9300) + .AddCalendarAssistantInfrastructure(); + +// Configure dependency injection services like Repositories, MediatR, Pipelines, FluentValidation validators, etc. builder.Services - .AddCoreServices(builder.Configuration) - .AddApiServices(builder, DependencyConfiguration.Assembly) - .AddStorage(builder) - .AddSinglePageAppFallback() - .ConfigureDevelopmentPort(builder, 9300); + .AddApiServices(Assembly.GetExecutingAssembly(), DependencyConfiguration.Assembly) + .AddCalendarAssistantServices(builder.Configuration) + .AddSinglePageAppFallback(); var app = builder.Build(); // Add common configuration for all APIs like Swagger, HSTS, and DeveloperExceptionPage. -app.UseApiCoreConfiguration(); +app.UseApiServices(); // Server the SPA and static files if no other endpoints are found app.UseSinglePageAppFallback(); diff --git a/application/calendar-assistant/Api/appsettings.development.json b/application/calendar-assistant/Api/appsettings.development.json deleted file mode 100644 index dd608fcac..000000000 --- a/application/calendar-assistant/Api/appsettings.development.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning", - "Aspire.Hosting.Dcp": "Information" - } - }, - "ConnectionStrings": { - "blob-storage": "AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;DefaultEndpointsProtocol=http;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;TableEndpoint=http://127.0.0.1:10002/devstoreaccount1;" - } -} diff --git a/application/calendar-assistant/Api/appsettings.json b/application/calendar-assistant/Api/appsettings.json index 299df0d40..aff3e7183 100644 --- a/application/calendar-assistant/Api/appsettings.json +++ b/application/calendar-assistant/Api/appsettings.json @@ -5,6 +5,9 @@ "Microsoft.AspNetCore": "Warning" } }, + "ConnectionStrings": { + "blob-storage": "UseDevelopmentStorage=true" + }, "AzureOpenAI": { "Endpoint": "", "Key": "", diff --git a/application/calendar-assistant/CalendarAssistant.slnf b/application/calendar-assistant/CalendarAssistant.slnf index 330ec9171..1d99dea81 100644 --- a/application/calendar-assistant/CalendarAssistant.slnf +++ b/application/calendar-assistant/CalendarAssistant.slnf @@ -6,7 +6,7 @@ "AppGateway\\AppGateway.csproj", "shared-kernel\\SharedKernel\\SharedKernel.csproj", "shared-kernel\\Tests\\SharedKernel.Tests.csproj", - "calendar-assistant\\Core\\CalendarAssistant.Core.csproj", + "calendar-assistant\\Core\\CalendarAssistant.csproj", "calendar-assistant\\Api\\CalendarAssistant.Api.csproj", "calendar-assistant\\WebApp\\CalendarAssistant.WebApp.esproj", "calendar-assistant\\Tests\\CalendarAssistant.Tests.csproj" diff --git a/application/calendar-assistant/Core/AI/AIAgent.cs b/application/calendar-assistant/Core/AI/AIAgent.cs index 322871be9..9cdda8c24 100644 --- a/application/calendar-assistant/Core/AI/AIAgent.cs +++ b/application/calendar-assistant/Core/AI/AIAgent.cs @@ -1,15 +1,15 @@ using System.Text.Json; using Microsoft.Bot.Builder; -using Moment42.CalendarAssistant.Core.AI.Actions.CancelEvent; -using Moment42.CalendarAssistant.Core.AI.Actions.CreateEvent; -using Moment42.CalendarAssistant.Core.AI.Actions.GetCalendarSchedule; -using Moment42.CalendarAssistant.Core.AI.Actions.RescheduleEvent; -using Moment42.CalendarAssistant.Core.AI.Contracts; -using Moment42.CalendarAssistant.Core.AI.Gpt; -using Moment42.CalendarAssistant.Core.AI.Planner; -using Moment42.CalendarAssistant.Core.Conversations.Application; - -namespace Moment42.CalendarAssistant.Core.AI; +using Moment42.CalendarAssistant.AI.Actions.CancelEvent; +using Moment42.CalendarAssistant.AI.Actions.CreateEvent; +using Moment42.CalendarAssistant.AI.Actions.GetCalendarSchedule; +using Moment42.CalendarAssistant.AI.Actions.RescheduleEvent; +using Moment42.CalendarAssistant.AI.Contracts; +using Moment42.CalendarAssistant.AI.Gpt; +using Moment42.CalendarAssistant.AI.Planner; +using Moment42.CalendarAssistant.Conversations.Application; + +namespace Moment42.CalendarAssistant.AI; public sealed class AIAgent( ActionPlanner actionPlanner, diff --git a/application/calendar-assistant/Core/AI/Actions/ActionSchemaBuilder.cs b/application/calendar-assistant/Core/AI/Actions/ActionSchemaBuilder.cs index 9524c724a..1556cb7cb 100644 --- a/application/calendar-assistant/Core/AI/Actions/ActionSchemaBuilder.cs +++ b/application/calendar-assistant/Core/AI/Actions/ActionSchemaBuilder.cs @@ -2,7 +2,7 @@ using Json.Schema; using Json.Schema.Generation; -namespace Moment42.CalendarAssistant.Core.AI.Actions; +namespace Moment42.CalendarAssistant.AI.Actions; internal class ActionSchemaBuilder { diff --git a/application/calendar-assistant/Core/AI/Actions/CancelEvent/CancelEventAction.cs b/application/calendar-assistant/Core/AI/Actions/CancelEvent/CancelEventAction.cs index 7de164df3..2ed7780a9 100644 --- a/application/calendar-assistant/Core/AI/Actions/CancelEvent/CancelEventAction.cs +++ b/application/calendar-assistant/Core/AI/Actions/CancelEvent/CancelEventAction.cs @@ -1,7 +1,7 @@ -using Moment42.CalendarAssistant.Core.Conversations.Application; -using Moment42.CalendarAssistant.Core.MicrosoftGraph; +using Moment42.CalendarAssistant.Conversations.Application; +using Moment42.CalendarAssistant.MicrosoftGraph; -namespace Moment42.CalendarAssistant.Core.AI.Actions.CancelEvent; +namespace Moment42.CalendarAssistant.AI.Actions.CancelEvent; public sealed class CancelEventAction(IMicrosoftGraphServiceFactory microsoftGraphServiceFactory) { diff --git a/application/calendar-assistant/Core/AI/Actions/CancelEvent/CancelEventParameters.cs b/application/calendar-assistant/Core/AI/Actions/CancelEvent/CancelEventParameters.cs index d94b89655..cf0b5897e 100644 --- a/application/calendar-assistant/Core/AI/Actions/CancelEvent/CancelEventParameters.cs +++ b/application/calendar-assistant/Core/AI/Actions/CancelEvent/CancelEventParameters.cs @@ -1,6 +1,6 @@ using Json.Schema.Generation; -namespace Moment42.CalendarAssistant.Core.AI.Actions.CancelEvent; +namespace Moment42.CalendarAssistant.AI.Actions.CancelEvent; public sealed class CancelEventParameters { diff --git a/application/calendar-assistant/Core/AI/Actions/CreateEvent/CreateEventAction.cs b/application/calendar-assistant/Core/AI/Actions/CreateEvent/CreateEventAction.cs index 336f6bdcc..d1c41513e 100644 --- a/application/calendar-assistant/Core/AI/Actions/CreateEvent/CreateEventAction.cs +++ b/application/calendar-assistant/Core/AI/Actions/CreateEvent/CreateEventAction.cs @@ -1,12 +1,12 @@ using System.Globalization; using AdaptiveCards.Templating; using Microsoft.Bot.Builder; -using Moment42.CalendarAssistant.Core.Conversations.AdaptiveCards; -using Moment42.CalendarAssistant.Core.Conversations.AdaptiveCards.Contracts; -using Moment42.CalendarAssistant.Core.Conversations.Application; -using Moment42.CalendarAssistant.Core.Conversations.Extensions; +using Moment42.CalendarAssistant.Conversations.AdaptiveCards; +using Moment42.CalendarAssistant.Conversations.AdaptiveCards.Contracts; +using Moment42.CalendarAssistant.Conversations.Application; +using Moment42.CalendarAssistant.Conversations.Extensions; -namespace Moment42.CalendarAssistant.Core.AI.Actions.CreateEvent; +namespace Moment42.CalendarAssistant.AI.Actions.CreateEvent; public sealed class CreateEventAction(AdaptiveCardProvider adaptiveCardProvider) { diff --git a/application/calendar-assistant/Core/AI/Actions/CreateEvent/CreateEventParameters.cs b/application/calendar-assistant/Core/AI/Actions/CreateEvent/CreateEventParameters.cs index 6d5a076dd..b8a669e27 100644 --- a/application/calendar-assistant/Core/AI/Actions/CreateEvent/CreateEventParameters.cs +++ b/application/calendar-assistant/Core/AI/Actions/CreateEvent/CreateEventParameters.cs @@ -1,6 +1,6 @@ using Json.Schema.Generation; -namespace Moment42.CalendarAssistant.Core.AI.Actions.CreateEvent; +namespace Moment42.CalendarAssistant.AI.Actions.CreateEvent; public sealed class CreateEventParameters { diff --git a/application/calendar-assistant/Core/AI/Actions/GetCalendarSchedule/GetCalendarScheduleAction.cs b/application/calendar-assistant/Core/AI/Actions/GetCalendarSchedule/GetCalendarScheduleAction.cs index 9f323b2b3..5d621988f 100644 --- a/application/calendar-assistant/Core/AI/Actions/GetCalendarSchedule/GetCalendarScheduleAction.cs +++ b/application/calendar-assistant/Core/AI/Actions/GetCalendarSchedule/GetCalendarScheduleAction.cs @@ -1,8 +1,8 @@ using System.Text.Json; using Microsoft.Graph.Models; -using Moment42.CalendarAssistant.Core.MicrosoftGraph; +using Moment42.CalendarAssistant.MicrosoftGraph; -namespace Moment42.CalendarAssistant.Core.AI.Actions.GetCalendarSchedule; +namespace Moment42.CalendarAssistant.AI.Actions.GetCalendarSchedule; public sealed class GetCalendarScheduleAction(IMicrosoftGraphServiceFactory microsoftGraphServiceFactory) { diff --git a/application/calendar-assistant/Core/AI/Actions/GetCalendarSchedule/GetCalendarScheduleParameters.cs b/application/calendar-assistant/Core/AI/Actions/GetCalendarSchedule/GetCalendarScheduleParameters.cs index 3c8db8f27..8a767b359 100644 --- a/application/calendar-assistant/Core/AI/Actions/GetCalendarSchedule/GetCalendarScheduleParameters.cs +++ b/application/calendar-assistant/Core/AI/Actions/GetCalendarSchedule/GetCalendarScheduleParameters.cs @@ -1,6 +1,6 @@ using Json.Schema.Generation; -namespace Moment42.CalendarAssistant.Core.AI.Actions.GetCalendarSchedule; +namespace Moment42.CalendarAssistant.AI.Actions.GetCalendarSchedule; public sealed class GetCalendarScheduleParameters { diff --git a/application/calendar-assistant/Core/AI/Actions/RescheduleEvent/RescheduleEventAction.cs b/application/calendar-assistant/Core/AI/Actions/RescheduleEvent/RescheduleEventAction.cs index 0e6d11f44..2f11b3d3d 100644 --- a/application/calendar-assistant/Core/AI/Actions/RescheduleEvent/RescheduleEventAction.cs +++ b/application/calendar-assistant/Core/AI/Actions/RescheduleEvent/RescheduleEventAction.cs @@ -1,9 +1,9 @@ using System.Globalization; using Microsoft.Graph.Models; -using Moment42.CalendarAssistant.Core.Conversations.Application; -using Moment42.CalendarAssistant.Core.MicrosoftGraph; +using Moment42.CalendarAssistant.Conversations.Application; +using Moment42.CalendarAssistant.MicrosoftGraph; -namespace Moment42.CalendarAssistant.Core.AI.Actions.RescheduleEvent; +namespace Moment42.CalendarAssistant.AI.Actions.RescheduleEvent; public sealed class RescheduleEventAction(IMicrosoftGraphServiceFactory microsoftGraphServiceFactory) { diff --git a/application/calendar-assistant/Core/AI/Actions/RescheduleEvent/RescheduleEventParameters.cs b/application/calendar-assistant/Core/AI/Actions/RescheduleEvent/RescheduleEventParameters.cs index 993f3dc98..34660ed10 100644 --- a/application/calendar-assistant/Core/AI/Actions/RescheduleEvent/RescheduleEventParameters.cs +++ b/application/calendar-assistant/Core/AI/Actions/RescheduleEvent/RescheduleEventParameters.cs @@ -1,6 +1,6 @@ using Json.Schema.Generation; -namespace Moment42.CalendarAssistant.Core.AI.Actions.RescheduleEvent; +namespace Moment42.CalendarAssistant.AI.Actions.RescheduleEvent; public sealed class RescheduleEventParameters { diff --git a/application/calendar-assistant/Core/AI/Contracts/AIGptResponse.cs b/application/calendar-assistant/Core/AI/Contracts/AIGptResponse.cs index 70c02adc1..225e2b253 100644 --- a/application/calendar-assistant/Core/AI/Contracts/AIGptResponse.cs +++ b/application/calendar-assistant/Core/AI/Contracts/AIGptResponse.cs @@ -1,5 +1,5 @@ -using Moment42.CalendarAssistant.Core.AI.Planner; +using Moment42.CalendarAssistant.AI.Planner; -namespace Moment42.CalendarAssistant.Core.AI.Contracts; +namespace Moment42.CalendarAssistant.AI.Contracts; public sealed record AIGptResponse(PlannedAction[]? PlannedActions, PlannedAction[]? PossibleActions, PlannerThoughts? Thoughts); diff --git a/application/calendar-assistant/Core/AI/Contracts/PlannedAction.cs b/application/calendar-assistant/Core/AI/Contracts/PlannedAction.cs index fc56f62af..d31111698 100644 --- a/application/calendar-assistant/Core/AI/Contracts/PlannedAction.cs +++ b/application/calendar-assistant/Core/AI/Contracts/PlannedAction.cs @@ -1,5 +1,5 @@ using System.Text.Json; -namespace Moment42.CalendarAssistant.Core.AI.Contracts; +namespace Moment42.CalendarAssistant.AI.Contracts; public sealed record PlannedAction(string UniqueId, string Name, Dictionary Parameters); diff --git a/application/calendar-assistant/Core/AI/Gpt/AzureOpenAIConfiguration.cs b/application/calendar-assistant/Core/AI/Gpt/AzureOpenAIConfiguration.cs index c66b11ee7..d41e19a1c 100644 --- a/application/calendar-assistant/Core/AI/Gpt/AzureOpenAIConfiguration.cs +++ b/application/calendar-assistant/Core/AI/Gpt/AzureOpenAIConfiguration.cs @@ -1,4 +1,4 @@ -namespace Moment42.CalendarAssistant.Core.AI.Gpt; +namespace Moment42.CalendarAssistant.AI.Gpt; internal class AzureOpenAIConfiguration { diff --git a/application/calendar-assistant/Core/AI/Gpt/GptClient.cs b/application/calendar-assistant/Core/AI/Gpt/GptClient.cs index 94a8edb27..042a11580 100644 --- a/application/calendar-assistant/Core/AI/Gpt/GptClient.cs +++ b/application/calendar-assistant/Core/AI/Gpt/GptClient.cs @@ -3,10 +3,10 @@ using Azure.AI.OpenAI; using Microsoft.ApplicationInsights; using Microsoft.Extensions.Options; -using Moment42.CalendarAssistant.Core.TelemetryEvents; +using Moment42.CalendarAssistant.TelemetryEvents; using OpenAI.Chat; -namespace Moment42.CalendarAssistant.Core.AI.Gpt; +namespace Moment42.CalendarAssistant.AI.Gpt; internal class GptClient(IOptions azureOpenAIConfiguration, TelemetryClient telemetryClient) : IGptClient { diff --git a/application/calendar-assistant/Core/AI/Gpt/GptMessage.cs b/application/calendar-assistant/Core/AI/Gpt/GptMessage.cs index 4818c0781..d588768bd 100644 --- a/application/calendar-assistant/Core/AI/Gpt/GptMessage.cs +++ b/application/calendar-assistant/Core/AI/Gpt/GptMessage.cs @@ -1,6 +1,6 @@ using OpenAI.Chat; -namespace Moment42.CalendarAssistant.Core.AI.Gpt; +namespace Moment42.CalendarAssistant.AI.Gpt; public sealed record GptMessage(string Message, GptMessageRole ChatRole) { diff --git a/application/calendar-assistant/Core/AI/Gpt/GptMessageRole.cs b/application/calendar-assistant/Core/AI/Gpt/GptMessageRole.cs index fdda75ccf..f6deb0297 100644 --- a/application/calendar-assistant/Core/AI/Gpt/GptMessageRole.cs +++ b/application/calendar-assistant/Core/AI/Gpt/GptMessageRole.cs @@ -1,4 +1,4 @@ -namespace Moment42.CalendarAssistant.Core.AI.Gpt; +namespace Moment42.CalendarAssistant.AI.Gpt; public enum GptMessageRole { diff --git a/application/calendar-assistant/Core/AI/Gpt/GptTokenizer.cs b/application/calendar-assistant/Core/AI/Gpt/GptTokenizer.cs index 90e8b6384..4ed0d4758 100644 --- a/application/calendar-assistant/Core/AI/Gpt/GptTokenizer.cs +++ b/application/calendar-assistant/Core/AI/Gpt/GptTokenizer.cs @@ -1,6 +1,6 @@ using Microsoft.ML.Tokenizers; -namespace Moment42.CalendarAssistant.Core.AI.Gpt; +namespace Moment42.CalendarAssistant.AI.Gpt; public sealed class GptTokenizer(Tokenizer tokenizer) : IGptTokenizer { diff --git a/application/calendar-assistant/Core/AI/Gpt/IGptClient.cs b/application/calendar-assistant/Core/AI/Gpt/IGptClient.cs index 7a085ccfd..c4fd8ee8f 100644 --- a/application/calendar-assistant/Core/AI/Gpt/IGptClient.cs +++ b/application/calendar-assistant/Core/AI/Gpt/IGptClient.cs @@ -1,6 +1,6 @@ using OpenAI.Chat; -namespace Moment42.CalendarAssistant.Core.AI.Gpt; +namespace Moment42.CalendarAssistant.AI.Gpt; public interface IGptClient { diff --git a/application/calendar-assistant/Core/AI/Gpt/IGptTokenizer.cs b/application/calendar-assistant/Core/AI/Gpt/IGptTokenizer.cs index 6ba5c62f0..3b7b056a7 100644 --- a/application/calendar-assistant/Core/AI/Gpt/IGptTokenizer.cs +++ b/application/calendar-assistant/Core/AI/Gpt/IGptTokenizer.cs @@ -1,4 +1,4 @@ -namespace Moment42.CalendarAssistant.Core.AI.Gpt; +namespace Moment42.CalendarAssistant.AI.Gpt; public interface IGptTokenizer { diff --git a/application/calendar-assistant/Core/AI/Planner/ActionPlanner.cs b/application/calendar-assistant/Core/AI/Planner/ActionPlanner.cs index a37a8ec86..2168c3e6d 100644 --- a/application/calendar-assistant/Core/AI/Planner/ActionPlanner.cs +++ b/application/calendar-assistant/Core/AI/Planner/ActionPlanner.cs @@ -1,16 +1,16 @@ using System.Text.Json; using Json.Schema; -using Moment42.CalendarAssistant.Core.AI.Actions; -using Moment42.CalendarAssistant.Core.AI.Actions.CancelEvent; -using Moment42.CalendarAssistant.Core.AI.Actions.CreateEvent; -using Moment42.CalendarAssistant.Core.AI.Actions.GetCalendarSchedule; -using Moment42.CalendarAssistant.Core.AI.Actions.RescheduleEvent; -using Moment42.CalendarAssistant.Core.AI.Contracts; -using Moment42.CalendarAssistant.Core.AI.Gpt; -using Moment42.CalendarAssistant.Core.Conversations.Application; +using Moment42.CalendarAssistant.AI.Actions; +using Moment42.CalendarAssistant.AI.Actions.CancelEvent; +using Moment42.CalendarAssistant.AI.Actions.CreateEvent; +using Moment42.CalendarAssistant.AI.Actions.GetCalendarSchedule; +using Moment42.CalendarAssistant.AI.Actions.RescheduleEvent; +using Moment42.CalendarAssistant.AI.Contracts; +using Moment42.CalendarAssistant.AI.Gpt; +using Moment42.CalendarAssistant.Conversations.Application; using OpenAI.Chat; -namespace Moment42.CalendarAssistant.Core.AI.Planner; +namespace Moment42.CalendarAssistant.AI.Planner; public sealed class ActionPlanner(IGptClient gptClient, IGptTokenizer gptTokenizer) { diff --git a/application/calendar-assistant/Core/AI/Planner/Plan.cs b/application/calendar-assistant/Core/AI/Planner/Plan.cs index cfb8efbdf..1bb12e7a8 100644 --- a/application/calendar-assistant/Core/AI/Planner/Plan.cs +++ b/application/calendar-assistant/Core/AI/Planner/Plan.cs @@ -1,7 +1,7 @@ using System.Text; -using Moment42.CalendarAssistant.Core.AI.Contracts; +using Moment42.CalendarAssistant.AI.Contracts; -namespace Moment42.CalendarAssistant.Core.AI.Planner; +namespace Moment42.CalendarAssistant.AI.Planner; public sealed record Plan(PlannedAction[]? PlannedActions, PlannedAction[]? PossibleActions, PlannerThoughts? Thoughts) { diff --git a/application/calendar-assistant/Core/AI/Planner/PlannerThoughts.cs b/application/calendar-assistant/Core/AI/Planner/PlannerThoughts.cs index 6dc6e5c89..b638c4200 100644 --- a/application/calendar-assistant/Core/AI/Planner/PlannerThoughts.cs +++ b/application/calendar-assistant/Core/AI/Planner/PlannerThoughts.cs @@ -1,3 +1,3 @@ -namespace Moment42.CalendarAssistant.Core.AI.Planner; +namespace Moment42.CalendarAssistant.AI.Planner; public sealed record PlannerThoughts(string Thought, string Reasoning); diff --git a/application/calendar-assistant/Core/Authentication/AuthenticationConfiguration.cs b/application/calendar-assistant/Core/Authentication/AuthenticationConfiguration.cs index 5d71d3fe9..2097238b6 100644 --- a/application/calendar-assistant/Core/Authentication/AuthenticationConfiguration.cs +++ b/application/calendar-assistant/Core/Authentication/AuthenticationConfiguration.cs @@ -1,4 +1,4 @@ -namespace Moment42.CalendarAssistant.Core.Authentication; +namespace Moment42.CalendarAssistant.Authentication; public sealed class AuthenticationConfiguration { diff --git a/application/calendar-assistant/Core/Authentication/OAuthProviders.cs b/application/calendar-assistant/Core/Authentication/OAuthProviders.cs index 1b28cde31..0a2897e9f 100644 --- a/application/calendar-assistant/Core/Authentication/OAuthProviders.cs +++ b/application/calendar-assistant/Core/Authentication/OAuthProviders.cs @@ -1,4 +1,4 @@ -namespace Moment42.CalendarAssistant.Core.Authentication; +namespace Moment42.CalendarAssistant.Authentication; internal static class OAuthProviders { diff --git a/application/calendar-assistant/Core/CalendarAssistant.Core.csproj b/application/calendar-assistant/Core/CalendarAssistant.csproj similarity index 90% rename from application/calendar-assistant/Core/CalendarAssistant.Core.csproj rename to application/calendar-assistant/Core/CalendarAssistant.csproj index 345643a07..ce2306db3 100644 --- a/application/calendar-assistant/Core/CalendarAssistant.Core.csproj +++ b/application/calendar-assistant/Core/CalendarAssistant.csproj @@ -2,8 +2,8 @@ net8.0 - Moment42.CalendarAssistant.Core - Moment42.CalendarAssistant.Core + Moment42.CalendarAssistant + Moment42.CalendarAssistant enable enable diff --git a/application/calendar-assistant/Core/Conversations/AdaptiveCards/AdaptiveCardProvider.cs b/application/calendar-assistant/Core/Conversations/AdaptiveCards/AdaptiveCardProvider.cs index 77c4a8edb..6a6422e35 100644 --- a/application/calendar-assistant/Core/Conversations/AdaptiveCards/AdaptiveCardProvider.cs +++ b/application/calendar-assistant/Core/Conversations/AdaptiveCards/AdaptiveCardProvider.cs @@ -1,4 +1,4 @@ -namespace Moment42.CalendarAssistant.Core.Conversations.AdaptiveCards; +namespace Moment42.CalendarAssistant.Conversations.AdaptiveCards; public sealed class AdaptiveCardProvider(string folderPath) { diff --git a/application/calendar-assistant/Core/Conversations/AdaptiveCards/Contracts/CreateEventConfirmation.cs b/application/calendar-assistant/Core/Conversations/AdaptiveCards/Contracts/CreateEventConfirmation.cs index 6395a733b..5a6ede3a2 100644 --- a/application/calendar-assistant/Core/Conversations/AdaptiveCards/Contracts/CreateEventConfirmation.cs +++ b/application/calendar-assistant/Core/Conversations/AdaptiveCards/Contracts/CreateEventConfirmation.cs @@ -1,5 +1,5 @@ -using Moment42.CalendarAssistant.Core.AI.Actions.CreateEvent; +using Moment42.CalendarAssistant.AI.Actions.CreateEvent; -namespace Moment42.CalendarAssistant.Core.Conversations.AdaptiveCards.Contracts; +namespace Moment42.CalendarAssistant.Conversations.AdaptiveCards.Contracts; internal record CreateEventConfirmation(string EventId, CreateEventParameters CreateEventParameters, string Time, bool HasAttendees); diff --git a/application/calendar-assistant/Core/Conversations/AdaptiveCards/Contracts/CreateEventResult.cs b/application/calendar-assistant/Core/Conversations/AdaptiveCards/Contracts/CreateEventResult.cs index 8a8984b19..794269fb1 100644 --- a/application/calendar-assistant/Core/Conversations/AdaptiveCards/Contracts/CreateEventResult.cs +++ b/application/calendar-assistant/Core/Conversations/AdaptiveCards/Contracts/CreateEventResult.cs @@ -1,3 +1,3 @@ -namespace Moment42.CalendarAssistant.Core.Conversations.AdaptiveCards.Contracts; +namespace Moment42.CalendarAssistant.Conversations.AdaptiveCards.Contracts; internal record CreateEventResult(string Title, string Time, string? Location, string Url); diff --git a/application/calendar-assistant/Core/Conversations/AdaptiveCards/Contracts/WelcomeMessage.cs b/application/calendar-assistant/Core/Conversations/AdaptiveCards/Contracts/WelcomeMessage.cs index eec82690a..62672f755 100644 --- a/application/calendar-assistant/Core/Conversations/AdaptiveCards/Contracts/WelcomeMessage.cs +++ b/application/calendar-assistant/Core/Conversations/AdaptiveCards/Contracts/WelcomeMessage.cs @@ -1,3 +1,3 @@ -namespace Moment42.CalendarAssistant.Core.Conversations.AdaptiveCards.Contracts; +namespace Moment42.CalendarAssistant.Conversations.AdaptiveCards.Contracts; internal record WelcomeMessage(string Title, string Message); diff --git a/application/calendar-assistant/Core/Conversations/Application/AdaptiveCardActionRoute.cs b/application/calendar-assistant/Core/Conversations/Application/AdaptiveCardActionRoute.cs index 601ed8309..cd5d35b38 100644 --- a/application/calendar-assistant/Core/Conversations/Application/AdaptiveCardActionRoute.cs +++ b/application/calendar-assistant/Core/Conversations/Application/AdaptiveCardActionRoute.cs @@ -1,7 +1,7 @@ using Microsoft.Bot.Schema; using Newtonsoft.Json.Linq; -namespace Moment42.CalendarAssistant.Core.Conversations.Application; +namespace Moment42.CalendarAssistant.Conversations.Application; internal abstract class AdaptiveCardActionRoute(string verb) : Route { diff --git a/application/calendar-assistant/Core/Conversations/Application/ConversationApplication.cs b/application/calendar-assistant/Core/Conversations/Application/ConversationApplication.cs index e201368c8..6f69f34ce 100644 --- a/application/calendar-assistant/Core/Conversations/Application/ConversationApplication.cs +++ b/application/calendar-assistant/Core/Conversations/Application/ConversationApplication.cs @@ -1,10 +1,10 @@ using Microsoft.Bot.Builder; using Microsoft.Bot.Schema; -using Moment42.CalendarAssistant.Core.AI; -using Moment42.CalendarAssistant.Core.Conversations.Authentication; +using Moment42.CalendarAssistant.AI; +using Moment42.CalendarAssistant.Conversations.Authentication; using IndexOutOfRangeException = System.IndexOutOfRangeException; -namespace Moment42.CalendarAssistant.Core.Conversations.Application; +namespace Moment42.CalendarAssistant.Conversations.Application; internal class ConversationApplication( IStorage storage, diff --git a/application/calendar-assistant/Core/Conversations/Application/Route.cs b/application/calendar-assistant/Core/Conversations/Application/Route.cs index 339351056..41de24643 100644 --- a/application/calendar-assistant/Core/Conversations/Application/Route.cs +++ b/application/calendar-assistant/Core/Conversations/Application/Route.cs @@ -1,6 +1,6 @@ using Microsoft.Bot.Builder; -namespace Moment42.CalendarAssistant.Core.Conversations.Application; +namespace Moment42.CalendarAssistant.Conversations.Application; internal delegate Task RouteSelector(ITurnContext turnContext, CancellationToken cancellationToken); diff --git a/application/calendar-assistant/Core/Conversations/Application/Routes/AuthenticationSignOutRoute.cs b/application/calendar-assistant/Core/Conversations/Application/Routes/AuthenticationSignOutRoute.cs index e0c18cdb1..e14ca53ed 100644 --- a/application/calendar-assistant/Core/Conversations/Application/Routes/AuthenticationSignOutRoute.cs +++ b/application/calendar-assistant/Core/Conversations/Application/Routes/AuthenticationSignOutRoute.cs @@ -1,8 +1,8 @@ using Microsoft.Bot.Builder; using Microsoft.Bot.Schema; -using Moment42.CalendarAssistant.Core.Conversations.Authentication; +using Moment42.CalendarAssistant.Conversations.Authentication; -namespace Moment42.CalendarAssistant.Core.Conversations.Application.Routes; +namespace Moment42.CalendarAssistant.Conversations.Application.Routes; internal class AuthenticationSignOutRoute(OAuthAuthentication oAuthAuthentication) : Route { diff --git a/application/calendar-assistant/Core/Conversations/Application/Routes/AuthenticationTokenExchangeRoute.cs b/application/calendar-assistant/Core/Conversations/Application/Routes/AuthenticationTokenExchangeRoute.cs index be674c1b0..d07781784 100644 --- a/application/calendar-assistant/Core/Conversations/Application/Routes/AuthenticationTokenExchangeRoute.cs +++ b/application/calendar-assistant/Core/Conversations/Application/Routes/AuthenticationTokenExchangeRoute.cs @@ -1,7 +1,7 @@ using Microsoft.Bot.Schema; -using Moment42.CalendarAssistant.Core.Conversations.Authentication; +using Moment42.CalendarAssistant.Conversations.Authentication; -namespace Moment42.CalendarAssistant.Core.Conversations.Application.Routes; +namespace Moment42.CalendarAssistant.Conversations.Application.Routes; internal class AuthenticationTokenExchangeRoute(OAuthAuthentication oAuthAuthentication) : Route { diff --git a/application/calendar-assistant/Core/Conversations/Application/Routes/AuthenticationVerifyStateRoute.cs b/application/calendar-assistant/Core/Conversations/Application/Routes/AuthenticationVerifyStateRoute.cs index 0a741b063..673d99154 100644 --- a/application/calendar-assistant/Core/Conversations/Application/Routes/AuthenticationVerifyStateRoute.cs +++ b/application/calendar-assistant/Core/Conversations/Application/Routes/AuthenticationVerifyStateRoute.cs @@ -1,7 +1,7 @@ using Microsoft.Bot.Schema; -using Moment42.CalendarAssistant.Core.Conversations.Authentication; +using Moment42.CalendarAssistant.Conversations.Authentication; -namespace Moment42.CalendarAssistant.Core.Conversations.Application.Routes; +namespace Moment42.CalendarAssistant.Conversations.Application.Routes; internal class AuthenticationVerifyStateRoute(OAuthAuthentication oAuthAuthentication) : Route { diff --git a/application/calendar-assistant/Core/Conversations/Application/Routes/CreateEventConfirmationRoute.cs b/application/calendar-assistant/Core/Conversations/Application/Routes/CreateEventConfirmationRoute.cs index 9f3b6655b..79b7d7386 100644 --- a/application/calendar-assistant/Core/Conversations/Application/Routes/CreateEventConfirmationRoute.cs +++ b/application/calendar-assistant/Core/Conversations/Application/Routes/CreateEventConfirmationRoute.cs @@ -3,15 +3,15 @@ using Microsoft.Bot.Builder; using Microsoft.Bot.Connector; using Microsoft.Graph.Models; -using Moment42.CalendarAssistant.Core.AI; -using Moment42.CalendarAssistant.Core.AI.Actions.CreateEvent; -using Moment42.CalendarAssistant.Core.Conversations.AdaptiveCards; -using Moment42.CalendarAssistant.Core.Conversations.AdaptiveCards.Contracts; -using Moment42.CalendarAssistant.Core.Conversations.Extensions; -using Moment42.CalendarAssistant.Core.MicrosoftGraph; +using Moment42.CalendarAssistant.AI; +using Moment42.CalendarAssistant.AI.Actions.CreateEvent; +using Moment42.CalendarAssistant.Conversations.AdaptiveCards; +using Moment42.CalendarAssistant.Conversations.AdaptiveCards.Contracts; +using Moment42.CalendarAssistant.Conversations.Extensions; +using Moment42.CalendarAssistant.MicrosoftGraph; using Newtonsoft.Json.Linq; -namespace Moment42.CalendarAssistant.Core.Conversations.Application.Routes; +namespace Moment42.CalendarAssistant.Conversations.Application.Routes; internal class CreateEventConfirmationRoute(AIAgent aiAgent, IMicrosoftGraphServiceFactory microsoftGraphServiceFactory, AdaptiveCardProvider adaptiveCardProvider) : AdaptiveCardActionRoute("createEvent.ok") { diff --git a/application/calendar-assistant/Core/Conversations/Application/Routes/MembersAddedRoute.cs b/application/calendar-assistant/Core/Conversations/Application/Routes/MembersAddedRoute.cs index 1d60509f1..b6c3cad9e 100644 --- a/application/calendar-assistant/Core/Conversations/Application/Routes/MembersAddedRoute.cs +++ b/application/calendar-assistant/Core/Conversations/Application/Routes/MembersAddedRoute.cs @@ -1,11 +1,11 @@ using AdaptiveCards.Templating; using Microsoft.Bot.Builder; using Microsoft.Bot.Schema; -using Moment42.CalendarAssistant.Core.Conversations.AdaptiveCards; -using Moment42.CalendarAssistant.Core.Conversations.AdaptiveCards.Contracts; -using Moment42.CalendarAssistant.Core.Conversations.Extensions; +using Moment42.CalendarAssistant.Conversations.AdaptiveCards; +using Moment42.CalendarAssistant.Conversations.AdaptiveCards.Contracts; +using Moment42.CalendarAssistant.Conversations.Extensions; -namespace Moment42.CalendarAssistant.Core.Conversations.Application.Routes; +namespace Moment42.CalendarAssistant.Conversations.Application.Routes; internal class MembersAddedRoute(AdaptiveCardProvider adaptiveCardProvider) : Route { diff --git a/application/calendar-assistant/Core/Conversations/Application/Routes/SetDebuggingRoute.cs b/application/calendar-assistant/Core/Conversations/Application/Routes/SetDebuggingRoute.cs index a8343113f..9fb5d42c6 100644 --- a/application/calendar-assistant/Core/Conversations/Application/Routes/SetDebuggingRoute.cs +++ b/application/calendar-assistant/Core/Conversations/Application/Routes/SetDebuggingRoute.cs @@ -1,7 +1,7 @@ using Microsoft.Bot.Builder; using Microsoft.Bot.Schema; -namespace Moment42.CalendarAssistant.Core.Conversations.Application.Routes; +namespace Moment42.CalendarAssistant.Conversations.Application.Routes; internal class SetDebuggingRoute : Route { diff --git a/application/calendar-assistant/Core/Conversations/Application/State.cs b/application/calendar-assistant/Core/Conversations/Application/State.cs index b76935ac8..dfece1532 100644 --- a/application/calendar-assistant/Core/Conversations/Application/State.cs +++ b/application/calendar-assistant/Core/Conversations/Application/State.cs @@ -1,9 +1,9 @@ using Microsoft.Bot.Builder; using Microsoft.Bot.Builder.Dialogs; -using Moment42.CalendarAssistant.Core.AI.Actions.CreateEvent; -using Moment42.CalendarAssistant.Core.AI.Gpt; +using Moment42.CalendarAssistant.AI.Actions.CreateEvent; +using Moment42.CalendarAssistant.AI.Gpt; -namespace Moment42.CalendarAssistant.Core.Conversations.Application; +namespace Moment42.CalendarAssistant.Conversations.Application; public sealed class State(IStorage storage) { diff --git a/application/calendar-assistant/Core/Conversations/Application/TypingTimer.cs b/application/calendar-assistant/Core/Conversations/Application/TypingTimer.cs index 717d380a4..5e0afaed4 100644 --- a/application/calendar-assistant/Core/Conversations/Application/TypingTimer.cs +++ b/application/calendar-assistant/Core/Conversations/Application/TypingTimer.cs @@ -2,7 +2,7 @@ using Microsoft.Bot.Schema; using Activity = Microsoft.Bot.Schema.Activity; -namespace Moment42.CalendarAssistant.Core.Conversations.Application; +namespace Moment42.CalendarAssistant.Conversations.Application; internal class TypingTimer(int interval = 1000) { diff --git a/application/calendar-assistant/Core/Conversations/Authentication/AuthenticationManager.cs b/application/calendar-assistant/Core/Conversations/Authentication/AuthenticationManager.cs index a621f08e5..7e25b631f 100644 --- a/application/calendar-assistant/Core/Conversations/Authentication/AuthenticationManager.cs +++ b/application/calendar-assistant/Core/Conversations/Authentication/AuthenticationManager.cs @@ -1,9 +1,9 @@ using System.IdentityModel.Tokens.Jwt; using Microsoft.Bot.Builder; -using Moment42.CalendarAssistant.Core.Conversations.Application; -using Moment42.CalendarAssistant.Core.MicrosoftGraph; +using Moment42.CalendarAssistant.Conversations.Application; +using Moment42.CalendarAssistant.MicrosoftGraph; -namespace Moment42.CalendarAssistant.Core.Conversations.Authentication; +namespace Moment42.CalendarAssistant.Conversations.Authentication; internal class AuthenticationManager(ILogger logger, OAuthAuthentication oAuthAuthentication, IMicrosoftGraphServiceFactory microsoftGraphServiceFactory) { diff --git a/application/calendar-assistant/Core/Conversations/Authentication/OAuthAuthentication.cs b/application/calendar-assistant/Core/Conversations/Authentication/OAuthAuthentication.cs index e5e205eae..a929eff31 100644 --- a/application/calendar-assistant/Core/Conversations/Authentication/OAuthAuthentication.cs +++ b/application/calendar-assistant/Core/Conversations/Authentication/OAuthAuthentication.cs @@ -4,19 +4,19 @@ using Microsoft.Bot.Connector.Authentication; using Microsoft.Bot.Schema; using Microsoft.Extensions.Options; -using Moment42.CalendarAssistant.Core.Conversations.Application; +using Moment42.CalendarAssistant.Conversations.Application; using Activity = Microsoft.Bot.Schema.Activity; -using Authentication_AuthenticationConfiguration = Moment42.CalendarAssistant.Core.Authentication.AuthenticationConfiguration; +using AuthenticationConfiguration = Moment42.CalendarAssistant.Authentication.AuthenticationConfiguration; -namespace Moment42.CalendarAssistant.Core.Conversations.Authentication; +namespace Moment42.CalendarAssistant.Conversations.Authentication; internal class OAuthAuthentication { - private readonly IOptions _authenticationConfiguration; + private readonly IOptions _authenticationConfiguration; private readonly OAuthPrompt _oauthPrompt; private readonly OAuthPromptSettings _oauthSettings; - public OAuthAuthentication(IOptions authenticationConfiguration) + public OAuthAuthentication(IOptions authenticationConfiguration) { _authenticationConfiguration = authenticationConfiguration; _oauthSettings = new OAuthPromptSettings diff --git a/application/calendar-assistant/Core/Conversations/Authentication/OAuthDialogStateAccessor.cs b/application/calendar-assistant/Core/Conversations/Authentication/OAuthDialogStateAccessor.cs index c3c230a14..123507133 100644 --- a/application/calendar-assistant/Core/Conversations/Authentication/OAuthDialogStateAccessor.cs +++ b/application/calendar-assistant/Core/Conversations/Authentication/OAuthDialogStateAccessor.cs @@ -1,8 +1,8 @@ using Microsoft.Bot.Builder; using Microsoft.Bot.Builder.Dialogs; -using Moment42.CalendarAssistant.Core.Conversations.Application; +using Moment42.CalendarAssistant.Conversations.Application; -namespace Moment42.CalendarAssistant.Core.Conversations.Authentication; +namespace Moment42.CalendarAssistant.Conversations.Authentication; internal class OAuthDialogStateAccessor(State state) : IStatePropertyAccessor { diff --git a/application/calendar-assistant/Core/Conversations/Authentication/SignInResponse.cs b/application/calendar-assistant/Core/Conversations/Authentication/SignInResponse.cs index f161ccd37..cd323cee2 100644 --- a/application/calendar-assistant/Core/Conversations/Authentication/SignInResponse.cs +++ b/application/calendar-assistant/Core/Conversations/Authentication/SignInResponse.cs @@ -1,4 +1,4 @@ -namespace Moment42.CalendarAssistant.Core.Conversations.Authentication; +namespace Moment42.CalendarAssistant.Conversations.Authentication; internal class SignInResponse(SignInStatus signInStatus, string? token = null) { diff --git a/application/calendar-assistant/Core/Conversations/Authentication/SignInStatus.cs b/application/calendar-assistant/Core/Conversations/Authentication/SignInStatus.cs index d6c3be9ce..05fa06341 100644 --- a/application/calendar-assistant/Core/Conversations/Authentication/SignInStatus.cs +++ b/application/calendar-assistant/Core/Conversations/Authentication/SignInStatus.cs @@ -1,4 +1,4 @@ -namespace Moment42.CalendarAssistant.Core.Conversations.Authentication; +namespace Moment42.CalendarAssistant.Conversations.Authentication; internal enum SignInStatus { diff --git a/application/calendar-assistant/Core/Conversations/BotFrameworkHttpAdapterWithErrorHandler.cs b/application/calendar-assistant/Core/Conversations/BotFrameworkHttpAdapterWithErrorHandler.cs index 1eb86a11d..120aeb227 100644 --- a/application/calendar-assistant/Core/Conversations/BotFrameworkHttpAdapterWithErrorHandler.cs +++ b/application/calendar-assistant/Core/Conversations/BotFrameworkHttpAdapterWithErrorHandler.cs @@ -4,10 +4,10 @@ using Microsoft.Bot.Builder.TraceExtensions; using Microsoft.Bot.Connector.Authentication; using Microsoft.Extensions.Options; -using Moment42.CalendarAssistant.Core.Conversations.Application; -using AuthenticationConfiguration = Moment42.CalendarAssistant.Core.Authentication.AuthenticationConfiguration; +using Moment42.CalendarAssistant.Conversations.Application; +using Authentication_AuthenticationConfiguration = Moment42.CalendarAssistant.Authentication.AuthenticationConfiguration; -namespace Moment42.CalendarAssistant.Core.Conversations; +namespace Moment42.CalendarAssistant.Conversations; public sealed class BotFrameworkHttpAdapterWithErrorHandler : CloudAdapter { @@ -15,7 +15,7 @@ public BotFrameworkHttpAdapterWithErrorHandler( BotFrameworkAuthentication botFrameworkAuthentication, ILogger logger, IStorage storage, - IOptions authenticationConfiguration + IOptions authenticationConfiguration ) : base(botFrameworkAuthentication, logger) { Use(new TeamsSSOTokenExchangeMiddleware(storage, authenticationConfiguration.Value.ProvidersOAuthConnectionName.Microsoft)); diff --git a/application/calendar-assistant/Core/Conversations/ConversationsEndpoints.cs b/application/calendar-assistant/Core/Conversations/ConversationsEndpoints.cs index 62e9c5835..4ba308b4f 100644 --- a/application/calendar-assistant/Core/Conversations/ConversationsEndpoints.cs +++ b/application/calendar-assistant/Core/Conversations/ConversationsEndpoints.cs @@ -5,7 +5,7 @@ using Microsoft.Bot.Builder.Integration.AspNet.Core; using PlatformPlatform.SharedKernel.Endpoints; -namespace Moment42.CalendarAssistant.Core.Conversations; +namespace Moment42.CalendarAssistant.Conversations; public sealed class ConversationsEndpoints : IEndpoints { diff --git a/application/calendar-assistant/Core/Conversations/Extensions/AdaptiveCardTemplateExtensions.cs b/application/calendar-assistant/Core/Conversations/Extensions/AdaptiveCardTemplateExtensions.cs index 0c7a11795..6ca202261 100644 --- a/application/calendar-assistant/Core/Conversations/Extensions/AdaptiveCardTemplateExtensions.cs +++ b/application/calendar-assistant/Core/Conversations/Extensions/AdaptiveCardTemplateExtensions.cs @@ -2,7 +2,7 @@ using AdaptiveCards.Templating; using Microsoft.Bot.Schema; -namespace Moment42.CalendarAssistant.Core.Conversations.Extensions; +namespace Moment42.CalendarAssistant.Conversations.Extensions; public static class AdaptiveCardTemplateExtensions { diff --git a/application/calendar-assistant/Core/Conversations/Users/EntraIdUserInfo.cs b/application/calendar-assistant/Core/Conversations/Users/EntraIdUserInfo.cs index 311939282..760acbcb2 100644 --- a/application/calendar-assistant/Core/Conversations/Users/EntraIdUserInfo.cs +++ b/application/calendar-assistant/Core/Conversations/Users/EntraIdUserInfo.cs @@ -1,4 +1,4 @@ -namespace Moment42.CalendarAssistant.Core.Conversations.Users; +namespace Moment42.CalendarAssistant.Conversations.Users; public sealed class EntraIdUserInfo { diff --git a/application/calendar-assistant/Core/Database/CalendarAssistantDbContext.cs b/application/calendar-assistant/Core/Database/CalendarAssistantDbContext.cs index a4dc9e7b7..fed921da9 100644 --- a/application/calendar-assistant/Core/Database/CalendarAssistantDbContext.cs +++ b/application/calendar-assistant/Core/Database/CalendarAssistantDbContext.cs @@ -1,7 +1,7 @@ using Microsoft.EntityFrameworkCore; using PlatformPlatform.SharedKernel.EntityFramework; -namespace Moment42.CalendarAssistant.Core.Database; +namespace Moment42.CalendarAssistant.Database; public sealed class CalendarAssistantDbContext(DbContextOptions options) : SharedKernelDbContext(options); diff --git a/application/calendar-assistant/Core/Database/DatabaseMigrations.cs b/application/calendar-assistant/Core/Database/DatabaseMigrations.cs index 262948b8e..076c717da 100644 --- a/application/calendar-assistant/Core/Database/DatabaseMigrations.cs +++ b/application/calendar-assistant/Core/Database/DatabaseMigrations.cs @@ -1,7 +1,7 @@ using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; -namespace Moment42.CalendarAssistant.Core.Database; +namespace Moment42.CalendarAssistant.Database; [DbContext(typeof(CalendarAssistantDbContext))] [Migration("1_Initial")] diff --git a/application/calendar-assistant/Core/DependencyConfiguration.cs b/application/calendar-assistant/Core/DependencyConfiguration.cs index 52a521d99..9e3a754b9 100644 --- a/application/calendar-assistant/Core/DependencyConfiguration.cs +++ b/application/calendar-assistant/Core/DependencyConfiguration.cs @@ -8,45 +8,53 @@ using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options; using Microsoft.ML.Tokenizers; -using Moment42.CalendarAssistant.Core.AI; -using Moment42.CalendarAssistant.Core.AI.Actions.CancelEvent; -using Moment42.CalendarAssistant.Core.AI.Actions.CreateEvent; -using Moment42.CalendarAssistant.Core.AI.Actions.GetCalendarSchedule; -using Moment42.CalendarAssistant.Core.AI.Actions.RescheduleEvent; -using Moment42.CalendarAssistant.Core.AI.Gpt; -using Moment42.CalendarAssistant.Core.AI.Planner; -using Moment42.CalendarAssistant.Core.Conversations; -using Moment42.CalendarAssistant.Core.Conversations.AdaptiveCards; -using Moment42.CalendarAssistant.Core.Conversations.Application; -using Moment42.CalendarAssistant.Core.Conversations.Application.Routes; -using Moment42.CalendarAssistant.Core.Conversations.Authentication; -using Moment42.CalendarAssistant.Core.Database; -using Moment42.CalendarAssistant.Core.MicrosoftGraph; +using Moment42.CalendarAssistant.AI; +using Moment42.CalendarAssistant.AI.Actions.CancelEvent; +using Moment42.CalendarAssistant.AI.Actions.CreateEvent; +using Moment42.CalendarAssistant.AI.Actions.GetCalendarSchedule; +using Moment42.CalendarAssistant.AI.Actions.RescheduleEvent; +using Moment42.CalendarAssistant.AI.Gpt; +using Moment42.CalendarAssistant.AI.Planner; +using Moment42.CalendarAssistant.Conversations; +using Moment42.CalendarAssistant.Conversations.AdaptiveCards; +using Moment42.CalendarAssistant.Conversations.Application; +using Moment42.CalendarAssistant.Conversations.Application.Routes; +using Moment42.CalendarAssistant.Conversations.Authentication; +using Moment42.CalendarAssistant.Database; +using Moment42.CalendarAssistant.MicrosoftGraph; using PlatformPlatform.SharedKernel; -using AuthenticationConfiguration = Moment42.CalendarAssistant.Core.Authentication.AuthenticationConfiguration; +using AuthenticationConfiguration = Moment42.CalendarAssistant.Authentication.AuthenticationConfiguration; -namespace Moment42.CalendarAssistant.Core; +namespace Moment42.CalendarAssistant; public static class DependencyConfiguration { public static Assembly Assembly => Assembly.GetExecutingAssembly(); - public static IServiceCollection AddCoreServices(this IServiceCollection services, IConfiguration configuration) + public static IHostApplicationBuilder AddCalendarAssistantInfrastructure(this IHostApplicationBuilder builder) { + // Infrastructure is configured separately from other Infrastructure services to allow mocking in tests + builder.AddSharedInfrastructure("calendar-assistant-database"); + + return builder; + } + + public static IServiceCollection AddCalendarAssistantServices(this IServiceCollection services, IConfiguration configuration) + { + services.AddSharedServices(Assembly); + services.Configure(options => configuration.GetSection("Authentication").Bind(options)); services.Configure(options => configuration.GetSection("AzureOpenAI").Bind(options)); - services - .AddSingleton(_ => - { - var adaptiveCardProvider = new AdaptiveCardProvider( - Path.Combine(Path.GetDirectoryName(Assembly.Location)!, "Conversations", "AdaptiveCards", "Cards") - ); - adaptiveCardProvider.LoadCards(); - return adaptiveCardProvider; - } - ) - ; + services.AddSingleton(_ => + { + var adaptiveCardProvider = new AdaptiveCardProvider( + Path.Combine(Path.GetDirectoryName(Assembly.Location)!, "Conversations", "AdaptiveCards", "Cards") + ); + adaptiveCardProvider.LoadCards(); + return adaptiveCardProvider; + } + ); services.AddSingleton(serviceProvider => { @@ -92,9 +100,7 @@ public static IServiceCollection AddCoreServices(this IServiceCollection service services.AddSingleton(); - - services - .AddSingleton(serviceProvider => + services.AddSingleton(serviceProvider => { var authenticationConfiguration = serviceProvider.GetRequiredService>(); return new ConfigurationBotFrameworkAuthentication(configuration, @@ -110,13 +116,4 @@ public static IServiceCollection AddCoreServices(this IServiceCollection service return services; } - - public static IServiceCollection AddStorage(this IServiceCollection services, IHostApplicationBuilder builder) - { - // Storage is configured separately from other Infrastructure services to allow mocking in tests - services.ConfigureDatabaseContext(builder, "calendar-assistant-database"); - services.AddDefaultBlobStorage(builder); - - return services; - } } diff --git a/application/calendar-assistant/Core/MicrosoftGraph/IMicrosoftGraphService.cs b/application/calendar-assistant/Core/MicrosoftGraph/IMicrosoftGraphService.cs index 709acf523..948d739f8 100644 --- a/application/calendar-assistant/Core/MicrosoftGraph/IMicrosoftGraphService.cs +++ b/application/calendar-assistant/Core/MicrosoftGraph/IMicrosoftGraphService.cs @@ -1,6 +1,6 @@ using Microsoft.Graph.Models; -namespace Moment42.CalendarAssistant.Core.MicrosoftGraph; +namespace Moment42.CalendarAssistant.MicrosoftGraph; public interface IMicrosoftGraphService { diff --git a/application/calendar-assistant/Core/MicrosoftGraph/IMicrosoftGraphServiceFactory.cs b/application/calendar-assistant/Core/MicrosoftGraph/IMicrosoftGraphServiceFactory.cs index 21c2509d9..4f6873a38 100644 --- a/application/calendar-assistant/Core/MicrosoftGraph/IMicrosoftGraphServiceFactory.cs +++ b/application/calendar-assistant/Core/MicrosoftGraph/IMicrosoftGraphServiceFactory.cs @@ -1,4 +1,4 @@ -namespace Moment42.CalendarAssistant.Core.MicrosoftGraph; +namespace Moment42.CalendarAssistant.MicrosoftGraph; public interface IMicrosoftGraphServiceFactory { diff --git a/application/calendar-assistant/Core/MicrosoftGraph/MicrosoftGraphService.cs b/application/calendar-assistant/Core/MicrosoftGraph/MicrosoftGraphService.cs index 2d1063c5a..69d14047f 100644 --- a/application/calendar-assistant/Core/MicrosoftGraph/MicrosoftGraphService.cs +++ b/application/calendar-assistant/Core/MicrosoftGraph/MicrosoftGraphService.cs @@ -2,7 +2,7 @@ using Microsoft.Graph; using Microsoft.Graph.Models; -namespace Moment42.CalendarAssistant.Core.MicrosoftGraph; +namespace Moment42.CalendarAssistant.MicrosoftGraph; public sealed class MicrosoftGraphService : IMicrosoftGraphService { diff --git a/application/calendar-assistant/Core/MicrosoftGraph/MicrosoftGraphServiceFactory.cs b/application/calendar-assistant/Core/MicrosoftGraph/MicrosoftGraphServiceFactory.cs index fac839d29..07f8d5b34 100644 --- a/application/calendar-assistant/Core/MicrosoftGraph/MicrosoftGraphServiceFactory.cs +++ b/application/calendar-assistant/Core/MicrosoftGraph/MicrosoftGraphServiceFactory.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.Options; -using Moment42.CalendarAssistant.Core.Authentication; +using Moment42.CalendarAssistant.Authentication; -namespace Moment42.CalendarAssistant.Core.MicrosoftGraph; +namespace Moment42.CalendarAssistant.MicrosoftGraph; public sealed class MicrosoftGraphServiceFactory(IOptions authenticationConfiguration) : IMicrosoftGraphServiceFactory { diff --git a/application/calendar-assistant/Core/TelemetryEvents/TelemetryEvents.cs b/application/calendar-assistant/Core/TelemetryEvents/TelemetryEvents.cs index b481459f0..e2e4a69a1 100644 --- a/application/calendar-assistant/Core/TelemetryEvents/TelemetryEvents.cs +++ b/application/calendar-assistant/Core/TelemetryEvents/TelemetryEvents.cs @@ -7,7 +7,7 @@ using PlatformPlatform.SharedKernel.TelemetryEvents; -namespace Moment42.CalendarAssistant.Core.TelemetryEvents; +namespace Moment42.CalendarAssistant.TelemetryEvents; public sealed class GptResponseReceived(string modelName, int inputTokens, int outputTokens, int totalTokens) : TelemetryEvent(nameof(GptResponseReceived), diff --git a/application/calendar-assistant/Tests/ArchitectureTests/IdPrefixForAllStronglyTypedUlidTests.cs b/application/calendar-assistant/Tests/ArchitectureTests/IdPrefixForAllStronglyTypedUlidTests.cs index 0777d3e16..c1ed21645 100644 --- a/application/calendar-assistant/Tests/ArchitectureTests/IdPrefixForAllStronglyTypedUlidTests.cs +++ b/application/calendar-assistant/Tests/ArchitectureTests/IdPrefixForAllStronglyTypedUlidTests.cs @@ -1,5 +1,4 @@ using FluentAssertions; -using Moment42.CalendarAssistant.Core; using NetArchTest.Rules; using PlatformPlatform.SharedKernel.IdGenerators; using Xunit; diff --git a/application/calendar-assistant/Tests/ArchitectureTests/PublicClassesTests.cs b/application/calendar-assistant/Tests/ArchitectureTests/PublicClassesTests.cs index cb7424ef7..85a4f1b80 100644 --- a/application/calendar-assistant/Tests/ArchitectureTests/PublicClassesTests.cs +++ b/application/calendar-assistant/Tests/ArchitectureTests/PublicClassesTests.cs @@ -1,5 +1,4 @@ using FluentAssertions; -using Moment42.CalendarAssistant.Core; using NetArchTest.Rules; using PlatformPlatform.SharedKernel.Cqrs; using Xunit; diff --git a/application/calendar-assistant/Tests/BaseTest.cs b/application/calendar-assistant/Tests/BaseTest.cs index 1d77ef1a6..bec1cf6fd 100644 --- a/application/calendar-assistant/Tests/BaseTest.cs +++ b/application/calendar-assistant/Tests/BaseTest.cs @@ -6,7 +6,6 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using Moment42.CalendarAssistant.Core; using NSubstitute; using PlatformPlatform.SharedKernel.Services; using PlatformPlatform.SharedKernel.TelemetryEvents; @@ -40,8 +39,7 @@ protected BaseTest() Services.AddDbContext(options => { options.UseSqlite(Connection); }); IConfiguration configuration = new ConfigurationRoot([]); - Services - .AddCoreServices(configuration); + Services.AddCalendarAssistantServices(configuration); TelemetryEventsCollectorSpy = new TelemetryEventsCollectorSpy(new TelemetryEventsCollector()); Services.AddScoped(_ => TelemetryEventsCollectorSpy); diff --git a/application/calendar-assistant/Tests/DatabaseSeeder.cs b/application/calendar-assistant/Tests/DatabaseSeeder.cs index c7434b34a..bbdc3b73d 100644 --- a/application/calendar-assistant/Tests/DatabaseSeeder.cs +++ b/application/calendar-assistant/Tests/DatabaseSeeder.cs @@ -1,4 +1,4 @@ -using Moment42.CalendarAssistant.Core.Database; +using Moment42.CalendarAssistant.Database; namespace Moment42.CalendarAssistant.Tests; diff --git a/application/calendar-assistant/Tests/appsettings.json b/application/calendar-assistant/Tests/appsettings.json index dd608fcac..f26bddcc8 100644 --- a/application/calendar-assistant/Tests/appsettings.json +++ b/application/calendar-assistant/Tests/appsettings.json @@ -2,11 +2,10 @@ "Logging": { "LogLevel": { "Default": "Information", - "Microsoft.AspNetCore": "Warning", - "Aspire.Hosting.Dcp": "Information" + "Microsoft.AspNetCore": "Warning" } }, "ConnectionStrings": { - "blob-storage": "AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;DefaultEndpointsProtocol=http;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;TableEndpoint=http://127.0.0.1:10002/devstoreaccount1;" + "blob-storage": "UseDevelopmentStorage=true" } } diff --git a/application/calendar-assistant/Workers/CalendarAssistant.Workers.csproj b/application/calendar-assistant/Workers/CalendarAssistant.Workers.csproj index 49726deed..61258afe5 100644 --- a/application/calendar-assistant/Workers/CalendarAssistant.Workers.csproj +++ b/application/calendar-assistant/Workers/CalendarAssistant.Workers.csproj @@ -11,13 +11,7 @@ - - - - - - appsettings.json - + diff --git a/application/calendar-assistant/Workers/Program.cs b/application/calendar-assistant/Workers/Program.cs index f2ccefe8e..d94094734 100644 --- a/application/calendar-assistant/Workers/Program.cs +++ b/application/calendar-assistant/Workers/Program.cs @@ -1,30 +1,26 @@ -using Microsoft.ApplicationInsights.AspNetCore.Extensions; -using Moment42.CalendarAssistant.Core; -using Moment42.CalendarAssistant.Core.Database; +using Moment42.CalendarAssistant; +using Moment42.CalendarAssistant.Database; using PlatformPlatform.SharedKernel; +using PlatformPlatform.SharedKernel.Database; // Worker service is using WebApplication.CreateBuilder instead of Host.CreateDefaultBuilder to allow scaling to zero var builder = WebApplication.CreateBuilder(args); -// Configure services for the Application, Infrastructure layers like Entity Framework, Repositories, MediatR, -// FluentValidation validators, Pipelines. -builder.Services - .AddCoreServices(builder.Configuration) - .AddStorage(builder) - .ConfigureDevelopmentPort(builder, 9399); +// Configure storage infrastructure like Database, BlobStorage, Logging, Telemetry, Entity Framework DB Context, etc. +builder + .AddDevelopmentPort(9399) + .AddCalendarAssistantInfrastructure(); -var applicationInsightsServiceOptions = new ApplicationInsightsServiceOptions -{ - EnableRequestTrackingTelemetryModule = false, - EnableDependencyTrackingTelemetryModule = false, - RequestCollectionOptions = { TrackExceptions = false } -}; +// Configure dependency injection services like Repositories, MediatR, Pipelines, FluentValidation validators, etc. +builder.Services.AddCalendarAssistantServices(builder.Configuration); -builder.Services.AddApplicationInsightsTelemetry(applicationInsightsServiceOptions); +builder.Services.AddTransient>(); var host = builder.Build(); // Apply migrations to the database (should be moved to GitHub Actions or similar in production) -host.Services.ApplyMigrations(); +using var scope = host.Services.CreateScope(); +var migrationService = scope.ServiceProvider.GetRequiredService>(); +migrationService.ApplyMigrations(); await host.RunAsync(); diff --git a/application/calendar-assistant/Workers/appsettings.development.json b/application/calendar-assistant/Workers/appsettings.development.json deleted file mode 100644 index dd608fcac..000000000 --- a/application/calendar-assistant/Workers/appsettings.development.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning", - "Aspire.Hosting.Dcp": "Information" - } - }, - "ConnectionStrings": { - "blob-storage": "AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;DefaultEndpointsProtocol=http;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1;QueueEndpoint=http://127.0.0.1:10001/devstoreaccount1;TableEndpoint=http://127.0.0.1:10002/devstoreaccount1;" - } -} diff --git a/application/calendar-assistant/Workers/appsettings.json b/application/calendar-assistant/Workers/appsettings.json index a71e36ca6..cb99e097e 100644 --- a/application/calendar-assistant/Workers/appsettings.json +++ b/application/calendar-assistant/Workers/appsettings.json @@ -1,4 +1,13 @@ { + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "ConnectionStrings": { + "blob-storage": "UseDevelopmentStorage=true" + }, "AzureOpenAI": { "Endpoint": "", "Key": "", @@ -12,11 +21,5 @@ "ProvidersOAuthConnectionName": { "Microsoft": "" } - }, - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.Hosting.Lifetime": "Information" - } } }