Skip to content

Фазы и результаты handler

Phases

PhaseКогда
beforeCreateдо insert
afterCreateпосле insert
beforeUpdateдо update
afterUpdateпосле update
beforeDeleteдо delete
afterDeleteпосле delete
beforeReadдо read (где wired)
afterReadпосле read
beforeSaveVersionalias для versioning entry
afterSaveVersionпосле commit version / WC

Handler result

ResultЭффект
void / { type: 'next' }следующий handler
{ type: 'replaceInput', input }подмена input для следующих handlers
{ type: 'shortCircuit', result }стоп цепочки, вернуть result (только фазы before*)
{ type: 'abort', code, message, status? }GraphQL/REST error

Порядок выполнения

  1. Host core handlers (order ≈ 0) — ability checks, field validation
  2. Extension handlers по order из registry (как store.ts SDK)

skipHooks

Internal mutations могут передать skipHooks: true в runner, чтобы избежать рекурсии. Публичные API extensions не должны это использовать.

Пример abort

ts
ctx.registerEntityHook('artifact', 'beforeCreate', async (hookCtx) => {
  if (hookCtx.fields['my-ext.strict'] === 'true' && !hookCtx.input?.name?.startsWith('REQ-')) {
    return {
      type: 'abort',
      code: 'STRICT_NAME',
      message: 'Name must start with REQ-',
    };
  }
});

Пример replaceInput

ts
ctx.registerEntityHook('artifact', 'beforeCreate', async (hookCtx) => {
  const input = hookCtx.input as { name?: string };
  if (!input?.name) return;
  return {
    type: 'replaceInput',
    input: { ...input, name: input.name.trim() },
  };
});

AI workspace для командных материалов и знаний