2025-09-28 15:24:13 +03:30
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 ;
2025-12-05 17:27:38 +03:30
using BackOffice.BFF.WebApi.Common.Authorization ;
2025-09-28 15:24:13 +03:30
var builder = WebApplication . CreateBuilder ( args ) ;
if ( RuntimeInformation . IsOSPlatform ( OSPlatform . OSX ) )
{
builder . WebHost . ConfigureKestrel ( options = >
{
// Setup a HTTP/2 endpoint without TLS.
2025-12-06 22:24:18 +03:30
options . ListenLocalhost ( 5001 , o = > o . Protocols =
2025-09-28 15:24:13 +03:30
HttpProtocols . Http2 ) ;
} ) ;
}
var levelSwitch = new LoggingLevelSwitch ( ) ;
var logger = new LoggerConfiguration ( )
2025-12-06 22:24:18 +03:30
. WriteTo . Console ( )
2025-12-05 21:53:03 +00:00
. WriteTo . Seq ( builder . Configuration [ "Seq:ServerUrl" ] ? ? "http://seq-svc:5341" ,
apiKey : string . IsNullOrEmpty ( builder . Configuration [ "Seq:ApiKey" ] ) ? null : builder . Configuration [ "Seq:ApiKey" ] ,
2025-09-28 15:24:13 +03:30
controlLevelSwitch : levelSwitch )
. CreateLogger ( ) ;
builder . Logging . AddSerilog ( logger ) ;
#if DEBUG
2025-12-07 22:27:28 +03:30
Serilog . Debugging . SelfLog . Enable ( msg = > Console . WriteLine ( msg ) ) ;
2025-09-28 15:24:13 +03:30
#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
2025-12-05 17:27:38 +03:30
options . Interceptors . Add < PermissionInterceptor > ( ) ;
2025-09-28 15:24:13 +03:30
} ) . 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<ProductService>();
} ) ;
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 ( ) ;