Fix Wave 2 review: PG18 volume path, null guards, NotAuthorized redirect, drop docker-compose, port 5433 connection strings
This commit is contained in:
@@ -15,6 +15,7 @@ Startup.ConfigureContentServices(builder.Services, contentApiUrl);
|
|||||||
Startup.ConfigureDomainServices(builder.Services);
|
Startup.ConfigureDomainServices(builder.Services);
|
||||||
|
|
||||||
// AuthBlocks WASM: auth state deserialization bridge (prerender → WASM handoff).
|
// AuthBlocks WASM: auth state deserialization bridge (prerender → WASM handoff).
|
||||||
|
// Registers AddAuthorizationCore, AddCascadingAuthenticationState, AddAuthenticationStateDeserialization.
|
||||||
AuthBlocksWeb.Client.Startup.ConfigureServices(builder.Services);
|
AuthBlocksWeb.Client.Startup.ConfigureServices(builder.Services);
|
||||||
|
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
|
|||||||
@@ -1,5 +1,13 @@
|
|||||||
<Router AppAssembly="typeof(_Imports).Assembly">
|
@inject NavigationManager NavigationManager
|
||||||
|
|
||||||
|
<Router AppAssembly="typeof(_Imports).Assembly">
|
||||||
<Found Context="routeData">
|
<Found Context="routeData">
|
||||||
<AuthorizeRouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)" />
|
<AuthorizeRouteView RouteData="routeData" DefaultLayout="typeof(Layout.MainLayout)">
|
||||||
|
<NotAuthorized>
|
||||||
|
@{
|
||||||
|
NavigationManager.NavigateTo($"account/login?returnUrl={Uri.EscapeDataString(NavigationManager.Uri)}", forceLoad: true);
|
||||||
|
}
|
||||||
|
</NotAuthorized>
|
||||||
|
</AuthorizeRouteView>
|
||||||
</Found>
|
</Found>
|
||||||
</Router>
|
</Router>
|
||||||
|
|||||||
@@ -47,7 +47,6 @@ public class TrackConfiguration : IEntityTypeConfiguration<TrackEntity>
|
|||||||
.HasMaxLength(500);
|
.HasMaxLength(500);
|
||||||
|
|
||||||
builder.Property(x => x.CreatedByUserId)
|
builder.Property(x => x.CreatedByUserId)
|
||||||
.HasColumnName("created_by_user_id")
|
.HasColumnName("created_by_user_id");
|
||||||
.IsRequired(false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -10,9 +10,9 @@ public class DeepDrftContextFactory : IDesignTimeDbContextFactory<DeepDrftContex
|
|||||||
// For 'dotnet ef' commands, set ConnectionStrings__DefaultConnection in your environment when
|
// For 'dotnet ef' commands, set ConnectionStrings__DefaultConnection in your environment when
|
||||||
// you need to actually hit the database (e.g. `dotnet ef database update`). For model-only
|
// you need to actually hit the database (e.g. `dotnet ef database update`). For model-only
|
||||||
// operations like `migrations add`, the placeholder below is sufficient — EF never connects.
|
// operations like `migrations add`, the placeholder below is sufficient — EF never connects.
|
||||||
// Example: export ConnectionStrings__DefaultConnection="Host=localhost;Database=deepdrft_dev;Username=postgres;Password=yourpassword"
|
// Example: export ConnectionStrings__DefaultConnection="Host=localhost;Port=5433;Database=postgres;Username=postgres;Password=yourpassword"
|
||||||
var connectionString = Environment.GetEnvironmentVariable("ConnectionStrings__DefaultConnection")
|
var connectionString = Environment.GetEnvironmentVariable("ConnectionStrings__DefaultConnection")
|
||||||
?? "Host=localhost;Database=deepdrft_dev;Username=postgres;Password=placeholder";
|
?? "Host=localhost;Port=5433;Database=postgres;Username=postgres;Password=placeholder";
|
||||||
|
|
||||||
var optionsBuilder = new DbContextOptionsBuilder<DeepDrftContext>();
|
var optionsBuilder = new DbContextOptionsBuilder<DeepDrftContext>();
|
||||||
optionsBuilder.UseNpgsql(connectionString);
|
optionsBuilder.UseNpgsql(connectionString);
|
||||||
|
|||||||
+19
-12
@@ -13,9 +13,6 @@ builder.Services.AddMudServices();
|
|||||||
|
|
||||||
builder.Services.AddCmsServices();
|
builder.Services.AddCmsServices();
|
||||||
|
|
||||||
// Add AudioInteropService for both server and client rendering
|
|
||||||
// builder.Services.AddScoped<AudioInteropService>();
|
|
||||||
|
|
||||||
var baseUrl = builder.GetKestrelUrl();
|
var baseUrl = builder.GetKestrelUrl();
|
||||||
var contentApiUrl = builder.Configuration["ApiUrls:ContentApi"] ?? throw new Exception("Content API URL is not configured");
|
var contentApiUrl = builder.Configuration["ApiUrls:ContentApi"] ?? throw new Exception("Content API URL is not configured");
|
||||||
|
|
||||||
@@ -23,26 +20,36 @@ var contentApiUrl = builder.Configuration["ApiUrls:ContentApi"] ?? throw new Exc
|
|||||||
// Auth schema runs in its own database (separate from DefaultConnection by design).
|
// Auth schema runs in its own database (separate from DefaultConnection by design).
|
||||||
builder.Services.AddAuthBlocks(options =>
|
builder.Services.AddAuthBlocks(options =>
|
||||||
{
|
{
|
||||||
options.ConnectionString = builder.Configuration.GetConnectionString("Auth")!;
|
options.ConnectionString = builder.Configuration.GetConnectionString("Auth")
|
||||||
|
?? throw new InvalidOperationException("ConnectionStrings:Auth is required");
|
||||||
options.ApplicationName = "DeepDrft";
|
options.ApplicationName = "DeepDrft";
|
||||||
options.SupportEmail = builder.Configuration["AuthBlocks:SupportEmail"] ?? "admin@deepdrft.com";
|
options.SupportEmail = builder.Configuration["AuthBlocks:SupportEmail"] ?? "admin@deepdrft.com";
|
||||||
|
|
||||||
options.JwtSettings.Secret = builder.Configuration["AuthBlocks:Jwt:Secret"]!;
|
options.JwtSettings.Secret = builder.Configuration["AuthBlocks:Jwt:Secret"]
|
||||||
options.JwtSettings.Issuer = builder.Configuration["AuthBlocks:Jwt:Issuer"]!;
|
?? throw new InvalidOperationException("AuthBlocks:Jwt:Secret is required");
|
||||||
options.JwtSettings.Audience = builder.Configuration["AuthBlocks:Jwt:Audience"]!;
|
options.JwtSettings.Issuer = builder.Configuration["AuthBlocks:Jwt:Issuer"]
|
||||||
|
?? throw new InvalidOperationException("AuthBlocks:Jwt:Issuer is required");
|
||||||
|
options.JwtSettings.Audience = builder.Configuration["AuthBlocks:Jwt:Audience"]
|
||||||
|
?? throw new InvalidOperationException("AuthBlocks:Jwt:Audience is required");
|
||||||
|
|
||||||
options.EmailConnection.Host = builder.Configuration["AuthBlocks:Email:Host"]!;
|
options.EmailConnection.Host = builder.Configuration["AuthBlocks:Email:Host"]
|
||||||
options.EmailConnection.Token = builder.Configuration["AuthBlocks:Email:Token"]!;
|
?? throw new InvalidOperationException("AuthBlocks:Email:Host is required");
|
||||||
|
options.EmailConnection.Token = builder.Configuration["AuthBlocks:Email:Token"]
|
||||||
|
?? throw new InvalidOperationException("AuthBlocks:Email:Token is required");
|
||||||
|
|
||||||
options.AdminUserSettings = new AdminUserSettings
|
options.AdminUserSettings = new AdminUserSettings
|
||||||
{
|
{
|
||||||
UserName = builder.Configuration["AuthBlocks:Admin:UserName"]!,
|
UserName = builder.Configuration["AuthBlocks:Admin:UserName"]
|
||||||
Email = builder.Configuration["AuthBlocks:Admin:Email"]!,
|
?? throw new InvalidOperationException("AuthBlocks:Admin:UserName is required"),
|
||||||
Password = builder.Configuration["AuthBlocks:Admin:Password"]!
|
Email = builder.Configuration["AuthBlocks:Admin:Email"]
|
||||||
|
?? throw new InvalidOperationException("AuthBlocks:Admin:Email is required"),
|
||||||
|
Password = builder.Configuration["AuthBlocks:Admin:Password"]
|
||||||
|
?? throw new InvalidOperationException("AuthBlocks:Admin:Password is required")
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
// AuthBlocksWeb: Blazor JWT client services (auth API is mounted on this same host via MapAuthBlocks).
|
// AuthBlocksWeb: Blazor JWT client services (auth API is mounted on this same host via MapAuthBlocks).
|
||||||
|
// AuthBlocksWeb.Startup.ConfigureAuthServices registers AddCascadingAuthenticationState server-side.
|
||||||
AuthBlocksWeb.Startup.ConfigureAuthServices(builder.Services, baseUrl);
|
AuthBlocksWeb.Startup.ConfigureAuthServices(builder.Services, baseUrl);
|
||||||
|
|
||||||
DeepDrftWeb.Client.Startup.ConfigureApiHttpClient(builder.Services, baseUrl);
|
DeepDrftWeb.Client.Startup.ConfigureApiHttpClient(builder.Services, baseUrl);
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
},
|
},
|
||||||
"AllowedHosts": "*",
|
"AllowedHosts": "*",
|
||||||
"ConnectionStrings": {
|
"ConnectionStrings": {
|
||||||
"DefaultConnection": "Host=localhost;Database=deepdrft_dev;Username=postgres;Password=REPLACE_IN_ENV"
|
"DefaultConnection": "Host=localhost;Port=5433;Database=postgres;Username=postgres;Password=REPLACE_IN_ENV"
|
||||||
},
|
},
|
||||||
"ApiUrls": {
|
"ApiUrls": {
|
||||||
"ContentApi": "http://localhost:12777/"
|
"ContentApi": "http://localhost:12777/"
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
<configuration>
|
<configuration>
|
||||||
<packageSources>
|
<packageSources>
|
||||||
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
|
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
|
||||||
|
<!-- Machine-specific local feed — update path if not at C:\Development\AuthBlocks\nupkgs\ -->
|
||||||
<add key="AuthBlocks-local" value="C:\Development\AuthBlocks\nupkgs\" />
|
<add key="AuthBlocks-local" value="C:\Development\AuthBlocks\nupkgs\" />
|
||||||
</packageSources>
|
</packageSources>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
services:
|
|
||||||
postgres:
|
|
||||||
image: postgres:18
|
|
||||||
environment:
|
|
||||||
POSTGRES_USER: postgres
|
|
||||||
POSTGRES_PASSWORD: postgres
|
|
||||||
POSTGRES_DB: deepdrft_dev
|
|
||||||
ports:
|
|
||||||
- "5432:5432"
|
|
||||||
volumes:
|
|
||||||
- deepdrft_postgres:/var/lib/postgresql/data
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
deepdrft_postgres:
|
|
||||||
Reference in New Issue
Block a user