Вытащил солюшен на уровень выше, чтобы прощё было дотнетить
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
2025-10-05 14:32:06 +03:00
parent fa87a56ad1
commit aae4b28089
242 changed files with 159 additions and 159 deletions

View File

@@ -0,0 +1,134 @@
using System.Reflection;
using System.Security.Claims;
using System.Text;
using System.Text.Json.Serialization;
using ApplicationLayer;
using Domains.Users;
using Infrastructure;
using Infrastructure.Auth;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authorization;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using SchengenVisaApi.Common;
using SchengenVisaApi.ExceptionFilters;
using Swashbuckle.AspNetCore.SwaggerGen;
namespace SchengenVisaApi;
/// Provides methods to add services to DI-container
public static class DependencyInjection
{
/// Add needed services
public static void RegisterServices(this WebApplicationBuilder builder)
{
var config = builder.Configuration;
var environment = builder.Environment;
AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);
builder.Services
.AddInfrastructure(config)
.AddApplicationLayer(environment.IsDevelopment())
.AddAuth(config)
.AddPresentation(environment);
}
/// Add services needed for Presentation layer
private static void AddPresentation(this IServiceCollection services,
IWebHostEnvironment environment)
{
if (environment.IsDevelopment())
{
services.AddSwagger();
}
services.AddProblemDetails();
services.AddCors(options => options.AddPolicy("policy", builder =>
builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader()));
services.AddControllers(opts => opts.Filters.Add<GlobalExceptionsFilter>())
.AddJsonOptions(options => options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()));
}
/// Adds authentication, authorization and token generator
private static IServiceCollection AddAuth(this IServiceCollection services, IConfigurationManager configurationManager)
{
var parameters = new TokenValidationParameters
{
ValidIssuer = configurationManager["JwtSettings:Issuer"],
ValidAudience = configurationManager["JwtSettings:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configurationManager["JwtSettings:Key"]!)),
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true
};
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(opts => opts.TokenValidationParameters = parameters);
services.AddAuthorizationBuilder().ConfigureAuthorizationPolicies();
services.AddTokenGenerator(new TokenGeneratorOptions(
Issuer: parameters.ValidIssuer!,
Audience: parameters.ValidAudience!,
Credentials: new SigningCredentials(parameters.IssuerSigningKey, SecurityAlgorithms.HmacSha256),
ValidTime: TimeSpan.FromMinutes(30)
));
return services;
}
/// Configure roles
private static void ConfigureAuthorizationPolicies(this AuthorizationBuilder builder)
{
builder.AddPolicy(
PolicyConstants.AdminPolicy,
p => p.RequireClaim(ClaimTypes.Role, Role.Admin.ToString()))
.AddPolicy(
PolicyConstants.ApprovingAuthorityPolicy,
p => p.RequireClaim(ClaimTypes.Role, Role.ApprovingAuthority.ToString()))
.AddPolicy(
PolicyConstants.ApplicantPolicy,
p => p.RequireClaim(ClaimTypes.Role, Role.Applicant.ToString()));
}
/// Add swagger
private static void AddSwagger(this IServiceCollection services)
{
services.AddSwaggerGen(options =>
{
var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename));
options.CustomOperationIds(apiDescription =>
apiDescription.TryGetMethodInfo(out MethodInfo methodInfo) ? methodInfo.Name : null);
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
In = ParameterLocation.Header,
Description = "Provide a JWT-token.",
Name = "Authorization",
Type = SecuritySchemeType.Http,
BearerFormat = "JWT",
Scheme = "Bearer"
});
options.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = "Bearer"
}
},
Array.Empty<string>()
}
});
});
}
}