< Summary

Information
Class: Orchestrator.Commands.Utility.UploadTransfers.UploadTransfersCommand
Assembly: Orchestrator
File(s): /home/runner/work/KicktippAi/KicktippAi/src/Orchestrator/Commands/Utility/UploadTransfers/UploadTransfersCommand.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 53
Coverable lines: 53
Total lines: 112
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 18
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
ExecuteAsync()0%342180%
get_DocumentName()100%210%
set_DocumentName(...)100%210%
.ctor()100%210%
get_Content()100%210%
set_Content(...)100%210%
get_Description()100%210%
set_Description(...)100%210%
get_CommunityContext()100%210%
set_CommunityContext(...)100%210%

File(s)

/home/runner/work/KicktippAi/KicktippAi/src/Orchestrator/Commands/Utility/UploadTransfers/UploadTransfersCommand.cs

#LineLine coverage
 1using Microsoft.Extensions.Logging;
 2using Spectre.Console.Cli;
 3using Spectre.Console;
 4using System.Text.Json;
 5using EHonda.KicktippAi.Core;
 6using Orchestrator.Infrastructure.Factories;
 7
 8namespace Orchestrator.Commands.Utility.UploadTransfers;
 9
 10public class UploadTransfersCommand : AsyncCommand<UploadTransfersSettings>
 11{
 12    private readonly IAnsiConsole _console;
 13    private readonly IFirebaseServiceFactory _firebaseServiceFactory;
 14    private readonly ILogger<UploadTransfersCommand> _logger;
 15
 016    public UploadTransfersCommand(
 017        IAnsiConsole console,
 018        IFirebaseServiceFactory firebaseServiceFactory,
 019        ILogger<UploadTransfersCommand> logger)
 20    {
 021        _console = console;
 022        _firebaseServiceFactory = firebaseServiceFactory;
 023        _logger = logger;
 024    }
 25
 26    public override async Task<int> ExecuteAsync(CommandContext context, UploadTransfersSettings settings)
 27    {
 28
 29        try
 30        {
 031            var docName = $"{settings.TeamAbbreviation.ToLowerInvariant()}-transfers.csv";
 032            _console.MarkupLine($"[green]Upload Transfers command initialized for document:[/] [yellow]{docName}[/]");
 033            _console.MarkupLine($"[blue]Using community context:[/] [yellow]{settings.CommunityContext}[/]");
 034            if (settings.Verbose) _console.MarkupLine("[dim]Verbose mode enabled[/]");
 35
 36            // JSON file path produced by Create-TransfersDocument.ps1 firebase mode
 037            var jsonPath = Path.Combine("transfers-documents", "output", settings.CommunityContext, $"{docName}.json");
 038            if (!File.Exists(jsonPath))
 39            {
 040                _console.MarkupLine($"[red]Transfers document JSON not found:[/] {jsonPath}");
 041                _console.MarkupLine("[dim]Run Create-TransfersDocument.ps1 in firebase mode first.[/]");
 042                return 1;
 43            }
 44
 045            _console.MarkupLine($"[blue]Reading transfers document from:[/] {jsonPath}");
 046            var jsonContent = await File.ReadAllTextAsync(jsonPath);
 047            var transfersDoc = JsonSerializer.Deserialize<TransfersDocumentJson>(jsonContent, new JsonSerializerOptions 
 048            if (transfersDoc == null)
 49            {
 050                _console.MarkupLine("[red]Failed to parse transfers document JSON[/]");
 051                return 1;
 52            }
 53
 054            if (settings.Verbose)
 55            {
 056                _console.MarkupLine($"[dim]Document Name: {transfersDoc.DocumentName}[/]");
 057                _console.MarkupLine($"[dim]Community Context: {transfersDoc.CommunityContext}[/]");
 058                _console.MarkupLine($"[dim]Content length: {transfersDoc.Content.Length} characters[/]");
 59            }
 60
 61            // Create Firebase services using factory (factory handles env var loading)
 062            var contextRepo = _firebaseServiceFactory.CreateContextRepository();
 063            var existing = await contextRepo.GetLatestContextDocumentAsync(transfersDoc.DocumentName, transfersDoc.Commu
 064            if (existing != null)
 65            {
 066                _console.MarkupLine($"[blue]Found existing transfers document '{transfersDoc.DocumentName}' (version {ex
 067                if (settings.Verbose)
 68                {
 069                    _console.MarkupLine("[dim]Checking for changes...[/]");
 70                }
 71            }
 72            else
 73            {
 074                _console.MarkupLine($"[blue]No existing transfers document found - will create version 0[/]");
 75            }
 76
 077            var savedVersion = await contextRepo.SaveContextDocumentAsync(
 078                transfersDoc.DocumentName,
 079                transfersDoc.Content,
 080                transfersDoc.CommunityContext);
 81
 082            if (existing != null && savedVersion == null)
 83            {
 084                _console.MarkupLine($"[green]✓ Content unchanged - transfers document remains at version {existing.Versi
 85            }
 086            else if (existing != null)
 87            {
 088                _console.MarkupLine($"[green]✓ Content changed - created new version {savedVersion}[/]");
 89            }
 90            else
 91            {
 092                _console.MarkupLine($"[green]✓ Created transfers document version {savedVersion}[/]");
 93            }
 94
 095            return 0;
 96        }
 097        catch (Exception ex)
 98        {
 099            _logger.LogError(ex, "Error in upload-transfers command");
 0100            _console.MarkupLine($"[red]Error: {ex.Message}[/]");
 0101            return 1;
 102        }
 0103    }
 104
 105    private class TransfersDocumentJson
 106    {
 0107        public string DocumentName { get; set; } = string.Empty;
 0108        public string Content { get; set; } = string.Empty;
 0109        public string Description { get; set; } = string.Empty;
 0110        public string CommunityContext { get; set; } = string.Empty;
 111    }
 112}