import { CascadeActionAuth, CascadeRelationAuth, ActionOnRemove, SyncOrAsync, OakException } from "."; import { AsyncContext } from "../store/AsyncRowStore"; import { SyncContext } from "../store/SyncRowStore"; import { EntityDict, OperateOption, SelectOption } from "../types/Entity"; import { EntityDict as BaseEntityDict } from '../base-app-domain'; import { ModiTurn } from './Trigger'; export type CheckerType = 'row' | 'data' | 'logical' | 'logicalData' | 'relation'; /** * conditionalFilter是指该action发生时,operation所操作的行中有满足conditionalFilter的行 * 被转化成trigger的filter条件,详细可看trigger中的说明 */ export type DataChecker | SyncContext> = { priority?: number; type: 'data'; entity: T; mt?: ModiTurn; action: Omit | Array>; checker: (data: Readonly, context: Cxt) => SyncOrAsync; }; export type RowChecker | SyncContext> = { priority?: number; type: 'row'; entity: T; mt?: ModiTurn; action: ED[T]['Action'] | Array; filter: ED[T]['Filter'] | ((operation: ED[T]['Operation'] | ED[T]['Selection'], context: Cxt, option: OperateOption | SelectOption) => SyncOrAsync); errMsg?: string; err?: new (msg?: string) => OakException; inconsistentRows?: { entity: keyof ED; selection: (filter?: ED[T]['Filter']) => ED[keyof ED]['Selection']; }; conditionalFilter?: ED[T]['Filter'] | ((operation: ED[T]['Operation'], context: Cxt, option: OperateOption) => SyncOrAsync); }; export type LogicalChecker | SyncContext> = { priority?: number; type: 'logical' | 'logicalData'; mt?: ModiTurn; entity: T; action: ED[T]['Action'] | Array; checker: (operation: ED[T]['Operation'] | ED[T]['Selection'], context: Cxt, option: OperateOption | SelectOption) => SyncOrAsync; conditionalFilter?: ED[T]['Filter'] | ((operation: ED[T]['Operation'], context: Cxt, option: OperateOption) => SyncOrAsync); }; export type Checker | SyncContext> = DataChecker | RowChecker | LogicalChecker; export type AuthDef = { relationAuth?: CascadeRelationAuth>; actionAuth?: CascadeActionAuth; cascadeRemove?: { [E in (keyof ED | keyof ED[T]['Schema'] | '@entity')]?: ActionOnRemove; }; }; export type CascadeRemoveDefDict = { [T in keyof ED]?: { [E in (keyof ED | keyof ED[T]['Schema'] | '@entity')]?: ActionOnRemove; }; }; export type AuthDefDict = { [K in keyof ED]?: AuthDef; };