mirror of
https://github.com/collinbarrett/FilterLists.git
synced 2026-03-11 09:04:27 +00:00
feat(archival): ✨🚧 orchestrate archival and logging of segments of each list
This commit is contained in:
parent
3ab46d0d4c
commit
4e4b2d0bf7
1 changed files with 34 additions and 2 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue