Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

API Surface Comparison

This document compares the three API surfaces — Admin UI, gRPC API, and Lua CRUD (hook local API) — to track feature consistency.

CREATE Lifecycle

StepAdmingRPCLua CRUD
Access control (collection-level)YesYesYes (overrideAccess)
Field-level write strippingYesYesYes (overrideAccess)
Password extraction (auth)YesYesYes
before_validate (field + collection + registered)YesYesYes
ValidationYesYesYes
before_change (field + collection + registered)YesYesYes
DB insertYesYesYes
Join table data (arrays, blocks, has-many)YesYesYes
Password hash + storeYesYesYes
Versioning (status + snapshot + prune)YesYesYes
after_change (field + collection + registered)YesYesYes
Publish event (SSE/WebSocket)YesYesNo (in-transaction)
Verification email (auth + verify_email)YesYesNo

UPDATE Lifecycle

StepAdmingRPCLua CRUD
Access control (collection-level)YesYesYes (overrideAccess)
Field-level write strippingYesYesYes (overrideAccess)
Password extraction (auth)YesYesYes
Unpublish pathYesYesYes
before_validate (field + collection + registered)YesYesYes
ValidationYesYesYes
before_change (field + collection + registered)YesYesYes
DB update (or draft-only version save)YesYesYes
Join table dataYesYesYes
Password hash + store (normal path)YesYesYes
Versioning (status + snapshot + prune)YesYesYes
after_change (field + collection + registered)YesYesYes
Publish eventYesYesNo (in-transaction)

DELETE Lifecycle

StepAdmingRPCLua CRUD
Access controlYesYesYes (overrideAccess)
before_delete (collection + registered)YesYesYes
DB deleteYesYesYes
after_delete (collection + registered)YesYesYes
Upload file cleanupYesYesYes
Publish eventYesYesNo (in-transaction)

FIND Lifecycle

StepAdmingRPCLua CRUD
Access control (collection-level)YesYesYes (overrideAccess)
Constraint filter mergingYesYesYes
Draft-aware filteringYesYesYes
before_read hooksYesYesYes
DB query + countYesYesYes
Hydrate join tablesYesYesYes
Upload sizes assemblyYesYesYes
after_read hooks (field + collection + registered)YesYesYes
Relationship population (depth)YesYesYes
Select field strippingYesYesYes
Field-level read strippingYesYesYes (overrideAccess)

FIND_BY_ID Lifecycle

StepAdmingRPCLua CRUD
Access control (collection-level)YesYesYes (overrideAccess)
before_read hooksYesYesYes
Draft version overlayYesYesYes
Hydrate join tablesYesYesYes
Upload sizes assemblyYesYesYes
after_read hooks (field + collection + registered)YesYesYes
Relationship population (depth)YesYesYes
Select field strippingYesYesYes
Field-level read strippingYesYesYes (overrideAccess)

Remaining By-Design Differences

FeatureAdmingRPCLua CRUDReason
Event publishingYesYesNoLua runs inside the caller’s transaction; event publishing is fire-and-forget after commit. The caller (admin/gRPC) publishes the event.
Upload file cleanup on deleteYesYesYesLua CRUD reads ConfigDir from Lua app_data; admin/gRPC clean up after commit.
Verification email on createYesYesNoEmail sending is async, post-commit.
Locale from requestYesYesExplicit optAdmin/gRPC infer from request; Lua passes explicitly via opts.locale.
Default depthVariesConfig0Lua defaults to 0 to avoid N+1 in hooks. Callers pass depth explicitly.