Add InfinityQSProjectConfiguration and related email functionality
This commit is contained in:
114
Helpers/InfinityQSProjectHelper.cs
Normal file
114
Helpers/InfinityQSProjectHelper.cs
Normal file
@ -0,0 +1,114 @@
|
||||
using File_Watcher.Models;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.Net.Mail;
|
||||
|
||||
namespace File_Watcher.Helpers;
|
||||
|
||||
internal static partial class InfinityQSProjectHelper
|
||||
{
|
||||
private record Record(ReadOnlyCollection<string> FilteredLines,
|
||||
DateTime LastWriteTimeUtc,
|
||||
string Path);
|
||||
|
||||
private static long _LastReview = DateTime.UtcNow.Ticks;
|
||||
private static readonly Dictionary<string, Record> _KeyValuePairs = [];
|
||||
|
||||
internal static bool SendEmail(AppSettings appSettings, ILogger<Worker> logger)
|
||||
{
|
||||
InfinityQSProjectConfiguration configuration = appSettings.InfinityQSProjectConfiguration;
|
||||
Clear(logger, configuration);
|
||||
ReadOnlyDictionary<string, Record> keyValuePairs = GetKeyValuePairs(logger, configuration);
|
||||
SendEmail(logger, configuration, keyValuePairs);
|
||||
_LastReview = DateTime.UtcNow.Ticks;
|
||||
return true;
|
||||
}
|
||||
|
||||
private static void Clear(ILogger<Worker> logger, InfinityQSProjectConfiguration configuration)
|
||||
{
|
||||
long check = DateTime.UtcNow.AddHours(-configuration.ClearEveryHours).Ticks;
|
||||
foreach (KeyValuePair<string, Record> keyValuePair in _KeyValuePairs)
|
||||
{
|
||||
if (keyValuePair.Value.LastWriteTimeUtc.Ticks < check)
|
||||
{
|
||||
_ = _KeyValuePairs.Remove(keyValuePair.Key);
|
||||
logger.LogDebug("Clear File:{file}", keyValuePair.Key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static ReadOnlyDictionary<string, Record> GetKeyValuePairs(ILogger<Worker> logger, InfinityQSProjectConfiguration configuration)
|
||||
{
|
||||
bool check;
|
||||
Record? record;
|
||||
string[] lines;
|
||||
FileInfo fileInfo;
|
||||
List<string> filtered = [];
|
||||
Dictionary<string, Record> results = [];
|
||||
string[] files = Directory.GetFiles(configuration.SourceDirectory, configuration.SearchPattern, SearchOption.TopDirectoryOnly);
|
||||
foreach (string file in files)
|
||||
{
|
||||
check = false;
|
||||
filtered.Clear();
|
||||
fileInfo = new(file);
|
||||
if (fileInfo.LastWriteTimeUtc.Ticks < _LastReview)
|
||||
{
|
||||
logger.LogDebug("Old File:{file}", file);
|
||||
continue;
|
||||
}
|
||||
if (_KeyValuePairs.ContainsKey(fileInfo.FullName))
|
||||
{
|
||||
logger.LogDebug("Verified File:{file}", file);
|
||||
continue;
|
||||
}
|
||||
lines = File.ReadAllLines(fileInfo.FullName);
|
||||
foreach (string line in lines)
|
||||
{
|
||||
if (!check && line.Contains(configuration.Search))
|
||||
{
|
||||
check = true;
|
||||
continue;
|
||||
}
|
||||
if (check)
|
||||
{
|
||||
if (line.StartsWith(configuration.Search[0]))
|
||||
break;
|
||||
filtered.Add(line);
|
||||
}
|
||||
}
|
||||
record = new(FilteredLines: filtered.AsReadOnly(),
|
||||
LastWriteTimeUtc: fileInfo.LastWriteTimeUtc,
|
||||
Path: fileInfo.FullName);
|
||||
results.Add(fileInfo.FullName, record);
|
||||
}
|
||||
return results.AsReadOnly();
|
||||
}
|
||||
|
||||
private static void SendEmail(ILogger<Worker> logger, InfinityQSProjectConfiguration configuration, ReadOnlyDictionary<string, Record> keyValuePairs)
|
||||
{
|
||||
string body;
|
||||
foreach (KeyValuePair<string, Record> keyValuePair in keyValuePairs)
|
||||
{
|
||||
logger.LogDebug("File:{file}", keyValuePair.Key);
|
||||
body = $"InfinityQS Project Change Detected{Environment.NewLine}File:{keyValuePair.Key}{Environment.NewLine}LastWriteTimeUtc:{keyValuePair.Value:O}{Environment.NewLine}{string.Join(Environment.NewLine, keyValuePair.Value.FilteredLines)}";
|
||||
logger.LogWarning("SendEmail:{body}", body);
|
||||
SendEmail(configuration.From, configuration.To, configuration.SimpleMailTransferProtocolServer, configuration.Subject, body);
|
||||
}
|
||||
}
|
||||
|
||||
private static void SendEmail(string from, string to, string simpleMailTransferProtocolServer, string subject, string body)
|
||||
{
|
||||
SmtpClient smtpClient = new(simpleMailTransferProtocolServer);
|
||||
MailMessage mailMessage = new()
|
||||
{
|
||||
From = new MailAddress(from),
|
||||
Subject = subject,
|
||||
Body = body,
|
||||
Priority = MailPriority.High
|
||||
};
|
||||
mailMessage.To.Add(new MailAddress(to));
|
||||
smtpClient.Send(mailMessage);
|
||||
smtpClient.Dispose();
|
||||
mailMessage.Dispose();
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user