From 4e4b2d0bf7e0887a13941009fc664412c40a91a9 Mon Sep 17 00:00:00 2001 From: "Collin M. Barrett" Date: Mon, 14 Sep 2020 17:14:01 -0500 Subject: [PATCH] =?UTF-8?q?feat(archival):=20=E2=9C=A8=F0=9F=9A=A7=20orche?= =?UTF-8?q?strate=20archival=20and=20logging=20of=20segments=20of=20each?= =?UTF-8?q?=20list?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Commands/ArchiveList.cs | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) 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; }