@nymphjs/nymph
Version:
Nymph.js - Nymph ORM
229 lines (228 loc) • 11.6 kB
TypeScript
import type { EntityConstructor, EntityInterface } from './Entity.types.js';
import type Nymph from './Nymph.js';
export type NymphEventType = 'connect' | 'disconnect' | 'query' | 'beforeGetEntity' | 'beforeGetEntities' | 'beforeSaveEntity' | 'afterSaveEntity' | 'failedSaveEntity' | 'beforeDeleteEntity' | 'afterDeleteEntity' | 'failedDeleteEntity' | 'beforeDeleteEntityByID' | 'afterDeleteEntityByID' | 'failedDeleteEntityByID' | 'beforeNewUID' | 'afterNewUID' | 'failedNewUID' | 'beforeSetUID' | 'afterSetUID' | 'failedSetUID' | 'beforeRenameUID' | 'afterRenameUID' | 'failedRenameUID' | 'beforeDeleteUID' | 'afterDeleteUID' | 'failedDeleteUID' | 'beforeStartTransaction' | 'afterStartTransaction' | 'beforeCommitTransaction' | 'afterCommitTransaction' | 'beforeRollbackTransaction' | 'afterRollbackTransaction';
export type NymphConnectCallback = (nymph: Nymph, result: Promise<boolean>) => Promise<void>;
export type NymphDisconnectCallback = (nymph: Nymph, result: Promise<boolean>) => Promise<void>;
/**
* The NymphQueryCallback will be called on both top level and qref queries.
*
* This is the only callback that is not asynchronous.
*
* This also isn't necessarily run on every "query". It is run before a database
* query for an entity, but it is not run during PubSub entity change
* propagation. Therefore, it shouldn't do anything _entity_ specific, instead
* it should be _query_ specific. For example, throw an error if the user is not
* permitted to run the query at all.
*/
export type NymphQueryCallback = (nymph: Nymph, options: Options, selectors: FormattedSelector[]) => void;
export type NymphBeforeGetEntityCallback = (nymph: Nymph, options: Options, selectors: Selector[]) => Promise<void>;
export type NymphBeforeGetEntitiesCallback = (nymph: Nymph, options: Options, selectors: Selector[]) => Promise<void>;
export type NymphBeforeSaveEntityCallback = (nymph: Nymph, entity: EntityInterface) => Promise<void>;
export type NymphAfterSaveEntityCallback = (nymph: Nymph, result: Promise<boolean>) => Promise<void>;
export type NymphFailedSaveEntityCallback = (nymph: Nymph, error: any) => Promise<void>;
export type NymphBeforeDeleteEntityCallback = (nymph: Nymph, entity: EntityInterface) => Promise<void>;
export type NymphAfterDeleteEntityCallback = (nymph: Nymph, result: Promise<boolean>) => Promise<void>;
export type NymphFailedDeleteEntityCallback = (nymph: Nymph, error: any) => Promise<void>;
export type NymphBeforeDeleteEntityByIDCallback = (nymph: Nymph, guid: string, className?: string) => Promise<void>;
export type NymphAfterDeleteEntityByIDCallback = (nymph: Nymph, result: Promise<boolean>) => Promise<void>;
export type NymphFailedDeleteEntityByIDCallback = (nymph: Nymph, error: any) => Promise<void>;
export type NymphBeforeNewUIDCallback = (nymph: Nymph, name: string) => Promise<void>;
export type NymphAfterNewUIDCallback = (nymph: Nymph, result: Promise<number | null>) => Promise<void>;
export type NymphFailedNewUIDCallback = (nymph: Nymph, error: any) => Promise<void>;
export type NymphBeforeSetUIDCallback = (nymph: Nymph, name: string, value: number) => Promise<void>;
export type NymphAfterSetUIDCallback = (nymph: Nymph, result: Promise<boolean>) => Promise<void>;
export type NymphFailedSetUIDCallback = (nymph: Nymph, error: any) => Promise<void>;
export type NymphBeforeRenameUIDCallback = (nymph: Nymph, oldName: string, newName: string) => Promise<void>;
export type NymphAfterRenameUIDCallback = (nymph: Nymph, result: Promise<boolean>) => Promise<void>;
export type NymphFailedRenameUIDCallback = (nymph: Nymph, error: any) => Promise<void>;
export type NymphBeforeDeleteUIDCallback = (nymph: Nymph, name: string) => Promise<void>;
export type NymphAfterDeleteUIDCallback = (nymph: Nymph, result: Promise<boolean>) => Promise<void>;
export type NymphFailedDeleteUIDCallback = (nymph: Nymph, error: any) => Promise<void>;
export type NymphBeforeStartTransactionCallback = (nymph: Nymph, name: string) => Promise<void>;
export type NymphAfterStartTransactionCallback = (nymph: Nymph, name: string, result: Nymph) => Promise<void>;
export type NymphBeforeCommitTransactionCallback = (nymph: Nymph, name: string) => Promise<void>;
export type NymphAfterCommitTransactionCallback = (nymph: Nymph, name: string, result: boolean) => Promise<void>;
export type NymphBeforeRollbackTransactionCallback = (nymph: Nymph, name: string) => Promise<void>;
export type NymphAfterRollbackTransactionCallback = (nymph: Nymph, name: string, result: boolean) => Promise<void>;
export type Options<T extends EntityConstructor = EntityConstructor> = {
/**
* The Entity class to query.
*/
class?: T;
/**
* The limit of entities to be returned. Not needed when using `getEntity`, as
* it always returns only one.
*/
limit?: number;
/**
* The offset from the first matching entity, in order, to start retrieving.
*/
offset?: number;
/**
* If true, entities will be retrieved from newest to oldest/largest to
* smallest (with regard to `sort`).
*/
reverse?: boolean;
/**
* How to sort the entities. Should be "cdate", "mdate", or the name of a
* property.
*/
sort?: 'cdate' | 'mdate' | string;
/**
* What to return, the entities with their data, just the entity data, just
* the GUIDs, or just a count.
*
* 'object' is only available on the server, as there are substantial security
* implications with using it. It returns the full entity data as a simple
* object. You should only use it for operations where instantiating the
* entities has an unacceptable performance cost.
*/
return?: 'entity' | 'object' | 'guid' | 'count';
/**
* Will be 'client' if the query came from a REST request or the PubSub
* server. (Mainly used in Tilmeld for access control.)
*/
source?: string;
/**
* If true, Nymph will skip the cache and retrieve the entity from the DB.
*/
skipCache?: boolean;
/**
* If true, Tilmeld will not filter returned entities according to access
* controls. (If Tilmeld is installed.) (This is always set to false by the
* REST endpoint and PubSub server.)
*/
skipAc?: boolean;
};
export type Clause<C> = C | Exclude<C, undefined>[];
export type OrWithTime<T> = T | [string, null, string];
type PrimitiveSelector = {
guid?: string;
'!guid'?: PrimitiveSelector['guid'];
tag?: string;
'!tag'?: PrimitiveSelector['tag'];
defined?: string;
'!defined'?: PrimitiveSelector['defined'];
truthy?: string;
'!truthy'?: PrimitiveSelector['truthy'];
equal?: [string, any];
'!equal'?: PrimitiveSelector['equal'];
contain?: [string, any];
'!contain'?: PrimitiveSelector['contain'];
match?: [string, string];
'!match'?: PrimitiveSelector['match'];
imatch?: [string, string];
'!imatch'?: PrimitiveSelector['imatch'];
like?: [string, string];
'!like'?: PrimitiveSelector['like'];
ilike?: [string, string];
'!ilike'?: PrimitiveSelector['ilike'];
gt?: [string, number];
'!gt'?: PrimitiveSelector['gt'];
gte?: [string, number];
'!gte'?: PrimitiveSelector['gte'];
lt?: [string, number];
'!lt'?: PrimitiveSelector['lt'];
lte?: [string, number];
'!lte'?: PrimitiveSelector['lte'];
ref?: [string, EntityInterface | string];
'!ref'?: PrimitiveSelector['ref'];
qref?: [string, [Options, ...PrimitiveSelector[]]];
'!qref'?: PrimitiveSelector['qref'];
selector?: PrimitiveSelector;
'!selector'?: PrimitiveSelector['selector'];
};
export type Selector = {
type: '&' | '|' | '!&' | '!|';
guid?: Clause<PrimitiveSelector['guid']>;
'!guid'?: Clause<PrimitiveSelector['guid']>;
tag?: Clause<PrimitiveSelector['tag']>;
'!tag'?: Clause<PrimitiveSelector['tag']>;
defined?: Clause<PrimitiveSelector['defined']>;
'!defined'?: Clause<PrimitiveSelector['defined']>;
truthy?: Clause<PrimitiveSelector['truthy']>;
'!truthy'?: Clause<PrimitiveSelector['truthy']>;
equal?: Clause<OrWithTime<PrimitiveSelector['equal']>>;
'!equal'?: Clause<OrWithTime<PrimitiveSelector['equal']>>;
contain?: Clause<OrWithTime<PrimitiveSelector['contain']>>;
'!contain'?: Clause<OrWithTime<PrimitiveSelector['contain']>>;
match?: Clause<PrimitiveSelector['match']>;
'!match'?: Clause<PrimitiveSelector['match']>;
imatch?: Clause<PrimitiveSelector['imatch']>;
'!imatch'?: Clause<PrimitiveSelector['imatch']>;
like?: Clause<PrimitiveSelector['like']>;
'!like'?: Clause<PrimitiveSelector['like']>;
ilike?: Clause<PrimitiveSelector['ilike']>;
'!ilike'?: Clause<PrimitiveSelector['ilike']>;
gt?: Clause<OrWithTime<PrimitiveSelector['gt']>>;
'!gt'?: Clause<OrWithTime<PrimitiveSelector['gt']>>;
gte?: Clause<OrWithTime<PrimitiveSelector['gte']>>;
'!gte'?: Clause<OrWithTime<PrimitiveSelector['gte']>>;
lt?: Clause<OrWithTime<PrimitiveSelector['lt']>>;
'!lt'?: Clause<OrWithTime<PrimitiveSelector['lt']>>;
lte?: Clause<OrWithTime<PrimitiveSelector['lte']>>;
'!lte'?: Clause<OrWithTime<PrimitiveSelector['lte']>>;
ref?: Clause<PrimitiveSelector['ref']>;
'!ref'?: Clause<PrimitiveSelector['ref']>;
qref?: Clause<[string, [Options, ...Selector[]]]>;
'!qref'?: Selector['qref'];
selector?: Clause<Selector>;
'!selector'?: Selector['selector'];
};
export type FormattedSelector = {
type: '&' | '|' | '!&' | '!|';
guid?: PrimitiveSelector['guid'][][];
'!guid'?: PrimitiveSelector['guid'][][];
tag?: PrimitiveSelector['tag'][][];
'!tag'?: PrimitiveSelector['tag'][][];
defined?: PrimitiveSelector['defined'][][];
'!defined'?: PrimitiveSelector['defined'][][];
truthy?: PrimitiveSelector['truthy'][][];
'!truthy'?: PrimitiveSelector['truthy'][][];
equal?: PrimitiveSelector['equal'][];
'!equal'?: PrimitiveSelector['equal'][];
contain?: PrimitiveSelector['contain'][];
'!contain'?: PrimitiveSelector['contain'][];
match?: PrimitiveSelector['match'][];
'!match'?: PrimitiveSelector['match'][];
imatch?: PrimitiveSelector['imatch'][];
'!imatch'?: PrimitiveSelector['imatch'][];
like?: PrimitiveSelector['like'][];
'!like'?: PrimitiveSelector['like'][];
ilike?: PrimitiveSelector['ilike'][];
'!ilike'?: PrimitiveSelector['ilike'][];
gt?: PrimitiveSelector['gt'][];
'!gt'?: PrimitiveSelector['gt'][];
gte?: PrimitiveSelector['gte'][];
'!gte'?: PrimitiveSelector['gte'][];
lt?: PrimitiveSelector['lt'][];
'!lt'?: PrimitiveSelector['lt'][];
lte?: PrimitiveSelector['lte'][];
'!lte'?: PrimitiveSelector['lte'][];
ref?: PrimitiveSelector['ref'][];
'!ref'?: PrimitiveSelector['ref'][];
qref?: [string, [Options, ...FormattedSelector[]]][];
'!qref'?: FormattedSelector['qref'];
selector?: FormattedSelector[];
'!selector'?: FormattedSelector['selector'];
};
export declare enum TilmeldAccessLevels {
NO_ACCESS = 0,
READ_ACCESS = 1,
WRITE_ACCESS = 2,
FULL_ACCESS = 4
}
export interface TilmeldInterface {
nymph: Nymph;
request: any;
response: any;
init(nymph: Nymph): void;
clone(): TilmeldInterface;
gatekeeper(ability?: string): boolean;
authenticate(skipXsrfToken?: boolean, skipRenew?: boolean): Promise<boolean>;
clearSession(): void;
extractToken(token: string): Promise<any>;
fillSession(user: any): Promise<void>;
checkClientUIDPermissions(name: string, type?: TilmeldAccessLevels): Promise<boolean>;
}
export {};