using System.Text.Json; using System.Text.Json.Serialization; using ForgejoReleaseSync.DTOs; using ForgejoReleaseSync.DTOs.Forgejo; using Microsoft.Extensions.Logging; namespace ForgejoReleaseSync.Services; public class GithubService(IHttpClientFactory httpClientFactory, ILogger logger) { public async Task> FetchRepoReleasesAsync( string owner, string repo, CancellationToken token = default) { try { var httpClient = httpClientFactory.CreateClient("github"); using var response = await httpClient.GetAsync( $"repos/{owner}/{repo}/releases?per_page=3&page=1", token); response.EnsureSuccessStatusCode(); await using var stream = await response.Content.ReadAsStreamAsync(token); var releases = await JsonSerializer.DeserializeAsync( stream, AppJsonSerializerContext.Default.ListGithubReleaseResponseDto, token); return releases ?? []; } catch (Exception ex) { logger.LogError(ex, "Failed to fetch GitHub releases for {Owner}/{Repo}", owner, repo); throw; } } } [JsonSerializable(typeof(List))] [JsonSerializable(typeof(ForgejoCreateReleaseDto))] [JsonSerializable(typeof(ForgejoReleaseResponseDto))] [JsonSerializable(typeof(List))] internal partial class AppJsonSerializerContext : JsonSerializerContext { }