Skip to content

Commit e74956e

Browse files
committed
Data Archiving
1 parent d9b4f7d commit e74956e

File tree

12 files changed

+224
-4
lines changed

12 files changed

+224
-4
lines changed
Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,46 @@
11
using ClassifiedAds.CrossCuttingConcerns.DateTimes;
22
using ClassifiedAds.Services.Notification.Entities;
3-
using System;
3+
using EntityFrameworkCore.SqlServer.SimpleBulks.BulkDelete;
4+
using EntityFrameworkCore.SqlServer.SimpleBulks.BulkInsert;
5+
using MapItEasy;
6+
using System.Data;
47

58
namespace ClassifiedAds.Services.Notification.Repositories;
69

710
public class EmailMessageRepository : Repository<EmailMessage, Guid>, IEmailMessageRepository
811
{
12+
private static readonly IMapper _mapper = new ExpressionMapper();
13+
private readonly NotificationDbContext _dbContext;
14+
915
public EmailMessageRepository(NotificationDbContext dbContext,
1016
IDateTimeProvider dateTimeProvider)
1117
: base(dbContext, dateTimeProvider)
1218
{
19+
_dbContext = dbContext;
20+
}
21+
22+
public async Task<int> ArchiveMessagesAsync(CancellationToken cancellationToken = default)
23+
{
24+
var archivedDate = DateTime.Now.AddDays(-30);
25+
26+
var messagesToArchive = _dbContext.Set<EmailMessage>()
27+
.Where(x => x.CreatedDateTime < archivedDate)
28+
.ToList();
29+
30+
if (messagesToArchive.Count == 0)
31+
{
32+
return 0;
33+
}
34+
35+
var archivedMessages = messagesToArchive.Select(x => _mapper.Map<EmailMessage, ArchivedEmailMessage>(x)).ToList();
36+
37+
using (await UnitOfWork.BeginTransactionAsync(IsolationLevel.ReadCommitted, cancellationToken))
38+
{
39+
_dbContext.BulkInsert(archivedMessages, opt => opt.KeepIdentity = true);
40+
_dbContext.BulkDelete(messagesToArchive);
41+
await UnitOfWork.CommitTransactionAsync(cancellationToken);
42+
}
43+
44+
return messagesToArchive.Count;
1345
}
1446
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
using ClassifiedAds.Domain.Repositories;
22
using ClassifiedAds.Services.Notification.Entities;
3-
using System;
43

54
namespace ClassifiedAds.Services.Notification.Repositories;
65

76
public interface IEmailMessageRepository : IRepository<EmailMessage, Guid>
87
{
8+
Task<int> ArchiveMessagesAsync(CancellationToken cancellationToken = default);
99
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
using ClassifiedAds.Domain.Repositories;
22
using ClassifiedAds.Services.Notification.Entities;
3-
using System;
43

54
namespace ClassifiedAds.Services.Notification.Repositories;
65

76
public interface ISmsMessageRepository : IRepository<SmsMessage, Guid>
87
{
8+
Task<int> ArchiveMessagesAsync(CancellationToken cancellationToken = default);
99
}
Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,46 @@
11
using ClassifiedAds.CrossCuttingConcerns.DateTimes;
22
using ClassifiedAds.Services.Notification.Entities;
3-
using System;
3+
using EntityFrameworkCore.SqlServer.SimpleBulks.BulkDelete;
4+
using EntityFrameworkCore.SqlServer.SimpleBulks.BulkInsert;
5+
using MapItEasy;
6+
using System.Data;
47

58
namespace ClassifiedAds.Services.Notification.Repositories;
69

710
public class SmsMessageRepository : Repository<SmsMessage, Guid>, ISmsMessageRepository
811
{
12+
private static readonly IMapper _mapper = new ExpressionMapper();
13+
private readonly NotificationDbContext _dbContext;
14+
915
public SmsMessageRepository(NotificationDbContext dbContext,
1016
IDateTimeProvider dateTimeProvider)
1117
: base(dbContext, dateTimeProvider)
1218
{
19+
_dbContext = dbContext;
20+
}
21+
22+
public async Task<int> ArchiveMessagesAsync(CancellationToken cancellationToken = default)
23+
{
24+
var archivedDate = DateTime.Now.AddDays(-30);
25+
26+
var messagesToArchive = _dbContext.Set<SmsMessage>()
27+
.Where(x => x.CreatedDateTime < archivedDate)
28+
.ToList();
29+
30+
if (messagesToArchive.Count == 0)
31+
{
32+
return 0;
33+
}
34+
35+
var archivedMessages = messagesToArchive.Select(x => _mapper.Map<SmsMessage, ArchivedSmsMessage>(x)).ToList();
36+
37+
using (await UnitOfWork.BeginTransactionAsync(IsolationLevel.ReadCommitted, cancellationToken))
38+
{
39+
_dbContext.BulkInsert(archivedMessages, opt => opt.KeepIdentity = true);
40+
_dbContext.BulkDelete(messagesToArchive);
41+
await UnitOfWork.CommitTransactionAsync(cancellationToken);
42+
}
43+
44+
return messagesToArchive.Count;
1345
}
1446
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,50 @@
11
using ClassifiedAds.CrossCuttingConcerns.DateTimes;
22
using ClassifiedAds.Modules.Notification.Entities;
3+
using EntityFrameworkCore.SqlServer.SimpleBulks.BulkDelete;
4+
using EntityFrameworkCore.SqlServer.SimpleBulks.BulkInsert;
5+
using MapItEasy;
36
using System;
7+
using System.Data;
8+
using System.Linq;
9+
using System.Threading;
10+
using System.Threading.Tasks;
411

512
namespace ClassifiedAds.Modules.Notification.Repositories;
613

714
public class EmailMessageRepository : Repository<EmailMessage, Guid>, IEmailMessageRepository
815
{
16+
private static readonly IMapper _mapper = new ExpressionMapper();
17+
private readonly NotificationDbContext _dbContext;
18+
919
public EmailMessageRepository(NotificationDbContext dbContext,
1020
IDateTimeProvider dateTimeProvider)
1121
: base(dbContext, dateTimeProvider)
1222
{
23+
_dbContext = dbContext;
24+
}
25+
26+
public async Task<int> ArchiveMessagesAsync(CancellationToken cancellationToken = default)
27+
{
28+
var archivedDate = DateTime.Now.AddDays(-30);
29+
30+
var messagesToArchive = _dbContext.Set<EmailMessage>()
31+
.Where(x => x.CreatedDateTime < archivedDate)
32+
.ToList();
33+
34+
if (messagesToArchive.Count == 0)
35+
{
36+
return 0;
37+
}
38+
39+
var archivedMessages = messagesToArchive.Select(x => _mapper.Map<EmailMessage, ArchivedEmailMessage>(x)).ToList();
40+
41+
using (await UnitOfWork.BeginTransactionAsync(IsolationLevel.ReadCommitted, cancellationToken))
42+
{
43+
_dbContext.BulkInsert(archivedMessages, opt => opt.KeepIdentity = true);
44+
_dbContext.BulkDelete(messagesToArchive);
45+
await UnitOfWork.CommitTransactionAsync(cancellationToken);
46+
}
47+
48+
return messagesToArchive.Count;
1349
}
1450
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
using ClassifiedAds.Domain.Repositories;
22
using ClassifiedAds.Modules.Notification.Entities;
33
using System;
4+
using System.Threading;
5+
using System.Threading.Tasks;
46

57
namespace ClassifiedAds.Modules.Notification.Repositories;
68

79
public interface IEmailMessageRepository : IRepository<EmailMessage, Guid>
810
{
11+
Task<int> ArchiveMessagesAsync(CancellationToken cancellationToken = default);
912
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
using ClassifiedAds.Domain.Repositories;
22
using ClassifiedAds.Modules.Notification.Entities;
33
using System;
4+
using System.Threading;
5+
using System.Threading.Tasks;
46

57
namespace ClassifiedAds.Modules.Notification.Repositories;
68

79
public interface ISmsMessageRepository : IRepository<SmsMessage, Guid>
810
{
11+
Task<int> ArchiveMessagesAsync(CancellationToken cancellationToken = default);
912
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,50 @@
11
using ClassifiedAds.CrossCuttingConcerns.DateTimes;
22
using ClassifiedAds.Modules.Notification.Entities;
3+
using EntityFrameworkCore.SqlServer.SimpleBulks.BulkDelete;
4+
using EntityFrameworkCore.SqlServer.SimpleBulks.BulkInsert;
5+
using MapItEasy;
36
using System;
7+
using System.Data;
8+
using System.Linq;
9+
using System.Threading;
10+
using System.Threading.Tasks;
411

512
namespace ClassifiedAds.Modules.Notification.Repositories;
613

714
public class SmsMessageRepository : Repository<SmsMessage, Guid>, ISmsMessageRepository
815
{
16+
private static readonly IMapper _mapper = new ExpressionMapper();
17+
private readonly NotificationDbContext _dbContext;
18+
919
public SmsMessageRepository(NotificationDbContext dbContext,
1020
IDateTimeProvider dateTimeProvider)
1121
: base(dbContext, dateTimeProvider)
1222
{
23+
_dbContext = dbContext;
24+
}
25+
26+
public async Task<int> ArchiveMessagesAsync(CancellationToken cancellationToken = default)
27+
{
28+
var archivedDate = DateTime.Now.AddDays(-30);
29+
30+
var messagesToArchive = _dbContext.Set<SmsMessage>()
31+
.Where(x => x.CreatedDateTime < archivedDate)
32+
.ToList();
33+
34+
if (messagesToArchive.Count == 0)
35+
{
36+
return 0;
37+
}
38+
39+
var archivedMessages = messagesToArchive.Select(x => _mapper.Map<SmsMessage, ArchivedSmsMessage>(x)).ToList();
40+
41+
using (await UnitOfWork.BeginTransactionAsync(IsolationLevel.ReadCommitted, cancellationToken))
42+
{
43+
_dbContext.BulkInsert(archivedMessages, opt => opt.KeepIdentity = true);
44+
_dbContext.BulkDelete(messagesToArchive);
45+
await UnitOfWork.CommitTransactionAsync(cancellationToken);
46+
}
47+
48+
return messagesToArchive.Count;
1349
}
1450
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
using ClassifiedAds.Domain.Entities;
22
using System;
3+
using System.Threading;
4+
using System.Threading.Tasks;
35

46
namespace ClassifiedAds.Domain.Repositories;
57

68
public interface IEmailMessageRepository : IRepository<EmailMessage, Guid>
79
{
10+
Task<int> ArchiveMessagesAsync(CancellationToken cancellationToken = default);
811
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
using ClassifiedAds.Domain.Entities;
22
using System;
3+
using System.Threading;
4+
using System.Threading.Tasks;
35

46
namespace ClassifiedAds.Domain.Repositories;
57

68
public interface ISmsMessageRepository : IRepository<SmsMessage, Guid>
79
{
10+
Task<int> ArchiveMessagesAsync(CancellationToken cancellationToken = default);
811
}

0 commit comments

Comments
 (0)