Files
OpenNoodl/dev-docs/tasks/phase-5-multi-target-deployment/01-byob-backend/TASK-002-data-nodes/NODES-SPEC.md
2025-12-30 11:55:30 +01:00

8.3 KiB

Data Node Specifications

This document defines the four data nodes for BYOB backends.

1. Query Records Node

The primary node for fetching data from backends.

Inputs

Input Type Description
Backend dropdown Select configured backend (or "Active Backend")
Collection dropdown Select table/collection from schema
Filter FilterBuilder Visual filter builder (see FILTER-BUILDER.md)
Sort Field dropdown Field to sort by
Sort Order enum Ascending / Descending
Limit number Max records to return
Offset number Records to skip (pagination)
Fields multi-select Fields to return (default: all)
Do signal Trigger the query

Outputs

Output Type Description
Records array Array of record objects
First Record object First record (convenience)
Count number Number of records returned
Total Count number Total matching records (for pagination)
Loading boolean True while request in progress
Error object Error details if failed
Done signal Fires when query completes
Failed signal Fires on error

Property Panel UI

┌─────────────────────────────────────────────────────────────────────┐
│ Query Records                                                       │
├─────────────────────────────────────────────────────────────────────┤
│ BACKEND                                                             │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │ ○ Active Backend (Production Directus)                          │ │
│ │ ● Specific Backend: [Production Directus          ▾]            │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│                                                                     │
│ COLLECTION                                                          │
│ [posts                                              ▾]              │
│                                                                     │
│ ▼ FILTER                                                            │
│ ┌─────────────────────────────────────────────────────────────────┐ │
│ │  [Visual Filter Builder - see FILTER-BUILDER.md]                │ │
│ └─────────────────────────────────────────────────────────────────┘ │
│                                                                     │
│ ▼ SORT                                                              │
│ [created_at ▾]  [Descending ▾]                                      │
│                                                                     │
│ ▼ PAGINATION                                                        │
│ Limit: [20   ]  Offset: [0    ]                                     │
│                                                                     │
│ ▶ FIELDS (optional)                                                 │
└─────────────────────────────────────────────────────────────────────┘

2. Create Record Node

Creates a new record in a collection.

Inputs

Input Type Description
Backend dropdown Select configured backend
Collection dropdown Select table/collection
Data object Record data (dynamic ports from schema)
Do signal Trigger creation

Dynamic Inputs

When a collection is selected, ports are dynamically generated for each writable field:

  • field_title (string)
  • field_content (text)
  • field_author (relation → user ID)
  • etc.

Outputs

Output Type Description
Record object The created record
ID string ID of created record
Success signal Fires on success
Failed signal Fires on error
Error object Error details

3. Update Record Node

Updates an existing record.

Inputs

Input Type Description
Backend dropdown Select configured backend
Collection dropdown Select table/collection
Record ID string ID of record to update
Data object Fields to update (dynamic ports)
Do signal Trigger update

Dynamic Inputs

Same as Create Record - schema-driven field inputs.

Outputs

Output Type Description
Record object The updated record
Success signal Fires on success
Failed signal Fires on error
Error object Error details

4. Delete Record Node

Deletes a record from a collection.

Inputs

Input Type Description
Backend dropdown Select configured backend
Collection dropdown Select table/collection
Record ID string ID of record to delete
Do signal Trigger deletion

Outputs

Output Type Description
Success signal Fires on success
Failed signal Fires on error
Error object Error details

Implementation Files

packages/noodl-runtime/src/nodes/std-library/data/
├── directus/
│   ├── query-records.js        # Query Records runtime
│   ├── create-record.js        # Create Record runtime
│   ├── update-record.js        # Update Record runtime
│   ├── delete-record.js        # Delete Record runtime
│   └── utils.js                # Shared utilities

packages/noodl-editor/src/editor/src/views/propertyeditor/
├── DataNodePropertyEditor/
│   ├── BackendSelector.tsx     # Backend dropdown
│   ├── CollectionSelector.tsx  # Collection dropdown
│   └── DynamicFieldInputs.tsx  # Schema-driven field inputs

Node Registration

// In node index/registration
module.exports = {
  node: QueryRecordsNode,
  setup: function (context, graphModel) {
    // Register dynamic ports based on schema
    graphModel.on('editorImportComplete', () => {
      // Set up schema-aware dropdowns
    });
  }
};

HTTP Request Format (Directus)

Query

GET /items/{collection}?filter={json}&sort={field}&limit={n}&offset={n}

Create

POST /items/{collection}
Body: { field1: value1, field2: value2 }

Update

PATCH /items/{collection}/{id}
Body: { field1: newValue }

Delete

DELETE /items/{collection}/{id}