Skip to content
This repository has been archived by the owner on Oct 7, 2023. It is now read-only.

Commit

Permalink
feat: 馃幐 allow customizing LogLevels of Repository write operations
Browse files Browse the repository at this point in the history
  • Loading branch information
francoishill committed May 1, 2023
1 parent cdf6341 commit d388b92
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 16 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/publish-nuget-packages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ on:

env:
DOTNET_VERSION: '7.0'
PACKAGE_VERSION: "0.22.0"
PACKAGE_VERSION: "0.22.1"

jobs:
build-and-deploy:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,22 @@ public abstract class CosmosDbRepository<T> : IRepository<T> 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);
Expand Down Expand Up @@ -151,7 +160,8 @@ public async Task<T> GetItemAsync(IQuerySpecification<T> querySpecification, Can
{
var response = await Container.CreateItemAsync<T>(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);

Expand Down Expand Up @@ -189,7 +199,8 @@ public async Task<T> GetItemAsync(IQuerySpecification<T> querySpecification, Can
{
var response = await Container.ReplaceItemAsync<T>(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);

Expand Down Expand Up @@ -234,7 +245,8 @@ public async Task<T> GetItemAsync(IQuerySpecification<T> querySpecification, Can
{
var response = await Container.DeleteItemAsync<T>(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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,25 @@ public abstract class MongoDbRepository<T> : IRepository<T> where T : class, IEn
{
protected readonly ILogger Logger;
protected readonly IMongoCollection<T> Collection;
protected readonly LogLevel ItemAddedLogLevel;
protected readonly LogLevel ItemReplacedLogLevel;
protected readonly LogLevel ItemUpdatedLogLevel;
protected readonly LogLevel ItemDeletedLogLevel;

protected MongoDbRepository(
ILogger logger,
IMongoCollection<T> collection)
IMongoCollection<T> 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;
Expand Down Expand Up @@ -126,7 +138,8 @@ public async Task<T> 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);

Expand Down Expand Up @@ -175,10 +188,11 @@ public async Task<T> AddItemAsync(T item, CancellationToken cancellationToken =

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);

Expand Down Expand Up @@ -238,10 +252,11 @@ public async Task<T> AddItemAsync(T item, CancellationToken cancellationToken =

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);
}
Expand Down Expand Up @@ -275,10 +290,11 @@ public async Task<T> AddItemAsync(T item, CancellationToken cancellationToken =

if (!ignoreETag)
{
VerifyDeleteExactlyOneDocument(deleteResult);
VerifyDeleteExactlyOneDocument(item.Id, deleteResult);
}

Logger.LogInformation(
Logger.Log(
ItemDeletedLogLevel,
"Deleted item id {Id} from collection {Collection}",
item.Id, CollectionNameForLogs);
}
Expand All @@ -290,7 +306,8 @@ public async Task<T> AddItemAsync(T item, CancellationToken cancellationToken =
await DeleteItemAsync(item, ignoreETag: false, cancellationToken);
}

private static void VerifyReplacedExactlyOneDocument(
private void VerifyReplacedExactlyOneDocument(
string itemId,
ReplaceOptions options,
ReplaceOneResult replaceResult)
{
Expand All @@ -317,12 +334,17 @@ public async Task<T> AddItemAsync(T item, CancellationToken cancellationToken =
}
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)
{
Expand All @@ -349,12 +371,17 @@ public async Task<T> AddItemAsync(T item, CancellationToken cancellationToken =
}
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)
Expand All @@ -369,6 +396,10 @@ public async Task<T> AddItemAsync(T item, CancellationToken cancellationToken =

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();
}
}
Expand Down

0 comments on commit d388b92

Please sign in to comment.