dbaas
Version:
Database as a service. Expose db to REST and GraphQL.
107 lines (106 loc) • 4.61 kB
TypeScript
import type { Accountability, SchemaOverview, Query } from "@directus/shared/types";
import type { Knex } from "knex";
import type { UnionToIntersection } from "../../utils/types.js";
import type SystemModels from "../../models/SystemModels.js";
import Models from "../../models/index.js";
/**
* Action Hook callback context
*/
export interface ActionHookContext {
/** Current database transaction */
database: Knex;
/** The current API schema in use */
schema: SchemaOverview;
/** Information about the current user */
accountability: Accountability;
}
export type ActionHookHandlerBase<TName extends string = string, TMeta = unknown> = (name: TName, callback: (meta: TMeta, ctx: ActionHookContext) => Promise<void>) => void;
export type ServerStartActionHookHandler = ActionHookHandlerBase<"server.start", {
server: unknown;
}>;
export type ServerStopActionHookHandler = ActionHookHandlerBase<"server.stop", {
server: unknown;
}>;
export type ResponseActionHookHandler = ActionHookHandlerBase<"response", {
request: unknown;
response: unknown;
ip: unknown;
duration: unknown;
finished: unknown;
}>;
export type AuthLoginActionHookHandler = ActionHookHandlerBase<"auth.login", {
payload: unknown;
status: unknown;
user: unknown;
provider: unknown;
}>;
export type FilesUploadActionHookHandler = ActionHookHandlerBase<"files.upload", {
payload: unknown;
key: unknown;
collection: string;
}>;
export type AllItemCollectionCrudActionHookHandlers = ActionHookHandlerBase<`items.read`, {
payload: unknown[];
query: Query;
collection: string;
}> & ActionHookHandlerBase<`items.create`, {
payload: unknown;
key: string | number;
collection: string;
}> & ActionHookHandlerBase<`items.update`, {
payload: unknown;
keys: (string | number)[];
collection: string;
}> & ActionHookHandlerBase<`items.delete`, {
keys: (string | number)[];
collection: string;
}> & ActionHookHandlerBase<`items.sort`, {
collection: string;
item: unknown;
to: unknown;
}>;
export type ItemCollectionCrudActionHookHandler<TName extends string, TPayload> = ActionHookHandlerBase<`${TName}.items.read`, {
payload: TPayload[];
query: Query;
collection: string;
}> & ActionHookHandlerBase<`${TName}.items.create`, {
payload: TPayload;
key: string | number;
collection: string;
}> & ActionHookHandlerBase<`${TName}.items.update`, {
payload: TPayload;
keys: (string | number)[];
collection: string;
}> & ActionHookHandlerBase<`${TName}.items.delete`, {
keys: (string | number)[];
collection: string;
}> & ActionHookHandlerBase<`${TName}.items.sort`, {
collection: string;
item: unknown;
to: unknown;
}>;
export type SystemCollectionCrudActionHookHandler<TName extends string, TPayload> = ActionHookHandlerBase<`${TName}.create`, {
payload: TPayload;
key: string | number;
collection: string;
}> & ActionHookHandlerBase<`${TName}.update`, {
payload: TPayload;
keys: (string | number)[];
collection: string;
}> & ActionHookHandlerBase<`${TName}.delete`, {
keys: (string | number)[];
collection: string;
}>;
type ItemCollectionActionHookHandlerModels<TModels> = {
[key in Extract<keyof TModels, string>]: ItemCollectionCrudActionHookHandler<key, TModels[key]>;
};
type AllItemCollectionActionHookHandlerModels<TModels> = ItemCollectionActionHookHandlerModels<TModels>[keyof ItemCollectionActionHookHandlerModels<TModels>];
export type ItemCollectionCrudActionHookHandlers<TModels> = UnionToIntersection<AllItemCollectionActionHookHandlerModels<TModels>>;
export type ItemCollectionActionHookHandlers<TModels> = AllItemCollectionCrudActionHookHandlers & ItemCollectionCrudActionHookHandlers<TModels>;
type SystemCollectionActionHookHandlerModels<TModels> = {
[key in Extract<keyof TModels, string>]: SystemCollectionCrudActionHookHandler<key, TModels[key]>;
};
type AllSystemCollectionActionHookHandlerModels<TModels> = SystemCollectionActionHookHandlerModels<TModels>[keyof SystemCollectionActionHookHandlerModels<TModels>];
export type SystemCollectionActionHookHandlers<TModels> = UnionToIntersection<AllSystemCollectionActionHookHandlerModels<TModels>>;
type ActionHookHandler<TModels extends Models = Models> = ServerStartActionHookHandler & ServerStopActionHookHandler & ResponseActionHookHandler & AuthLoginActionHookHandler & FilesUploadActionHookHandler & ItemCollectionActionHookHandlers<TModels> & SystemCollectionActionHookHandlers<SystemModels> & ActionHookHandlerBase;
export default ActionHookHandler;