import { CascadeActionAuth, RelationHierarchy, CascadeRelationAuth, ActionOnRemove } from "."; import { AsyncContext } from "../store/AsyncRowStore"; import { SyncContext } from "../store/SyncRowStore"; import { EntityDict, OperateOption, SelectOption } from "../types/Entity"; import { RefOrExpression } from "./Expression"; export type CheckerType = 'relation' | 'row' | 'data' | 'logical' | 'logicalRelation'; /** * conditionalFilter是指该action发生时,operation所操作的行中有满足conditionalFilter的行 * 被转化成trigger的filter条件,详细可看trigger中的说明 */ export type DataChecker | SyncContext> = { priority?: number; type: 'data'; entity: T; action: Omit | Array>; checker: (data: ED[T]['Create']['data'] | ED[T]['Update']['data'], context: Cxt) => any | Promise; conditionalFilter?: ED[T]['Update']['filter'] | ( (operation: ED[T]['Operation'], context: Cxt, option: OperateOption) => ED[T]['Update']['filter'] | Promise ); }; export type RowChecker | SyncContext> = { priority?: number; type: 'row'; entity: T; action: Omit | Array>; filter: ED[T]['Selection']['filter'] | ( (operation: ED[T]['Operation'] | ED[T]['Selection'], context: Cxt, option: OperateOption | SelectOption) => ED[T]['Selection']['filter'] | Promise ); // 对行的额外检查条件 errMsg?: string; inconsistentRows?: { // 因为这里的限制不一定在本row上,如果不传这个exception,则默认返回本row上的exception entity: keyof ED; selection: (filter?: ED[T]['Selection']['filter']) => ED[keyof ED]['Selection']; }; conditionalFilter?: ED[T]['Update']['filter'] | ( (operation: ED[T]['Operation'], context: Cxt, option: OperateOption) => ED[T]['Update']['filter'] | Promise ); }; export type RelationChecker | SyncContext> = { priority?: number; type: 'relation'; entity: T; when?: 'after'; action: ED[T]['Action'] | Array; relationFilter: (operation: ED[T]['Operation'] | ED[T]['Selection'], context: Cxt, option: OperateOption | SelectOption) => ED[T]['Selection']['filter'] | Promise; // 生成一个额外的relation相关的filter,加在原先的filter上 errMsg: string; conditionalFilter?: ED[T]['Update']['filter'] | ( (operation: ED[T]['Operation'], context: Cxt, option: OperateOption) => ED[T]['Update']['filter'] | Promise ); }; export type LogicalChecker | SyncContext> = { priority?: number; type: 'logical'; when?: 'after'; entity: T; action: ED[T]['Action'] | Array; checker: ( operation: ED[T]['Operation'] | ED[T]['Selection'], context: Cxt, option: OperateOption | SelectOption ) => any | Promise; conditionalFilter?: ED[T]['Update']['filter'] | ((operation: ED[T]['Operation'], context: Cxt, option: OperateOption) => ED[T]['Update']['filter']); }; export type LogicalRelationChecker | SyncContext> = { priority?: number; type: 'logicalRelation'; when?: 'after'; entity: T; action: ED[T]['Action'] | Array; checker: ( operation: ED[T]['Operation'] | ED[T]['Selection'], context: Cxt, option: OperateOption | SelectOption ) => any | Promise; conditionalFilter?: ED[T]['Update']['filter'] | ((operation: ED[T]['Operation'], context: Cxt, option: OperateOption) => ED[T]['Update']['filter']); }; export type Checker | SyncContext> = DataChecker | RowChecker | RelationChecker | LogicalChecker | LogicalRelationChecker; export type AuthDef = { relationAuth?: CascadeRelationAuth>; actionAuth?: CascadeActionAuth; cascadeRemove?: { [E in (keyof ED | '@entity')]?: ActionOnRemove; } }; export type AuthDefDict = { [K in keyof ED]?: AuthDef; };