本批迁移已完成:

原生化后台只读接口:GET /api/admin/candidates
GET /api/admin/registrations
GET /api/admin/payments

保持超级、校级、班级管理员的数据范围一致。
保持证件号脱敏、审批流、考试科目、缴费信息及座位号前导零兼容。
新增灰度开关:ADMIN_NATIVE_OPERATIONAL_READS_ENABLED=true
归档、审核、缴费更新等写操作暂时继续转发 Node。
This commit is contained in:
2026-07-23 09:39:47 +08:00 Unverified
parent 518c922773
commit 95a87f0276
12 changed files with 620 additions and 11 deletions
@@ -6,7 +6,8 @@ public sealed record AdminMigrationOptions(
bool NativeAccountBatchesEnabled = false,
bool NativeConfigurationEnabled = false,
bool NativeNoticeManagementEnabled = false,
bool NativeCentersEnabled = false)
bool NativeCentersEnabled = false,
bool NativeOperationalReadsEnabled = false)
{
public static AdminMigrationOptions FromEnvironment(
bool configuredNativeReadsEnabled,
@@ -16,7 +17,8 @@ public sealed record AdminMigrationOptions(
bool configuredNativeAccountBatchesEnabled = false,
bool configuredNativeConfigurationEnabled = false,
bool configuredNativeNoticeManagementEnabled = false,
bool configuredNativeCentersEnabled = false)
bool configuredNativeCentersEnabled = false,
bool configuredNativeOperationalReadsEnabled = false)
{
var readsEnabled = ParseBoolean(
Environment.GetEnvironmentVariable("ADMIN_NATIVE_READS_ENABLED"),
@@ -37,12 +39,15 @@ public sealed record AdminMigrationOptions(
var centersEnabled = ParseBoolean(
Environment.GetEnvironmentVariable("ADMIN_NATIVE_CENTERS_ENABLED"),
configuredNativeCentersEnabled);
if ((organizationWritesEnabled || accountBatchesEnabled || configurationEnabled || noticeManagementEnabled || centersEnabled) && !readsEnabled)
var operationalReadsEnabled = ParseBoolean(
Environment.GetEnvironmentVariable("ADMIN_NATIVE_OPERATIONAL_READS_ENABLED"),
configuredNativeOperationalReadsEnabled);
if ((organizationWritesEnabled || accountBatchesEnabled || configurationEnabled || noticeManagementEnabled || centersEnabled || operationalReadsEnabled) && !readsEnabled)
{
throw new InvalidOperationException(
"启用原生组织维护接口前必须同时设置 ADMIN_NATIVE_READS_ENABLED=true");
}
var anyNativeAdminEndpointEnabled = readsEnabled || organizationWritesEnabled || accountBatchesEnabled || configurationEnabled || noticeManagementEnabled || centersEnabled;
var anyNativeAdminEndpointEnabled = readsEnabled || organizationWritesEnabled || accountBatchesEnabled || configurationEnabled || noticeManagementEnabled || centersEnabled || operationalReadsEnabled;
if (anyNativeAdminEndpointEnabled && !authenticationNativeEnabled)
{
throw new InvalidOperationException(
@@ -58,7 +63,7 @@ public sealed record AdminMigrationOptions(
"管理端仍有接口需要转发给 Node;启用原生管理端接口必须配置共享 Redis 会话");
}
return new AdminMigrationOptions(readsEnabled, organizationWritesEnabled, accountBatchesEnabled, configurationEnabled, noticeManagementEnabled, centersEnabled);
return new AdminMigrationOptions(readsEnabled, organizationWritesEnabled, accountBatchesEnabled, configurationEnabled, noticeManagementEnabled, centersEnabled, operationalReadsEnabled);
}
private static bool ParseBoolean(string? value, bool fallback) => value?.Trim().ToLowerInvariant() switch