Dateien, Mail und Personen
Dateien in Buckets ablegen, Mail senden, Personen nachschlagen und die eigenen Rechte lesen.
Neben den Collections bietet die Schnittstelle vier weitere Dinge: Buckets für Dateien, den Mailversand, das Personenverzeichnis und die Auskunft über die angemeldete Person. Für alle gelten dieselben Regeln wie für Daten: Sitzungscookie, Content-Type: application/json bei einem JSON-Rumpf, dieselbe Form der Fehlerantwort (Daten lesen und schreiben).
Trage in tool.json unter uses ein, was dein Werkzeug davon braucht: den Bucket unter buckets, mail.send und people.read unter capabilities.
Dateien in einem Bucket
Ein Bucket hält Dateien. Er steht neben den Collections, nie in einer. Der Agent legt ihn mit ensure_bucket an. Rechte hängen wie bei Daten an einer Rolle, mit den Stufen none, own und all für Lesen und Schreiben. own meint die Dateien, die die Person selbst hochgeladen hat.
Dateien liegen je Datenraum, wie Datensätze: Der Bucket ist in beiden Räumen derselbe, sein Bestand nicht. Ein Werkzeug sieht im Übungsraum nur die Dateien, die dort hochgeladen wurden, siehe Produktion und Übungsraum.
| Aufruf | Was er tut |
|---|---|
POST /api/buckets/<bucket>/files | lädt eine Datei hoch |
POST /api/buckets/<bucket>/files/query | listet Dateien: {"limit": 50} ergibt {files, total, hasMore} |
GET /api/buckets/<bucket>/files/<id> | liefert die Datei, immer als Download |
DELETE /api/buckets/<bucket>/files/<id> | löscht die Datei. Der Aufruf trägt Content-Type: application/json |
Eine Datei hochladen
Die Bytes stehen im Rumpf, der Name im Kopf X-File-Name, prozentkodiert. Multipart nimmt die Instanz nicht an.
fetch("/api/buckets/belege/files", {
method: "POST",
credentials: "same-origin",
headers: {
"Content-Type": file.type,
"X-File-Name": encodeURIComponent(file.name)
},
body: file // das File-Objekt aus einem <input type="file">
});
Die Antwort ist 201 mit id, name, mediaType, bytes und checksum.
Grenzen
- Die Vorgabe ist 25 MB je Datei und 1 GB je Bucket. Das Kontingent zählt je Datenraum.
- Die Instanz nimmt nur bestimmte Dateiarten an. Die Vorgabe: PDF, PNG, JPEG, GIF, WebP, Text, CSV, ZIP, JSON, Word (
.docx) und Excel (.xlsx). - Die Instanz prüft den genannten Inhaltstyp an den ersten Bytes. Eine Datei, die
.pngheisst und keines ist, weist sie ab. - Jeder Download kommt als Anhang. Ein abgelegtes Bild lässt sich deshalb nicht mit
<img src>anzeigen. - Ein Bucket lässt sich nicht löschen, seine Dateien schon.
Mail senden
POST /api/mail sendet eine Nachricht. Die Person braucht dafür die Fähigkeit mail.send über eine ihrer Rollen.
{
"to": ["vera@example.com"],
"subject": "Neue Aufgabe für dich",
"text": "Du hast eine neue Aufgabe: Angebot prüfen.",
"replyTo": "empfang@example.com"
}
- Pflicht sind mindestens ein Empfänger, ein Betreff und ein Inhalt:
text,htmloder beides.ccundbccsind Listen wieto. - Der Betreff ist eine Zeile mit höchstens 200 Zeichen.
- Der Absender ist je Instanz fest. Ein Werkzeug wählt ihn nicht.
replyTokannst du setzen. - Die Vorgabe ist höchstens 50 Empfänger je Nachricht und 200 Nachrichten je Stunde für die ganze Instanz.
- Der Versand läuft sofort: 202 mit
{"sent": true}heisst, die Nachricht ist draussen. Bei einem Fehler ging nichts hinaus. - Die Instanz protokolliert jede Nachricht.
Personen nachschlagen
Lass niemanden einen Namen tippen. Suche im Verzeichnis und speichere die Kennung in einem Feld vom Typ person. Die Person braucht die Fähigkeit people.read. Auch sie ist kein Teil der Adminrechte.
{"term": "ver", "limit": 50}
POST /api/people/query antwortet:
{"people": [{"id": "…", "name": "Vera Beispiel", "email": "vera@example.com"}],
"total": 1, "hasMore": false}
GET /api/people/<id> macht aus einer gespeicherten Kennung wieder einen Namen. Im Verzeichnis steht, wer sich mindestens einmal angemeldet hat und nicht deaktiviert ist.
Wer angemeldet ist
GET /api/me nennt die angemeldete Person und ihre wirksamen Rechte:
{
"userId": "4b40b106-…",
"name": "Alex Admin",
"admin": true,
"roles": ["admin", "demo"],
"collections": [{"collection": "aufgaben", "read": "all", "write": "all"}],
"buckets": [{"bucket": "task_files", "read": "all", "write": "all"}],
"capabilities": ["people.read", "mail.send"],
"tools": ["tasklist"],
"contexts": []
}
Nutze die Antwort für „meine Aufgaben“ (created_by gleich userId) und um Knöpfe auszublenden, die die Person nicht benutzen darf. Das Ausblenden ist Komfort: Die Instanz prüft jedes Recht bei jeder Anfrage selbst.