added ability to notify user that they have a registration token.

This commit is contained in:
DESKTOP-GENO133\IvanPlex
2024-01-13 11:48:20 -07:00
parent c9d60910e5
commit 2247b1b1db
6 changed files with 110 additions and 38 deletions

View File

@@ -24,11 +24,9 @@ namespace CarCareTracker.Controllers
}; };
return View(viewModel); return View(viewModel);
} }
public IActionResult GenerateNewToken(string emailAddress) public IActionResult GenerateNewToken(string emailAddress, bool autoNotify)
{ {
var result = _loginLogic.GenerateUserToken(emailAddress); var result = _loginLogic.GenerateUserToken(emailAddress, autoNotify);
//send an email test block.
SendEmail(emailAddress);
return Json(result); return Json(result);
} }
public IActionResult DeleteToken(int tokenId) public IActionResult DeleteToken(int tokenId)
@@ -36,31 +34,5 @@ namespace CarCareTracker.Controllers
var result = _loginLogic.DeleteUserToken(tokenId); var result = _loginLogic.DeleteUserToken(tokenId);
return Json(result); return Json(result);
} }
private bool SendEmail(string emailAddress)
{
var mailConfig = new MailConfig();
string to = emailAddress;
string from = mailConfig.EmailFrom;
var server = mailConfig.EmailServer;
MailMessage message = new MailMessage(from, to);
message.Subject = "Using the new SMTP client.";
message.Body = @"Using this new feature, you can send an email message from an application very easily.";
SmtpClient client = new SmtpClient(server);
client.EnableSsl = mailConfig.UseSSL;
client.Port = mailConfig.Port;
client.Credentials = new NetworkCredential(mailConfig.Username, mailConfig.Password);
try
{
client.Send(message);
return true;
}
catch (Exception ex)
{
Console.WriteLine("Exception caught in CreateTestMessage2(): {0}",
ex.ToString());
return false;
}
}
} }
} }

77
Helper/MailHelper.cs Normal file
View File

@@ -0,0 +1,77 @@
using CarCareTracker.Models;
using System.Net.Mail;
using System.Net;
namespace CarCareTracker.Helper
{
public interface IMailHelper
{
OperationResponse NotifyUserForRegistration(string emailAddress, string token);
OperationResponse NotifyUserForPasswordReset(string emailAddress, string token);
}
public class MailHelper : IMailHelper
{
private readonly MailConfig mailConfig;
public MailHelper(
IConfiguration config
) {
//load mailConfig from Configuration
mailConfig = config.GetSection("MailConfig").Get<MailConfig>();
}
public OperationResponse NotifyUserForRegistration(string emailAddress, string token)
{
if (string.IsNullOrWhiteSpace(emailAddress) || string.IsNullOrWhiteSpace(token)) {
return new OperationResponse { Success = false, Message = "Email Address or Token is invalid" };
}
string emailSubject = "Your Registration Token for LubeLogger";
string emailBody = $"A token has been generated on your behalf, please complete your registration for LubeLogger using the token: {token}";
var result = SendEmail(emailAddress, emailSubject, emailBody);
if (result)
{
return new OperationResponse { Success = true, Message = "Email Sent!" };
} else
{
return new OperationResponse { Success = false, Message = StaticHelper.GenericErrorMessage };
}
}
public OperationResponse NotifyUserForPasswordReset(string emailAddress, string token)
{
if (string.IsNullOrWhiteSpace(emailAddress) || string.IsNullOrWhiteSpace(token))
{
return new OperationResponse { Success = false, Message = "Email Address or Token is invalid" };
}
string emailSubject = "Your Password Reset Token for LubeLogger";
string emailBody = $"A token has been generated on your behalf, please reset your password for LubeLogger using the token: {token}";
var result = SendEmail(emailAddress, emailSubject, emailBody);
if (result)
{
return new OperationResponse { Success = true, Message = "Email Sent!" };
}
else
{
return new OperationResponse { Success = false, Message = StaticHelper.GenericErrorMessage };
}
}
private bool SendEmail(string emailTo, string emailSubject, string emailBody) {
string to = emailTo;
string from = mailConfig.EmailFrom;
var server = mailConfig.EmailServer;
MailMessage message = new MailMessage(from, to);
message.Subject = emailSubject;
message.Body = emailBody;
SmtpClient client = new SmtpClient(server);
client.EnableSsl = mailConfig.UseSSL;
client.Port = mailConfig.Port;
client.Credentials = new NetworkCredential(mailConfig.Username, mailConfig.Password);
try
{
client.Send(message);
return true;
}
catch (Exception ex)
{
return false;
}
}
}
}

View File

