import { SelectOption, CheckerType } from "."; import { GenericAction } from "../actions/action"; import { AsyncContext } from "../store/AsyncRowStore"; import { SyncContext } from "../store/SyncRowStore"; import { EntityDict, OperateOption } from "../types/Entity"; import { EntityShape } from "../types/Entity"; /** * 优先级越小,越早执行。定义在1~99之间 */ export declare const TRIGGER_DEFAULT_PRIORITY = 50; export declare const TRIGGER_MIN_PRIORITY = 1; export declare const TRIGGER_MAX_PRIORITY = 99; export declare const DATA_CHECKER_DEFAULT_PRIORITY = 60; export declare const CHECKER_DEFAULT_PRIORITY = 99; interface TriggerBase { checkerType?: CheckerType; entity: T; name: string; priority?: number; } export interface CreateTriggerBase | SyncContext> extends TriggerBase { action: 'create'; check?: (operation: ED[T]['Create']) => boolean; fn: (event: { operation: ED[T]['Create']; }, context: Cxt, option: OperateOption) => Promise | number; } export interface CreateTriggerInTxn | SyncContext> extends CreateTriggerBase { when: 'before' | 'after'; } export interface CreateTriggerCrossTxn | SyncContext> extends CreateTriggerBase { when: 'commit'; strict?: 'takeEasy' | 'makeSure'; } export declare type CreateTrigger | SyncContext> = CreateTriggerInTxn | CreateTriggerCrossTxn; /** * update trigger如果带有filter,说明只对存在限定条件的行起作用。此时系统在进行相应动作时, * 会判定当前动作的filter条件和trigger所定义的filter是否有交集(即有同时满足两个条件的行) * 只要有,就会触发trigger。要注意的是这个条件是exists而不是all */ export interface UpdateTriggerBase | SyncContext> extends TriggerBase { action: Exclude | 'update' | Array | 'update'>; attributes?: keyof ED[T]['OpSchema'] | Array; check?: (operation: ED[T]['Update']) => boolean; fn: (event: { operation: ED[T]['Update']; }, context: Cxt, option: OperateOption) => Promise | number; filter?: ED[T]['Update']['filter'] | ((operation: ED[T]['Update'], context: Cxt, option: OperateOption) => ED[T]['Update']['filter'] | Promise); } export interface UpdateTriggerInTxn | SyncContext> extends UpdateTriggerBase { when: 'before' | 'after'; } export interface UpdateTriggerCrossTxn | SyncContext> extends UpdateTriggerBase { when: 'commit'; strict?: 'takeEasy' | 'makeSure'; } export declare type UpdateTrigger | SyncContext> = UpdateTriggerInTxn | UpdateTriggerCrossTxn; /** * 同update trigger一样,remove trigger如果带有filter,说明只对存在限定条件的行起作用。此时系统在进行相应动作时, * 会判定当前动作的filter条件和trigger所定义的filter是否有交集(即有同时满足两个条件的行) * 只要有,就会触发trigger。要注意的是这个条件是exists而不是all */ export interface RemoveTriggerBase | SyncContext> extends TriggerBase { action: 'remove'; check?: (operation: ED[T]['Remove']) => boolean; fn: (event: { operation: ED[T]['Remove']; }, context: Cxt, option: OperateOption) => Promise | number; filter?: ED[T]['Remove']['filter'] | ((operation: ED[T]['Remove'], context: Cxt, option: OperateOption) => ED[T]['Remove']['filter'] | Promise); } export interface RemoveTriggerInTxn | SyncContext> extends RemoveTriggerBase { when: 'before' | 'after'; } export interface RemoveTriggerCrossTxn | SyncContext> extends RemoveTriggerBase { when: 'commit'; strict?: 'takeEasy' | 'makeSure'; } export declare type RemoveTrigger | SyncContext> = RemoveTriggerInTxn | RemoveTriggerCrossTxn; export interface SelectTriggerBase extends TriggerBase { action: 'select'; } /** * selection似乎不需要支持跨事务?没想清楚 * todo by Xc */ export interface SelectTriggerBefore | SyncContext> extends SelectTriggerBase { when: 'before'; fn: (event: { operation: ED[T]['Selection']; }, context: Cxt, params?: SelectOption) => Promise | number; } export interface SelectTriggerAfter | SyncContext> extends SelectTriggerBase { when: 'after'; fn: (event: { operation: ED[T]['Selection']; result: Partial[]; }, context: Cxt, params?: SelectOption) => Promise | number; } export declare type SelectTrigger | SyncContext> = SelectTriggerBefore | SelectTriggerAfter; export declare type Trigger | SyncContext> = CreateTrigger | UpdateTrigger | RemoveTrigger | SelectTrigger; export interface TriggerEntityShape extends EntityShape { $$triggerData$$?: { name: string; operation: object; }; $$triggerTimestamp$$?: number; } export {};