docs: document Directus Flow for secure listing views increment

This commit is contained in:
2026-02-04 12:43:12 +01:00
parent 529de56428
commit 7f40dc1e9b

View File

@@ -193,7 +193,7 @@ Meldungen von Anzeigen.
| Collection | Read | Create | Update | Delete | Hinweise | | Collection | Read | Create | Update | Delete | Hinweise |
|------------|:----:|:------:|:------:|:------:|----------| |------------|:----:|:------:|:------:|:------:|----------|
| `listings` | ✓ | ✓ | - | - | Nur `status=published` lesen | | `listings` | ✓ | ✓ | ✓* | - | Nur `status=published` lesen, *Update nur `views` (via Flow) |
| `listings_files` | ✓ | ✓ | - | - | Für Bilder-Upload | | `listings_files` | ✓ | ✓ | - | - | Für Bilder-Upload |
| `directus_files` | ✓ | ✓ | - | - | Asset-Upload | | `directus_files` | ✓ | ✓ | - | - | Asset-Upload |
| `categories` | ✓ | - | - | - | Nur `status=published` | | `categories` | ✓ | - | - | - | Nur `status=published` |
@@ -204,3 +204,50 @@ Meldungen von Anzeigen.
| `messages` | ✓ | ✓ | - | - | Filter via `conversation` ID | | `messages` | ✓ | ✓ | - | - | Filter via `conversation` ID |
| `favorites` | ✓ | ✓ | - | ✓ | Nur eigene | | `favorites` | ✓ | ✓ | - | ✓ | Nur eigene |
| `reports` | - | ✓ | - | - | Nur erstellen | | `reports` | - | ✓ | - | - | Nur erstellen |
---
## Directus Flows
### Increment Listing Views
**Zweck:** Sichert ab, dass `views` nur inkrementiert (nicht beliebig gesetzt) werden kann.
| Schritt | Typ | Beschreibung |
|---------|-----|--------------|
| 1. Trigger | Action (Non-Blocking) | `items.update` auf `listings` |
| 2. Condition | Filter Rule | Prüft ob `views` im Payload vorhanden |
| 3. Operation | Run Script | Prüft ob **nur** `views` geändert wurde |
| 4. Condition | Filter Rule | Prüft Script-Ergebnis |
**Schritt 2 - Condition Rule (views vorhanden):**
```json
{
"$trigger": {
"payload": {
"views": {
"_nnull": true
}
}
}
}
```
**Schritt 3 - Run Script (nur views im Payload):**
```javascript
module.exports = async function(data) {
const keys = Object.keys(data.$trigger.payload)
return keys.length === 1 && keys[0] === 'views' ? 1 : 0
}
```
**Schritt 4 - Condition Rule (Script-Ergebnis prüfen):**
```json
{
"$last": {
"_eq": 1
}
}
```
**Hinweis:** Ohne diese Absicherung könnte jeder `views` auf beliebige Werte setzen.