mirror of
https://github.com/The-Low-Code-Foundation/OpenNoodl.git
synced 2026-01-12 07:12:54 +01:00
214 lines
8.3 KiB
Markdown
214 lines
8.3 KiB
Markdown
# 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
|
|
|
|
```javascript
|
|
// 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}
|
|
```
|