Add InfinityQSProjectConfiguration and related email functionality

This commit is contained in:
2025-10-06 14:15:38 -07:00
parent 1dffe235ff
commit a5b224cee1
5 changed files with 149 additions and 1 deletions

View File

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

View 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();
}
}

View File

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

View 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
{
}

View File

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