api.provider.ts 1.2 KB

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