diff --git a/.gitignore b/.gitignore index fb12081..6f19ff6 100644 --- a/.gitignore +++ b/.gitignore @@ -346,4 +346,6 @@ SignalRChat/* Server/wwwroot/js/chat.js Server/Hubs/ChatHub.cs Server/Pages/Chat.cshtml -Server/Pages/Chat.cshtml.cs \ No newline at end of file +Server/Pages/Chat.cshtml.cs + +.kanbn \ No newline at end of file diff --git a/.kanbn/index.md b/.kanbn/index.md index 9582bdc..fd306ec 100644 --- a/.kanbn/index.md +++ b/.kanbn/index.md @@ -4,6 +4,9 @@ startedColumns: completedColumns: - Done dateFormat: mm/dd +created: "2023-10-20T05:13:53.975Z" +updated: "2023-10-20T05:13:53.975Z" +type: "note" --- # Barcode-Host @@ -25,6 +28,7 @@ dateFormat: mm/dd - [roll-out](tasks/roll-out.md) - [publish](tasks/publish.md) - [post-only-once](tasks/post-only-once.md) +- [convert-to-net-7](tasks/convert-to-net-7.md) ## Done diff --git a/.vscode/settings.json b/.vscode/settings.json index 5feb921..f5c7f36 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,19 +1,16 @@ { - "files.eol": "\n", - "[markdown]": { - "editor.wordWrap": "off" - }, - "cSpell.enabled": false, - "thunder-client.saveToWorkspace": true, - "thunder-client.workspaceRelativePath": ".vscode", - "coverage-gutters.coverageBaseDir": "../.vscode/TestResults/*", - "[markdown]": { - "editor.wordWrap": "off" - }, - "files.exclude": { - "**/node_modules": true - }, - "files.watcherExclude": { - "**/node_modules": true - } + "[markdown]": { + "editor.wordWrap": "off" + }, + "coverage-gutters.coverageBaseDir": "../.vscode/TestResults/*", + "cSpell.enabled": false, + "files.eol": "\n", + "files.exclude": { + "**/node_modules": true + }, + "files.watcherExclude": { + "**/node_modules": true + }, + "thunder-client.saveToWorkspace": true, + "thunder-client.workspaceRelativePath": ".vscode" } \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index f8f4a21..0f30f9f 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -1,5 +1,4 @@ { - "version": "2.0.0", "options": { "env": { "serverUserSecretsId": "02dce973-df1d-4325-962a-ed549af8d4c5" @@ -7,21 +6,18 @@ }, "tasks": [ { - "label": "userSecretsInit", - "command": "dotnet", - "type": "process", "args": [ "user-secrets", "-p", "${workspaceFolder}/Server/Barcode.Host.Server.csproj", "init" ], - "problemMatcher": "$msCompile" + "command": "dotnet", + "label": "userSecretsInit", + "problemMatcher": "$msCompile", + "type": "process" }, { - "label": "userSecretsSet", - "command": "dotnet", - "type": "process", "args": [ "user-secrets", "-p", @@ -30,12 +26,12 @@ "asdf", "123" ], - "problemMatcher": "$msCompile" + "command": "dotnet", + "label": "userSecretsSet", + "problemMatcher": "$msCompile", + "type": "process" }, { - "label": "userSecretsMkLink", - "command": "cmd", - "type": "shell", "args": [ "/c", "mklink", @@ -43,47 +39,47 @@ ".vscode\\UserSecrets", "${userHome}\\AppData\\Roaming\\Microsoft\\UserSecrets\\$env:serverUserSecretsId" ], - "problemMatcher": "$msCompile" + "command": "cmd", + "label": "userSecretsMkLink", + "problemMatcher": "$msCompile", + "type": "shell" }, { - "label": "buildServer", - "command": "dotnet", - "type": "process", "args": [ "build", "${workspaceFolder}/Server/Barcode.Host.Server.csproj", "/property:GenerateFullPaths=true", "/consoleloggerparameters:NoSummary" ], - "problemMatcher": "$msCompile" + "command": "dotnet", + "label": "buildServer", + "problemMatcher": "$msCompile", + "type": "process" }, { - "label": "publishServer", - "command": "dotnet", - "type": "process", "args": [ "publish", "${workspaceFolder}/Server/Barcode.Host.Server.csproj", "/property:GenerateFullPaths=true", "/consoleloggerparameters:NoSummary" ], - "problemMatcher": "$msCompile" + "command": "dotnet", + "label": "publishServer", + "problemMatcher": "$msCompile", + "type": "process" }, { - "label": "testDebug", - "command": "dotnet", - "type": "process", "args": [ "test", "/property:GenerateFullPaths=true", "/consoleloggerparameters:NoSummary" ], - "problemMatcher": "$msCompile" + "command": "dotnet", + "label": "testDebug", + "problemMatcher": "$msCompile", + "type": "process" }, { - "label": "testRelease", - "command": "dotnet", - "type": "process", "args": [ "test", "/property:GenerateFullPaths=true", @@ -91,12 +87,12 @@ "-c", "Release" ], - "problemMatcher": "$msCompile" + "command": "dotnet", + "label": "testRelease", + "problemMatcher": "$msCompile", + "type": "process" }, { - "label": "format", - "command": "dotnet", - "type": "process", "args": [ "format", "--report", @@ -106,24 +102,24 @@ "--severity", "warn" ], - "problemMatcher": "$msCompile" + "command": "dotnet", + "label": "format", + "problemMatcher": "$msCompile", + "type": "process" }, { - "label": "old-watch", - "command": "dotnet", - "type": "process", "args": [ "watch", "run", "--project", "${workspaceFolder}/Server/Barcode.Host.Server.csproj" ], - "problemMatcher": "$msCompile" + "command": "dotnet", + "label": "old-watch", + "problemMatcher": "$msCompile", + "type": "process" }, { - "label": "watchServer", - "command": "dotnet", - "type": "process", "args": [ "watch", "--launch-profile", @@ -133,68 +129,72 @@ "${workspaceFolder}/Server/Barcode.Host.Server.csproj", "--verbose" ], - "isBackground": true, + "command": "dotnet", "dependsOn": [ "build" ], + "isBackground": true, + "label": "watchServer", "problemMatcher": { - "fileLocation": "relative", - "pattern": { - "regexp": "^([^\\s].*)\\((\\d+|\\d+,\\d+|\\d+,\\d+,\\d+,\\d+)\\):\\s+(error|warning|info)\\s+(TS\\d+)\\s*:\\s*(.*)$", - "file": 1, - "location": 2, - "severity": 3, - "code": 4, - "message": 5 - }, "background": { "activeOnStart": true, "beginsPattern": "^.*Shutdown requested.*", "endsPattern": "^.*Application started.*" + }, + "fileLocation": "relative", + "pattern": { + "code": 4, + "file": 1, + "location": 2, + "message": 5, + "regexp": "^([^\\s].*)\\((\\d+|\\d+,\\d+|\\d+,\\d+,\\d+,\\d+)\\):\\s+(error|warning|info)\\s+(TS\\d+)\\s*:\\s*(.*)$", + "severity": 3 } - } + }, + "type": "process" }, { - "label": "PowerShell Force Clean", - "type": "shell", "command": "& Get-ChildItem . -include bin,obj -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse }", - "problemMatcher": [] + "label": "PowerShell Force Clean", + "problemMatcher": [], + "type": "shell" }, { - "label": "PowerShell Clean TestResults", - "type": "shell", "command": "& Get-ChildItem . -include TestResults -Recurse | foreach ($_) { remove-item $_.fullname -Force -Recurse }", - "problemMatcher": [] + "label": "PowerShell Clean TestResults", + "problemMatcher": [], + "type": "shell" }, { - "label": "File-Folder-Helper AOT s Set metadata", - "type": "shell", "command": "& L:/DevOps/Mesa_FI/File-Folder-Helper/bin/Release/net7.0/win-x64/publish/File-Folder-Helper.exe .kanbn", - "problemMatcher": [] + "label": "File-Folder-Helper AOT s Set metadata", + "problemMatcher": [], + "type": "shell" }, { - "label": "File-Folder-Helper AOT s M tasks", - "type": "shell", "command": "& L:/DevOps/Mesa_FI/File-Folder-Helper/bin/Release/net7.0/win-x64/publish/File-Folder-Helper.exe s M .kanbn/tasks", - "problemMatcher": [] + "label": "File-Folder-Helper AOT s M tasks", + "problemMatcher": [], + "type": "shell" }, { "label": "Kanbn Console", - "type": "npm", + "problemMatcher": [], "script": "kanbn.board", - "problemMatcher": [] + "type": "npm" }, { - "label": "Kanbn Write Boad", - "type": "shell", "command": "& kanbn board -j | L:/Git/kanbn2md/kanbn2md.exe >.kanbn/board.md", - "problemMatcher": [] + "label": "Kanbn Write Boad", + "problemMatcher": [], + "type": "shell" }, { "label": "Kanbn Write json", - "type": "npm", + "problemMatcher": [], "script": "kanbn.board.json", - "problemMatcher": [] + "type": "npm" } - ] + ], + "version": "2.0.0" } \ No newline at end of file diff --git a/Server.Tests/Barcode.Host.Server.Tests.csproj b/Server.Tests/Barcode.Host.Server.Tests.csproj index ba1516e..362da56 100644 --- a/Server.Tests/Barcode.Host.Server.Tests.csproj +++ b/Server.Tests/Barcode.Host.Server.Tests.csproj @@ -4,6 +4,7 @@ enable win-x64;linux-x64 net7.0 + 02dce973-df1d-4325-962a-ed549af8d4c5 trx @@ -30,25 +31,13 @@ - - - - - - - - + + + + - - - Always - - - Always - - \ No newline at end of file diff --git a/Server.Tests/UnitTestFileService.cs b/Server.Tests/UnitTestFileService.cs index 86b2b7e..03985fb 100644 --- a/Server.Tests/UnitTestFileService.cs +++ b/Server.Tests/UnitTestFileService.cs @@ -2,7 +2,7 @@ using Barcode.Host.Shared.Models; using Barcode.Host.Shared.Models.Stateless; using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.Extensions.DependencyInjection; -using Serilog; +using Microsoft.Extensions.Logging; namespace Barcode.Host.Tests; @@ -10,20 +10,17 @@ namespace Barcode.Host.Tests; public class UnitTestFileService { -#pragma warning disable CS8618 - - private static ILogger _Logger; - private static TestContext _TestContext; - private static WebApplicationFactory _WebApplicationFactory; - -#pragma warning restore + private static ILogger? _Logger; + private static TestContext? _TestContext; + private static WebApplicationFactory? _WebApplicationFactory; [ClassInitialize] public static void ClassInitAsync(TestContext testContext) { _TestContext = testContext; - _Logger = Log.ForContext(); _WebApplicationFactory = new WebApplicationFactory(); + IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; + _Logger = serviceProvider.GetRequiredService>(); } private static void NonThrowTryCatch() @@ -39,13 +36,15 @@ public class UnitTestFileService [TestMethod] public void GetWrite() { - _Logger.Information("Starting Web Application"); - IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; - Server.Models.AppSettings appSettings = serviceProvider.GetRequiredService(); - IFileService fileService = serviceProvider.GetRequiredService(); - Notification notification = new(KeyPressEvent: null, "Test", appSettings.ToolClass, null); + _Logger?.LogInformation("Starting Web Application"); + IServiceProvider? serviceProvider = _WebApplicationFactory?.Services.CreateScope().ServiceProvider; + Server.Models.AppSettings? appSettings = serviceProvider?.GetRequiredService(); + IFileService? fileService = serviceProvider?.GetRequiredService(); + Assert.IsNotNull(appSettings); + Assert.IsNotNull(fileService); + Notification? notification = new(KeyPressEvent: null, "Test", appSettings.ToolClass, null); fileService.Write(appSettings.EquipmentName, appSettings.FileShare, calendar: null, notification); - _Logger.Information($"{_TestContext?.TestName} completed"); + _Logger?.LogInformation("{testName} completed", _TestContext?.TestName); NonThrowTryCatch(); } diff --git a/Server.Tests/UnitTestLastScanController.cs b/Server.Tests/UnitTestLastScanController.cs index 5247513..3159167 100644 --- a/Server.Tests/UnitTestLastScanController.cs +++ b/Server.Tests/UnitTestLastScanController.cs @@ -2,7 +2,7 @@ using Barcode.Host.Shared.DataModels; using Barcode.Host.Shared.Models.Stateless; using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.Extensions.DependencyInjection; -using Serilog; +using Microsoft.Extensions.Logging; namespace Barcode.Host.Tests; @@ -10,21 +10,18 @@ namespace Barcode.Host.Tests; public class UnitTestLastScanController { -#pragma warning disable CS8618 - - private static ILogger _Logger; - private static string _ControllerName; - private static TestContext _TestContext; - private static WebApplicationFactory _WebApplicationFactory; - -#pragma warning restore + private static ILogger? _Logger; + private static string? _ControllerName; + private static TestContext? _TestContext; + private static WebApplicationFactory? _WebApplicationFactory; [ClassInitialize] public static void ClassInitAsync(TestContext testContext) { _TestContext = testContext; - _Logger = Log.ForContext(); _WebApplicationFactory = new WebApplicationFactory(); + IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; + _Logger = serviceProvider.GetRequiredService>(); _ControllerName = nameof(Server.ApiControllers.LastScanController)[..^10]; } @@ -38,9 +35,9 @@ public class UnitTestLastScanController [TestMethod] public void TestControllerName() { - _Logger.Information("Starting Web Application"); + _Logger?.LogInformation("Starting Web Application"); Assert.AreEqual(ILastScanController.GetRouteName(), _ControllerName); - _Logger.Information($"{_TestContext?.TestName} completed"); + _Logger?.LogInformation("{testName} completed", _TestContext?.TestName); NonThrowTryCatch(); } @@ -50,12 +47,13 @@ public class UnitTestLastScanController [TestMethod] public void GetScan() { - _Logger.Information("Starting Web Application"); - IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; - ILastScanService lastScanService = serviceProvider.GetRequiredService(); + _Logger?.LogInformation("Starting Web Application"); + IServiceProvider? serviceProvider = _WebApplicationFactory?.Services.CreateScope().ServiceProvider; + ILastScanService? lastScanService = serviceProvider?.GetRequiredService(); + Assert.IsNotNull(lastScanService); Result result = lastScanService.GetScan(); Assert.IsNotNull(result?.Results); - _Logger.Information($"{_TestContext?.TestName} completed"); + _Logger?.LogInformation("{testName} completed", _TestContext?.TestName); NonThrowTryCatch(); } @@ -65,13 +63,14 @@ public class UnitTestLastScanController [TestMethod] public async Task GetScanApi() { - HttpClient httpClient = _WebApplicationFactory.CreateClient(); - _Logger.Information("Starting Web Application"); + HttpClient? httpClient = _WebApplicationFactory?.CreateClient(); + _Logger?.LogInformation("Starting Web Application"); + Assert.IsNotNull(httpClient); string? json = await httpClient.GetStringAsync($"api/{_ControllerName}/O171927.1.37/"); File.WriteAllText(Path.Combine(AppContext.BaseDirectory, $"{_ControllerName}-{nameof(GetScan)}.json"), json); Result? result = System.Text.Json.JsonSerializer.Deserialize>(json); Assert.IsNotNull(result?.Results); - _Logger.Information($"{_TestContext?.TestName} completed"); + _Logger?.LogInformation("{testName} completed", _TestContext?.TestName); NonThrowTryCatch(); } diff --git a/Server.Tests/UnitTestPostService.cs b/Server.Tests/UnitTestPostService.cs index 8dcdc7e..0391cb1 100644 --- a/Server.Tests/UnitTestPostService.cs +++ b/Server.Tests/UnitTestPostService.cs @@ -2,7 +2,7 @@ using Barcode.Host.Shared.Models; using Barcode.Host.Shared.Models.Stateless; using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.Extensions.DependencyInjection; -using Serilog; +using Microsoft.Extensions.Logging; namespace Barcode.Host.Tests; @@ -10,20 +10,17 @@ namespace Barcode.Host.Tests; public class UnitTestPostService { -#pragma warning disable CS8618 - - private static ILogger _Logger; - private static TestContext _TestContext; - private static WebApplicationFactory _WebApplicationFactory; - -#pragma warning restore + private static ILogger? _Logger; + private static TestContext? _TestContext; + private static WebApplicationFactory? _WebApplicationFactory; [ClassInitialize] public static void ClassInitAsync(TestContext testContext) { _TestContext = testContext; - _Logger = Log.ForContext(); _WebApplicationFactory = new WebApplicationFactory(); + IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; + _Logger = serviceProvider.GetRequiredService>(); } private static void NonThrowTryCatch() @@ -39,14 +36,18 @@ public class UnitTestPostService [TestMethod] public void GetPostTo() { - _Logger.Information("Starting Web Application"); - HttpClient httpClient = _WebApplicationFactory.CreateClient(); - IServiceProvider serviceProvider = _WebApplicationFactory.Services.CreateScope().ServiceProvider; - Server.Models.AppSettings appSettings = serviceProvider.GetRequiredService(); - IPostService postService = serviceProvider.GetRequiredService(); - Notification notification = new(KeyPressEvent: null, "Test", appSettings.ToolClass, null); + _Logger?.LogInformation("Starting Web Application"); + HttpClient? httpClient = _WebApplicationFactory?.CreateClient(); + IServiceProvider? serviceProvider = _WebApplicationFactory?.Services.CreateScope().ServiceProvider; + Server.Models.AppSettings? appSettings = serviceProvider?.GetRequiredService(); + IPostService? postService = serviceProvider?.GetRequiredService(); + Assert.IsNotNull(httpClient); + Assert.IsNotNull(appSettings); + Assert.IsNotNull(postService); + Notification? notification = new(KeyPressEvent: null, "Test", appSettings.ToolClass, null); + Assert.IsNotNull(notification); _ = postService.Post(appSettings.PostTo, httpClient, notification); - _Logger.Information($"{_TestContext?.TestName} completed"); + _Logger?.LogInformation("{testName} completed", _TestContext?.TestName); NonThrowTryCatch(); } diff --git a/Server/Barcode.Host.Server.csproj b/Server/Barcode.Host.Server.csproj index 37b0160..9767ce9 100644 --- a/Server/Barcode.Host.Server.csproj +++ b/Server/Barcode.Host.Server.csproj @@ -22,27 +22,17 @@ Linux - - + + - - - - + + - + - - - Always - - - Always - - \ No newline at end of file diff --git a/Server/HostedService/TimedHostedService.cs b/Server/HostedService/TimedHostedService.cs index df3e961..1f4b3fa 100644 --- a/Server/HostedService/TimedHostedService.cs +++ b/Server/HostedService/TimedHostedService.cs @@ -5,7 +5,6 @@ using Barcode.Host.Shared.KeyboardMouse; using Barcode.Host.Shared.Models; using Barcode.Host.Shared.Models.Stateless; using Microsoft.AspNetCore.SignalR; -using Serilog.Context; using System.Globalization; namespace Barcode.Host.Server.HostedService; @@ -65,12 +64,9 @@ public class TimedHostedService : IHostedService, IAggregateInputReader, IDispos public Task StartAsync(CancellationToken stoppingToken) { - string? methodName = IMethodName.GetActualAsyncMethodName(); - using (LogContext.PushProperty("MethodName", methodName)) - { - _Logger.LogInformation($"Timed Hosted Service: {_AppSettings.BuildSourceVersion}:{Environment.ProcessId} running."); - if (!string.IsNullOrEmpty(_AppSettings.SerialPortName)) - _SerialService.Open(); + _Logger.LogInformation("Timed Hosted Service: {BuildSourceVersion}:{ProcessId} running.", _AppSettings.BuildSourceVersion, Environment.ProcessId); + if (!string.IsNullOrEmpty(_AppSettings.SerialPortName)) + _SerialService.Open(); #if Linux if (!_LinuxGroupManager.IsInInputGroup().WaitAsync(stoppingToken).Result) { @@ -80,32 +76,29 @@ public class TimedHostedService : IHostedService, IAggregateInputReader, IDispos _ = _LinuxGroupManager.RebootSystem(_AppSettings.RootPassword); } #endif - List<(EventCode, char)> collection = _LastScanService.IncludeEventCodes(); - foreach ((EventCode eventCode, char @char) in collection) - _CharToEventCodes.Add(eventCode, @char); - int dueTime = 0; - foreach ((string _, Timer timer) in _Timers) - { - dueTime += 300; - _ = timer.Change(dueTime, Timeout.Infinite); - } + List<(EventCode, char)> collection = _LastScanService.IncludeEventCodes(); + foreach ((EventCode eventCode, char @char) in collection) + _CharToEventCodes.Add(eventCode, @char); + int dueTime = 0; + foreach ((string _, Timer timer) in _Timers) + { + dueTime += 300; + _ = timer.Change(dueTime, Timeout.Infinite); } + return Task.CompletedTask; } public Task StopAsync(CancellationToken stoppingToken) { - string? methodName = IMethodName.GetActualAsyncMethodName(); - using (LogContext.PushProperty("MethodName", methodName)) + _Logger.LogInformation("Timed Hosted Service: {BuildSourceVersion}:{ProcessId} is stopping.", _AppSettings.BuildSourceVersion, Environment.ProcessId); + for (short i = 0; i < short.MaxValue; i++) { - _Logger.LogInformation($"Timed Hosted Service: {_AppSettings.BuildSourceVersion}:{Environment.ProcessId} is stopping."); - for (short i = 0; i < short.MaxValue; i++) - { - Thread.Sleep(500); - if (_ExecutionCount == 0) - break; - } + Thread.Sleep(500); + if (_ExecutionCount == 0) + break; } + return Task.CompletedTask; } diff --git a/Server/Models/AppSettings.cs b/Server/Models/AppSettings.cs index 074919c..b59387b 100644 --- a/Server/Models/AppSettings.cs +++ b/Server/Models/AppSettings.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using System.Text.Json.Serialization; namespace Barcode.Host.Server.Models; @@ -32,8 +33,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))] +internal partial class AppSettingsSourceGenerationContext : JsonSerializerContext +{ } \ No newline at end of file diff --git a/Server/Models/Binder/.editorconfig b/Server/Models/Binder/.editorconfig new file mode 100644 index 0000000..1c444cd --- /dev/null +++ b/Server/Models/Binder/.editorconfig @@ -0,0 +1,2 @@ +[*.cs] +csharp_preserve_single_line_statements = true \ No newline at end of file diff --git a/Server/Models/Binder/AppSettings.cs b/Server/Models/Binder/AppSettings.cs index 61e57de..d7affb7 100644 --- a/Server/Models/Binder/AppSettings.cs +++ b/Server/Models/Binder/AppSettings.cs @@ -1,4 +1,3 @@ -using System.ComponentModel.DataAnnotations; using System.Text.Json; namespace Barcode.Host.Server.Models.Binder; @@ -6,34 +5,32 @@ namespace Barcode.Host.Server.Models.Binder; public class AppSettings { - [Display(Name = "Build Number"), Required] public string? BuildNumber { get; set; } - [Display(Name = "Build Source Version"), Required] public string? BuildSourceVersion { get; set; } - [Display(Name = "Last Scan Service Clear After"), Required] public int? ClearLastScanServiceAfter { get; set; } - [Display(Name = "Company"), Required] public string? Company { get; set; } - [Display(Name = "Device Name Ends With"), Required] public string? DeviceNameEndsWith { get; set; } - [Display(Name = "Equipment Name"), Required] public string? EquipmentName { get; set; } - [Display(Name = "ExpectedScanLengthA"), Required] public int? ExpectedScanLengthA { get; set; } - [Display(Name = "ExpectedScanLengthB"), Required] public int? ExpectedScanLengthB { get; set; } - [Display(Name = "File Share"), Required] public string? FileShare { get; set; } - [Display(Name = "Is Development"), Required] public bool? IsDevelopment { get; set; } - [Display(Name = "Is Staging"), Required] public bool? IsStaging { get; set; } - [Display(Name = "Linux Device Path"), Required] public string? LinuxDevicePath { get; set; } - [Display(Name = "Mock Root"), Required] public string? MockRoot { get; set; } - [Display(Name = "MonA Resource"), Required] public string? MonAResource { get; set; } - [Display(Name = "MonA Site"), Required] public string? MonASite { get; set; } - [Display(Name = "Notify Minimum"), Required] public int? NotifyMinimum { get; set; } - [Display(Name = "OpenInsight Application Programming Interface"), Required] public string? OpenInsightApplicationProgrammingInterface { get; set; } - [Display(Name = "PostTo"), Required] public string? PostTo { get; set; } - [Display(Name = "Post to Every"), Required] public int? PostToEvery { get; set; } - [Display(Name = "RootPassword"), Required] public string? RootPassword { get; set; } - [Display(Name = "Serial Port Name"), Required] public string? SerialPortName { get; set; } - [Display(Name = "Share to Every"), Required] public int? ShareToEvery { get; set; } - [Display(Name = "ToolClass"), Required] public string? ToolClass { get; set; } - [Display(Name = "URLs"), Required] public string? URLs { get; set; } - [Display(Name = "Working Directory Name"), Required] public string? WorkingDirectoryName { get; set; } - [Display(Name = "WriteToSerialEvery"), Required] public int? WriteToSerialEvery { get; set; } - -#nullable restore + public string? BuildNumber { get; set; } + public string? BuildSourceVersion { get; set; } + public int? ClearLastScanServiceAfter { get; set; } + public string? Company { get; set; } + public string? DeviceNameEndsWith { get; set; } + public string? EquipmentName { get; set; } + public int? ExpectedScanLengthA { get; set; } + public int? ExpectedScanLengthB { get; set; } + public string? FileShare { get; set; } + public bool? IsDevelopment { get; set; } + public bool? IsStaging { get; set; } + public string? LinuxDevicePath { get; set; } + public string? MockRoot { get; set; } + public string? MonAResource { get; set; } + public string? MonASite { get; set; } + public int? NotifyMinimum { get; set; } + public string? OpenInsightApplicationProgrammingInterface { get; set; } + public string? PostTo { get; set; } + public int? PostToEvery { get; set; } + public string? RootPassword { get; set; } + public string? SerialPortName { get; set; } + public int? ShareToEvery { get; set; } + public string? ToolClass { get; set; } + public string? URLs { get; set; } + public string? WorkingDirectoryName { get; set; } + public int? WriteToSerialEvery { get; set; } public override string ToString() { @@ -44,60 +41,33 @@ public class AppSettings private static Models.AppSettings Get(AppSettings? appSettings) { Models.AppSettings result; - if (appSettings is null) - throw new NullReferenceException(nameof(appSettings)); - if (appSettings.BuildNumber is null) - throw new NullReferenceException(nameof(BuildNumber)); - if (appSettings.BuildSourceVersion is null) - throw new NullReferenceException(nameof(BuildSourceVersion)); - if (appSettings.ClearLastScanServiceAfter is null) - throw new NullReferenceException(nameof(ClearLastScanServiceAfter)); - if (appSettings.Company is null) - throw new NullReferenceException(nameof(Company)); - if (appSettings.DeviceNameEndsWith is null) - throw new NullReferenceException(nameof(DeviceNameEndsWith)); - if (appSettings.EquipmentName is null) - throw new NullReferenceException(nameof(EquipmentName)); - if (appSettings.ExpectedScanLengthA is null) - throw new NullReferenceException(nameof(ExpectedScanLengthA)); - if (appSettings.ExpectedScanLengthB is null) - throw new NullReferenceException(nameof(ExpectedScanLengthB)); - if (appSettings.FileShare is null) - throw new NullReferenceException(nameof(FileShare)); - if (appSettings.IsDevelopment is null) - throw new NullReferenceException(nameof(IsDevelopment)); - if (appSettings.IsStaging is null) - throw new NullReferenceException(nameof(IsStaging)); - if (appSettings.LinuxDevicePath is null) - throw new NullReferenceException(nameof(LinuxDevicePath)); - if (appSettings.MockRoot is null) - throw new NullReferenceException(nameof(MockRoot)); - if (appSettings.MonAResource is null) - throw new NullReferenceException(nameof(MonAResource)); - if (appSettings.MonASite is null) - throw new NullReferenceException(nameof(MonASite)); - if (appSettings.NotifyMinimum is null) - throw new NullReferenceException(nameof(NotifyMinimum)); - if (appSettings.OpenInsightApplicationProgrammingInterface is null) - throw new NullReferenceException(nameof(OpenInsightApplicationProgrammingInterface)); - if (appSettings.PostTo is null) - throw new NullReferenceException(nameof(PostTo)); - if (appSettings.PostToEvery is null) - throw new NullReferenceException(nameof(PostToEvery)); - if (appSettings.RootPassword is null) - throw new NullReferenceException(nameof(RootPassword)); - if (appSettings.SerialPortName is null) - throw new NullReferenceException(nameof(SerialPortName)); - if (appSettings.ShareToEvery is null) - throw new NullReferenceException(nameof(ShareToEvery)); - if (appSettings.ToolClass is null) - throw new NullReferenceException(nameof(ToolClass)); - if (appSettings.URLs is null) - throw new NullReferenceException(nameof(URLs)); - if (appSettings.WorkingDirectoryName is null) - throw new NullReferenceException(nameof(WorkingDirectoryName)); - if (appSettings.WriteToSerialEvery is null) - throw new NullReferenceException(nameof(WriteToSerialEvery)); + if (appSettings is null) throw new NullReferenceException(nameof(appSettings)); + if (appSettings.BuildNumber is null) throw new NullReferenceException(nameof(BuildNumber)); + if (appSettings.BuildSourceVersion is null) throw new NullReferenceException(nameof(BuildSourceVersion)); + if (appSettings.ClearLastScanServiceAfter is null) throw new NullReferenceException(nameof(ClearLastScanServiceAfter)); + if (appSettings.Company is null) throw new NullReferenceException(nameof(Company)); + if (appSettings.DeviceNameEndsWith is null) throw new NullReferenceException(nameof(DeviceNameEndsWith)); + if (appSettings.EquipmentName is null) throw new NullReferenceException(nameof(EquipmentName)); + if (appSettings.ExpectedScanLengthA is null) throw new NullReferenceException(nameof(ExpectedScanLengthA)); + if (appSettings.ExpectedScanLengthB is null) throw new NullReferenceException(nameof(ExpectedScanLengthB)); + if (appSettings.FileShare is null) throw new NullReferenceException(nameof(FileShare)); + if (appSettings.IsDevelopment is null) throw new NullReferenceException(nameof(IsDevelopment)); + if (appSettings.IsStaging is null) throw new NullReferenceException(nameof(IsStaging)); + if (appSettings.LinuxDevicePath is null) throw new NullReferenceException(nameof(LinuxDevicePath)); + if (appSettings.MockRoot is null) throw new NullReferenceException(nameof(MockRoot)); + if (appSettings.MonAResource is null) throw new NullReferenceException(nameof(MonAResource)); + if (appSettings.MonASite is null) throw new NullReferenceException(nameof(MonASite)); + if (appSettings.NotifyMinimum is null) throw new NullReferenceException(nameof(NotifyMinimum)); + if (appSettings.OpenInsightApplicationProgrammingInterface is null) throw new NullReferenceException(nameof(OpenInsightApplicationProgrammingInterface)); + if (appSettings.PostTo is null) throw new NullReferenceException(nameof(PostTo)); + if (appSettings.PostToEvery is null) throw new NullReferenceException(nameof(PostToEvery)); + if (appSettings.RootPassword is null) throw new NullReferenceException(nameof(RootPassword)); + if (appSettings.SerialPortName is null) throw new NullReferenceException(nameof(SerialPortName)); + if (appSettings.ShareToEvery is null) throw new NullReferenceException(nameof(ShareToEvery)); + if (appSettings.ToolClass is null) throw new NullReferenceException(nameof(ToolClass)); + if (appSettings.URLs is null) throw new NullReferenceException(nameof(URLs)); + if (appSettings.WorkingDirectoryName is null) throw new NullReferenceException(nameof(WorkingDirectoryName)); + if (appSettings.WriteToSerialEvery is null) throw new NullReferenceException(nameof(WriteToSerialEvery)); result = new( appSettings.BuildNumber, appSettings.BuildSourceVersion, diff --git a/Server/Pages/Error.cshtml.cs b/Server/Pages/Error.cshtml.cs index 75427c4..9f46a8b 100644 --- a/Server/Pages/Error.cshtml.cs +++ b/Server/Pages/Error.cshtml.cs @@ -1,6 +1,6 @@ -using System.Diagnostics; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; +using System.Diagnostics; namespace Barcode.Host.Server.Pages; @@ -19,5 +19,4 @@ public class ErrorModel : PageModel public void OnGet() => RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; -} - +} \ No newline at end of file diff --git a/Server/Pages/Notification.cshtml.cs b/Server/Pages/Notification.cshtml.cs index 82e8c86..761b5b5 100644 --- a/Server/Pages/Notification.cshtml.cs +++ b/Server/Pages/Notification.cshtml.cs @@ -15,4 +15,4 @@ public class NotificationModel : PageModel { } -} +} \ No newline at end of file diff --git a/Server/Program.cs b/Server/Program.cs index 2b3f9f4..c0468ab 100644 --- a/Server/Program.cs +++ b/Server/Program.cs @@ -2,50 +2,21 @@ using Barcode.Host.Server.Hubs; using Barcode.Host.Server.Models; using Barcode.Host.Server.Services; -using Barcode.Host.Shared.Models; using Barcode.Host.Shared.Models.Stateless; -using Serilog; -using System.Reflection; namespace Barcode.Host.Server; public class Program { - private static (string, WebApplicationOptions) Get(string[] args) - { - Assembly assembly = Assembly.GetExecutingAssembly(); - string? assemblyName = assembly.GetName()?.Name; - if (string.IsNullOrEmpty(assemblyName)) - throw new Exception(); - string baseAssemblyName = assemblyName.Split('.')[0]; - string webRootPath = Path.Combine(AppContext.BaseDirectory.Split(baseAssemblyName)[0], baseAssemblyName, "wwwroot"); - if (!Directory.Exists(webRootPath)) - webRootPath = string.Empty; - WebApplicationOptions webApplicationOptions = new() - { - Args = args, - ContentRootPath = AppContext.BaseDirectory, - WebRootPath = webRootPath - }; - return new(assemblyName, webApplicationOptions); - } - public static int Main(string[] args) { - LoggerConfiguration loggerConfiguration = new(); - (string assemblyName, _) = Get(args); + ILogger? logger = null; WebApplicationBuilder webApplicationBuilder = WebApplication.CreateBuilder(args); _ = webApplicationBuilder.Configuration.AddUserSecrets(); AppSettings appSettings = Models.Binder.AppSettings.Get(webApplicationBuilder.Configuration); - if (string.IsNullOrEmpty(appSettings.WorkingDirectoryName)) - throw new Exception("Working directory name must have a value!"); - string workingDirectory = IWorkingDirectory.GetWorkingDirectory(assemblyName, appSettings.WorkingDirectoryName); - Environment.SetEnvironmentVariable(nameof(workingDirectory), workingDirectory); - _ = ConfigurationLoggerConfigurationExtensions.Configuration(loggerConfiguration.ReadFrom, webApplicationBuilder.Configuration); - _ = SerilogHostBuilderExtensions.UseSerilog(webApplicationBuilder.Host); - Log.Logger = loggerConfiguration.CreateLogger(); - Serilog.ILogger log = Log.ForContext(); + if (string.IsNullOrEmpty(appSettings.Company)) + throw new Exception("Company name must have a value!"); try { if (appSettings.IsStaging && appSettings.IsDevelopment) @@ -68,6 +39,7 @@ public class Program _ = webApplicationBuilder.Services.AddHostedService(); _ = webApplicationBuilder.Services.AddSwaggerGen(); WebApplication webApplication = webApplicationBuilder.Build(); + logger = webApplication.Services.GetRequiredService>(); if (appSettings.IsDevelopment) { _ = webApplication.UseSwagger(); @@ -79,25 +51,23 @@ public class Program _ = webApplication.UseExceptionHandler("/Error"); _ = webApplication.UseHsts(); } - _ = webApplication.Lifetime.ApplicationStopped.Register(Log.CloseAndFlush); _ = webApplication.UseStaticFiles(); _ = webApplication.UseRouting(); _ = webApplication.UseAuthorization(); _ = webApplication.MapControllers(); _ = webApplication.MapRazorPages(); _ = webApplication.MapHub($"/{nameof(NotificationHub)}"); - log.Information("Starting Web Application"); + logger.LogInformation("Starting Web Application"); + logger.LogCritical("{Company}", appSettings.Company); webApplication.Run(); return 0; } catch (Exception ex) { - log.Fatal(ex, "Host terminated unexpectedly"); - return 1; - } - finally - { - Log.CloseAndFlush(); + try + { logger?.LogCritical(ex, "Host terminated unexpectedly"); } + catch (Exception) { } + throw; } } diff --git a/Server/appsettings.Development.json b/Server/appsettings.Development.json deleted file mode 100644 index 0f32e52..0000000 --- a/Server/appsettings.Development.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "ExpectedScanLengthA": 6, - "ExpectedScanLengthB": 9, - "Logging": { - "LogLevel": { - "Log4netProvider": "Debug" - } - }, - "IsDevelopment": true, - "Serilog": { - "MinimumLevel": "Debug" - } -} \ No newline at end of file diff --git a/Server/appsettings.json b/Server/appsettings.json deleted file mode 100644 index fee4de3..0000000 --- a/Server/appsettings.json +++ /dev/null @@ -1,74 +0,0 @@ -{ - "BuildNumber": "1", - "BuildSourceVersion": "1234567", - "Company": "Infineon Technologies Americas Corp.", - "ClearLastScanServiceAfter": 250, - "DeviceNameEndsWith": "Symbol Bar Code Scanner", - "EquipmentName": "", - "ExpectedScanLengthA": 8, - "ExpectedScanLengthB": 14, - "ExpectedScanLengthBExample": "1TO172125.1.11", - "FileShare": "", - "LinuxDevicePath": "/proc/bus/input/devices", - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft": "Warning", - "Log4netProvider": "Information", - "Microsoft.Hosting.Lifetime": "Information" - } - }, - "IsDevelopment": false, - "IsStaging": false, - "NotifyMinimum": 3, - "MockRoot": "", - "MonAResource": "OI_Metrology_Viewer_EC", - "MonASite": "auc", - "OpenInsightApplicationProgrammingInterface": "https://oi-prod-ec-api.mes.infineon.com/api/oiWizard", - "PostTo": "", - "PostToEvery": 1000, - "SerialPortName": "/dev/ttyUSB0", - "Serilog": { - "Using": [ - "Serilog.Sinks.Console", - "Serilog.Sinks.File" - ], - "MinimumLevel": "Information", - "WriteTo": [ - { - "Name": "Debug", - "Args": { - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{MethodName}) ({InstanceId}) ({RemoteIpAddress}) {Message}{NewLine}{Exception}" - } - }, - { - "Name": "Console", - "Args": { - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{MethodName}) ({InstanceId}) ({RemoteIpAddress}) {Message}{NewLine}{Exception}" - } - }, - { - "Name": "File", - "Args": { - "path": "%workingDirectory% - Log/log-.txt", - "outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] ({SourceContext}.{MethodName}) ({InstanceId}) ({RemoteIpAddress}) {Message}{NewLine}{Exception}", - "rollingInterval": "Hour" - } - } - ], - "Enrich": [ - "FromLogContext", - "WithMachineName", - "WithThreadId" - ], - "Properties": { - "Application": "Sample" - } - }, - "ShareToEvery": 1000, - "RootPassword": "", - "ToolClass": "FTIR", - "URLs": "http://localhost:5003;", - "WorkingDirectoryName": "IFXApps", - "WriteToSerialEvery": 750 -} \ No newline at end of file diff --git a/Shared/Barcode.Host.Shared.csproj b/Shared/Barcode.Host.Shared.csproj index 0c69df0..91b6997 100644 --- a/Shared/Barcode.Host.Shared.csproj +++ b/Shared/Barcode.Host.Shared.csproj @@ -20,7 +20,7 @@ Linux - +