< 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: 83
Uncovered lines: 0
Coverable lines: 83
Total lines: 129
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.ViewModels;
 5using Chronicis.Shared.Admin;
 6using Microsoft.Extensions.Options;
 7
 8namespace Chronicis.Client.Extensions;
 9
 10/// <summary>
 11/// Extension methods for registering application services.
 12/// </summary>
 13public static class ApplicationServiceExtensions
 14{
 15    /// <summary>
 16    /// Adds all Chronicis application services including API services,
 17    /// state services, and domain services.
 18    /// </summary>
 19    public static IServiceCollection AddChronicisApplicationServices(
 20        this IServiceCollection services,
 21        IConfiguration configuration)
 22    {
 23        // SysAdmin checker — reads from the "SysAdmin" config section in wwwroot/appsettings.json
 124        services.Configure<SysAdminOptions>(configuration.GetSection("SysAdmin"));
 125        services.AddSingleton<ISysAdminChecker>(sp =>
 126        {
 127            var options = sp.GetRequiredService<IOptions<SysAdminOptions>>().Value;
 128            return new SysAdminChecker(options);
 129        });
 30
 31        // API Services - use the authenticated "ChronicisApi" client
 132        services.AddChronicisApiService<IArticleApiService, ArticleApiService>();
 133        services.AddChronicisApiService<ISearchApiService, SearchApiService>();
 134        services.AddChronicisApiService<IAISummaryApiService, AISummaryApiService>();
 135        services.AddChronicisApiService<IWorldApiService, WorldApiService>();
 136        services.AddChronicisApiService<ICampaignApiService, CampaignApiService>();
 137        services.AddChronicisApiService<IArcApiService, ArcApiService>();
 138        services.AddChronicisApiService<ISessionApiService, SessionApiService>();
 139        services.AddChronicisApiService<ILinkApiService, LinkApiService>();
 140        services.AddChronicisApiService<IArticleExternalLinkApiService, ArticleExternalLinkApiService>();
 141        services.AddChronicisApiService<IExternalLinkApiService, ExternalLinkApiService>();
 142        services.AddChronicisApiService<IUserApiService, UserApiService>();
 143        services.AddChronicisApiService<ICharacterApiService, CharacterApiService>();
 144        services.AddChronicisApiService<IDashboardApiService, DashboardApiService>();
 145        services.AddChronicisApiService<IResourceProviderApiService, ResourceProviderApiService>();
 146        services.AddChronicisApiService<IAdminApiService, AdminApiService>();
 147        services.AddChronicisApiService<ITutorialApiService, TutorialApiService>();
 148        services.AddChronicisApiService<IMapApiService, MapApiService>();
 49
 50        // API services with special dependencies
 151        services.AddChronicisApiServiceWithSnackbar<IQuestApiService, QuestApiService>();
 152        services.AddChronicisApiServiceWithJSRuntime<IExportApiService, ExportApiService>();
 53
 54        // Public API service (uses unauthenticated client)
 155        services.AddScoped<IPublicApiService>(sp =>
 156        {
 157            var factory = sp.GetRequiredService<IHttpClientFactory>();
 158            var logger = sp.GetRequiredService<ILogger<PublicApiService>>();
 159            return new PublicApiService(factory.CreateClient("ChronicisPublicApi"), logger);
 160        });
 61
 62        // Health Status API service (uses unauthenticated client since health endpoints are public)
 163        services.AddScoped<IHealthStatusApiService>(sp =>
 164        {
 165            var factory = sp.GetRequiredService<IHttpClientFactory>();
 166            var logger = sp.GetRequiredService<ILogger<HealthStatusApiService>>();
 167            return new HealthStatusApiService(factory.CreateClient("ChronicisPublicApi"), logger);
 168        });
 69
 70        // UI Infrastructure abstractions — decouple ViewModels from MudBlazor/JS/NavigationManager
 171        services.AddScoped<IAppNavigator, AppNavigator>();
 172        services.AddScoped<IUserNotifier, UserNotifier>();
 173        services.AddScoped<IConfirmationService, ConfirmationService>();
 174        services.AddScoped<IPageTitleService, PageTitleService>();
 75
 76        // ViewModels
 177        services.AddTransient<SearchViewModel>();
 178        services.AddTransient<DashboardViewModel>();
 179        services.AddTransient<CampaignDetailViewModel>();
 180        services.AddTransient<ArcDetailViewModel>();
 181        services.AddTransient<SessionDetailViewModel>();
 182        services.AddTransient<WorldDetailViewModel>();
 183        services.AddTransient<WorldLinksViewModel>();
 184        services.AddTransient<WorldDocumentsViewModel>();
 185        services.AddTransient<WorldSharingViewModel>();
 186        services.AddTransient<ArticleDetailViewModel>();
 187        services.AddTransient<CosmosViewModel>();
 188        services.AddTransient<GettingStartedViewModel>();
 189        services.AddTransient<PublicWorldPageViewModel>();
 90
 91        // State & coordination services
 192        services.AddScoped<ITreeStateService, TreeStateService>();
 193        services.AddScoped<IAuthService, AuthService>();
 194        services.AddScoped<IAdminAuthService, AdminAuthService>();
 195        services.AddScoped<IAppContextService, AppContextService>();
 196        services.AddScoped<IDrawerCoordinator, DrawerCoordinator>();
 197        services.AddScoped<IMetadataDrawerService, MetadataDrawerService>();
 198        services.AddScoped<IQuestDrawerService, QuestDrawerService>();
 199        services.AddScoped<IKeyboardShortcutService, KeyboardShortcutService>();
 1100        services.AddScoped<TutorialPageTypeResolver>();
 101
 102        // Domain services
 1103        services.AddScoped<IArticleCacheService, ArticleCacheService>();
 1104        services.AddScoped<IWikiLinkService, WikiLinkService>();
 1105        services.AddScoped<IWikiLinkAutocompleteService, WikiLinkAutocompleteService>();
 1106        services.AddScoped<IBreadcrumbService, BreadcrumbService>();
 1107        services.AddScoped<IMarkdownService, MarkdownService>();
 108
 109        // Render definition service (loads from wwwroot static assets via base URI)
 1110        services.AddScoped<IRenderDefinitionService>(sp =>
 1111        {
 1112            var navigationManager = sp.GetRequiredService<Microsoft.AspNetCore.Components.NavigationManager>();
 1113            var http = new HttpClient { BaseAddress = new Uri(navigationManager.BaseUri) };
 1114            var logger = sp.GetRequiredService<ILogger<RenderDefinitionService>>();
 1115            return new RenderDefinitionService(http, logger);
 1116        });
 117
 118        // Version service — reads wwwroot/version.json stamped by CI
 1119        services.AddSingleton<IVersionService>(sp =>
 1120        {
 1121            var navigationManager = sp.GetRequiredService<Microsoft.AspNetCore.Components.NavigationManager>();
 1122            var http = new HttpClient { BaseAddress = new Uri(navigationManager.BaseUri) };
 1123            var logger = sp.GetRequiredService<ILogger<VersionService>>();
 1124            return new VersionService(http, logger);
 1125        });
 126
 1127        return services;
 128    }
 129}