import { inject, Provider } from '@angular/core'; import { environment } from '../../../environments/environment'; import { scopeFor } from '../acl'; import { SessionService } from '../session.service'; import { FmodeApi } from './fmode-api'; import { MockApi } from './mock-api'; import { ParseApi } from './parse-api'; /** * 数据源单开关(《数据访问层设计.md》§二) * * 🔴 这是全项目**唯一**决定"连真实还是用演示"的地方。 * 业务服务与页面只认 `FmodeApi`,不感知实现。 */ export function provideFmodeApi(): Provider { // 取值延迟到 provider 工厂执行时,便于测试替换 environment return { provide: FmodeApi, useFactory: () => { if (environment.useMockData) return new MockApi(); // - 令牌读取器:每次调用实时取 SessionService 的令牌(避免持过期副本) // - scope 判定器:由 acl.scopeFor(me) 决定请求范围 // 🔴 不硬编码 'all',否则每个用户都会拿到别人的容器(越权) const session = inject(SessionService); return new ParseApi( () => session.token() ?? '', () => scopeFor(session.me()), ); }, }; }