feat: add verifiable listings (proof of possession) with verification widget, badge on cards/detail, i18n (7 langs), fix edit prefill for location/monero, prevent edit/delete on pending listings

This commit is contained in:
2026-02-11 08:14:44 +01:00
parent f5cfab6a2a
commit 53673b4650
20 changed files with 754 additions and 34 deletions

View File

@@ -44,6 +44,10 @@ Haupttabelle für alle Anzeigen.
| `expires_at` | datetime | Ablaufdatum |
| `monero_address` | string | XMR-Adresse für Zahlung |
| `contact_public_key` | text | NaCl Public Key für E2E-Chat (pro Listing) |
| `verified` | boolean | `false` default — Verifikation abgeschlossen |
| `verification_code` | string(6) | 6-stelliger Klartext-Code (für Käufer-Vergleich mit Foto) |
| `verification_image` | UUID | FK → directus_files (Verifikationsfoto) |
| `verification_date` | datetime | Zeitpunkt der Verifikation |
| `date_created` | datetime | Erstellungsdatum |
| `date_updated` | datetime | Änderungsdatum |
| `user_created` | UUID | Ersteller (FK → directus_users) |
@@ -220,7 +224,7 @@ Meldungen von Anzeigen.
| `favorites` | ✓ | ✓ | - | ✓ | Nur eigene |
| `reports` | - | ✓ | - | - | Nur erstellen |
### Listings Update-Berechtigungen (Detail)
### Listings Update-Berechtigungen — Public Role (Detail)
**Custom Filter:**
```json
@@ -236,12 +240,28 @@ Meldungen von Anzeigen.
- `contact_public_key`
- `images`
- `views` (geschützt durch Flow)
- `verified`, `verification_code`, `verification_image`, `verification_date`
**Read Filter:**
```json
{ "status": { "_eq": "published" } }
```
**Hinweis:** Die Felder `paid_at`, `payment_status` und `btcpay_invoice_id` sind in der Public-Rolle **nicht** lesbar.
### User Role: Listings (zusätzliche Felder)
Eingeloggte User haben zusätzlich zu den Public-Feldern Zugriff auf:
**Read (zusätzlich):**
- `paid_at`, `payment_status`, `btcpay_invoice_id`
**Update:**
- Gleiche Felder wie Public Update
- Filter: `user_created = $CURRENT_USER`
**Hinweis:** `paid_at` und `payment_status` dürfen NICHT in der Public-Rolle lesbar sein, da sonst `getListing()` für nicht-eingeloggte Besucher fehlschlägt.
---
## Directus Flows

View File

@@ -3,7 +3,7 @@
Differenzierung gegenüber eBay Kleinanzeigen, Tutti, XMRBazaar.
Drei Features, die kein Konkurrent hat.
Status: **Planung** (noch nicht implementiert)
Status: **Verifiable Listings** implementiert, Rest in Planung
---