Automation node types wrap integration service types, and the same service types
also back builder data sources, builder workflow actions and dashboard data sources.
The names below let a reader go from a node type to its model, to the service type it
wraps, to the form that configures it and to the fixture that creates it in tests
without looking up the type string. The convention covers class, function and file
names only: registry type strings and Django model names are persisted in API
payloads, exports, templates and migrations, and are never renamed for naming
reasons.
<Prefix> is the integration family the service type already uses (Core,
LocalBaserow, Slack, AIAgent); <Thing> is what the node or service does
(DeleteRow, Periodic, RowsDeleted).
| Layer | Pattern | Examples |
|---|---|---|
| Backend node model (unchanged) | <Prefix><Thing>ActionNode / <Prefix><Thing>TriggerNode; bases AutomationActionNode / AutomationTriggerNode |
LocalBaserowDeleteRowActionNode, CoreHTTPTriggerNode |
| Backend node type | the model name plus Type: <Prefix><Thing>ActionNodeType / <Prefix><Thing>TriggerNodeType; bases AutomationActionNodeType / AutomationTriggerNodeType; registry base AutomationNodeType; mixins <Name>NodeTypeMixin |
LocalBaserowDeleteRowActionNodeType, LocalBaserowRowsDeletedTriggerNodeType, ContainerNodeTypeMixin |
| Backend service type | <Prefix><Thing>ServiceType for action and data services; <Prefix><Thing>TriggerServiceType for event services (anything using TriggerServiceTypeMixin) |
LocalBaserowDeleteRowServiceType, CorePeriodicTriggerServiceType, LocalBaserowRowsDeletedTriggerServiceType |
| Backend service model (unchanged) | whatever it is today | CorePeriodicService, LocalBaserowRowsDeleted |
type strings (unchanged) |
a service-backed node type’s type equals the wrapped service type’s type |
local_baserow_delete_row, periodic |
| Backend test fixtures | create_<prefix>_<thing>_action_node / create_<prefix>_<thing>_trigger_node |
create_core_goto_action_node, create_core_http_trigger_node |
| Frontend node type | the backend class name; base NodeType; mixins ActionNodeTypeMixin, TriggerNodeTypeMixin, ContainerNodeTypeMixin, UtilityNodeTypeMixin |
CoreGotoActionNodeType, LocalBaserowRowsDeletedTriggerNodeType |
| Frontend service type | the backend class name; the surface is expressed by the mixin (WorkflowActionServiceTypeMixin, DataSourceServiceTypeMixin, TriggerServiceTypeMixin), never by a Workflow or DataSource word in the class name |
LocalBaserowDeleteRowServiceType, CorePeriodicTriggerServiceType |
| Frontend service form | the service type name with Type replaced by Form |
LocalBaserowDeleteRowServiceForm.vue, CorePeriodicTriggerServiceForm.vue |
| Casing | acronyms stay upper-case | HTTP, SMTP, CSV, XLS, AI |
Frontend-only intermediate bases follow the same shape: LocalBaserowNodeType and
LocalBaserowSignalTriggerNodeType sit between NodeType and the concrete Local
Baserow node types.
These names predate the convention and are kept on purpose: the User suffix on the
Local Baserow data-source service types (LocalBaserowGetRowUserServiceType,
LocalBaserowListRowsUserServiceType, LocalBaserowAggregateRowsUserServiceType and
the premium LocalBaserowGroupedAggregateRowsUserServiceType),
DataSourceLocalBaserowTableServiceType on the frontend, the three data-source form
components LocalBaserowGetRowForm.vue, LocalBaserowListRowsForm.vue and
LocalBaserowAggregateRowsForm.vue, and the builder workflow action type names
(CoreHttpRequestActionType, DeleteRowWorkflowActionType, …). They are shared
builder and dashboard code, or builder-only code, so renaming them buys automation
nothing and would touch modules this convention does not own.
Each of these is a separate change if someone wants to close the gap:
User suffix from the backend data-source service types; the frontend
already uses LocalBaserowGetRowServiceType, LocalBaserowListRowsServiceType and
LocalBaserowAggregateRowsServiceType.HTTP, not Http).DataSource word of DataSourceLocalBaserowTableServiceType into its
mixin, as the frontend service type row requires.LocalBaserowGetRowServiceForm.vue, …), together with
localBaserowGetRowForm.spec.js.