using System.Text.Json; using System.Text.Json.Serialization; using ForgejoReleaseSync.DTOs; using Microsoft.Extensions.Logging; namespace ForgejoReleaseSync.Services; public class GithubService { private readonly AppConfig _config; private readonly RepositoryConfig _repoConfig; private readonly HttpClient _httpClient; private readonly ILogger _logger; public GithubService(AppConfig config, RepositoryConfig repoConfig, ILogger logger) { var client = new HttpClient(); client.BaseAddress = new Uri("https://api.github.com"); client.DefaultRequestHeaders.Add("User-Agent", "ForgejoReleaseSync"); client.DefaultRequestHeaders.Add("Accept", "application/json"); client.Timeout = TimeSpan.FromSeconds(90); _config = config; _repoConfig = repoConfig; _httpClient = client; _logger = logger; } public async Task> FetchRepoReleasesAsync(string owner, string repo) { try { var response = await _httpClient.GetAsync( $"/repos/{owner}/{repo}/releases?per_page=3&page=1"); response.EnsureSuccessStatusCode(); var responseStream = await response.Content.ReadAsStreamAsync(); var releases = await JsonSerializer.DeserializeAsync(responseStream, AppJsonSerializerContext.Default.ListGithubReleaseResponseDto); return releases ?? []; } catch (Exception ex) { _logger.LogError(ex, "Failed to fetch posts from Mastodon"); return []; } } } [JsonSerializable(typeof(List))] internal partial class AppJsonSerializerContext : JsonSerializerContext { }