Skip to content

Commit

Permalink
Merge pull request #37 from dr-o-ne/issue_32
Browse files Browse the repository at this point in the history
Fix for issue #32
  • Loading branch information
d4nt authored Oct 16, 2018
2 parents 4ab96a3 + 661a754 commit 6490719
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 20 deletions.
40 changes: 22 additions & 18 deletions Web/Managers/ScheduledEmailManager.cs
Original file line number Diff line number Diff line change
@@ -1,18 +1,14 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.Collections.Generic;
using Microsoft.AspNetCore.Hosting;
using QueryTree.Models;
using Microsoft.Extensions.PlatformAbstractions;
using Newtonsoft.Json;
using MimeKit;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Caching.Memory;
using QueryTree.Services;

namespace QueryTree.Managers
{
Expand All @@ -24,22 +20,25 @@ public interface IScheduledEmailManager

public class ScheduledEmailManager : IScheduledEmailManager
{
private IEmailSender _emailSender;
private IConfiguration _config;
private ApplicationDbContext _db;
private DbManager _dbMgr;
private IHostingEnvironment _env;
private ConvertManager _convertManager;


public ScheduledEmailManager(
IEmailSender emailSender,
IConfiguration config,
private readonly IEmailSenderService _emailSenderService;
private readonly IEmailSender _emailSender;
private readonly IConfiguration _config;
private readonly ApplicationDbContext _db;
private readonly DbManager _dbMgr;
private readonly IHostingEnvironment _env;
private readonly ConvertManager _convertManager;


public ScheduledEmailManager(
IEmailSenderService emailSenderService,
IEmailSender emailSender,
IConfiguration config,
ApplicationDbContext db,
IHostingEnvironment env,
IMemoryCache cache,
IPasswordManager passwordManager)
{
_emailSenderService = emailSenderService;
_emailSender = emailSender;
_config = config;
_db = db;
Expand All @@ -54,8 +53,13 @@ public void BuildScheduledEmail(string queryName, string editUrl, string recipie
{
return;
}

var query = _db.Queries

if(!_emailSenderService.TrySetDelivered(queryId))
{
return;
}

var query = _db.Queries
.Include(q => q.DatabaseConnection)
.FirstOrDefault(q => q.QueryID == queryId);

Expand Down
32 changes: 32 additions & 0 deletions Web/Services/EmailSenderService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;

namespace QueryTree.Services
{
public sealed class EmailSenderService : IEmailSenderService
{
private const int TimeoutInSeconds = 60;
private readonly object _locker = new object();
private readonly Dictionary<int, DateTime> _messageDeliveryTime = new Dictionary<int, DateTime>();

public bool TrySetDelivered(int messageId)
{

DateTime deliveredTime;
if (!_messageDeliveryTime.TryGetValue(messageId, out deliveredTime) || deliveredTime.AddSeconds(TimeoutInSeconds) <= DateTime.UtcNow)
{
lock(_locker)
{
if (!_messageDeliveryTime.TryGetValue(messageId, out deliveredTime) || deliveredTime.AddSeconds(TimeoutInSeconds) <= DateTime.UtcNow)
{
_messageDeliveryTime[messageId] = DateTime.UtcNow;
return true;
}
}
}

return false;
}

}
}
7 changes: 7 additions & 0 deletions Web/Services/IEmailSenderService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace QueryTree.Services
{
public interface IEmailSenderService
{
bool TrySetDelivered(int messageId);
}
}
6 changes: 4 additions & 2 deletions Web/Startup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
using Microsoft.Extensions.Logging;
using QueryTree.Models;
using QueryTree.Managers;
using QueryTree.Services;

namespace QueryTree
{
Expand Down Expand Up @@ -65,8 +66,9 @@ public void ConfigureServices(IServiceCollection services)
options.User.RequireUniqueEmail = true;
});

// Add application services.
services.AddTransient<IEmailSender, EmailSender>();
// Add application services.
services.AddSingleton<IEmailSenderService, EmailSenderService>();
services.AddTransient<IEmailSender, EmailSender>();
services.AddTransient<IPasswordManager, PasswordManager>(); // Allows controllers to set/get/delete database credentials
services.AddTransient<IScheduledEmailManager, ScheduledEmailManager>();
services.AddMemoryCache();
Expand Down

0 comments on commit 6490719

Please sign in to comment.