< 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: 88
Uncovered lines: 0
Coverable lines: 88
Total lines: 137
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>();
 151        services.AddChronicisApiService<IHandwrittenNoteApiService, HandwrittenNoteApiService>();
 52
 53        // Routing services
 154        services.AddSingleton<IAppUrlBuilder, AppUrlBuilder>();
 155        services.AddSingleton<IClientReservedSlugProvider>(sp =>
 156            new ClientReservedSlugProvider(sp.GetRequiredService<IConfiguration>()));
 57
 58        // API services with special dependencies
 159        services.AddChronicisApiServiceWithSnackbar<IQuestApiService, QuestApiService>();
 160        services.AddChronicisApiServiceWithJSRuntime<IExportApiService, ExportApiService>();
 61
 62        // Public API service (uses unauthenticated client)
 163        services.AddScoped<IPublicApiService>(sp =>
 164        {
 165            var factory = sp.GetRequiredService<IHttpClientFactory>();
 166            var logger = sp.GetRequiredService<ILogger<PublicApiService>>();
 167            return new PublicApiService(factory.CreateClient("ChronicisPublicApi"), logger);
 168        });
 69
 70        // Health Status API service (uses unauthenticated client since health endpoints are public)
 171        services.AddScoped<IHealthStatusApiService>(sp =>
 172        {
 173            var factory = sp.GetRequiredService<IHttpClientFactory>();
 174            var logger = sp.GetRequiredService<ILogger<HealthStatusApiService>>();
 175            return new HealthStatusApiService(factory.CreateClient("ChronicisPublicApi"), logger);
 176        });
 77
 78        // UI Infrastructure abstractions — decouple ViewModels from MudBlazor/JS/NavigationManager
 179        services.AddScoped<IAppNavigator, AppNavigator>();
 180        services.AddScoped<IUserNotifier, UserNotifier>();
 181        services.AddScoped<IConfirmationService, ConfirmationService>();
 182        services.AddScoped<IPageTitleService, PageTitleService>();
 83
 84        // ViewModels
 185        services.AddTransient<SearchViewModel>();
 186        services.AddTransient<DashboardViewModel>();
 187        services.AddTransient<CampaignDetailViewModel>();
 188        services.AddTransient<ArcDetailViewModel>();
 189        services.AddTransient<SessionDetailViewModel>();
 190        services.AddTransient<WorldDetailViewModel>();
 191        services.AddTransient<WorldLinksViewModel>();
 192        services.AddTransient<WorldDocumentsViewModel>();
 193        services.AddTransient<WorldSharingViewModel>();
 194        services.AddTransient<ArticleDetailViewModel>();
 195        services.AddTransient<CosmosViewModel>();
 196        services.AddTransient<GettingStartedViewModel>();
 97
 98        // State & coordination services
 199        services.AddScoped<ITreeStateService, TreeStateService>();
 1100        services.AddScoped<IAuthService, AuthService>();
 1101        services.AddScoped<IAdminAuthService, AdminAuthService>();
 1102        services.AddScoped<IAppContextService, AppContextService>();
 1103        services.AddScoped<IDrawerCoordinator, DrawerCoordinator>();
 1104        services.AddScoped<IMetadataDrawerService, MetadataDrawerService>();
 1105        services.AddScoped<IQuestDrawerService, QuestDrawerService>();
 1106        services.AddScoped<IKeyboardShortcutService, KeyboardShortcutService>();
 1107        services.AddScoped<TutorialPageTypeResolver>();
 108
 109        // Domain services
 1110        services.AddScoped<IArticleCacheService, ArticleCacheService>();
 1111        services.AddScoped<IWikiLinkService, WikiLinkService>();
 1112        services.AddScoped<IWikiLinkCommitService, WikiLinkCommitService>();
 1113        services.AddScoped<IWikiLinkAutocompleteService, WikiLinkAutocompleteService>();
 1114        services.AddScoped<IBreadcrumbService, BreadcrumbService>();
 1115        services.AddScoped<IMarkdownService, MarkdownService>();
 116
 117        // Render definition service (loads from wwwroot static assets via base URI)
 1118        services.AddScoped<IRenderDefinitionService>(sp =>
 1119        {
 1120            var navigationManager = sp.GetRequiredService<Microsoft.AspNetCore.Components.NavigationManager>();
 1121            var http = new HttpClient { BaseAddress = new Uri(navigationManager.BaseUri) };
 1122            var logger = sp.GetRequiredService<ILogger<RenderDefinitionService>>();
 1123            return new RenderDefinitionService(http, logger);
 1124        });
 125
 126        // Version service — reads wwwroot/version.json stamped by CI
 1127        services.AddSingleton<IVersionService>(sp =>
 1128        {
 1129            var navigationManager = sp.GetRequiredService<Microsoft.AspNetCore.Components.NavigationManager>();
 1130            var http = new HttpClient { BaseAddress = new Uri(navigationManager.BaseUri) };
 1131            var logger = sp.GetRequiredService<ILogger<VersionService>>();
 1132            return new VersionService(http, logger);
 1133        });
 134
 1135        return services;
 136    }
 137}