60 lines
3.2 KiB
TypeScript
60 lines
3.2 KiB
TypeScript
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<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> = {
|
||
priority?: number;
|
||
type: 'data';
|
||
entity: T;
|
||
mt?: ModiTurn;
|
||
action: Omit<ED[T]['Action'], 'remove'> | Array<Omit<ED[T]['Action'], 'remove'>>;
|
||
checker: (data: Readonly<ED[T]['Create']['data'] | ED[T]['Update']['data']>, context: Cxt) => SyncOrAsync<any>;
|
||
};
|
||
export type RowChecker<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> = {
|
||
priority?: number;
|
||
type: 'row';
|
||
entity: T;
|
||
mt?: ModiTurn;
|
||
action: ED[T]['Action'] | Array<ED[T]['Action']>;
|
||
filter: ED[T]['Filter'] | ((operation: ED[T]['Operation'] | ED[T]['Selection'], context: Cxt, option: OperateOption | SelectOption) => SyncOrAsync<ED[T]['Filter'] | undefined>);
|
||
errMsg?: string;
|
||
err?: new (msg?: string) => OakException<ED>;
|
||
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<ED[T]['Filter']>);
|
||
};
|
||
export type LogicalChecker<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> = {
|
||
priority?: number;
|
||
type: 'logical' | 'logicalData';
|
||
mt?: ModiTurn;
|
||
entity: T;
|
||
action: ED[T]['Action'] | Array<ED[T]['Action']>;
|
||
checker: (operation: ED[T]['Operation'] | ED[T]['Selection'], context: Cxt, option: OperateOption | SelectOption) => SyncOrAsync<any>;
|
||
conditionalFilter?: ED[T]['Filter'] | ((operation: ED[T]['Operation'], context: Cxt, option: OperateOption) => SyncOrAsync<ED[T]['Filter']>);
|
||
};
|
||
export type Checker<ED extends EntityDict & BaseEntityDict, T extends keyof ED, Cxt extends AsyncContext<ED> | SyncContext<ED>> = DataChecker<ED, T, Cxt> | RowChecker<ED, T, Cxt> | LogicalChecker<ED, T, Cxt>;
|
||
export type AuthDef<ED extends EntityDict & BaseEntityDict, T extends keyof ED> = {
|
||
relationAuth?: CascadeRelationAuth<NonNullable<ED[T]['Relation']>>;
|
||
actionAuth?: CascadeActionAuth<ED[T]['Action']>;
|
||
cascadeRemove?: {
|
||
[E in (keyof ED | keyof ED[T]['Schema'] | '@entity')]?: ActionOnRemove;
|
||
};
|
||
};
|
||
export type CascadeRemoveDefDict<ED extends EntityDict & BaseEntityDict> = {
|
||
[T in keyof ED]?: {
|
||
[E in (keyof ED | keyof ED[T]['Schema'] | '@entity')]?: ActionOnRemove;
|
||
};
|
||
};
|
||
export type AuthDefDict<ED extends EntityDict & BaseEntityDict> = {
|
||
[K in keyof ED]?: AuthDef<ED, K>;
|
||
};
|