configStatus.js 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /**
  2. * 配置与数据源的词汇 + 「状态 → 视觉键」映射(票 04,纯函数、可脱浏览器断言)。
  3. *
  4. * 和 domain/statusTones.js 一样:这里只决定「状态叫什么、用哪个色键、标签怎么写」,
  5. * 不做业务判断,也不碰网络。配置服务(services/cockpitConfig.js)反过来依赖这里的常量。
  6. */
  7. /** 配置加载三态(票 04 验收:成功 / 失败 / 缺失都要能演示)。 */
  8. export const CONFIG_STATE = {
  9. READY: 'ready',
  10. MISSING: 'missing',
  11. FAILED: 'failed',
  12. }
  13. /** 数据源两态:默认 mock,真实接口必须由部署配置显式开启。 */
  14. export const DATA_SOURCE = {
  15. MOCK: 'mock',
  16. REAL: 'real',
  17. }
  18. /** 前端是否自带只读 token;REST 免鉴权后该值恒为 `none`(ADR 0005 修订),保留供状态视图判断。 */
  19. export const CREDENTIAL = {
  20. CONFIG: 'config',
  21. NONE: 'none',
  22. }
  23. /**
  24. * 把配置加载结果映射成顶栏标签用的视图模型。
  25. * @param {object} state services/cockpitConfig.js 的加载结果
  26. * @returns {{state: string, tone: string, label: string, detail: string, dataSource: string}}
  27. */
  28. export function configStatusView(state) {
  29. const current = state || {}
  30. const config = current.config || {}
  31. const dataSource = config.dataSource === DATA_SOURCE.REAL ? DATA_SOURCE.REAL : DATA_SOURCE.MOCK
  32. if (current.state === CONFIG_STATE.READY) {
  33. return {
  34. state: CONFIG_STATE.READY,
  35. dataSource,
  36. tone: 'lv4',
  37. label: `配置就绪 · 数据源 ${dataSource}`,
  38. // ADR 0005 修订(2026-09-28):驾驶舱 REST 免鉴权,接口安全由网络层内网隔离保障。
  39. detail: dataSource === DATA_SOURCE.REAL ? '接口免鉴权(内网隔离)' : '',
  40. }
  41. }
  42. if (current.state === CONFIG_STATE.FAILED) {
  43. return {
  44. state: CONFIG_STATE.FAILED,
  45. dataSource,
  46. tone: 'lv1',
  47. label: '配置载入失败 · 数据不可用',
  48. detail: current.error || '',
  49. }
  50. }
  51. return {
  52. state: CONFIG_STATE.MISSING,
  53. dataSource,
  54. tone: 'neutral',
  55. label: '配置缺失 · 用内置默认(mock)',
  56. detail: current.url ? `尝试过 ${current.url}` : '',
  57. }
  58. }
  59. /** 数据不可用分区统一文案(票 05 起各分区据此渲染,票 04 只定义措辞,避免各处自造)。 */
  60. export const DATA_UNAVAILABLE_LABEL = '数据不可用'
  61. /**
  62. * 请求失败原因 → 是否属于「凭据类失败」(这类失败按 ADR 0005 只标数据不可用,绝不跳登录页)。
  63. * @param {string} reason services/cockpitApi.js 的 REQUEST_REASON
  64. */
  65. export function isCredentialFailure(reason) {
  66. return reason === 'unauthorized' || reason === 'no-credential'
  67. }