diff --git a/services/Archival/FilterLists.Archival.Application/Commands/ArchiveList.cs b/services/Archival/FilterLists.Archival.Application/Commands/ArchiveList.cs index d3bbd4c5b..0cc40128f 100644 --- a/services/Archival/FilterLists.Archival.Application/Commands/ArchiveList.cs +++ b/services/Archival/FilterLists.Archival.Application/Commands/ArchiveList.cs @@ -1,8 +1,14 @@ using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; using System.Threading; using System.Threading.Tasks; +using FilterLists.Archival.Infrastructure.Persistence; using FilterLists.SharedKernel.Apis.Clients; using MediatR; +using Microsoft.Extensions.Logging; namespace FilterLists.Archival.Application.Commands { @@ -20,20 +26,46 @@ public Command(int listId) public class Handler : IRequestHandler { + private readonly IArchiveFiles _archiver; private readonly IDirectoryApi _directory; + private readonly ILogger _logger; - public Handler(IDirectoryApi directory) + public Handler(IArchiveFiles archiver, IDirectoryApi directory, ILogger logger) { + _archiver = archiver; _directory = directory; + _logger = logger; } public async Task Handle(Command request, CancellationToken cancellationToken) { _ = request ?? throw new ArgumentNullException(nameof(request)); + _logger.LogDebug("Archiving list {ListId}", request.ListId); var listDetails = await _directory.GetListDetailsAsync(request.ListId, cancellationToken); + var segments = listDetails.ViewUrls?.GroupBy(u => u.SegmentNumber).ToList(); - // TODO: archive + if (segments != null) + { + var archiveTasks = new List(); + foreach (var segment in segments) + { + Stream? contents = default; // TODO: fetch list file stream + var path = Path.Combine( + listDetails.Id.ToString(CultureInfo.InvariantCulture), + segment.Key.ToString(CultureInfo.InvariantCulture)); + _logger.LogDebug("Archiving segment {SegmentNumber} of list {ListId}", segment.Key, request.ListId); + archiveTasks.Add(_archiver.ArchiveFileAsync(contents, path, cancellationToken)); + } + + await Task.WhenAll(archiveTasks); + _archiver.Commit(); + _logger.LogDebug("Archived segments {@SegmentNumbers} of list {ListId}", segments.Select(s => s.Key), request.ListId); + } + else + { + _logger.LogDebug("List {ListId} has no view URLs to archive", request.ListId); + } return Unit.Value; }