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:
ClaudeandClaude Sonnet 5.5 committed 2026-10-04 14:27:29 +00:00
1 parent cd55d4c891
commit 7bbe0a9fe6
6 files changed
+235 -63

No files matched your search

+16 -2
View File
@@ -7,7 +7,7 @@ const { test, afterEach } = require('node:test');
const assert = require('node:assert/strict');
const http = require('node:http');
const { createAppwrite, AppwriteError, queryEqual, queryLimit } = require('./appwrite.js');
const { createAppwrite, AppwriteError, queryEqual, queryLimit, queryCursorAfter } = require('./appwrite.js');
const { startFakeAppwrite } = require('./fake-appwrite.js');
const fakes = [];
@@ -110,9 +110,23 @@ test('listRows schickt die Queries als queries[]-Parameter und liefert die Zeile
assert.equal(lastCall(fake).headers['x-appwrite-key'], fake.key);
});
test('queryEqual und queryLimit liefern Appwrite-JSON-Strings', () => {
test('queryEqual, queryLimit und queryCursorAfter liefern Appwrite-JSON-Strings', () => {
assert.equal(queryEqual('galleryId', ['x']), '{"method":"equal","attribute":"galleryId","values":["x"]}');
assert.equal(queryLimit(100), '{"method":"limit","values":[100]}');
assert.equal(queryCursorAfter('abc'), '{"method":"cursorAfter","values":["abc"]}');
});
test('listRows blättert mit cursorAfter', async () => {
const { appwrite } = await setup();
for (const id of ['a', 'b', 'c', 'd', 'e']) {
await appwrite.createRow('reports', id, { galleryId: 'g1', reason: 'spam', reporterHash: id }, []);
}
const first = await appwrite.listRows('reports', [queryEqual('galleryId', ['g1']), queryLimit(2)]);
assert.deepEqual(first.map((row) => row.$id), ['a', 'b']);
const second = await appwrite.listRows('reports', [queryEqual('galleryId', ['g1']), queryLimit(2), queryCursorAfter('b')]);
assert.deepEqual(second.map((row) => row.$id), ['c', 'd']);
const last = await appwrite.listRows('reports', [queryEqual('galleryId', ['g1']), queryLimit(2), queryCursorAfter('d')]);
assert.deepEqual(last.map((row) => row.$id), ['e']);
});
test('Dateien: lesen, Rechte setzen, löschen', async () => {