-
Notifications
You must be signed in to change notification settings - Fork 104
Expand file tree
/
Copy pathAuditableEntityRepository.cs
More file actions
75 lines (60 loc) · 2.55 KB
/
AuditableEntityRepository.cs
File metadata and controls
75 lines (60 loc) · 2.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
namespace FluentCMS.Repositories.RavenDB;
public abstract class AuditableEntityRepository<TEntity>(IRavenDBContext dbContext, IApiExecutionContext apiExecutionContext) : EntityRepository<TEntity>(dbContext), IAuditableEntityRepository<TEntity> where TEntity : IAuditableEntity
{
protected readonly IApiExecutionContext ApiExecutionContext = apiExecutionContext;
public override async Task<TEntity?> Create(TEntity entity, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
SetAuditableFieldsForCreate(entity);
return await base.Create(entity, cancellationToken);
}
public override async Task<IEnumerable<TEntity>> CreateMany(IEnumerable<TEntity> entities, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
foreach (var entity in entities)
SetAuditableFieldsForCreate(entity);
return await base.CreateMany(entities, cancellationToken);
}
public override async Task<TEntity?> Update(TEntity entity, CancellationToken cancellationToken = default)
{
cancellationToken.ThrowIfCancellationRequested();
using (var session = Store.OpenAsyncSession())
{
var id = entity.Id;
var dbEntity = await session.Query<RavenEntity<TEntity>>().SingleOrDefaultAsync(x => x.Data.Id == id, cancellationToken);
if (dbEntity == null)
{
SetAuditableFieldsForCreate(entity);
dbEntity = new RavenEntity<TEntity>(entity);
await session.StoreAsync(dbEntity, cancellationToken);
}
else
{
entity.CopyProperties(dbEntity.Data);
SetAuditableFieldsForUpdate(dbEntity.Data);
}
await session.SaveChangesAsync(cancellationToken);
return dbEntity.Data;
}
}
protected void SetAuditableFieldsForCreate(TEntity entity)
{
if (entity.Id == Guid.Empty)
{
entity.Id = Guid.NewGuid();
}
entity.CreatedAt = DateTime.UtcNow;
entity.CreatedBy = ApiExecutionContext.Username;
entity.ModifiedAt = entity.CreatedAt;
entity.ModifiedBy = entity.CreatedBy;
}
protected void SetAuditableFieldsForUpdate(TEntity entity)
{
if (entity.Id == Guid.Empty)
{
entity.Id = Guid.NewGuid();
}
entity.ModifiedAt = DateTime.UtcNow;
entity.ModifiedBy = ApiExecutionContext.Username;
}
}