@@ -7,6 +7,7 @@
{ {
public static string DbName = "data/cartracker.db"; public static string DbName = "data/cartracker.db";
public static string UserConfigPath = "config/userConfig.json"; public static string UserConfigPath = "config/userConfig.json";
public static string GenericErrorMessage = "An error occurred, please try again later";
public static string TruncateStrings(string input, int maxLength = 25) public static string TruncateStrings(string input, int maxLength = 25)
{ {

View File

@@ -10,7 +10,7 @@ namespace CarCareTracker.Logic
{ {
public interface ILoginLogic public interface ILoginLogic
{ {
bool GenerateUserToken(string emailAddress); OperationResponse GenerateUserToken(string emailAddress, bool autoNotify);
bool DeleteUserToken(int tokenId); bool DeleteUserToken(int tokenId);
OperationResponse RegisterNewUser(LoginModel credentials); OperationResponse RegisterNewUser(LoginModel credentials);
OperationResponse ResetUserPassword(LoginModel credentials); OperationResponse ResetUserPassword(LoginModel credentials);
@@ -25,10 +25,12 @@ namespace CarCareTracker.Logic
{ {
private readonly IUserRecordDataAccess _userData; private readonly IUserRecordDataAccess _userData;
private readonly ITokenRecordDataAccess _tokenData; private readonly ITokenRecordDataAccess _tokenData;
public LoginLogic(IUserRecordDataAccess userData, ITokenRecordDataAccess tokenData) private readonly IMailHelper _mailHelper;
public LoginLogic(IUserRecordDataAccess userData, ITokenRecordDataAccess tokenData, IMailHelper mailHelper)
{ {
_userData = userData; _userData = userData;
_tokenData = tokenData; _tokenData = tokenData;
_mailHelper = mailHelper;
} }
public OperationResponse RegisterNewUser(LoginModel credentials) public OperationResponse RegisterNewUser(LoginModel credentials)
{ {
@@ -113,13 +115,13 @@ namespace CarCareTracker.Logic
var result = _tokenData.GetTokens(); var result = _tokenData.GetTokens();
return result; return result;
} }
public bool GenerateUserToken(string emailAddress) public OperationResponse GenerateUserToken(string emailAddress, bool autoNotify)
{ {
//check if email address already has a token attached to it. //check if email address already has a token attached to it.
var existingToken = _tokenData.GetTokenRecordByEmailAddress(emailAddress); var existingToken = _tokenData.GetTokenRecordByEmailAddress(emailAddress);
if (existingToken.Id != default) if (existingToken.Id != default)
{ {
return false; return new OperationResponse { Success = false, Message = "There is an existing token tied to this email address" };
} }
var token = new Token() var token = new Token()
{ {
@@ -127,7 +129,21 @@ namespace CarCareTracker.Logic
EmailAddress = emailAddress EmailAddress = emailAddress
}; };
var result = _tokenData.CreateNewToken(token); var result = _tokenData.CreateNewToken(token);
return result; if (result && autoNotify)
{
result = _mailHelper.NotifyUserForRegistration(emailAddress, token.Body).Success;
if (!result)
{
return new OperationResponse { Success = false, Message = "Token Generated, but Email failed to send, please check your SMTP settings." };
}
}
if (result)
{
return new OperationResponse { Success = true, Message = "Token Generated!" };
} else
{
return new OperationResponse { Success = false, Message = StaticHelper.GenericErrorMessage };
}
} }
public bool DeleteUserToken(int tokenId) public bool DeleteUserToken(int tokenId)
{ {

View File

@@ -26,6 +26,7 @@ builder.Services.AddSingleton<IFileHelper, FileHelper>();
builder.Services.AddSingleton<IGasHelper, GasHelper>(); builder.Services.AddSingleton<IGasHelper, GasHelper>();
builder.Services.AddSingleton<IReminderHelper, ReminderHelper>(); builder.Services.AddSingleton<IReminderHelper, ReminderHelper>();
builder.Services.AddSingleton<IReportHelper, ReportHelper>(); builder.Services.AddSingleton<IReportHelper, ReportHelper>();
builder.Services.AddSingleton<IMailHelper, MailHelper>();
//configur logic //configur logic
builder.Services.AddSingleton<ILoginLogic, LoginLogic>(); builder.Services.AddSingleton<ILoginLogic, LoginLogic>();

View File

@@ -6,6 +6,10 @@
<div class="row"> <div class="row">
<div class="col-5"> <div class="col-5">
<div class="row"> <div class="row">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch" id="enableAutoNotify" checked>
<label class="form-check-label" for="enableAutoNotify">Auto Notify(via Email)</label>
</div>
<button onclick="generateNewToken()" class="btn btn-primary btn-md mt-1 mb-1"><i class="bi bi-pencil-square me-2"></i>Generate User Token</button> <button onclick="generateNewToken()" class="btn btn-primary btn-md mt-1 mb-1"><i class="bi bi-pencil-square me-2"></i>Generate User Token</button>
</div> </div>
<table class="table table-hover"> <table class="table table-hover">
@@ -88,11 +92,12 @@
}, },
}).then(function (result) { }).then(function (result) {
if (result.isConfirmed) { if (result.isConfirmed) {
$.get('/Admin/GenerateNewToken', {emailAddress: result.value.emailAddress}, function (data) { var autoNotify = $("#enableAutoNotify").is(":checked");
if (data) { $.get('/Admin/GenerateNewToken', {emailAddress: result.value.emailAddress, autoNotify: autoNotify}, function (data) {
if (data.success) {
reloadPage(); reloadPage();
} else { } else {
errorToast("An error occurred, make sure the email address doesn't already have a token generated for it.") errorToast(data.message)
} }
}); });
} }