forked from mohammadKarimi/SwiftLink
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
114 lines (95 loc) · 3.47 KB
/
Program.cs
File metadata and controls
114 lines (95 loc) · 3.47 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
using Asp.Versioning;
using HealthChecks.UI.Client;
using Microsoft.AspNetCore.Diagnostics.HealthChecks;
using Microsoft.OpenApi.Models;
using Prometheus;
using Serilog;
using SwiftLink.Application;
using SwiftLink.Application.Common.Interfaces;
using SwiftLink.Infrastructure;
using SwiftLink.Infrastructure.CacheProvider;
using SwiftLink.Infrastructure.Persistence.Context;
using SwiftLink.Presentation.Extensions;
using SwiftLink.Presentation.Filters;
using SwiftLink.Presentation.Middleware;
using SwiftLink.Presentation.Services;
using SwiftLink.Shared;
var builder = WebApplication.CreateBuilder(args);
{
builder.Services.AddPolicyRegistry()
.AddPolicies();
builder.Services.AddScoped<IUser, CurrentUser>();
builder.Services.AddHttpContextAccessor();
builder.Services.AddOptions<AppSettings>()
.Bind(builder.Configuration.GetSection(AppSettings.ConfigurationSectionName))
.ValidateDataAnnotations();
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.RegisterApplicationServices(builder.Configuration)
.RegisterInfrastructureServices(builder.Configuration);
builder.Services.AddApiVersioning(options =>
{
options.DefaultApiVersion = new ApiVersion(1);
options.ReportApiVersions = true;
options.AssumeDefaultVersionWhenUnspecified = true;
options.ApiVersionReader = new UrlSegmentApiVersionReader();
}).AddApiExplorer(options =>
{
options.GroupNameFormat = "'v'VVV";
options.SubstituteApiVersionInUrl = true;
});
builder.Services
.AddHealthChecks()
.AddSqlServer(builder.Configuration.GetConnectionString(nameof(ApplicationDbContext)))
.AddRedis(builder.Configuration["AppSettings:Redis:RedisCacheUrl"]);
builder.Services.AddExceptionHandler<GlobalExceptionHandler>();
builder.Services.AddProblemDetails();
builder.Host.UseSerilog((context, configuration) => configuration.ReadFrom.Configuration(context.Configuration));
builder.Services.AddMetricServer(options =>
{
options.Port = ushort.Parse(builder.Configuration["AppSettings:DefaultPrometheusPort"]);
});
builder.Services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1", new OpenApiInfo
{
Title = "SwiftLink",
Version = "v1",
});
options.OperationFilter<SwaggerAuthenticationFilter>();
});
}
var app = builder.Build();
{
if (app.Environment.IsDevelopment())
await app.InitializeDatabaseAsync();
app.UseExceptionHandler();
app.UseAuthorization();
app.MapControllers();
app.UseRouting().UseEndpoints(config =>
{
config.MapHealthChecks("/health/check", new HealthCheckOptions
{
Predicate = _ => true,
ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse
});
});
app.UseMetricServer();
app.UseHttpMetrics(options =>
{
options.ReduceStatusCodeCardinality();
options.AddCustomLabel("Host_IP", context => context.Request.Host.Host);
});
app.MapMetrics();
app.UseSwagger();
app.UseSwaggerUI(options =>
{
options.SwaggerEndpoint("/swagger/v1/swagger.json", "SwiftLink API v1");
options.RoutePrefix = string.Empty;
});
app.UseSerilogRequestLogging();
//app.UseElasticApm(builder.Configuration,
// new HttpDiagnosticsSubscriber(),
// new EfCoreDiagnosticsSubscriber());
app.Run();
}