using System.Text; using System.Text.Json.Serialization; using Managing.Api.Authorization; using Managing.Api.Exceptions; using Managing.Api.Filters; using Managing.Api.Workers; using Managing.Application.Hubs; using Managing.Bootstrap; using Managing.Common; using Managing.Infrastructure.Databases.InfluxDb.Models; using Managing.Infrastructure.Databases.MongoDb.Configurations; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Models; using NSwag; using NSwag.Generation.Processors.Security; using Serilog; using Serilog.Events; using Serilog.Sinks.Elasticsearch; using OpenApiSecurityRequirement = Microsoft.OpenApi.Models.OpenApiSecurityRequirement; using OpenApiSecurityScheme = NSwag.OpenApiSecurityScheme; // Builder var builder = WebApplication.CreateBuilder(args); builder.Configuration.SetBasePath(AppContext.BaseDirectory); builder.Configuration.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddJsonFile($"appsettings.{builder.Environment.EnvironmentName}.json") .AddJsonFile($"config.{builder.Environment.EnvironmentName}.json", optional: true, reloadOnChange: true); builder.Configuration.AddEnvironmentVariables(); builder.Configuration.AddUserSecrets(); builder.Host.UseSerilog((hostBuilder, loggerConfiguration) => { var envName = builder.Environment.EnvironmentName.ToLower().Replace(".", "-"); var indexFormat = $"managing-{envName}-" + "{0:yyyy.MM.dd}"; var yourTemplateName = "dotnetlogs"; var es = new ElasticsearchSinkOptions(new Uri(hostBuilder.Configuration["ElasticConfiguration:Uri"])) { IndexFormat = indexFormat.ToLower(), AutoRegisterTemplate = true, OverwriteTemplate = true, TemplateName = yourTemplateName, AutoRegisterTemplateVersion = AutoRegisterTemplateVersion.ESv7, TypeName = null, BatchAction = ElasticOpType.Create, MinimumLogEventLevel = LogEventLevel.Information, DetectElasticsearchVersion = true, RegisterTemplateFailure = RegisterTemplateRecovery.IndexAnyway, }; loggerConfiguration .WriteTo.Console() .WriteTo.Elasticsearch(es); }); builder.Services.AddOptions(); builder.Services.Configure(builder.Configuration.GetSection(Constants.Databases.MongoDb)); builder.Services.Configure(builder.Configuration.GetSection(Constants.Databases.InfluxDb)); builder.Services.AddControllers().AddJsonOptions(options => options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter())); builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(o => { o.SaveToken = true; o.TokenValidationParameters = new TokenValidationParameters { ValidIssuer = builder.Configuration["Authentication:Schemes:Bearer:ValidIssuer"], ValidAudience = builder.Configuration["Authentication:Schemes:Bearer:ValidAudiences"], IssuerSigningKey = new SymmetricSecurityKey (Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Secret"])), ValidateIssuer = false, ValidateAudience = false, ValidateIssuerSigningKey = true }; }); builder.Services.AddAuthorization(); builder.Services.AddCors(o => o.AddPolicy("CorsPolicy", builder => { builder .SetIsOriginAllowed((host) => true) .AllowAnyOrigin() .WithOrigins("http://localhost:3000/") .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials(); })); builder.Services.AddSignalR().AddJsonProtocol(); builder.Services.AddScoped(); builder.Services.RegisterApiDependencies(builder.Configuration); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddOpenApiDocument(document => { document.AddSecurity("JWT", Enumerable.Empty(), new OpenApiSecurityScheme { Type = OpenApiSecuritySchemeType.ApiKey, Name = "Authorization", In = OpenApiSecurityApiKeyLocation.Header, Description = "Type into the textbox: Bearer {your JWT token}." }); document.OperationProcessors.Add( new AspNetCoreOperationSecurityScopeProcessor("JWT")); }); builder.Services.AddSwaggerGen(options => { options.SchemaFilter(); options.AddSecurityDefinition("Bearer,", new Microsoft.OpenApi.Models.OpenApiSecurityScheme { Description = "Please insert your JWT Token into field : Bearer {your_token}", Name = "Authorization", Type = SecuritySchemeType.Http, In = ParameterLocation.Header, Scheme = "Bearer", BearerFormat = "JWT" }); options.AddSecurityRequirement(new OpenApiSecurityRequirement { { new Microsoft.OpenApi.Models.OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } }, new string[] { } } }); }); builder.WebHost.SetupDiscordBot(); builder.Services.AddHostedService(); // App var app = builder.Build(); app.UseSerilogRequestLogging(); if (app.Environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseOpenApi(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "Managing API v1"); c.RoutePrefix = string.Empty; }); app.UseCors("CorsPolicy"); app.UseMiddleware(typeof(GlobalErrorHandlingMiddleware)); app.UseMiddleware(); app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); endpoints.MapHub("/bothub"); endpoints.MapHub("/backtesthub"); endpoints.MapHub("/candlehub"); }); app.Run();