2022-08-26 15:40:05 -07:00

96 lines
4.7 KiB
C#

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<Program>();
try
{
Dictionary<string, int?> 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<WebApi.WorkItemTrackingHttpClient>();
_ = webApplicationBuilder.Services.AddSingleton<WebApi.WorkItemTrackingHttpClient, WebApi.WorkItemTrackingHttpClient>(_ => workItemTrackingHttpClient);
_ = webApplicationBuilder.Services.AddHttpClient<Pages.FetchData>(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<IHostLifetime, WindowsServiceLifetime>();
_ = 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();
}
}
}