Версия:

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