diff --git a/BrixelAPI.SpaceAPI/Bootstrapper.cs b/BrixelAPI.SpaceAPI/Bootstrapper.cs index e190bb3..bda7f57 100644 --- a/BrixelAPI.SpaceAPI/Bootstrapper.cs +++ b/BrixelAPI.SpaceAPI/Bootstrapper.cs @@ -8,7 +8,7 @@ namespace BrixelAPI.SpaceState { - public class Bootstrapper + public static class Bootstrapper { public static void Configure(IServiceCollection serviceCollection, IConfiguration configuration) { diff --git a/BrixelAPI.SpaceAPI/Features/GetFullStatus/GetFullStatusHandler.cs b/BrixelAPI.SpaceAPI/Features/GetFullStatus/GetFullStatusHandler.cs index cb5f36b..4594eac 100644 --- a/BrixelAPI.SpaceAPI/Features/GetFullStatus/GetFullStatusHandler.cs +++ b/BrixelAPI.SpaceAPI/Features/GetFullStatus/GetFullStatusHandler.cs @@ -22,10 +22,13 @@ public async Task Handle(GetFullStatusRequest request, Ca var state = Domain.SpaceStateAggregate.SpaceState.GetConfiguredSpaceAPI(); var lastState = await _spaceStateRepository.GetLastLogAsync(); - state.State.Open = lastState.IsOpen; - state.State.Lastchange = lastState.ChangedAtDateTime - .ToUniversalTime() - .Subtract(new DateTime(1970, 1, 1)).TotalSeconds; + if (lastState != null) { + + state.State.Open = lastState.IsOpen; + state.State.Lastchange = lastState.ChangedAtDateTime + .ToUniversalTime() + .Subtract(new DateTime(1970, 1, 1)).TotalSeconds; + } var response = new GetFullStatusResponse(state); return response; diff --git a/SpaceAPI.Host/Program.cs b/SpaceAPI.Host/Program.cs index 6a4d6bf..bf97a96 100644 --- a/SpaceAPI.Host/Program.cs +++ b/SpaceAPI.Host/Program.cs @@ -1,20 +1,11 @@ -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Hosting; +using Microsoft.AspNetCore.Builder; +var builder = WebApplication.CreateBuilder(args); -namespace SpaceAPI.Host -{ - public class Program - { - public static void Main(string[] args) - { - CreateHostBuilder(args).Build().Run(); - } +SpaceAPI.Host.WebApplicationBuilder.ConfigureServices(builder.Services, builder.Configuration); - public static IHostBuilder CreateHostBuilder(string[] args) => - Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder(args) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - }); - } -} +var app = builder.Build(); + +SpaceAPI.Host.WebApplicationBuilder.Configure(app, app.Environment); + + +app.Run(); \ No newline at end of file diff --git a/SpaceAPI.Host/Startup.cs b/SpaceAPI.Host/WebApplicationBuilder.cs similarity index 78% rename from SpaceAPI.Host/Startup.cs rename to SpaceAPI.Host/WebApplicationBuilder.cs index 1417316..6ff8c68 100644 --- a/SpaceAPI.Host/Startup.cs +++ b/SpaceAPI.Host/WebApplicationBuilder.cs @@ -14,21 +14,15 @@ namespace SpaceAPI.Host { - public class Startup + public static class WebApplicationBuilder { - public Startup(IConfiguration configuration) - { - Configuration = configuration; - } - - public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. - public void ConfigureServices(IServiceCollection services) + public static void ConfigureServices(IServiceCollection services, IConfiguration configuration) { var version = GetVersion(); - var configurationSection = Configuration.GetSection(nameof(AuthConfig)); + var configurationSection = configuration.GetSection(nameof(AuthConfig)); var authConfiguration = configurationSection.Get(); services.Configure(configurationSection); @@ -36,36 +30,38 @@ public void ConfigureServices(IServiceCollection services) services.AddControllers(options => { options.RespectBrowserAcceptHeader = true; - }); - - services.AddAuthentication(authOptions => - { - authOptions.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; - authOptions.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; - authOptions.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; - }).AddJwtBearer(options => + }).AddJsonOptions(o => { - options.Authority = authConfiguration.Authority; - options.Audience = authConfiguration.Audience; - //options.SaveToken = true; - options.RequireHttpsMetadata = false; - options.TokenValidationParameters = new TokenValidationParameters() - { - ValidateAudience = false - }; + o.JsonSerializerOptions.DefaultIgnoreCondition = System.Text.Json.Serialization.JsonIgnoreCondition.WhenWritingNull; }); - services.AddAuthorization(auth => - { - var defaultPolicy = - new AuthorizationPolicyBuilder() - .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme) - .RequireAuthenticatedUser() - .Build(); - auth.DefaultPolicy = defaultPolicy; + AddAuthentication(services, authConfiguration); + AddAuthorization(services); + AddCors(services); + AddOpenAPI(services, version); + + ConfigureVerticals(services, configuration); + } + + private static void AddOpenAPI(IServiceCollection services, string version) + { + services.AddSwaggerGen(options => + { + options.SwaggerDoc($"v{version}", new OpenApiInfo() + { + Version = version, + Title = "Brixel.SpaceAPI", + Description = "SpaceAPI of Brixel" + }); + options.DocumentFilter(); + options.CustomOperationIds( + d => (d.ActionDescriptor as ControllerActionDescriptor)?.ActionName); }); + } + private static void AddCors(IServiceCollection services) + { services.AddCors(options => { options.AddDefaultPolicy( @@ -77,22 +73,40 @@ public void ConfigureServices(IServiceCollection services) .AllowAnyHeader(); }); }); + } - services.AddSwaggerGen(options => + private static void AddAuthorization(IServiceCollection services) + { + services.AddAuthorization(auth => { - options.SwaggerDoc($"v{version}", new OpenApiInfo() + var defaultPolicy = + new AuthorizationPolicyBuilder() + .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme) + .RequireAuthenticatedUser() + .Build(); + + auth.DefaultPolicy = defaultPolicy; + }); + } + + private static void AddAuthentication(IServiceCollection services, AuthConfig authConfiguration) + { + services.AddAuthentication(authOptions => + { + authOptions.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; + authOptions.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; + authOptions.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; + }).AddJwtBearer(options => + { + options.Authority = authConfiguration.Authority; + options.Audience = authConfiguration.Audience; + //options.SaveToken = true; + options.RequireHttpsMetadata = false; + options.TokenValidationParameters = new TokenValidationParameters() { - Version = version, - Title = "Brixel.SpaceAPI", - Description = "SpaceAPI of Brixel" - }); - options.DocumentFilter(); - options.CustomOperationIds( - d => (d.ActionDescriptor as ControllerActionDescriptor)?.ActionName); + ValidateAudience = false + }; }); - services.AddMvcCore() - .AddApiExplorer(); - ConfigureVerticals(services, Configuration); } private static string GetVersion() @@ -101,13 +115,13 @@ private static string GetVersion() } - private void ConfigureVerticals(IServiceCollection serviceCollection, IConfiguration configuration) + private static void ConfigureVerticals(IServiceCollection serviceCollection, IConfiguration configuration) { Bootstrapper.Configure(serviceCollection, configuration); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + public static void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { diff --git a/SpaceAPI.sln b/SpaceAPI.sln index 9ccfdb9..ff80d86 100644 --- a/SpaceAPI.sln +++ b/SpaceAPI.sln @@ -12,7 +12,6 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{8EC462FD-D22E-90A8-E5CE-7E832BA40C5D}" ProjectSection(SolutionItems) = preProject docker-compose.yml = docker-compose.yml - .github\workflows\test.yml = .github\workflows\test.yml EndProjectSection EndProject Global