using LCU.API.Internal.DocumentLib.Containers; using LCU.API.Internal.DocumentLib.Utilities; using Microsoft.Extensions.Logging; using MongoDB.Driver; namespace OwnerNumberMigration.Logging; public delegate IAttributeMigration AttributeMigrationLoggingDecoratorFactory ( IAttributeMigration migration, string attributeName, string destinationAttributeName ); public class AttributeMigrationLoggingDecorator : IAttributeMigration { private readonly IAttributeMigration _migration; private readonly ILogger _logger; private readonly IMongoCollection _documents; private readonly string _attributeName; private readonly string _destinationAttributeName; private readonly IDocumentFilterFactory _filterFactory; public AttributeMigrationLoggingDecorator ( IAttributeMigration migration, ILogger logger, IMongoCollectionFactory collectionFactory, string attributeName, string destinationAttributeName, IDocumentFilterFactory filterFactory ) { _migration = migration; _logger = logger; _documents = collectionFactory.GetCollection(); _attributeName = attributeName; _destinationAttributeName = destinationAttributeName; _filterFactory = filterFactory; } public async Task Migrate(CancellationToken cancellationToken) { var countToMigration = await _documents.CountDocumentsAsync ( _filterFactory.AppliesForMigrationFilterFactory(_attributeName, _destinationAttributeName), cancellationToken: cancellationToken ); _logger.LogInformation ( "starting to migration {attribute} with {count} documents", _attributeName, countToMigration ); var start = DateTime.Now; await _migration.Migrate(cancellationToken); var duration = DateTime.Now - start; _logger.LogInformation("finished migration for {attribute} in {elapsed}", _attributeName, duration); } }