import { CreateParams, CreateResult, DataProvider, DeleteManyParams, DeleteManyResult, DeleteParams, DeleteResult, GetListParams, GetListResult, GetManyParams, GetManyReferenceParams, GetManyReferenceResult, GetManyResult, GetOneParams, GetOneResult, RaRecord, UpdateManyParams, UpdateManyResult, UpdateParams, UpdateResult } from '../types'; /** * Extend a dataProvider to execute callbacks before and after read and write calls. * * @param {DataProvider} dataProvider The dataProvider to wrap * @param {ResourceCallbacks[]} handlers An array of ResourceCallbacks * * @typedef {Object} ResourceCallbacks * @property {string} resource The resource name * @property {AfterCreate} [afterCreate] A callback (or array of callbacks) executed after create * @property {AfterDelete} [afterDelete] A callback (or array of callbacks) executed after delete * @property {AfterDeleteMany} [afterDeleteMany] A callback (or array of callbacks) executed after deleteMany * @property {AfterGetList} [afterGetList] A callback (or array of callbacks) executed after getList * @property {AfterGetMany} [afterGetMany] A callback (or array of callbacks) executed after getMany * @property {AfterGetManyReference} [afterGetManyReference] A callback (or array of callbacks) executed after getManyReference * @property {AfterGetOne} [afterGetOne] A callback (or array of callbacks) executed after getOne * @property {AfterRead} [afterRead] A callback (or array of callbacks) executed after read (getList, getMany, getManyReference, getOne) * @property {AfterSave} [afterSave] A callback (or array of callbacks) executed after save (create, update, updateMany) * @property {AfterUpdate} [afterUpdate] A callback (or array of callbacks) executed after update * @property {AfterUpdateMany} [afterUpdateMany] A callback (or array of callbacks) executed after updateMany * @property {BeforeCreate} [beforeCreate] A callback (or array of callbacks) executed before create * @property {BeforeDelete} [beforeDelete] A callback (or array of callbacks) executed before delete * @property {BeforeDeleteMany} [beforeDeleteMany] A callback (or array of callbacks) executed before deleteMany * @property {BeforeGetList} [beforeGetList] A callback (or array of callbacks) executed before getList * @property {BeforeGetMany} [beforeGetMany] A callback (or array of callbacks) executed before getMany * @property {BeforeGetManyReference} [beforeGetManyReference] A callback (or array of callbacks) executed before getManyReference * @property {BeforeGetOne} [beforeGetOne] A callback (or array of callbacks) executed before getOne * @property {BeforeSave} [beforeSave] A callback (or array of callbacks) executed before save (create, update, updateMany) * @property {BeforeUpdate} [beforeUpdate] A callback (or array of callbacks) executed before update * @property {BeforeUpdateMany} [beforeUpdateMany] A callback (or array of callbacks) executed before updateMany * * Warnings: * - As queries issued in the callbacks are not done through react-query, * any change in the data will not be automatically reflected in the UI. * - The callbacks are not executed in a transaction. In case of error, * the backend may be left in an inconsistent state. * - When calling the API directly using fetch or another client, * the callbacks will not be executed, leaving the backend in a possibly inconsistent state. * - If a callback triggers the query it's listening to, this will lead to a infinite loop. * * @example * * const dataProvider = withLifecycleCallbacks( * jsonServerProvider("http://localhost:3000"), * [ * { * resource: "posts", * afterRead: async (data, dataProvider, resource) => { * // rename field to the record * data.user_id = data.userId; * return data; * }, * // executed after create, update and updateMany * afterSave: async (record, dataProvider, resource) => { * // update the author's nb_posts * const { total } = await dataProvider.getList("users", { * filter: { id: record.user_id }, * pagination: { page: 1, perPage: 1 }, * }); * await dataProvider.update("users", { * id: user.id, * data: { nb_posts: total }, * previousData: user, * }); * return record; * }, * beforeDelete: async (params, dataProvider, resource) => { * // delete all comments linked to the post * const { data: comments } = await dataProvider.getManyReference( * "comments", * { * target: "post_id", * id: params.id, * } * ); * if (comments.length > 0) { * await dataProvider.deleteMany("comments", { * ids: comments.map((comment) => comment.id), * }); * } * // update the author's nb_posts * const { data: post } = await dataProvider.getOne("posts", { * id: params.id, * }); * const { total } = await dataProvider.getList("users", { * filter: { id: post.user_id }, * pagination: { page: 1, perPage: 1 }, * }); * await dataProvider.update("users", { * id: user.id, * data: { nb_posts: total - 1 }, * previousData: user, * }); * return params; * }, * }, * ] * ); */ export declare const withLifecycleCallbacks: (dataProvider: DataProvider, handlers: ResourceCallbacks[]) => DataProvider; /** * Apply callbacks to the params for the given resource and hook * @param {DataProvider} dataProvider The dataProvider * @param {ResourceCallbacks[]} handlers An array of ResourceCallbacks * @param {string} resource The resource name * @param {string} hook The hook name (beforeGetList, afterGetOne, etc.) * @param {U} params The params / result to pass to the callbacks * @returns {Promise} The params / result after the callbacks have been applied */ export declare const applyCallbacks: ({ name, params, dataProvider, handlers, resource, }: { name: string; params: U; dataProvider: DataProvider; handlers: ResourceCallbacks[]; resource: string; }) => Promise; export type ResourceCallback = { (params: U, dataProvider: DataProvider, resource: string): Promise; }; export type ResourceCallbacksValue = ResourceCallback | ResourceCallback[]; export type ResourceCallbacks = { resource: string; afterCreate?: ResourceCallbacksValue>; afterDelete?: ResourceCallbacksValue>; afterDeleteMany?: ResourceCallbacksValue>; afterGetList?: ResourceCallbacksValue>; afterGetMany?: ResourceCallbacksValue>; afterGetManyReference?: ResourceCallbacksValue>; afterGetOne?: ResourceCallbacksValue>; afterUpdate?: ResourceCallbacksValue>; afterUpdateMany?: ResourceCallbacksValue>; beforeCreate?: ResourceCallbacksValue>; beforeDelete?: ResourceCallbacksValue>; beforeDeleteMany?: ResourceCallbacksValue>; beforeGetList?: ResourceCallbacksValue; beforeGetMany?: ResourceCallbacksValue; beforeGetManyReference?: ResourceCallbacksValue; beforeGetOne?: ResourceCallbacksValue>; beforeUpdate?: ResourceCallbacksValue>; beforeUpdateMany?: ResourceCallbacksValue>; /** * Modify the data before it is sent to the dataProvider. * * Used in create, update, and updateMany * * Note: This callback doesn't modify the record itself, but the data argument * (which may be a diff, especially when called with updateMany). */ beforeSave?: ResourceCallbacksValue; /** * Update a record after it has been read from the dataProvider * * Used in getOne, getList, getMany, and getManyReference */ afterRead?: ResourceCallbacksValue; /** * Use the record after it is returned by the dataProvider. * * Used in create, update, and updateMany */ afterSave?: ResourceCallbacksValue; }; //# sourceMappingURL=withLifecycleCallbacks.d.ts.map