using Microsoft.Extensions.Logging; namespace ForgejoReleaseSync.Services; public class ReleaseAssetDownloadService(IHttpClientFactory httpClientFactory, ILogger logger) { public async Task DownloadReleaseAssetAsync(Uri url, CancellationToken token = default) { try { var httpClient = httpClientFactory.CreateClient("asset-download"); var fileName = Path.GetFileName(url.AbsoluteUri); var filePath = Path.Combine(Path.GetTempPath(), fileName); await using var resource = await httpClient.GetStreamAsync(url, token); await using var fs = new FileStream( filePath, FileMode.Create, FileAccess.Write, FileShare.None, 8192, useAsync: true); await resource.CopyToAsync(fs, token); return filePath; } catch (Exception ex) { logger.LogError(ex, "Failed to download asset from {Url}", url); throw; } } public async Task DeleteReleaseAssetAsync(string downloadPath, CancellationToken token = default) { try { File.Delete(downloadPath); await Task.CompletedTask; } catch (Exception ex) { logger.LogError(ex, "Failed to delete asset {Path}", downloadPath); throw; } } }