< Summary

Information
Class: Chronicis.Client.Services.AISummaryApiService
Assembly: Chronicis.Client
File(s): /home/runner/work/chronicis/chronicis/src/Chronicis.Client/Services/AISummaryApiService.cs
Line coverage
100%
Covered lines: 9
Uncovered lines: 0
Coverable lines: 9
Total lines: 151
Line coverage: 100%
Branch coverage
100%
Covered branches: 4
Total branches: 4
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
GetEntityRoute(...)100%44100%

File(s)

/home/runner/work/chronicis/chronicis/src/Chronicis.Client/Services/AISummaryApiService.cs

#LineLine coverage
 1using System.Net.Http.Json;
 2using Chronicis.Shared.DTOs;
 3
 4namespace Chronicis.Client.Services;
 5
 6/// <summary>
 7/// Service for AI Summary API operations.
 8/// Uses HttpClientExtensions for consistent error handling and logging.
 9/// </summary>
 10public class AISummaryApiService : IAISummaryApiService
 11{
 12    private readonly HttpClient _http;
 13    private readonly ILogger<AISummaryApiService> _logger;
 14
 15    public AISummaryApiService(HttpClient http, ILogger<AISummaryApiService> logger)
 16    {
 817        _http = http;
 818        _logger = logger;
 819    }
 20
 21    #region Templates
 22
 23    public async Task<List<SummaryTemplateDto>> GetTemplatesAsync()
 24    {
 25        var result = await _http.GetEntityAsync<List<SummaryTemplateDto>>(
 26            "summary/templates",
 27            _logger,
 28            "summary templates");
 29        return result ?? new List<SummaryTemplateDto>();
 30    }
 31
 32    #endregion
 33
 34    #region Article Summary (existing)
 35
 36    public async Task<SummaryEstimateDto?> GetEstimateAsync(Guid articleId)
 37    {
 38        return await _http.GetEntityAsync<SummaryEstimateDto>(
 39            $"articles/{articleId}/summary/estimate",
 40            _logger,
 41            $"summary estimate for article {articleId}");
 42    }
 43
 44    public async Task<SummaryGenerationDto?> GenerateSummaryAsync(Guid articleId, GenerateSummaryRequestDto? request = n
 45    {
 46        request ??= new GenerateSummaryRequestDto();
 47
 48        return await _http.PostEntityAsync<SummaryGenerationDto>(
 49            $"articles/{articleId}/summary/generate",
 50            request,
 51            _logger,
 52            $"summary generation for article {articleId}");
 53    }
 54
 55    public async Task<ArticleSummaryDto?> GetSummaryAsync(Guid articleId)
 56    {
 57        return await _http.GetEntityAsync<ArticleSummaryDto>(
 58            $"articles/{articleId}/summary",
 59            _logger,
 60            $"summary for article {articleId}");
 61    }
 62
 63    public async Task<SummaryPreviewDto?> GetSummaryPreviewAsync(Guid articleId)
 64    {
 65        try
 66        {
 67            var response = await _http.GetAsync($"articles/{articleId}/summary/preview");
 68
 69            if (response.StatusCode == System.Net.HttpStatusCode.NoContent ||
 70                response.StatusCode == System.Net.HttpStatusCode.NotFound)
 71            {
 72                return null;
 73            }
 74
 75            if (response.IsSuccessStatusCode)
 76            {
 77                return await response.Content.ReadFromJsonAsync<SummaryPreviewDto>();
 78            }
 79
 80            return null;
 81        }
 82        catch (Exception ex)
 83        {
 84            _logger.LogError(ex, "Error getting summary preview for article {ArticleId}", articleId);
 85            return null;
 86        }
 87    }
 88
 89    public async Task<bool> ClearSummaryAsync(Guid articleId)
 90    {
 91        return await _http.DeleteEntityAsync(
 92            $"articles/{articleId}/summary",
 93            _logger,
 94            $"summary for article {articleId}");
 95    }
 96
 97    #endregion
 98
 99    #region Entity Summary (Campaign, Arc)
 100
 101    public async Task<EntitySummaryDto?> GetEntitySummaryAsync(string entityType, Guid entityId)
 102    {
 103        var route = GetEntityRoute(entityType);
 104        return await _http.GetEntityAsync<EntitySummaryDto>(
 105            $"{route}/{entityId}/summary",
 106            _logger,
 107            $"summary for {entityType} {entityId}");
 108    }
 109
 110    public async Task<SummaryEstimateDto?> GetEntityEstimateAsync(string entityType, Guid entityId)
 111    {
 112        var route = GetEntityRoute(entityType);
 113        return await _http.GetEntityAsync<SummaryEstimateDto>(
 114            $"{route}/{entityId}/summary/estimate",
 115            _logger,
 116            $"summary estimate for {entityType} {entityId}");
 117    }
 118
 119    public async Task<SummaryGenerationDto?> GenerateEntitySummaryAsync(string entityType, Guid entityId, GenerateSummar
 120    {
 121        request ??= new GenerateSummaryRequestDto();
 122        var route = GetEntityRoute(entityType);
 123
 124        return await _http.PostEntityAsync<SummaryGenerationDto>(
 125            $"{route}/{entityId}/summary/generate",
 126            request,
 127            _logger,
 128            $"summary generation for {entityType} {entityId}");
 129    }
 130
 131    public async Task<bool> ClearEntitySummaryAsync(string entityType, Guid entityId)
 132    {
 133        var route = GetEntityRoute(entityType);
 134        return await _http.DeleteEntityAsync(
 135            $"{route}/{entityId}/summary",
 136            _logger,
 137            $"summary for {entityType} {entityId}");
 138    }
 139
 140    private static string GetEntityRoute(string entityType)
 141    {
 12142        return entityType.ToLowerInvariant() switch
 12143        {
 2144            "campaign" => "campaigns",
 2145            "arc" => "arcs",
 8146            _ => throw new ArgumentException($"Unknown entity type: {entityType}")
 12147        };
 148    }
 149
 150    #endregion
 151}