diff --git a/.github/workflows/publish-nuget-packages.yml b/.github/workflows/publish-nuget-packages.yml index 8a3ee85..559be80 100644 --- a/.github/workflows/publish-nuget-packages.yml +++ b/.github/workflows/publish-nuget-packages.yml @@ -7,7 +7,7 @@ on: env: DOTNET_VERSION: '7.0' - PACKAGE_VERSION: "0.22.0" + PACKAGE_VERSION: "0.22.1" jobs: build-and-deploy: diff --git a/Firepuma.DatabaseRepositories.CosmosDb/Repositories/CosmosDbRepository.cs b/Firepuma.DatabaseRepositories.CosmosDb/Repositories/CosmosDbRepository.cs index 5223ac1..352703e 100644 --- a/Firepuma.DatabaseRepositories.CosmosDb/Repositories/CosmosDbRepository.cs +++ b/Firepuma.DatabaseRepositories.CosmosDb/Repositories/CosmosDbRepository.cs @@ -19,13 +19,22 @@ public abstract class CosmosDbRepository : IRepository where T : BaseCosmo { protected readonly ILogger Logger; protected readonly Container Container; + protected readonly LogLevel ItemAddedLogLevel; + protected readonly LogLevel ItemReplacedLogLevel; + protected readonly LogLevel ItemDeletedLogLevel; protected CosmosDbRepository( ILogger logger, - Container container) + Container container, + LogLevel itemAddedLogLevel = LogLevel.Information, + LogLevel itemReplacedLogLevel = LogLevel.Information, + LogLevel itemDeletedLogLevel = LogLevel.Information) { Logger = logger; Container = container; + ItemAddedLogLevel = itemAddedLogLevel; + ItemReplacedLogLevel = itemReplacedLogLevel; + ItemDeletedLogLevel = itemDeletedLogLevel; } protected abstract PartitionKey ResolvePartitionKey(string entityId); @@ -151,7 +160,8 @@ public async Task AddItemAsync( { var response = await Container.CreateItemAsync(item, ResolvePartitionKey(item.Id), cancellationToken: cancellationToken); - Logger.LogInformation( + Logger.Log( + ItemAddedLogLevel, "Added item id {Id} to container {Container}, which consumed {Charge} RUs", item.Id, Container.Id, response.RequestCharge); @@ -189,7 +199,8 @@ public async Task ReplaceItemAsync( { var response = await Container.ReplaceItemAsync(item, item.Id, ResolvePartitionKey(item.Id), options, cancellationToken); - Logger.LogInformation( + Logger.Log( + ItemReplacedLogLevel, "Replace item id {Id} in container {Container}, which consumed {Charge} RUs", item.Id, Container.Id, response.RequestCharge); @@ -234,7 +245,8 @@ public async Task DeleteItemAsync( { var response = await Container.DeleteItemAsync(item.Id, ResolvePartitionKey(item.Id), options, cancellationToken); - Logger.LogInformation( + Logger.Log( + ItemDeletedLogLevel, "Deleted item id {Id} from container {Container}, which consumed {Charge} RUs", item.Id, Container.Id, response.RequestCharge); } diff --git a/Firepuma.DatabaseRepositories.MongoDb/Repositories/MongoDbRepository.cs b/Firepuma.DatabaseRepositories.MongoDb/Repositories/MongoDbRepository.cs index 2789380..36a1fde 100644 --- a/Firepuma.DatabaseRepositories.MongoDb/Repositories/MongoDbRepository.cs +++ b/Firepuma.DatabaseRepositories.MongoDb/Repositories/MongoDbRepository.cs @@ -18,13 +18,25 @@ public abstract class MongoDbRepository : IRepository where T : class, IEn { protected readonly ILogger Logger; protected readonly IMongoCollection Collection; + protected readonly LogLevel ItemAddedLogLevel; + protected readonly LogLevel ItemReplacedLogLevel; + protected readonly LogLevel ItemUpdatedLogLevel; + protected readonly LogLevel ItemDeletedLogLevel; protected MongoDbRepository( ILogger logger, - IMongoCollection collection) + IMongoCollection collection, + LogLevel itemAddedLogLevel = LogLevel.Information, + LogLevel itemReplacedLogLevel = LogLevel.Information, + LogLevel itemUpdatedLogLevel = LogLevel.Information, + LogLevel itemDeletedLogLevel = LogLevel.Information) { Logger = logger; Collection = collection; + ItemAddedLogLevel = itemAddedLogLevel; + ItemReplacedLogLevel = itemReplacedLogLevel; + ItemUpdatedLogLevel = itemUpdatedLogLevel; + ItemDeletedLogLevel = itemDeletedLogLevel; } protected virtual string CollectionNameForLogs => Collection.CollectionNamespace.FullName; @@ -126,7 +138,8 @@ public async Task AddItemAsync(T item, CancellationToken cancellationToken = { await Collection.InsertOneAsync(item, cancellationToken: cancellationToken); - Logger.LogInformation( + Logger.Log( + ItemAddedLogLevel, "Added item id {Id} to collection {Collection}", item.Id, CollectionNameForLogs); @@ -175,10 +188,11 @@ public async Task ReplaceItemAsync( if (!ignoreETag) { - VerifyReplacedExactlyOneDocument(options, replaceResult); + VerifyReplacedExactlyOneDocument(item.Id, options, replaceResult); } - Logger.LogInformation( + Logger.Log( + ItemReplacedLogLevel, "Replaced item id {Id} in collection {Collection}", item.Id, CollectionNameForLogs); @@ -238,10 +252,11 @@ protected async Task UpdateItemAsync( if (!ignoreETag) { - VerifyUpdatedExactlyOneDocument(options, updateResult); + VerifyUpdatedExactlyOneDocument(item.Id, options, updateResult); } - Logger.LogInformation( + Logger.Log( + ItemUpdatedLogLevel, "Updated item id {Id} in collection {Collection}", item.Id, CollectionNameForLogs); } @@ -275,10 +290,11 @@ public async Task DeleteItemAsync( if (!ignoreETag) { - VerifyDeleteExactlyOneDocument(deleteResult); + VerifyDeleteExactlyOneDocument(item.Id, deleteResult); } - Logger.LogInformation( + Logger.Log( + ItemDeletedLogLevel, "Deleted item id {Id} from collection {Collection}", item.Id, CollectionNameForLogs); } @@ -290,7 +306,8 @@ public async Task DeleteItemAsync( await DeleteItemAsync(item, ignoreETag: false, cancellationToken); } - private static void VerifyReplacedExactlyOneDocument( + private void VerifyReplacedExactlyOneDocument( + string itemId, ReplaceOptions options, ReplaceOneResult replaceResult) { @@ -317,12 +334,17 @@ private static void VerifyReplacedExactlyOneDocument( } else { + Logger.LogWarning( + "Failed to replace item id {Id} from collection {Collection} due to PreconditionFailed response status", + itemId, CollectionNameForLogs); + throw new DocumentETagMismatchException(); } } } - private static void VerifyUpdatedExactlyOneDocument( + private void VerifyUpdatedExactlyOneDocument( + string itemId, UpdateOptions options, UpdateResult updateResult) { @@ -349,12 +371,17 @@ private static void VerifyUpdatedExactlyOneDocument( } else { + Logger.LogWarning( + "Failed to update item id {Id} from collection {Collection} due to PreconditionFailed response status", + itemId, CollectionNameForLogs); + throw new DocumentETagMismatchException(); } } } - private static void VerifyDeleteExactlyOneDocument( + private void VerifyDeleteExactlyOneDocument( + string itemId, DeleteResult deleteResult) { if (!deleteResult.IsAcknowledged) @@ -369,6 +396,10 @@ private static void VerifyDeleteExactlyOneDocument( if (deleteResult.DeletedCount == 0) { + Logger.LogWarning( + "Failed to delete item id {Id} from collection {Collection} due to PreconditionFailed response status", + itemId, CollectionNameForLogs); + throw new DocumentETagMismatchException(); } }