feat(archival): 🚧 orchestrate archival and logging of segments of each list

This commit is contained in:
Collin M. Barrett 2020-09-14 17:14:01 -05:00
parent 3ab46d0d4c
commit 4e4b2d0bf7

View file

@ -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<Command, Unit>
{
private readonly IArchiveFiles _archiver;
private readonly IDirectoryApi _directory;
private readonly ILogger _logger;
public Handler(IDirectoryApi directory)
public Handler(IArchiveFiles archiver, IDirectoryApi directory, ILogger<Handler> logger)
{
_archiver = archiver;
_directory = directory;
_logger = logger;
}
public async Task<Unit> 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<Task>();
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;
}