using System.Security.Principal; using Azure.Communication.CallAutomation; using Azure.Communication.Identity; using Azure.Communication.Rooms; using Coravel; using EnotaryoPH.Data; using EnotaryoPH.Web.Common.Hubs; using EnotaryoPH.Web.Common.Jobs; using EnotaryoPH.Web.Common.Models; using Exadel.Compreface.Clients.CompreFaceClient; using Microsoft.AspNetCore.Authentication.Cookies; using Syncfusion.Licensing; namespace EnotaryoPH.Web { public class Program { public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options => options.LoginPath = new Microsoft.AspNetCore.Http.PathString("/Login")); builder.Services.AddAuthorization(options => options.AddPolicy("PrincipalPolicy", policy => policy.RequireRole(nameof(UserType.Principal)))); builder.Services.AddAuthorization(options => options.AddPolicy("ParticipantPolicy", policy => policy.RequireRole(nameof(UserType.Witness), nameof(UserType.Principal)))); var razorBuilder = builder.Services.AddRazorPages(options => { options.Conventions.AuthorizeFolder("/Principal", "PrincipalPolicy"); options.Conventions.AuthorizeFolder("/Participant/Registration/Steps", "ParticipantPolicy"); options.Conventions.AuthorizeFolder("/Participant/VideoCall"); }); #if DEBUG razorBuilder.AddRazorRuntimeCompilation(); #endif builder.Services.AddSignalR(); builder.Services.AddSingleton(); var config = builder.Configuration; builder.Services.AddTransient(provider => config); SyncfusionLicenseProvider.RegisterLicense(config.GetValue("SyncfusionLicenseKey")); builder.Services.AddDbContext(); builder.Services.AddHttpContextAccessor(); builder.Services.AddSession(options => options.IdleTimeout = TimeSpan.FromMinutes(120)); builder.Services.AddTransient(provider => provider.GetService()?.HttpContext?.User); builder.Services.AddTransient(provider => new Settings { BaseUrl = config.GetValue("BaseUrl") ?? "" }); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(provider => { var host = config.GetValue("CompreFaceConfig:Host"); var port = config.GetValue("CompreFaceConfig:Port"); return new CompreFaceClient(host, port); }); builder.Services.AddQueue(); builder.Services.AddMailer(config); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddScoped(provider => { var connectionString = config.GetConnectionString("AzureCommunication"); return string.IsNullOrEmpty(connectionString) ? throw new InvalidConfigurationException("AzureCommunication", string.Empty) : new RoomsClient(connectionString); }); builder.Services.AddScoped(provider => { var connectionString = config.GetConnectionString("AzureCommunication"); return string.IsNullOrEmpty(connectionString) ? throw new InvalidConfigurationException("AzureCommunication", string.Empty) : new CommunicationIdentityClient(connectionString); }); builder.Services.AddScoped(provider => { var connectionString = config.GetConnectionString("AzureCommunication"); return string.IsNullOrEmpty(connectionString) ? throw new InvalidConfigurationException("AzureCommunication", string.Empty) : new CallAutomationClient(connectionString); }); var app = builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseSession(); app.Use(async (context, next) => { var key = "X-Session-ID"; var value = context.Request.Cookies[key]; if (string.IsNullOrEmpty(value)) { value = context.Session.Id; } if (string.IsNullOrEmpty(context.Session.GetString(key))) { context.Session.SetString(key, value); } context.Response.Cookies.Append(key, value); await next.Invoke(); }); app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); app.MapStaticAssets(); app.MapRazorPages() .WithStaticAssets(); app.MapHub("/notificationHub"); app.Run(); } } }