using Mesa_Backlog.Library; using Microsoft.Extensions.Hosting.WindowsServices; using Microsoft.VisualStudio.Services.Common; using Microsoft.VisualStudio.Services.WebApi; using Serilog; using System.Net.Http.Headers; using System.Reflection; using System.Text; using WebApi = Microsoft.TeamFoundation.WorkItemTracking.WebApi; namespace Mesa_Backlog; public class Program { public static int Main(string[] args) { LoggerConfiguration loggerConfiguration = new(); WebApplicationBuilder webApplicationBuilder = WebApplication.CreateBuilder(args); _ = webApplicationBuilder.Services.AddRazorPages(); _ = webApplicationBuilder.Services.AddServerSideBlazor(); Assembly assembly = Assembly.GetExecutingAssembly(); AppSettings appSettings = Library.Binder.AppSettings.Get(webApplicationBuilder.Configuration); if (string.IsNullOrEmpty(appSettings.WorkingDirectoryName)) throw new Exception("Working directory name must have a value!"); string workingDirectory = IWorkingDirectory.GetWorkingDirectory(assembly.GetName()?.Name, 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(); try { Dictionary keyValuePairs = new(); byte[] bytes = Encoding.ASCII.GetBytes($":{appSettings.Client.PAT}"); string base64 = Convert.ToBase64String(bytes); VssBasicCredential credential = new("", appSettings.Client.PAT); MediaTypeWithQualityHeaderValue mediaTypeWithQualityHeaderValue = new("application/json"); VssConnection connection = new(new(string.Concat(appSettings.Client.BaseAddress, appSettings.Client.BasePage)), credential); _ = webApplicationBuilder.Services.AddSingleton(_ => appSettings); _ = webApplicationBuilder.Services.AddSingleton(_ => keyValuePairs); WebApi.WorkItemTrackingHttpClient workItemTrackingHttpClient = connection.GetClient(); _ = webApplicationBuilder.Services.AddSingleton(_ => workItemTrackingHttpClient); _ = webApplicationBuilder.Services.AddHttpClient(nameof(Pages.FetchData), httpClient => { httpClient.BaseAddress = new(appSettings.Client.BaseAddress); httpClient.DefaultRequestHeaders.Accept.Add(mediaTypeWithQualityHeaderValue); httpClient.DefaultRequestHeaders.Authorization = new("Basic", base64); }); if (WindowsServiceHelpers.IsWindowsService()) { _ = webApplicationBuilder.Services.AddSingleton(); _ = webApplicationBuilder.Logging.AddEventLog(settings => { if (string.IsNullOrEmpty(settings.SourceName)) settings.SourceName = webApplicationBuilder.Environment.ApplicationName; }); } WebApplication webApplication = webApplicationBuilder.Build(); if (!webApplication.Environment.IsDevelopment()) { _ = webApplication.UseExceptionHandler("/Error"); _ = webApplication.UseHsts(); } else { if (string.IsNullOrEmpty(appSettings.URLs)) { Environment.ExitCode = -1; webApplication.Lifetime.StopApplication(); } } _ = webApplication.Lifetime.ApplicationStopped.Register(Log.CloseAndFlush); _ = ApplicationBuilderSerilogClientExtensions.UseSerilogIngestion(webApplication); _ = SerilogApplicationBuilderExtensions.UseSerilogRequestLogging(webApplication); _ = webApplication.UseFileServer(enableDirectoryBrowsing: true); _ = webApplication.UseHttpsRedirection(); _ = webApplication.UseStaticFiles(); _ = webApplication.UseRouting(); _ = webApplication.MapBlazorHub(); _ = webApplication.MapFallbackToPage("/_Host"); webApplication.Run(); return 0; } catch (Exception ex) { log.Fatal(ex, "Host terminated unexpectedly"); return 1; } finally { Log.CloseAndFlush(); } } }