oak-domain/lib/types/Auth.d.ts

60 lines
3.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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>;
};