refactor(platform): migrate Tenant to anemia model, use Manager pattern
- Convert Tenant to anemia model with long Id (no strong-typed ID) - Add ApplicationUser, ApplicationRole to Platform.Domain (inherit Identity) - Add TenantInfo value object for user-tenant redundancy - Implement TenantManager/TenantStore in Platform.Infrastructure - Update PlatformDbContext to inherit IdentityDbContext - Migrate AuthService and Console to use Platform entities - Remove old TenantRepository (replaced by TenantManager) - Update AGENTS.md documentation
This commit is contained in:
parent
d32b44bfc4
commit
f33acacbbc
57
Program.cs
57
Program.cs
@ -1,18 +1,14 @@
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using Fengling.Console.Repositories;
|
|
||||||
using Fengling.Console.Services;
|
using Fengling.Console.Services;
|
||||||
using Fengling.Console.Stores;
|
using Fengling.Platform.Domain.AggregatesModel.UserAggregate;
|
||||||
using Fengling.Console.Managers;
|
using Fengling.Platform.Domain.AggregatesModel.RoleAggregate;
|
||||||
using Fengling.Platform.Infrastructure.Repositories;
|
using Fengling.Platform.Infrastructure;
|
||||||
using OpenIddict.Abstractions;
|
using OpenIddict.Abstractions;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
using Microsoft.AspNetCore.Authentication.JwtBearer;
|
||||||
using Microsoft.AspNetCore.Identity;
|
using Microsoft.AspNetCore.Identity;
|
||||||
using Microsoft.IdentityModel.Tokens;
|
using Microsoft.IdentityModel.Tokens;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Fengling.Console.Datas;
|
|
||||||
using Fengling.Console.Models.Entities;
|
|
||||||
using Fengling.Platform.Infrastructure;
|
|
||||||
using NetCorePal.Extensions.DependencyInjection;
|
using NetCorePal.Extensions.DependencyInjection;
|
||||||
using OpenIddict.Validation.AspNetCore;
|
using OpenIddict.Validation.AspNetCore;
|
||||||
using YarpGateway.Data;
|
using YarpGateway.Data;
|
||||||
@ -21,29 +17,32 @@ var builder = WebApplication.CreateBuilder(args);
|
|||||||
|
|
||||||
builder.Services.AddControllers();
|
builder.Services.AddControllers();
|
||||||
|
|
||||||
builder.Services.AddDbContext<ApplicationDbContext>(options =>
|
// Use PlatformDbContext for all identity
|
||||||
|
builder.Services.AddDbContext<PlatformDbContext>(options =>
|
||||||
{
|
{
|
||||||
options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection"));
|
options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection"));
|
||||||
|
if (builder.Environment.IsDevelopment())
|
||||||
|
{
|
||||||
|
options.EnableSensitiveDataLogging();
|
||||||
|
}
|
||||||
|
options.EnableDetailedErrors();
|
||||||
});
|
});
|
||||||
|
|
||||||
builder.Services.AddDbContext<GatewayDbContext>(options =>
|
builder.Services.AddDbContext<GatewayDbContext>(options =>
|
||||||
options.UseNpgsql(builder.Configuration.GetConnectionString("GatewayConnection")));
|
options.UseNpgsql(builder.Configuration.GetConnectionString("GatewayConnection")));
|
||||||
|
|
||||||
builder.Services.AddDbContext<PlatformDbContext>(options =>
|
// Use Platform's identity
|
||||||
options.UseNpgsql(builder.Configuration.GetConnectionString("DefaultConnection")));
|
|
||||||
|
|
||||||
builder.Services.AddIdentity<ApplicationUser, ApplicationRole>()
|
builder.Services.AddIdentity<ApplicationUser, ApplicationRole>()
|
||||||
.AddEntityFrameworkStores<ApplicationDbContext>()
|
.AddEntityFrameworkStores<PlatformDbContext>()
|
||||||
.AddDefaultTokenProviders();
|
.AddDefaultTokenProviders();
|
||||||
|
|
||||||
builder.Services.AddHttpContextAccessor();
|
builder.Services.AddHttpContextAccessor();
|
||||||
|
|
||||||
builder.Services.AddHttpClient();
|
builder.Services.AddHttpClient();
|
||||||
builder.Services.AddScoped<IOAuthClientService, OAuthClientService>();
|
builder.Services.AddScoped<IOAuthClientService, OAuthClientService>();
|
||||||
builder.Services.AddScoped<IUserRepository, UserRepository>();
|
|
||||||
builder.Services.AddScoped<IRoleRepository, RoleRepository>();
|
|
||||||
|
|
||||||
builder.Services.AddScoped<ITenantStore<Tenant>, TenantStore>();
|
// Register Platform managers
|
||||||
|
builder.Services.AddScoped<ITenantStore, TenantStore>();
|
||||||
builder.Services.AddScoped<ITenantManager, TenantManager>();
|
builder.Services.AddScoped<ITenantManager, TenantManager>();
|
||||||
|
|
||||||
builder.Services.AddScoped<IUserService, UserService>();
|
builder.Services.AddScoped<IUserService, UserService>();
|
||||||
@ -53,7 +52,7 @@ builder.Services.AddScoped<IGatewayService, GatewayService>();
|
|||||||
builder.Services.AddScoped<IH5LinkService, H5LinkService>();
|
builder.Services.AddScoped<IH5LinkService, H5LinkService>();
|
||||||
|
|
||||||
builder.Services.AddOpenIddict()
|
builder.Services.AddOpenIddict()
|
||||||
.AddCore(options => { options.UseEntityFrameworkCore().UseDbContext<ApplicationDbContext>(); })
|
.AddCore(options => { options.UseEntityFrameworkCore().UseDbContext<PlatformDbContext>(); })
|
||||||
.AddValidation(options =>
|
.AddValidation(options =>
|
||||||
{
|
{
|
||||||
options.SetIssuer("http://localhost:5132/");
|
options.SetIssuer("http://localhost:5132/");
|
||||||
@ -88,7 +87,7 @@ builder.Services.AddEndpointsApiExplorer();
|
|||||||
builder.Services.AddSwaggerGen(c =>
|
builder.Services.AddSwaggerGen(c =>
|
||||||
{
|
{
|
||||||
c.SwaggerDoc("v1", new() { Title = "Fengling.Console API", Version = "v1" });
|
c.SwaggerDoc("v1", new() { Title = "Fengling.Console API", Version = "v1" });
|
||||||
c.CustomSchemaIds(type => type.FullName); // Use full name to avoid conflicts with YarpGateway DTOs
|
c.CustomSchemaIds(type => type.FullName);
|
||||||
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
|
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
|
||||||
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
|
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
|
||||||
if (File.Exists(xmlPath))
|
if (File.Exists(xmlPath))
|
||||||
@ -97,31 +96,13 @@ builder.Services.AddSwaggerGen(c =>
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
builder.Services.AddRepositories(typeof(PlatformDbContext).Assembly);
|
||||||
builder.Services.AddRepositories(typeof(ApplicationDbContext).Assembly,typeof(PlatformDbContext).Assembly);
|
|
||||||
|
|
||||||
builder.Services.AddDbContext<ApplicationDbContext>(options =>
|
|
||||||
{
|
|
||||||
options.UseNpgsql(builder.Configuration.GetConnectionString("PostgreSQL"));
|
|
||||||
// 仅在开发环境启用敏感数据日志,防止生产环境泄露敏感信息
|
|
||||||
if (builder.Environment.IsDevelopment())
|
|
||||||
{
|
|
||||||
options.EnableSensitiveDataLogging();
|
|
||||||
}
|
|
||||||
|
|
||||||
options.EnableDetailedErrors();
|
|
||||||
});
|
|
||||||
builder.Services.AddUnitOfWork<PlatformDbContext>();
|
|
||||||
builder.Services.AddRedisLocks();
|
|
||||||
|
|
||||||
builder.Services.AddMediatR(cfg =>
|
builder.Services.AddMediatR(cfg =>
|
||||||
cfg.RegisterServicesFromAssemblies(
|
cfg.RegisterServicesFromAssemblies(
|
||||||
Assembly.GetExecutingAssembly(),
|
Assembly.GetExecutingAssembly(),
|
||||||
typeof(PlatformDbContext).Assembly
|
typeof(PlatformDbContext).Assembly
|
||||||
)
|
));
|
||||||
.AddCommandLockBehavior()
|
|
||||||
.AddKnownExceptionValidationBehavior()
|
|
||||||
.AddUnitOfWorkBehaviors());
|
|
||||||
|
|
||||||
|
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
@ -136,4 +117,4 @@ app.UseAuthorization();
|
|||||||
|
|
||||||
app.MapControllers();
|
app.MapControllers();
|
||||||
|
|
||||||
app.Run();
|
app.Run();
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user