using Admin.NET.Core;
namespace Admin.NET.Plugin.AiDOP.Infrastructure;
///
/// S8 可信作用域:租户一律由服务端从认证身份解析,
/// 客户端传入的 tenantId / factoryId / body.TenantId / body.FactoryId 不承担任何安全边界作用。
///
/// S8-TENANT-ONLY-BATCH6:Factory 已退出作用域。
/// 原实现要在租户内解析出唯一的「工厂组织」,并在 0 个或多于 1 个时**直接抛异常** ——
/// 于是零工厂 / 多工厂租户连异常列表都打不开,而工厂在 S8 里本就不决定任何数据归属。
/// 该解析连同 Type='501' 工厂组织查询一并删除:S8 不再需要知道"当前是哪个工厂"。
///
/// 安全边界没有放松:租户仍只信认证后的 JWT
/// (),绝不接受 query 里的 tenantId。
/// 去掉的是一个从不提供隔离、却经常制造故障的维度。
///
public sealed record S8TrustedScope(long TenantId)
{
///
/// 历史兼容:仍需往 factory_id 列写值的旧代码用它,语义是「租户级、无工厂」。
///
/// 刻意不叫 FactoryId —— 那个名字会让人以为它还是个作用域。
/// 它只是一个写入 legacy 列的占位值,任何查询谓词都不得使用它。
///
public long LegacyFactoryId => S8ConfigScope.GlobalFactoryId;
}
///
/// S8 租户可信作用域解析器。只解析租户,不再解析工厂。
///
public sealed class S8TrustedScopeResolver : ITransient
{
private readonly UserManager _userManager;
public S8TrustedScopeResolver(UserManager userManager) => _userManager = userManager;
/// 解析当前登录身份的 S8 可信作用域;租户无法确定时抛业务异常,绝不回落默认值。
public Task ResolveAsync() =>
Task.FromResult(new S8TrustedScope(AidopTenantScope.ResolveOrThrow(_userManager)));
}