using MagicCarpetBusinessLogic.Implementations; using MagicCarpetContracts.AdapterContracts; using MagicCarpetContracts.BuisnessLogicContracts; using MagicCarpetContracts.BusinessLogicContracts; using MagicCarpetContracts.Infrastructure; using MagicCarpetContracts.StoragesContracts; using MagicCarpetDatabase; using MagicCarpetDatabase.Implementations; using MagicCarpetWebApi; using MagicCarpetWebApi.Adapters; using MagicCarpetWebApi.Infrastructure; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; using Serilog; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddControllers(); using var loggerFactory = new LoggerFactory(); loggerFactory.AddSerilog(new LoggerConfiguration().ReadFrom.Configuration(builder.Configuration).CreateLogger()); builder.Services.AddSingleton(loggerFactory.CreateLogger("Any")); builder.Services.AddAuthorization(); builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidIssuer = AuthOptions.ISSUER, ValidateAudience = true, ValidAudience = AuthOptions.AUDIENCE, ValidateLifetime = true, IssuerSigningKey = AuthOptions.GetSymmetricSecurityKey(), ValidateIssuerSigningKey = true, }; }); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddOpenApi(); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.MapOpenApi(); } if (app.Environment.IsProduction()) { var dbContext = app.Services.GetRequiredService(); if (dbContext.Database.CanConnect()) { dbContext.Database.EnsureCreated(); dbContext.Database.Migrate(); } } app.UseHttpsRedirection(); app.UseAuthentication(); app.UseAuthorization(); app.Map("/login/{username}", (string username) => { return new JwtSecurityTokenHandler().WriteToken(new JwtSecurityToken( issuer: AuthOptions.ISSUER, audience: AuthOptions.AUDIENCE, claims: [new(ClaimTypes.Name, username)], expires: DateTime.UtcNow.Add(TimeSpan.FromMinutes(2)), signingCredentials: new SigningCredentials(AuthOptions.GetSymmetricSecurityKey(), SecurityAlgorithms.HmacSha256))); }); app.MapControllers(); app.Run();