before/after
Для операций add/modify/remove предусмотрены методы для выполнения действий до и после выполнения самого метода. Для использования механизма в классе нужно определить соответствующий метод с классическими входными и выходными параметрами (IAPIRequest и IAPIResponse).
before
Для каждого метода проверяется наличие соответствующего метода в классе. Для add — beforeAdd, для modify — beforeModify, для remove — beforeRemove.
В вызываемые методы передаются параметры переданные в основной метод.
after
Аналогично, для каждого метода проверяется наличие соответствующего метода в классе. Для add — afterAdd, для modify — afterModify, для remove — afterRemove.
В вызываемые методы передается объект с id (для add это будет id созданной записи), origParams (параметры переданные в основной метод) и системный rollback_key.
Общие методы
Также можно определить общий метод, просто “before”/“after” — он будет срабатывать (при наличии), до/после любого из действий (add/modify/remove).
Примеры
/**
* Hook before add: if alias is not passed, transliterate name to alias.
* Хук перед добавлением: если не передан alias, переводим в name в транслит.
*/
async beforeAdd(r: IAPIRequest): Promise<IAPIResponse> {
const params = r.data.params
if (params.alias) return new UserOk('ok')
if (!params.name) return new MyError('name not passed', {params})
params.alias = slugify(params.name)
return new UserOk('ok')
}
или
/**
* If the state of activity has changed, then update the current version
* Если изменилось состояние активности, то обновим актуальную версию
*/
async afterModify(r: IAPIRequest): Promise<IAPIResponse> {
const params = r.data.params
const origParams = params.origParams
const id = params.id
if (!id) return new MyError('id not passed', {params})
if (!origParams.hasOwnProperty('is_active')) return new UserOk('ok')
return r.api(Document, 'setActualPriorityByDocId', {id})
}