Add InfinityQSProjectConfiguration and related email functionality
This commit is contained in:
@ -20,7 +20,7 @@
|
|||||||
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.1" />
|
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.1" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Logging.EventLog" Version="8.0.1" />
|
<PackageReference Include="Microsoft.Extensions.Logging.EventLog" Version="8.0.1" />
|
||||||
<PackageReference Include="Oracle.ManagedDataAccess.Core" Version="23.7.0" />
|
<PackageReference Include="Oracle.ManagedDataAccess.Core" Version="23.7.0" />
|
||||||
<PackageReference Include="runtime.win-x64.Microsoft.DotNet.ILCompiler" Version="8.0.19" />
|
<PackageReference Include="runtime.win-x64.Microsoft.DotNet.ILCompiler" Version="8.0.20" />
|
||||||
<PackageReference Include="System.Data.SqlClient" Version="4.8.6" />
|
<PackageReference Include="System.Data.SqlClient" Version="4.8.6" />
|
||||||
<PackageReference Include="System.Drawing.Common" Version="8.0.16" />
|
<PackageReference Include="System.Drawing.Common" Version="8.0.16" />
|
||||||
<PackageReference Include="System.IO.Ports" Version="8.0.0" />
|
<PackageReference Include="System.IO.Ports" Version="8.0.0" />
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -13,6 +13,7 @@ public record AppSettings(CamstarOracleConfiguration CamstarOracleConfiguration,
|
|||||||
EDADatabaseConfiguration EDADatabaseConfiguration,
|
EDADatabaseConfiguration EDADatabaseConfiguration,
|
||||||
FileWatcherConfiguration FileWatcherConfiguration,
|
FileWatcherConfiguration FileWatcherConfiguration,
|
||||||
InfinityQSConfiguration InfinityQSConfiguration,
|
InfinityQSConfiguration InfinityQSConfiguration,
|
||||||
|
InfinityQSProjectConfiguration InfinityQSProjectConfiguration,
|
||||||
IsoConfiguration IsoConfiguration,
|
IsoConfiguration IsoConfiguration,
|
||||||
MetadataSettings MetadataSettings,
|
MetadataSettings MetadataSettings,
|
||||||
MetrologyConfiguration MetrologyConfiguration,
|
MetrologyConfiguration MetrologyConfiguration,
|
||||||
@ -40,6 +41,7 @@ public record AppSettings(CamstarOracleConfiguration CamstarOracleConfiguration,
|
|||||||
EDADatabaseConfiguration? edaDatabaseConfiguration = configurationRoot.GetSection(nameof(EDADatabaseConfiguration)).Get<EDADatabaseConfiguration>();
|
EDADatabaseConfiguration? edaDatabaseConfiguration = configurationRoot.GetSection(nameof(EDADatabaseConfiguration)).Get<EDADatabaseConfiguration>();
|
||||||
FileWatcherConfiguration? fileWatcherConfiguration = configurationRoot.GetSection(nameof(FileWatcherConfiguration)).Get<FileWatcherConfiguration>();
|
FileWatcherConfiguration? fileWatcherConfiguration = configurationRoot.GetSection(nameof(FileWatcherConfiguration)).Get<FileWatcherConfiguration>();
|
||||||
InfinityQSConfiguration? infinityQSConfiguration = configurationRoot.GetSection(nameof(InfinityQSConfiguration)).Get<InfinityQSConfiguration>();
|
InfinityQSConfiguration? infinityQSConfiguration = configurationRoot.GetSection(nameof(InfinityQSConfiguration)).Get<InfinityQSConfiguration>();
|
||||||
|
InfinityQSProjectConfiguration? infinityQSProjectConfiguration = configurationRoot.GetSection(nameof(InfinityQSProjectConfiguration)).Get<InfinityQSProjectConfiguration>();
|
||||||
IsoConfiguration? isoConfiguration = configurationRoot.GetSection(nameof(IsoConfiguration)).Get<IsoConfiguration>();
|
IsoConfiguration? isoConfiguration = configurationRoot.GetSection(nameof(IsoConfiguration)).Get<IsoConfiguration>();
|
||||||
MetadataSettings? metadataSettings = configurationRoot.GetSection(nameof(MetadataSettings)).Get<MetadataSettings>();
|
MetadataSettings? metadataSettings = configurationRoot.GetSection(nameof(MetadataSettings)).Get<MetadataSettings>();
|
||||||
MetrologyConfiguration? metrologyConfiguration = configurationRoot.GetSection(nameof(MetrologyConfiguration)).Get<MetrologyConfiguration>();
|
MetrologyConfiguration? metrologyConfiguration = configurationRoot.GetSection(nameof(MetrologyConfiguration)).Get<MetrologyConfiguration>();
|
||||||
@ -62,6 +64,7 @@ public record AppSettings(CamstarOracleConfiguration CamstarOracleConfiguration,
|
|||||||
|| edaDatabaseConfiguration is null
|
|| edaDatabaseConfiguration is null
|
||||||
|| fileWatcherConfiguration is null
|
|| fileWatcherConfiguration is null
|
||||||
|| infinityQSConfiguration is null
|
|| infinityQSConfiguration is null
|
||||||
|
|| infinityQSProjectConfiguration is null
|
||||||
|| isoConfiguration is null
|
|| isoConfiguration is null
|
||||||
|| metadataSettings is null
|
|| metadataSettings is null
|
||||||
|| metrologyConfiguration is null
|
|| metrologyConfiguration is null
|
||||||
@ -96,6 +99,7 @@ public record AppSettings(CamstarOracleConfiguration CamstarOracleConfiguration,
|
|||||||
edaDatabaseConfiguration,
|
edaDatabaseConfiguration,
|
||||||
fileWatcherConfiguration,
|
fileWatcherConfiguration,
|
||||||
infinityQSConfiguration,
|
infinityQSConfiguration,
|
||||||
|
infinityQSProjectConfiguration,
|
||||||
isoConfiguration,
|
isoConfiguration,
|
||||||
metadataSettings,
|
metadataSettings,
|
||||||
metrologyConfiguration,
|
metrologyConfiguration,
|
||||||
|
28
Models/InfinityQSProjectConfiguration.cs
Normal file
28
Models/InfinityQSProjectConfiguration.cs
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace File_Watcher.Models;
|
||||||
|
|
||||||
|
public record InfinityQSProjectConfiguration(string From,
|
||||||
|
int ClearEveryHours,
|
||||||
|
string Search,
|
||||||
|
string SearchPattern,
|
||||||
|
string SimpleMailTransferProtocolServer,
|
||||||
|
string SourceDirectory,
|
||||||
|
string Subject,
|
||||||
|
string To)
|
||||||
|
{
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
string result = JsonSerializer.Serialize(this, InfinityQSProjectConfigurationSourceGenerationContext.Default.InfinityQSProjectConfiguration);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
[JsonSourceGenerationOptions(WriteIndented = true)]
|
||||||
|
[JsonSerializable(typeof(InfinityQSProjectConfiguration))]
|
||||||
|
internal partial class InfinityQSProjectConfigurationSourceGenerationContext : JsonSerializerContext
|
||||||
|
{
|
||||||
|
}
|
@ -46,6 +46,7 @@ public partial class Worker : BackgroundService
|
|||||||
if (!_IsWindowsService)
|
if (!_IsWindowsService)
|
||||||
{
|
{
|
||||||
_Logger.LogInformation("Set break point and skip to run {_AppSettings.FileWatcherConfiguration.Helper}!", _AppSettings.FileWatcherConfiguration.Helper);
|
_Logger.LogInformation("Set break point and skip to run {_AppSettings.FileWatcherConfiguration.Helper}!", _AppSettings.FileWatcherConfiguration.Helper);
|
||||||
|
BodyInner(cancellationToken);
|
||||||
throw new EvaluateException($"Set break point and skip to run {_AppSettings.FileWatcherConfiguration.Helper}!");
|
throw new EvaluateException($"Set break point and skip to run {_AppSettings.FileWatcherConfiguration.Helper}!");
|
||||||
}
|
}
|
||||||
if (!_IsWindowsService)
|
if (!_IsWindowsService)
|
||||||
@ -89,6 +90,7 @@ public partial class Worker : BackgroundService
|
|||||||
nameof(Helpers.HelperWaferCounter) => Helpers.HelperWaferCounter.MoveFile(_AppSettings, _Logger),
|
nameof(Helpers.HelperWaferCounter) => Helpers.HelperWaferCounter.MoveFile(_AppSettings, _Logger),
|
||||||
nameof(Helpers.HelperSerial) => Helpers.HelperSerial.ReadWrite(_AppSettings, _Logger, cancellationToken),
|
nameof(Helpers.HelperSerial) => Helpers.HelperSerial.ReadWrite(_AppSettings, _Logger, cancellationToken),
|
||||||
nameof(Helpers.HelperMetrologyFiles) => Helpers.HelperMetrologyFiles.SortAndDelete(_AppSettings, _Logger),
|
nameof(Helpers.HelperMetrologyFiles) => Helpers.HelperMetrologyFiles.SortAndDelete(_AppSettings, _Logger),
|
||||||
|
nameof(Helpers.InfinityQSProjectHelper) => Helpers.InfinityQSProjectHelper.SendEmail(_AppSettings, _Logger),
|
||||||
nameof(Helpers.NationalInstrumentsHelper) => Helpers.NationalInstrumentsHelper.WriteData(_AppSettings, _Logger),
|
nameof(Helpers.NationalInstrumentsHelper) => Helpers.NationalInstrumentsHelper.WriteData(_AppSettings, _Logger),
|
||||||
nameof(Helpers.DeterministicHashCodeHelper) => Helpers.DeterministicHashCodeHelper.WindowsWork(_AppSettings, _Logger),
|
nameof(Helpers.DeterministicHashCodeHelper) => Helpers.DeterministicHashCodeHelper.WindowsWork(_AppSettings, _Logger),
|
||||||
nameof(Helpers.TransmissionControlProtocolHelper) => Helpers.TransmissionControlProtocolHelper.ReadWrite(_AppSettings, _Logger),
|
nameof(Helpers.TransmissionControlProtocolHelper) => Helpers.TransmissionControlProtocolHelper.ReadWrite(_AppSettings, _Logger),
|
||||||
|
Reference in New Issue
Block a user