AzureDevOpsRepository

Switch to DataGrid
Markdown links
Add css for files, leo and mes
copySelectedB
Logic for other collections
monospace
Ticks bug fix, default to *.wc files and formatting
This commit is contained in:
2024-10-14 12:24:43 -07:00
parent 018382e218
commit 141f9c084a
58 changed files with 3203 additions and 126 deletions

View File

@ -0,0 +1,26 @@
using Microsoft.AspNetCore.Mvc;
using OI.Metrology.Shared.Models;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Wafer.Counter.Helper;
namespace OI.Metrology.Wafer.Counter.ApiControllers;
[Route("api/v1/ado")]
public class AzureDevOpsController : Controller, IAzureDevOpsController<IResult>
{
private readonly IAzureDevOpsRepository _AzureDevOpsRepository;
public AzureDevOpsController(IAzureDevOpsRepository azureDevOpsRepository) =>
_AzureDevOpsRepository = azureDevOpsRepository;
[HttpPost("save")]
public IResult Save()
{
PollValue? pollValue = ParameterHelper.GetPollValue(Request.HttpContext.Connection?.RemoteIpAddress, Request.Body);
ArgumentNullException.ThrowIfNull(pollValue);
_AzureDevOpsRepository.Save(pollValue);
return Results.Ok();
}
}

View File

