fix(api): Dateien bereits veröffentlichter oder gesperrter Karten nicht wiederverwenden
Veröffentlichen lehnt mit 403 "Diese Bilder sind bereits veröffentlicht oder
gesperrt." ab, wenn eine Datei kein read("any") trägt (ausgeblendet) oder von
einer Galerie-Zeile des Autors schon als Bild oder Vorschau verwendet wird
(auch überkreuz, auch ausgeblendete Karten). Die Nutzungsprüfung liest die
Zeilen des Autors über den vorhandenen ownerId-Index seitenweise mit Cursor
(auf die Datei-ID-Spalten gibt es keinen Index) und läuft zusammen mit dem
Anlegen je Autor nacheinander. 92 Tests.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
cd55d4c891
commit
7bbe0a9fe6
6 files changed
+235
-63
No files matched your search
@@ -5,7 +5,7 @@
|
||||
*
|
||||
* createAppwrite({ endpoint, project, key, fetchImpl?, database?, timeoutMs? })
|
||||
* getRow(table, id) Zeile oder null (404 row_not_found)
|
||||
* listRows(table, queries) Array von Zeilen; queries = JSON-Strings (queryEqual, queryLimit);
|
||||
* listRows(table, queries) Array von Zeilen; queries = JSON-Strings (queryEqual, queryLimit, queryCursorAfter);
|
||||
* eine Antwort ohne `rows`-Array ist ein Fehler (kein stilles [])
|
||||
* createRow(table, rowId, data, permissions) doppelte ID -> AppwriteError mit status 409
|
||||
* updateRow(table, id, data, permissions?) Rechte nur ändern, wenn übergeben
|
||||
@@ -49,6 +49,11 @@ function queryLimit(count) {
|
||||
return JSON.stringify({ method: 'limit', values: [count] });
|
||||
}
|
||||
|
||||
/** Nächste Seite nach der Zeile mit dieser ID (Reihenfolge: Anlegereihenfolge). */
|
||||
function queryCursorAfter(id) {
|
||||
return JSON.stringify({ method: 'cursorAfter', values: [id] });
|
||||
}
|
||||
|
||||
/** Ein Pfadsegment: nur nichtleere Zeichenketten, nie "." oder "..", immer kodiert. */
|
||||
function segment(value) {
|
||||
if (typeof value !== 'string' || value === '' || value === '.' || value === '..') {
|
||||
@@ -165,4 +170,4 @@ function createAppwrite({ endpoint, project, key, fetchImpl = globalThis.fetch,
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = { createAppwrite, AppwriteError, queryEqual, queryLimit };
|
||||
module.exports = { createAppwrite, AppwriteError, queryEqual, queryLimit, queryCursorAfter };
|
||||
Reference in new issue
Block a user