< Summary

Information
Class: Orchestrator.Infrastructure.Factories.FirebaseServiceFactory
Assembly: Orchestrator
File(s): /home/runner/work/KicktippAi/KicktippAi/src/Orchestrator/Infrastructure/Factories/FirebaseServiceFactory.cs
Line coverage
40%
Covered lines: 11
Uncovered lines: 16
Coverable lines: 27
Total lines: 83
Line coverage: 40.7%
Branch coverage
75%
Covered branches: 3
Total branches: 4
Branch coverage: 75%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
get_FirestoreDb()100%11100%
CreatePredictionRepository()100%210%
CreateKpiRepository()100%210%
CreateContextRepository()100%210%
CreateMatchOutcomeRepository()100%210%
InitializeFirestoreDb()75%7442.86%

File(s)

/home/runner/work/KicktippAi/KicktippAi/src/Orchestrator/Infrastructure/Factories/FirebaseServiceFactory.cs

#LineLine coverage
 1using EHonda.KicktippAi.Core;
 2using FirebaseAdapter;
 3using Google.Cloud.Firestore;
 4using Microsoft.Extensions.Logging;
 5
 6namespace Orchestrator.Infrastructure.Factories;
 7
 8/// <summary>
 9/// Default implementation of <see cref="IFirebaseServiceFactory"/>.
 10/// </summary>
 11/// <remarks>
 12/// Initializes <see cref="FirestoreDb"/> from environment variables on construction.
 13/// Throws if required environment variables are not set.
 14/// </remarks>
 15public sealed class FirebaseServiceFactory : IFirebaseServiceFactory
 16{
 17    private readonly ILoggerFactory _loggerFactory;
 18    private readonly Lazy<FirestoreDb> _firestoreDb;
 19
 120    public FirebaseServiceFactory(ILoggerFactory loggerFactory)
 21    {
 122        _loggerFactory = loggerFactory;
 123        _firestoreDb = new Lazy<FirestoreDb>(InitializeFirestoreDb);
 124    }
 25
 26    /// <inheritdoc />
 127    public FirestoreDb FirestoreDb => _firestoreDb.Value;
 28
 29    /// <inheritdoc />
 30    public IPredictionRepository CreatePredictionRepository()
 31    {
 032        var logger = _loggerFactory.CreateLogger<FirebasePredictionRepository>();
 033        return new FirebasePredictionRepository(FirestoreDb, logger);
 34    }
 35
 36    /// <inheritdoc />
 37    public IKpiRepository CreateKpiRepository()
 38    {
 039        var logger = _loggerFactory.CreateLogger<FirebaseKpiRepository>();
 040        return new FirebaseKpiRepository(FirestoreDb, logger);
 41    }
 42
 43    /// <inheritdoc />
 44    public IContextRepository CreateContextRepository()
 45    {
 046        var logger = _loggerFactory.CreateLogger<FirebaseContextRepository>();
 047        return new FirebaseContextRepository(FirestoreDb, logger);
 48    }
 49
 50    /// <inheritdoc />
 51    public IMatchOutcomeRepository CreateMatchOutcomeRepository()
 52    {
 053        var logger = _loggerFactory.CreateLogger<FirebaseMatchOutcomeRepository>();
 054        return new FirebaseMatchOutcomeRepository(FirestoreDb, logger);
 55    }
 56
 57    private FirestoreDb InitializeFirestoreDb()
 58    {
 159        var projectId = Environment.GetEnvironmentVariable("FIREBASE_PROJECT_ID");
 160        var serviceAccountJson = Environment.GetEnvironmentVariable("FIREBASE_SERVICE_ACCOUNT_JSON");
 61
 162        if (string.IsNullOrWhiteSpace(projectId))
 63        {
 164            throw new InvalidOperationException("FIREBASE_PROJECT_ID environment variable is required");
 65        }
 66
 167        if (string.IsNullOrWhiteSpace(serviceAccountJson))
 68        {
 169            throw new InvalidOperationException("FIREBASE_SERVICE_ACCOUNT_JSON environment variable is required");
 70        }
 71
 072        var logger = _loggerFactory.CreateLogger<FirebaseServiceFactory>();
 073        logger.LogInformation("Initializing Firebase Firestore for project: {ProjectId}", projectId);
 74
 075        var firestoreDbBuilder = new FirestoreDbBuilder
 076        {
 077            ProjectId = projectId,
 078            JsonCredentials = serviceAccountJson
 079        };
 80
 081        return firestoreDbBuilder.Build();
 82    }
 83}