@ -2,10 +2,8 @@
using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Models;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Wafer.Counter.Helper;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.Text.Json;
using System.Web;
namespace OI.Metrology.Wafer.Counter.ApiControllers;
@ -39,36 +37,11 @@ public class FileShareController : Controller, IFileShareController<IResult>
return Results.Ok();
}
private static Dictionary<string, string?> GetKeyValuePairs(QueryString queryString)
{
Dictionary<string, string?> results = [];
if (queryString.HasValue)
{
NameValueCollection nameValueCollection = HttpUtility.ParseQueryString(queryString.Value);
foreach (string? key in nameValueCollection.AllKeys)
{
if (key is null)
continue;
results.Add(key, nameValueCollection[key]);
}
}
return results;
}
private static CharacterizationParameters? GetCharacterizationParameters(QueryString queryString)
{
CharacterizationParameters? result;
Dictionary<string, string?> keyValuePairs = GetKeyValuePairs(queryString);
string json = JsonSerializer.Serialize(keyValuePairs);
result = string.IsNullOrEmpty(json) ? null : JsonSerializer.Deserialize(json, CharacterizationParametersSourceGenerationContext.Default.CharacterizationParameters);
return result;
}
[HttpGet("archive-data")]
public IActionResult ArchiveData()
{
ReadOnlyCollection<CharacterizationInfo> results;
CharacterizationParameters? characterizationParameters = GetCharacterizationParameters(Request.QueryString);
CharacterizationParameters? characterizationParameters = ParameterHelper.GetCharacterizationParameters(Request.QueryString);
ArgumentNullException.ThrowIfNull(characterizationParameters);
results = _FileShareRepository.GetArchiveData(characterizationParameters);
return Json(results);

View File

@ -0,0 +1,82 @@
using OI.Metrology.Shared.Models;
using System.Collections.Specialized;
using System.Net;
using System.Text.Json;
using System.Web;
namespace OI.Metrology.Wafer.Counter.Helper;
public class ParameterHelper
{
private static Dictionary<string, string?> GetKeyValuePairs(QueryString queryString)
{
Dictionary<string, string?> results = [];
if (queryString.HasValue)
{
NameValueCollection nameValueCollection = HttpUtility.ParseQueryString(queryString.Value);
foreach (string? key in nameValueCollection.AllKeys)
{
if (key is null)
continue;
results.Add(key, nameValueCollection[key]);
}
}
return results;
}
internal static CharacterizationParameters? GetCharacterizationParameters(QueryString queryString)
{
CharacterizationParameters? result;
Dictionary<string, string?> keyValuePairs = GetKeyValuePairs(queryString);
string json = JsonSerializer.Serialize(keyValuePairs, new JsonSerializerOptions() { WriteIndented = true });
result = string.IsNullOrEmpty(json) ? null : JsonSerializer.Deserialize(json, CharacterizationParametersSourceGenerationContext.Default.CharacterizationParameters);
return result;
}
private static string? GetQueryString(Stream stream)
{
string? result;
if (!stream.CanRead)
result = null;
else
{
Task<string> task = new StreamReader(stream).ReadToEndAsync();
result = task.Result;
}
return result;
}
private static Dictionary<string, string?> GetKeyValuePairs(string? queryString)
{
Dictionary<string, string?> results = [];
if (!string.IsNullOrEmpty(queryString))
{
NameValueCollection nameValueCollection = HttpUtility.ParseQueryString(queryString);
foreach (string? key in nameValueCollection.AllKeys)
{
if (key is null)
continue;
results.Add(key, nameValueCollection[key]);
}
}
return results;
}
internal static PollValue? GetPollValue(IPAddress? remoteIpAddress, Stream stream)
{
PollValue? result;
string? queryString = GetQueryString(stream);
Dictionary<string, string?> keyValuePairs = GetKeyValuePairs(queryString);
string json = JsonSerializer.Serialize(keyValuePairs, new JsonSerializerOptions() { WriteIndented = true });
result = string.IsNullOrEmpty(json) ? null : JsonSerializer.Deserialize(json, PollValueSourceGenerationContext.Default.PollValue);
if (result is not null)
{
result = new(null, result.Id, result.Page, queryString, remoteIpAddress is null ? string.Empty : remoteIpAddress.ToString(), result.Time, result.Value);
json = JsonSerializer.Serialize(result, PollValueSourceGenerationContext.Default.PollValue);
result = new(json, result.Id, result.Page, queryString, remoteIpAddress is null ? string.Empty : remoteIpAddress.ToString(), result.Time, result.Value);
}
return result;
}
}

View File

@ -1,6 +1,6 @@
using System.Text.RegularExpressions;
namespace OI.Metrology.Wafer.Counter.Repository;
namespace OI.Metrology.Wafer.Counter.Helper;
public partial class RegexHelper
{
@ -8,4 +8,4 @@ public partial class RegexHelper
[GeneratedRegex(@"[\\,\/,\:,\*,\?,\"",\<,\>,\|]")]
internal static partial Regex WindowsFileSystem();
}
}

View File

@ -1,8 +1,10 @@
using System.Text.Json;
using System.Text.Json.Serialization;
namespace OI.Metrology.Wafer.Counter.Models;
public record AppSettings(string BuildNumber,
public record AppSettings(string AzureDevOpsDestinationDirectory,
string BuildNumber,
string Company,
string EcCharacterizationSi,
string EcMesaFileShareCharacterizationSi,
@ -20,8 +22,14 @@ public record AppSettings(string BuildNumber,
public override string ToString()
{
string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
string result = JsonSerializer.Serialize(this, AppSettingsSourceGenerationContext.Default.AppSettings);
return result;
}
}
[JsonSourceGenerationOptions(WriteIndented = true)]
[JsonSerializable(typeof(AppSettings))]
public partial class AppSettingsSourceGenerationContext : JsonSerializerContext
{
}

View File

@ -6,6 +6,7 @@ namespace OI.Metrology.Wafer.Counter.Models.Binder;
public class AppSettings
{
public string? AzureDevOpsDestinationDirectory { get; set; }
public string? BuildNumber { get; set; }
public string? Company { get; set; }
public string? EcCharacterizationSi { get; set; }
@ -23,7 +24,7 @@ public class AppSettings
public override string ToString()
{
string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
string result = JsonSerializer.Serialize(this, BinderAppSettingsSourceGenerationContext.Default.AppSettings);
return result;
}
@ -48,6 +49,7 @@ public class AppSettings
{
Models.AppSettings result;
if (appSettings is null) throw new NullReferenceException(nameof(appSettings));
if (appSettings.AzureDevOpsDestinationDirectory is null) throw new NullReferenceException(nameof(AzureDevOpsDestinationDirectory));
if (appSettings.BuildNumber is null) throw new NullReferenceException(nameof(BuildNumber));
if (appSettings.Company is null) throw new NullReferenceException(nameof(Company));
if (appSettings.EcCharacterizationSi is null) throw new NullReferenceException(nameof(EcCharacterizationSi));
@ -62,7 +64,8 @@ public class AppSettings
if (appSettings.WaferCounterDestinationDirectory is null) throw new NullReferenceException(nameof(WaferCounterDestinationDirectory));
if (appSettings.WaferCounterTwoFileSecondsWait is null) throw new NullReferenceException(nameof(WaferCounterTwoFileSecondsWait));
if (appSettings.WorkingDirectoryName is null) throw new NullReferenceException(nameof(WorkingDirectoryName));
result = new(appSettings.BuildNumber,
result = new(appSettings.AzureDevOpsDestinationDirectory,
appSettings.BuildNumber,
appSettings.Company,
appSettings.EcCharacterizationSi,
appSettings.EcMesaFileShareCharacterizationSi,

View File

@ -19,17 +19,17 @@
<PackageReference Include="Dapper" Version="2.1.44" />
<PackageReference Include="EntityFramework" Version="6.5.1" />
<PackageReference Include="jQuery" Version="3.7.1" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.8" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.EventLog" Version="8.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.Server" Version="8.0.10" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Hosting" 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="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.7.3" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.8.1" />
<PackageReference Include="System.Data.SqlClient" Version="4.8.6" />
</ItemGroup>
<ItemGroup>

View File

@ -31,6 +31,7 @@ public class Program
_ = webApplicationBuilder.Services.AddHttpClient();
_ = webApplicationBuilder.Services.AddSingleton(_ => appSettings);
_ = webApplicationBuilder.Services.AddSingleton<IFileShareRepository, FileShareRepository>();
_ = webApplicationBuilder.Services.AddSingleton<IAzureDevOpsRepository, AzureDevOpsRepository>();
_ = webApplicationBuilder.Services.AddSingleton<IWaferCounterRepository, WaferCounterRepository>();
_ = webApplicationBuilder.Services.AddSingleton<IAppSettingsRepository<Models.Binder.AppSettings>>(_ => appSettingsRepository);

View File

@ -0,0 +1,25 @@
using OI.Metrology.Shared.Models;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Wafer.Counter.Models;
namespace OI.Metrology.Wafer.Counter.Repository;
public class AzureDevOpsRepository : IAzureDevOpsRepository
{
private readonly AppSettings _AppSettings;
public AzureDevOpsRepository(AppSettings appSettings) =>
_AppSettings = appSettings;
void IAzureDevOpsRepository.Save(PollValue pollValue)
{
ArgumentNullException.ThrowIfNull(pollValue.Id);
ArgumentNullException.ThrowIfNull(pollValue.Page);
string directory = Path.Combine(_AppSettings.AzureDevOpsDestinationDirectory, pollValue.Page, pollValue.Id.Value.ToString());
if (!Directory.Exists(directory))
_ = Directory.CreateDirectory(directory);
File.WriteAllText(Path.Combine(directory, $"{pollValue.Time}.json"), pollValue.Json is null ? string.Empty : pollValue.Json);
}
}

View File

@ -128,7 +128,7 @@ public class FileShareRepository : IFileShareRepository
string[] directories;
string startDateTimeTicks = startDateTime.Ticks.ToString();
string delta = (endDateTime.Ticks - startDateTime.Ticks).ToString();
string ticksSearchPattern = $"{startDateTime.Ticks.ToString()[..(startDateTimeTicks.Length - delta.Length + 1)]}*";
string ticksSearchPattern = $"{startDateTime.Ticks.ToString()[..(startDateTimeTicks.Length - delta.Length - 1)]}*";
bool check = characterizationParameters.SearchPattern is null || searchPattern == characterizationParameters.SearchPattern;
if (check)
results.AddRange(Directory.GetFiles(equipmentDirectory, searchPattern, SearchOption.AllDirectories));

View File

@ -1,6 +1,7 @@
using OI.Metrology.Shared.DataModels;
using OI.Metrology.Shared.Models;
using OI.Metrology.Shared.Models.Stateless;
using OI.Metrology.Wafer.Counter.Helper;
using OI.Metrology.Wafer.Counter.Models;
using System.Collections.ObjectModel;
using System.Globalization;
@ -51,7 +52,7 @@ public class WaferCounterRepository : IWaferCounterRepository
string weekOfYear = $"{nginxFileSystemSortable.DateTime:yyyy}_Week_{calendar.GetWeekOfYear(nginxFileSystemSortable.DateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday):00}";
string directory = Path.Combine(archive, weekOfYear, nginxFileSystemSortable.DateTime.ToString("yyyy-MM-dd"), windowsFileSystemSafeText);
string file = Path.Combine(directory, nginxFileSystemSortable.DateTime.Ticks.ToString(), $"{nginxFileSystemSortable.Name}.json");
string json = JsonSerializer.Serialize(waferCounterArchive, new JsonSerializerOptions() { WriteIndented = true });
string json = JsonSerializer.Serialize(waferCounterArchive, WaferCounterArchiveSourceGenerationContext.Default.WaferCounterArchive);
_FileShareRepository.FileWrite(file, json);
string to = Path.Combine(directory, nginxFileSystemSortable.Name);
_FileShareRepository.MoveFile(from, to);