Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ddc3c2e1b5 | ||
|
|
49184b287b | ||
|
|
f6139bda0d | ||
|
|
a6471b823b | ||
|
|
7c34003647 | ||
|
|
1aa21f9980 | ||
|
|
ce4ca50939 | ||
|
|
fb28260c4a | ||
|
|
626a904747 | ||
|
|
893cdafdc5 |
@@ -13,6 +13,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="CsvHelper" Version="30.0.1" />
|
<PackageReference Include="CsvHelper" Version="30.0.1" />
|
||||||
<PackageReference Include="LiteDB" Version="5.0.17" />
|
<PackageReference Include="LiteDB" Version="5.0.17" />
|
||||||
|
<PackageReference Include="MailKit" Version="4.5.0" />
|
||||||
<PackageReference Include="Npgsql" Version="8.0.2" />
|
<PackageReference Include="Npgsql" Version="8.0.2" />
|
||||||
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.3.1" />
|
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.3.1" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@@ -1153,6 +1153,10 @@ namespace CarCareTracker.Controllers
|
|||||||
{
|
{
|
||||||
numbersArray.Add(upgradeRecords.Min(x => x.Date.Year));
|
numbersArray.Add(upgradeRecords.Min(x => x.Date.Year));
|
||||||
}
|
}
|
||||||
|
if (odometerRecords.Any())
|
||||||
|
{
|
||||||
|
numbersArray.Add(odometerRecords.Min(x => x.Date.Year));
|
||||||
|
}
|
||||||
var minYear = numbersArray.Any() ? numbersArray.Min() : DateTime.Now.AddYears(-5).Year;
|
var minYear = numbersArray.Any() ? numbersArray.Min() : DateTime.Now.AddYears(-5).Year;
|
||||||
var yearDifference = DateTime.Now.Year - minYear + 1;
|
var yearDifference = DateTime.Now.Year - minYear + 1;
|
||||||
for (int i = 0; i < yearDifference; i++)
|
for (int i = 0; i < yearDifference; i++)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
using CarCareTracker.Models;
|
using CarCareTracker.Models;
|
||||||
using System.Net.Mail;
|
using MimeKit;
|
||||||
using System.Net;
|
using MailKit.Net.Smtp;
|
||||||
|
|
||||||
namespace CarCareTracker.Helper
|
namespace CarCareTracker.Helper
|
||||||
{
|
{
|
||||||
@@ -15,13 +15,16 @@ namespace CarCareTracker.Helper
|
|||||||
{
|
{
|
||||||
private readonly MailConfig mailConfig;
|
private readonly MailConfig mailConfig;
|
||||||
private readonly IFileHelper _fileHelper;
|
private readonly IFileHelper _fileHelper;
|
||||||
|
private readonly ILogger<MailHelper> _logger;
|
||||||
public MailHelper(
|
public MailHelper(
|
||||||
IConfiguration config,
|
IConfiguration config,
|
||||||
IFileHelper fileHelper
|
IFileHelper fileHelper,
|
||||||
|
ILogger<MailHelper> logger
|
||||||
) {
|
) {
|
||||||
//load mailConfig from Configuration
|
//load mailConfig from Configuration
|
||||||
mailConfig = config.GetSection("MailConfig").Get<MailConfig>();
|
mailConfig = config.GetSection("MailConfig").Get<MailConfig>() ?? new MailConfig();
|
||||||
_fileHelper = fileHelper;
|
_fileHelper = fileHelper;
|
||||||
|
_logger = logger;
|
||||||
}
|
}
|
||||||
public OperationResponse NotifyUserForRegistration(string emailAddress, string token)
|
public OperationResponse NotifyUserForRegistration(string emailAddress, string token)
|
||||||
{
|
{
|
||||||
@@ -34,7 +37,7 @@ namespace CarCareTracker.Helper
|
|||||||
}
|
}
|
||||||
string emailSubject = "Your Registration Token for LubeLogger";
|
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}";
|
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);
|
var result = SendEmail(new List<string> { emailAddress }, emailSubject, emailBody);
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
return new OperationResponse { Success = true, Message = "Email Sent!" };
|
return new OperationResponse { Success = true, Message = "Email Sent!" };
|
||||||
@@ -55,7 +58,7 @@ namespace CarCareTracker.Helper
|
|||||||
}
|
}
|
||||||
string emailSubject = "Your Password Reset Token for LubeLogger";
|
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}";
|
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);
|
var result = SendEmail(new List<string> { emailAddress }, emailSubject, emailBody);
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
return new OperationResponse { Success = true, Message = "Email Sent!" };
|
return new OperationResponse { Success = true, Message = "Email Sent!" };
|
||||||
@@ -77,7 +80,7 @@ namespace CarCareTracker.Helper
|
|||||||
}
|
}
|
||||||
string emailSubject = "Your User Account Update Token for LubeLogger";
|
string emailSubject = "Your User Account Update Token for LubeLogger";
|
||||||
string emailBody = $"A token has been generated on your behalf, please update your account for LubeLogger using the token: {token}";
|
string emailBody = $"A token has been generated on your behalf, please update your account for LubeLogger using the token: {token}";
|
||||||
var result = SendEmail(emailAddress, emailSubject, emailBody);
|
var result = SendEmail(new List<string> { emailAddress}, emailSubject, emailBody);
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
return new OperationResponse { Success = true, Message = "Email Sent!" };
|
return new OperationResponse { Success = true, Message = "Email Sent!" };
|
||||||
@@ -116,43 +119,44 @@ namespace CarCareTracker.Helper
|
|||||||
emailBody = emailBody.Replace("{TableBody}", tableBody);
|
emailBody = emailBody.Replace("{TableBody}", tableBody);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
foreach (string emailAddress in emailAddresses)
|
SendEmail(emailAddresses, emailSubject, emailBody);
|
||||||
{
|
|
||||||
SendEmail(emailAddress, emailSubject, emailBody, true, true);
|
|
||||||
}
|
|
||||||
return new OperationResponse { Success = true, Message = "Email Sent!" };
|
return new OperationResponse { Success = true, Message = "Email Sent!" };
|
||||||
} catch (Exception ex)
|
} catch (Exception ex)
|
||||||
{
|
{
|
||||||
return new OperationResponse { Success = false, Message = ex.Message };
|
return new OperationResponse { Success = false, Message = ex.Message };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private bool SendEmail(string emailTo, string emailSubject, string emailBody, bool isBodyHtml = false, bool useAsync = false) {
|
private bool SendEmail(List<string> emailTo, string emailSubject, string emailBody) {
|
||||||
string to = emailTo;
|
|
||||||
string from = mailConfig.EmailFrom;
|
string from = mailConfig.EmailFrom;
|
||||||
var server = mailConfig.EmailServer;
|
var server = mailConfig.EmailServer;
|
||||||
MailMessage message = new MailMessage(from, to);
|
var message = new MimeMessage();
|
||||||
message.Subject = emailSubject;
|
message.From.Add(new MailboxAddress(from, from));
|
||||||
message.Body = emailBody;
|
foreach(string emailRecipient in emailTo)
|
||||||
message.IsBodyHtml = isBodyHtml;
|
|
||||||
SmtpClient client = new SmtpClient(server);
|
|
||||||
client.EnableSsl = mailConfig.UseSSL;
|
|
||||||
client.Port = mailConfig.Port;
|
|
||||||
client.Credentials = new NetworkCredential(mailConfig.Username, mailConfig.Password);
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
if (useAsync)
|
message.To.Add(new MailboxAddress(emailRecipient, emailRecipient));
|
||||||
{
|
}
|
||||||
client.SendMailAsync(message, new CancellationToken());
|
message.Subject = emailSubject;
|
||||||
}
|
|
||||||
else
|
var builder = new BodyBuilder();
|
||||||
|
|
||||||
|
builder.HtmlBody = emailBody;
|
||||||
|
|
||||||
|
message.Body = builder.ToMessageBody();
|
||||||
|
|
||||||
|
using (var client = new SmtpClient())
|
||||||
|
{
|
||||||
|
client.Connect(server, mailConfig.Port, MailKit.Security.SecureSocketOptions.Auto);
|
||||||
|
client.Authenticate(mailConfig.Username, mailConfig.Password);
|
||||||
|
try
|
||||||
{
|
{
|
||||||
client.Send(message);
|
client.Send(message);
|
||||||
|
client.Disconnect(true);
|
||||||
|
return true;
|
||||||
|
} catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex.Message);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ namespace CarCareTracker.Helper
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static class StaticHelper
|
public static class StaticHelper
|
||||||
{
|
{
|
||||||
public static string VersionNumber = "1.3.1";
|
public static string VersionNumber = "1.3.2";
|
||||||
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 GenericErrorMessage = "An error occurred, please try again later";
|
||||||
|
|||||||
17
README.md
17
README.md
@@ -30,14 +30,15 @@ Read this [Getting Started Guide](https://docs.lubelogger.com/Getting%20Started)
|
|||||||
[Search Existing Issues](https://github.com/hargata/lubelog/issues)
|
[Search Existing Issues](https://github.com/hargata/lubelog/issues)
|
||||||
|
|
||||||
## Dependencies
|
## Dependencies
|
||||||
- Bootstrap
|
- [Bootstrap](https://github.com/twbs/bootstrap)
|
||||||
- LiteDB
|
- [LiteDB](https://github.com/mbdavid/litedb)
|
||||||
- Npgsql
|
- [Npgsql](https://github.com/npgsql/npgsql)
|
||||||
- Bootstrap-DatePicker
|
- [Bootstrap-DatePicker](https://github.com/uxsolutions/bootstrap-datepicker)
|
||||||
- SweetAlert2
|
- [SweetAlert2](https://github.com/sweetalert2/sweetalert2)
|
||||||
- CsvHelper
|
- [CsvHelper](https://github.com/JoshClose/CsvHelper)
|
||||||
- Chart.js
|
- [Chart.js](https://github.com/chartjs/Chart.js)
|
||||||
- Drawdown
|
- [Drawdown](https://github.com/adamvleggett/drawdown)
|
||||||
|
- [MailKit](https://github.com/jstedfast/MailKit)
|
||||||
|
|
||||||
## License
|
## License
|
||||||
LubeLogger utilizes a dual-licensing model, see [License](/LICENSE) for more information
|
LubeLogger utilizes a dual-licensing model, see [License](/LICENSE) for more information
|
||||||
|
|||||||
@@ -247,6 +247,7 @@
|
|||||||
<li class="list-group-item">CsvHelper</li>
|
<li class="list-group-item">CsvHelper</li>
|
||||||
<li class="list-group-item">Chart.js</li>
|
<li class="list-group-item">Chart.js</li>
|
||||||
<li class="list-group-item">Drawdown</li>
|
<li class="list-group-item">Drawdown</li>
|
||||||
|
<li class="list-group-item">MailKit</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
function getYear() {
|
function getYear() {
|
||||||
return $("#yearOption").val();
|
return $("#yearOption").val() ?? '0';
|
||||||
}
|
}
|
||||||
function generateVehicleHistoryReport() {
|
function generateVehicleHistoryReport() {
|
||||||
var vehicleId = GetVehicleId().vehicleId;
|
var vehicleId = GetVehicleId().vehicleId;
|
||||||
@@ -54,7 +54,10 @@ function getSelectedMetrics() {
|
|||||||
if (selectedMetricCheckBoxes.length == 6) {
|
if (selectedMetricCheckBoxes.length == 6) {
|
||||||
$("#selectAllExpenseCheck").prop("checked", true);
|
$("#selectAllExpenseCheck").prop("checked", true);
|
||||||
}
|
}
|
||||||
$('#yearOption').val(yearMetric);
|
//check if option is available
|
||||||
|
if ($("#yearOption").has(`option[value=${yearMetric}]`).length > 0) {
|
||||||
|
$('#yearOption').val(yearMetric);
|
||||||
|
}
|
||||||
$("#reminderOption").val(reminderMetric);
|
$("#reminderOption").val(reminderMetric);
|
||||||
//retrieve data.
|
//retrieve data.
|
||||||
yearUpdated();
|
yearUpdated();
|
||||||
|
|||||||
Reference in New Issue
Block a user