Files
GiecChallenge/backend/GiecChallenge/Program.cs
2025-05-15 14:56:46 +02:00

116 lines
3.8 KiB
C#

using Microsoft.EntityFrameworkCore;
using GiecChallenge.Models;
using GiecChallenge.Services;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;
using Microsoft.AspNetCore.HttpOverrides;
using GiecChallenge.Profiles;
var builder = WebApplication.CreateBuilder(args);
ConfigurationManager configuration = builder.Configuration;
builder.Services.AddControllers(
options => options.SuppressImplicitRequiredAttributeForNonNullableReferenceTypes = true);
builder.Services.AddDbContext<GiecChallengeContext>(opt =>
opt.UseNpgsql(builder.Configuration.GetConnectionString("PostgreSQL")));
AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);
builder.Services.AddCors(p =>
p.AddPolicy("CORSPolicy", x => x.AllowAnyHeader()
.AllowAnyMethod()
.SetIsOriginAllowed(_ => true)
.AllowCredentials())
);
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{
c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
});
builder.Services.AddAutoMapper(
typeof(CurrencyProfile),
typeof(GroupProfile),
typeof(LanguageProfile),
typeof(ProductProfile),
typeof(PurchaseProfile),
typeof(SubGroupProfile),
typeof(UserProfile)
);
builder.Services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.SaveToken = true;
options.RequireHttpsMetadata = false;
options.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = true,
ValidateAudience = true,
ValidAudience = configuration["JWT:ValidAudience"],
ValidIssuer = configuration["JWT:ValidIssuer"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(configuration["JWT:Secret"]!))
};
});
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.All;
});
builder.Services.AddAuthorization();
addScoped();
var app = builder.Build();
app.UseForwardedHeaders();
app.UseHttpsRedirection();
app.UseRouting();
app.Use((ctx, next) =>
{
var headers = ctx.Response.Headers;
headers["Access-Control-Allow-Origin"] = configuration["OriginAllowed"];
headers["Access-Control-Allow-Credentials"] = "true";
headers["Access-Control-Allow-Headers"] = "Content-Type, X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Date, X-Api-Version, X-File-Name";
headers["Access-Control-Allow-Methods"] = "POST,GET,PUT,PATCH,DELETE,OPTIONS";
return next();
});
app.UseCors("CORSPolicy");
app.UseAuthentication();
app.UseAuthorization();
app.UseSwagger();
app.UseSwaggerUI();
app.MapControllers();
app.MapSwagger();
app.Run();
void addScoped() {
builder.Services.AddScoped<IAlimentRepository, AlimentService>();
builder.Services.AddScoped<IProductRepository, ProductService>();
builder.Services.AddScoped<ICurrencyRepository, Currencieservice>();
builder.Services.AddScoped<IGroupRepository, GroupService>();
builder.Services.AddScoped<ISubGroupRepository, SubGroupService>();
builder.Services.AddScoped<ILanguageRepository, LanguageService>();
builder.Services.AddScoped<IUserRepository, UserService>();
builder.Services.AddScoped<IPurchaseRepository, PurchaseService>();
}