2024-08-31 20:59:42 -05:00

142 lines
5.2 KiB
C#

using API.Authentication;
using API.Authentication.Interfaces;
using API.Hashing;
using API.Hashing.Interfaces;
using API.Services;
using API.Services.Interfaces;
using DAL.Contexts;
using DAL.Models;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.EntityFrameworkCore;
using Serilog;
using System.Reflection;
using ConfigurationManager = Microsoft.Extensions.Configuration.ConfigurationManager;
using InvalidOperationException = System.InvalidOperationException;
namespace API
{
internal static class Program
{
public static IServiceCollection AddLazyResolution(this IServiceCollection services)
{
return services.AddTransient(
typeof(Lazy<>),
typeof(LazilyResolved<>));
}
private class LazilyResolved<T> : Lazy<T>
{
public LazilyResolved(IServiceProvider serviceProvider)
: base(serviceProvider.GetRequiredService<T>)
{
}
}
public static void Main(string[] args)
{
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
ConfigurationManager configManager = builder.Configuration;
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(options =>
{
string xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
string xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
options.IncludeXmlComments(xmlPath, true);
});
builder.Host.UseSerilog((context, configuration) => configuration.ReadFrom.Configuration(context.Configuration));
builder.Services.AddDbContext<SASGContext>(options => { options.UseMySQL(builder.Configuration["connectionString"] ?? throw new InvalidOperationException("Connection String is null")); });
builder.Services.AddTransient<ColorService>();
builder.Services.AddTransient<EventService>();
builder.Services.AddTransient<GrantService>();
builder.Services.AddTransient<ImageService>();
builder.Services.AddTransient<PermissionService>();
builder.Services.AddTransient<SavedEventService>();
builder.Services.AddTransient<SignupService>();
builder.Services.AddTransient<UserService>(options =>
{
ILogger<UserService> logger = options.GetRequiredService<ILogger<UserService>>();
SASGContext context = options.GetRequiredService<SASGContext>();
IUserAuthentication authentication = options.GetRequiredService<IUserAuthentication>();
PermissionService permissionService = options.GetRequiredService<PermissionService>();
ulong defaultUserPermission = UInt64.Parse(builder.Configuration["defaultUserPermission"] ?? throw new InvalidOperationException("defaultUserPermission is null"));
return new UserService(logger, context, authentication, permissionService, defaultUserPermission);
});
builder.Services.AddTransient<IColorAuthentication, ColorAuthentication>();
builder.Services.AddTransient<IEventAuthentication, EventAuthentication>();
builder.Services.AddTransient<IGrantAuthentication, GrantAuthentication>();
builder.Services.AddTransient<IImageAuthentication, ImageAuthentication>();
builder.Services.AddTransient<IColorAuthentication, ColorAuthentication>();
builder.Services.AddTransient<IPermissionAuthentication, PermissionAuthentication>();
builder.Services.AddTransient<ISavedEventAuthentication, SavedEventAuthentication>();
builder.Services.AddTransient<IUserAuthentication, UserAuthentication>();
builder.Services.AddTransient<ISignupAuthentication, SignupAuthentication>();
builder.Services.AddTransient<IHashingFactory, HashingFactory>();
builder.Services.AddTransient<IHashingAlgorithm, Pbkdf2>();
builder.Services.AddTransient<IGrantManager, GrantManager>();
builder.Services.AddTransient<IUserManager, UserManager>(options =>
{
UserService userService = options.GetRequiredService<UserService>();
IHashingFactory hashingFactory = options.GetRequiredService<IHashingFactory>();
ILogger<UserManager> logger = options.GetRequiredService<ILogger<UserManager>>();
HashingType hashingType;
if (!Enum.TryParse(builder.Configuration["preferredHashingType"], out hashingType))
throw new InvalidOperationException($"preferredHashingType not one of {String.Join(", ", Enum.GetNames(typeof(HashingType)))}");
return new UserManager(userService, hashingFactory, logger, hashingType);
});
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options =>
{
options.Events.OnRedirectToAccessDenied = context =>
{
context.Response.StatusCode = 403;
return Task.CompletedTask;
};
});
// builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(options =>
// {
// options.Cookie.SameSite = SameSiteMode.None;
// options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
// });
builder.Services.AddLazyResolution();
WebApplication app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseCookiePolicy(new CookiePolicyOptions
{
MinimumSameSitePolicy = SameSiteMode.Strict
});
app.UseAuthorization();
app.UseCors(builder => {
builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
});
app.UseHttpsRedirection();
app.MapControllers();
app.Run();
}
}
}