import type { DynamicExpression, JsonValue, RestRequest } from '../shared'; /** * 数据查询核心配置 * * 【架构定位】: * * 这是一个极其强大的多态联合类型 (Polymorphism Union Type)。 * 它决定了当前这个 `Query` 到底是通过什么“物理手段”去获取数据的。 * * 引擎实现指引: * * 渲染引擎(或数据请求层)在执行 `Query` 时,必须写一个 `switch (config.type)`。 * * - 如果是 'static',O(1) 复杂度直接返回内存里的死数据。 * - 如果是 'rest',提取其绑定的 dataSourceId,组装 Axios 请求发给网关。 * - 未来如果是 'database',则通过 WebSocket 或专用代理发给后端执行 SQL。 */ export type QueryConfig = | QueryConfigByStatic | QueryConfigByRest | QueryConfigByGraphql | QueryConfigByDatabase | QueryConfigByCode; /** * 静态查询配置 * * 核心价值: * * 1. 跨组件复用:定义如“全国省份列表”等被多个组件同时绑定的全局字典数据。 * 2. 接口 Mock:当后端真实 API 尚未开发完毕时,作为临时数据源占位。 * 一旦后端就绪,只需在设计器将此配置一键切换为 `QueryConfigByRest`, * 所有绑定了此 Query 的前端组件无需任何修改即可平滑接入真数据。 */ export interface QueryConfigByStatic { type: 'static'; /** * 静态的、硬编码的全局数据。 * 必须是合法的纯净 JSON(使用 JsonValue 锁死序列化底线,坚决不用 any)。 */ data: JsonValue; } /** * RESTful 查询配置 * * 占据了低代码数据获取 90% 以上场景的主力网络通信配置。 */ export interface QueryConfigByRest { type: 'rest'; /** * HTTP 请求方法 * * 注:在 CQRS 架构中,即使是一个 POST 请求(如 GraphQL 的查询,或带有复杂查询体的高级搜索), * 只要它是幂等的且不修改服务端状态,它在低代码中依然属于 `Query`(查询),而非 `Mutation`(变更)。 */ method: 'GET' | 'POST'; /** * 请求体配置 * * 极其关键的双模逃生舱设计 (Dual-Mode Design): * 它引入了定义在 `core/rest-request.ts` 中的 `RestRequest` 类型 * (`RestRequestByFixed | RestRequestByCode`)。 * * 允许用户既能通过可视化表单填死 url/params, * 又能通过手写 JS 代码,根据全局变量动态拼装出极其复杂的请求头和加密签名。 */ request: RestRequest; /** * 接口超时时间 (毫秒 ms) * * 如果不启用,引擎应使用全局 DataSource 配置的超时,或默认的浏览器超时(如 30s)。 */ timeout: { enabled: boolean; duration: number; }; } // TODO: GraphQL 查询配置,暂不实现 export interface QueryConfigByGraphql { type: 'graphql'; } // TODO: 数据库查询配置,暂不实现 export interface QueryConfigByDatabase { type: 'database'; } // TODO: 代码查询配置,暂不实现 export interface QueryConfigByCode extends DynamicExpression {}