Compare commits

...

10 Commits

Author SHA1 Message Date
Hargata Softworks
ddc3c2e1b5 Merge pull request #503 from hargata/Hargata/null.mail.config
null check for mail config
2024-04-25 12:45:36 -06:00
DESKTOP-T0O5CDB\DESK-555BD
49184b287b null check for mail config 2024-04-25 12:45:21 -06:00
Hargata Softworks
f6139bda0d Merge pull request #502 from hargata/Hargata/mailkit.upgrade
fix inefficiencies
2024-04-25 11:33:14 -06:00
DESKTOP-T0O5CDB\DESK-555BD
a6471b823b fix inefficiencies 2024-04-25 11:11:54 -06:00
Hargata Softworks
7c34003647 Merge pull request #501 from hargata/Hargata/mailkit.upgrade
MailKit Upgrade
2024-04-25 10:46:53 -06:00
DESKTOP-T0O5CDB\DESK-555BD
1aa21f9980 Uprgade from .NET SMTPClient to MailKit as the default smtpclient does not support modern protocols. 2024-04-25 10:45:55 -06:00
Hargata Softworks
ce4ca50939 Merge pull request #499 from hargata/Hargata/persist.metric.bug
fix getyear method
2024-04-23 23:50:31 -06:00
DESKTOP-T0O5CDB\DESK-555BD
fb28260c4a fix getyear method 2024-04-23 23:50:06 -06:00
Hargata Softworks
626a904747 Merge pull request #498 from hargata/Hargata/persist.metric.bug
Minor bug fix
2024-04-23 23:43:18 -06:00
DESKTOP-T0O5CDB\DESK-555BD
893cdafdc5 Fixes a very minor bug where the persisted year metric blanks out when viewing a different car that doesn't have that specific year. 2024-04-23 23:42:09 -06:00
7 changed files with 57 additions and 43 deletions

View File

@@ -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>

View File

@@ -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++)

View File

@@ -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;
} }
} }
} }

View File

@@ -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";

View File

@@ -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

View File

@@ -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>

View File

@@ -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();