< Summary

Information
Class: Chronicis.Client.Extensions.ApplicationServiceExtensions
Assembly: Chronicis.Client
File(s): /home/runner/work/chronicis/chronicis/src/Chronicis.Client/Extensions/ApplicationServiceExtensions.cs
Line coverage
100%
Covered lines: 87
Uncovered lines: 0
Coverable lines: 87
Total lines: 136
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
AddChronicisApplicationServices(...)100%11100%

File(s)

/home/runner/work/chronicis/chronicis/src/Chronicis.Client/Extensions/ApplicationServiceExtensions.cs

#LineLine coverage
 1using Chronicis.Client.Abstractions;
 2using Chronicis.Client.Infrastructure;
 3using Chronicis.Client.Services;
 4using Chronicis.Client.Services.Routing;
 5using Chronicis.Client.ViewModels;
 6using Chronicis.Shared.Admin;
 7using Microsoft.Extensions.Options;
 8
 9namespace Chronicis.Client.Extensions;
 10
 11/// <summary>
 12/// Extension methods for registering application services.
 13/// </summary>
 14public static class ApplicationServiceExtensions
 15{
 16    /// <summary>
 17    /// Adds all Chronicis application services including API services,
 18    /// state services, and domain services.
 19    /// </summary>
 20    public static IServiceCollection AddChronicisApplicationServices(
 21        this IServiceCollection services,
 22        IConfiguration configuration)
 23    {
 24        // SysAdmin checker — reads from the "SysAdmin" config section in wwwroot/appsettings.json
 125        services.Configure<SysAdminOptions>(configuration.GetSection("SysAdmin"));
 126        services.AddSingleton<ISysAdminChecker>(sp =>
 127        {
 128            var options = sp.GetRequiredService<IOptions<SysAdminOptions>>().Value;
 129            return new SysAdminChecker(options);
 130        });
 31
 32        // API Services - use the authenticated "ChronicisApi" client
 133        services.AddChronicisApiService<IArticleApiService, ArticleApiService>();
 134        services.AddChronicisApiService<ISearchApiService, SearchApiService>();
 135        services.AddChronicisApiService<IAISummaryApiService, AISummaryApiService>();
 136        services.AddChronicisApiService<IWorldApiService, WorldApiService>();
 137        services.AddChronicisApiService<ICampaignApiService, CampaignApiService>();
 138        services.AddChronicisApiService<IArcApiService, ArcApiService>();
 139        services.AddChronicisApiService<ISessionApiService, SessionApiService>();
 140        services.AddChronicisApiService<ILinkApiService, LinkApiService>();
 141        services.AddChronicisApiService<IArticleExternalLinkApiService, ArticleExternalLinkApiService>();
 142        services.AddChronicisApiService<IExternalLinkApiService, ExternalLinkApiService>();
 143        services.AddChronicisApiService<IUserApiService, UserApiService>();
 144        services.AddChronicisApiService<ICharacterApiService, CharacterApiService>();
 145        services.AddChronicisApiService<IDashboardApiService, DashboardApiService>();
 146        services.AddChronicisApiService<IResourceProviderApiService, ResourceProviderApiService>();
 147        services.AddChronicisApiService<IAdminApiService, AdminApiService>();
 148        services.AddChronicisApiService<ITutorialApiService, TutorialApiService>();
 149        services.AddChronicisApiService<IMapApiService, MapApiService>();
 150        services.AddChronicisApiService<IPathApiService, PathApiService>();
 51
 52        // Routing services
 153        services.AddSingleton<IAppUrlBuilder, AppUrlBuilder>();
 154        services.AddSingleton<IClientReservedSlugProvider>(sp =>
 155            new ClientReservedSlugProvider(sp.GetRequiredService<IConfiguration>()));
 56
 57        // API services with special dependencies
 158        services.AddChronicisApiServiceWithSnackbar<IQuestApiService, QuestApiService>();
 159        services.AddChronicisApiServiceWithJSRuntime<IExportApiService, ExportApiService>();
 60
 61        // Public API service (uses unauthenticated client)
 162        services.AddScoped<IPublicApiService>(sp =>
 163        {
 164            var factory = sp.GetRequiredService<IHttpClientFactory>();
 165            var logger = sp.GetRequiredService<ILogger<PublicApiService>>();
 166            return new PublicApiService(factory.CreateClient("ChronicisPublicApi"), logger);
 167        });
 68
 69        // Health Status API service (uses unauthenticated client since health endpoints are public)
 170        services.AddScoped<IHealthStatusApiService>(sp =>
 171        {
 172            var factory = sp.GetRequiredService<IHttpClientFactory>();
 173            var logger = sp.GetRequiredService<ILogger<HealthStatusApiService>>();
 174            return new HealthStatusApiService(factory.CreateClient("ChronicisPublicApi"), logger);
 175        });
 76
 77        // UI Infrastructure abstractions — decouple ViewModels from MudBlazor/JS/NavigationManager
 178        services.AddScoped<IAppNavigator, AppNavigator>();
 179        services.AddScoped<IUserNotifier, UserNotifier>();
 180        services.AddScoped<IConfirmationService, ConfirmationService>();
 181        services.AddScoped<IPageTitleService, PageTitleService>();
 82
 83        // ViewModels
 184        services.AddTransient<SearchViewModel>();
 185        services.AddTransient<DashboardViewModel>();
 186        services.AddTransient<CampaignDetailViewModel>();
 187        services.AddTransient<ArcDetailViewModel>();
 188        services.AddTransient<SessionDetailViewModel>();
 189        services.AddTransient<WorldDetailViewModel>();
 190        services.AddTransient<WorldLinksViewModel>();
 191        services.AddTransient<WorldDocumentsViewModel>();
 192        services.AddTransient<WorldSharingViewModel>();
 193        services.AddTransient<ArticleDetailViewModel>();
 194        services.AddTransient<CosmosViewModel>();
 195        services.AddTransient<GettingStartedViewModel>();
 96
 97        // State & coordination services
 198        services.AddScoped<ITreeStateService, TreeStateService>();
 199        services.AddScoped<IAuthService, AuthService>();
 1100        services.AddScoped<IAdminAuthService, AdminAuthService>();
 1101        services.AddScoped<IAppContextService, AppContextService>();
 1102        services.AddScoped<IDrawerCoordinator, DrawerCoordinator>();
 1103        services.AddScoped<IMetadataDrawerService, MetadataDrawerService>();
 1104        services.AddScoped<IQuestDrawerService, QuestDrawerService>();
 1105        services.AddScoped<IKeyboardShortcutService, KeyboardShortcutService>();
 1106        services.AddScoped<TutorialPageTypeResolver>();
 107
 108        // Domain services
 1109        services.AddScoped<IArticleCacheService, ArticleCacheService>();
 1110        services.AddScoped<IWikiLinkService, WikiLinkService>();
 1111        services.AddScoped<IWikiLinkCommitService, WikiLinkCommitService>();
 1112        services.AddScoped<IWikiLinkAutocompleteService, WikiLinkAutocompleteService>();
 1113        services.AddScoped<IBreadcrumbService, BreadcrumbService>();
 1114        services.AddScoped<IMarkdownService, MarkdownService>();
 115
 116        // Render definition service (loads from wwwroot static assets via base URI)
 1117        services.AddScoped<IRenderDefinitionService>(sp =>
 1118        {
 1119            var navigationManager = sp.GetRequiredService<Microsoft.AspNetCore.Components.NavigationManager>();
 1120            var http = new HttpClient { BaseAddress = new Uri(navigationManager.BaseUri) };
 1121            var logger = sp.GetRequiredService<ILogger<RenderDefinitionService>>();
 1122            return new RenderDefinitionService(http, logger);
 1123        });
 124
 125        // Version service — reads wwwroot/version.json stamped by CI
 1126        services.AddSingleton<IVersionService>(sp =>
 1127        {
 1128            var navigationManager = sp.GetRequiredService<Microsoft.AspNetCore.Components.NavigationManager>();
 1129            var http = new HttpClient { BaseAddress = new Uri(navigationManager.BaseUri) };
 1130            var logger = sp.GetRequiredService<ILogger<VersionService>>();
 1131            return new VersionService(http, logger);
 1132        });
 133
 1134        return services;
 135    }
 136}