| 12345678910111213141516171819202122232425262728293031 |
- 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()),
- );
- },
- };
- }
|