using System.Reflection; using System.Runtime.InteropServices; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using Microsoft.AspNetCore.Server.Kestrel.Core; using Serilog; using Serilog.Core; using Microsoft.OpenApi.Models; using BackOffice.BFF.WebApi.Common.Authorization; var builder = WebApplication.CreateBuilder(args); if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { builder.WebHost.ConfigureKestrel(options => { // Setup a HTTP/2 endpoint without TLS. options.ListenLocalhost(5001, o => o.Protocols = HttpProtocols.Http2); }); } var levelSwitch = new LoggingLevelSwitch(); var logger = new LoggerConfiguration() .WriteTo.Console() .WriteTo.Seq(builder.Configuration["Seq:ServerUrl"] ?? "http://seq-svc:5341", apiKey: string.IsNullOrEmpty(builder.Configuration["Seq:ApiKey"]) ? null : builder.Configuration["Seq:ApiKey"], controlLevelSwitch: levelSwitch) .CreateLogger(); builder.Logging.AddSerilog(logger); #if DEBUG Serilog.Debugging.SelfLog.Enable(msg => Console.WriteLine(msg)); #endif // Additional configuration is required to successfully run gRPC on macOS. // For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682 // Add services to the container. builder.Services.AddGrpc(options => { options.EnableDetailedErrors = true; options.MaxReceiveMessageSize = 1000 * 1024 * 1024; // 1 GB options.MaxSendMessageSize = 1000 * 1024 * 1024; // 1 GB options.Interceptors.Add(); }).AddJsonTranscoding(); builder.Services.AddInfrastructureServices(builder.Configuration); builder.Services.AddApplicationServices(); builder.Services.AddPresentationServices(builder.Configuration); #region Configure Cors builder.Services.AddCors(options => { options.AddPolicy("AllowAll", builder => builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader().WithExposedHeaders("Grpc-Status", "Grpc-Message", "Grpc-Encoding", "Grpc-Accept-Encoding", "validation-errors-text")); }); #endregion builder.Services.AddGrpcSwagger(); builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "gRPC transcoding", Version = "v1" }); c.CustomSchemaIds(type=>type.ToString()); c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { In = ParameterLocation.Header, Description = "Please insert JWT with Bearer into field", Name = "Authorization", Type = SecuritySchemeType.ApiKey }); c.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } }, new string[] { } } }); }); var app = builder.Build(); app.UseRouting(); app.UseCors("AllowAll"); app.UseAuthentication(); app.UseAuthorization(); app.UseGrpcWeb(new GrpcWebOptions { DefaultEnabled = true }); // Configure the HTTP request pipeline. app.ConfigureGrpcEndpoints(Assembly.GetExecutingAssembly(), endpoints => { // endpoints.MapGrpcService(); }); app.MapGet("/", () => "Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909"); app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); }); app.Run();