fe5ff81c98
## Overview This PR completes the architectural consolidation of the web project and stabilizes the Identity-based authentication flow for the NexusReader application. It also refines the UI aesthetic for the Book Ingestion Modal as requested in #33. ## Key Changes - **Project Consolidation**: Fully merged `NexusReader.Web.New` into `NexusReader.Web`. This includes updating all namespace references, VS Code launch/task configurations, and CI/CD (`Dockerfile`). - **Identity Stabilization**: - Implemented `IIdentityService` on the server using `SignInManager<NexusUser>` and `UserManager<NexusUser>`. - Fixed registration logic to include mandatory fields (`SubscriptionPlanId`, `TenantId`). - Updated `Login.razor` to force a page reload on successful login, ensuring proper synchronization of authentication cookies between SignalR and the browser. - **UI/UX Refinement**: - Updated `BookIngestionModal` styling to follow the **Nexus Neon** design system. - Added premium button styles with hover effects and glows. - Improved modal layout and interaction feedback (shimmer effects, spinner colors). - **Cleanup**: Removed obsolete interfaces and constants that were superseded by newer Application layer implementations. ## Verification - Successfully built the solution: `dotnet build NexusReader.slnx --no-restore` - Verified project structure and file moves. - Validated server-side authentication logic. Fixes #33 --------- Co-authored-by: Marek Jasiński <jasins.marek@gmail.com> Reviewed-on: #40 Co-authored-by: Antigravity <antigravity@google.com> Co-committed-by: Antigravity <antigravity@google.com>
46 lines
1.8 KiB
C#
46 lines
1.8 KiB
C#
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.EntityFrameworkCore.Design;
|
|
using Microsoft.Extensions.Configuration;
|
|
using Pgvector.EntityFrameworkCore;
|
|
|
|
namespace NexusReader.Data.Persistence;
|
|
|
|
public class AppDbContextFactory : IDesignTimeDbContextFactory<AppDbContext>
|
|
{
|
|
public AppDbContext CreateDbContext(string[] args)
|
|
{
|
|
var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Development";
|
|
|
|
// Try to find the Web project directory by looking for the solution root
|
|
var currentDir = new DirectoryInfo(Directory.GetCurrentDirectory());
|
|
while (currentDir != null && !File.Exists(Path.Combine(currentDir.FullName, "NexusReader.slnx")))
|
|
{
|
|
currentDir = currentDir.Parent;
|
|
}
|
|
|
|
var basePath = currentDir != null
|
|
? Path.Combine(currentDir.FullName, "src", "NexusReader.Web")
|
|
: Directory.GetCurrentDirectory();
|
|
|
|
var configuration = new ConfigurationBuilder()
|
|
.SetBasePath(basePath)
|
|
.AddJsonFile("appsettings.json", optional: true)
|
|
.AddJsonFile($"appsettings.{environment}.json", optional: true)
|
|
.AddEnvironmentVariables()
|
|
.Build();
|
|
|
|
var optionsBuilder = new DbContextOptionsBuilder<AppDbContext>();
|
|
var connectionString = configuration.GetConnectionString("PostgresConnection");
|
|
|
|
if (string.IsNullOrEmpty(connectionString))
|
|
{
|
|
// For design time, if no PG connection is found, we might be using Sqlite or just testing
|
|
connectionString = "Host=localhost;Database=nexus_reader;Username=postgres;Password=postgres";
|
|
}
|
|
|
|
optionsBuilder.UseNpgsql(connectionString, x => x.UseVector());
|
|
|
|
return new AppDbContext(optionsBuilder.Options);
|
|
}
|
|
}
|