docs: document Directus Flow for secure listing views increment
This commit is contained in:
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user