Skip to content

Commit 6490719

Browse files
authored
Merge pull request #37 from dr-o-ne/issue_32
Fix for issue #32
2 parents 4ab96a3 + 661a754 commit 6490719

File tree

4 files changed

+65
-20
lines changed

4 files changed

+65
-20
lines changed

Web/Managers/ScheduledEmailManager.cs

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
1-
using System;
2-
using System.Diagnostics;
31
using System.IO;
42
using System.Linq;
5-
using System.Text;
6-
using System.Security.Cryptography;
73
using System.Collections.Generic;
84
using Microsoft.AspNetCore.Hosting;
95
using QueryTree.Models;
10-
using Microsoft.Extensions.PlatformAbstractions;
116
using Newtonsoft.Json;
127
using MimeKit;
138
using Microsoft.EntityFrameworkCore;
149
using Microsoft.Extensions.Configuration;
1510
using Microsoft.Extensions.Caching.Memory;
11+
using QueryTree.Services;
1612

1713
namespace QueryTree.Managers
1814
{
@@ -24,22 +20,25 @@ public interface IScheduledEmailManager
2420

2521
public class ScheduledEmailManager : IScheduledEmailManager
2622
{
27-
private IEmailSender _emailSender;
28-
private IConfiguration _config;
29-
private ApplicationDbContext _db;
30-
private DbManager _dbMgr;
31-
private IHostingEnvironment _env;
32-
private ConvertManager _convertManager;
33-
34-
35-
public ScheduledEmailManager(
36-
IEmailSender emailSender,
37-
IConfiguration config,
23+
private readonly IEmailSenderService _emailSenderService;
24+
private readonly IEmailSender _emailSender;
25+
private readonly IConfiguration _config;
26+
private readonly ApplicationDbContext _db;
27+
private readonly DbManager _dbMgr;
28+
private readonly IHostingEnvironment _env;
29+
private readonly ConvertManager _convertManager;
30+
31+
32+
public ScheduledEmailManager(
33+
IEmailSenderService emailSenderService,
34+
IEmailSender emailSender,
35+
IConfiguration config,
3836
ApplicationDbContext db,
3937
IHostingEnvironment env,
4038
IMemoryCache cache,
4139
IPasswordManager passwordManager)
4240
{
41+
_emailSenderService = emailSenderService;
4342
_emailSender = emailSender;
4443
_config = config;
4544
_db = db;
@@ -54,8 +53,13 @@ public void BuildScheduledEmail(string queryName, string editUrl, string recipie
5453
{
5554
return;
5655
}
57-
58-
var query = _db.Queries
56+
57+
if(!_emailSenderService.TrySetDelivered(queryId))
58+
{
59+
return;
60+
}
61+
62+
var query = _db.Queries
5963
.Include(q => q.DatabaseConnection)
6064
.FirstOrDefault(q => q.QueryID == queryId);
6165

Web/Services/EmailSenderService.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
namespace QueryTree.Services
5+
{
6+
public sealed class EmailSenderService : IEmailSenderService
7+
{
8+
private const int TimeoutInSeconds = 60;
9+
private readonly object _locker = new object();
10+
private readonly Dictionary<int, DateTime> _messageDeliveryTime = new Dictionary<int, DateTime>();
11+
12+
public bool TrySetDelivered(int messageId)
13+
{
14+
15+
DateTime deliveredTime;
16+
if (!_messageDeliveryTime.TryGetValue(messageId, out deliveredTime) || deliveredTime.AddSeconds(TimeoutInSeconds) <= DateTime.UtcNow)
17+
{
18+
lock(_locker)
19+
{
20+
if (!_messageDeliveryTime.TryGetValue(messageId, out deliveredTime) || deliveredTime.AddSeconds(TimeoutInSeconds) <= DateTime.UtcNow)
21+
{
22+
_messageDeliveryTime[messageId] = DateTime.UtcNow;
23+
return true;
24+
}
25+
}
26+
}
27+
28+
return false;
29+
}
30+
31+
}
32+
}

Web/Services/IEmailSenderService.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace QueryTree.Services
2+
{
3+
public interface IEmailSenderService
4+
{
5+
bool TrySetDelivered(int messageId);
6+
}
7+
}

Web/Startup.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
using Microsoft.Extensions.Logging;
1616
using QueryTree.Models;
1717
using QueryTree.Managers;
18+
using QueryTree.Services;
1819

1920
namespace QueryTree
2021
{
@@ -65,8 +66,9 @@ public void ConfigureServices(IServiceCollection services)
6566
options.User.RequireUniqueEmail = true;
6667
});
6768

68-
// Add application services.
69-
services.AddTransient<IEmailSender, EmailSender>();
69+
// Add application services.
70+
services.AddSingleton<IEmailSenderService, EmailSenderService>();
71+
services.AddTransient<IEmailSender, EmailSender>();
7072
services.AddTransient<IPasswordManager, PasswordManager>(); // Allows controllers to set/get/delete database credentials
7173
services.AddTransient<IScheduledEmailManager, ScheduledEmailManager>();
7274
services.AddMemoryCache();

0 commit comments

Comments
 (0)