Unterstützung: Setup-Skript für das Attribut supporters

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Opus 5.5 committed 2026-09-30 14:48:16 +00:00
1 parent 1497f7a4dc
commit 32bc3d7c3d
2 files changed
+90

No files matched your search

+74
View File
@@ -0,0 +1,74 @@
#!/usr/bin/env node
/**
* WOMS Unterstuetzung – Appwrite-Setup (idempotent).
* Legt in der Sammlung worksheets das Attribut "supporters" an (JSON-Liste der
* unterstuetzenden Mitarbeiter, siehe src/lib/support.js).
*
* Usage:
* node scripts/setup-supporters.mjs --dry-run
* APPWRITE_API_KEY=... node scripts/setup-supporters.mjs
*/
import { pathToFileURL } from "node:url";
const dryRun = process.argv.includes("--dry-run");
const endpoint = process.env.APPWRITE_ENDPOINT || "https://appwrite.webklar.com/v1";
const projectId = process.env.APPWRITE_PROJECT_ID || "6a1058610003c5a13a05";
const databaseId = process.env.APPWRITE_DATABASE_ID || "woms-database";
const apiKey = process.env.APPWRITE_API_KEY;
const collectionId = "worksheets";
export const ATTRIBUTE = { key: "supporters", type: "string", size: 4000, required: false };
/** 'create' = fehlt, 'exists' = passt, 'conflict' = gleicher Name mit anderem Typ oder zu klein */
export function planAttribute(existing) {
const found = (existing || []).find((a) => a.key === ATTRIBUTE.key);
if (!found) return "create";
if (found.type !== ATTRIBUTE.type || !(Number(found.size) >= ATTRIBUTE.size)) return "conflict";
return "exists";
}
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
async function run() {
if (dryRun) {
console.log(`Sammlung ${collectionId}: Attribut ${ATTRIBUTE.key} (String ${ATTRIBUTE.size}, nicht Pflicht) wird angelegt, falls es fehlt.`);
return;
}
if (!apiKey) {
console.error("APPWRITE_API_KEY required (oder --dry-run)");
process.exit(1);
}
const { Client, Databases } = await import("node-appwrite");
const client = new Client().setEndpoint(endpoint).setProject(projectId).setKey(apiKey);
const db = new Databases(client);
const { attributes } = await db.listAttributes(databaseId, collectionId);
const plan = planAttribute(attributes);
if (plan === "conflict") {
console.error(`Attribut ${ATTRIBUTE.key} existiert schon mit anderem Typ oder kleinerer Größe – bitte in der Appwrite-Konsole prüfen.`);
process.exit(1);
}
if (plan === "exists") {
console.log(`Attribut ${ATTRIBUTE.key} ist schon vorhanden.`);
return;
}
await db.createStringAttribute(databaseId, collectionId, ATTRIBUTE.key, ATTRIBUTE.size, ATTRIBUTE.required);
console.log(`Attribut ${ATTRIBUTE.key} angelegt, warte auf Appwrite …`);
const until = Date.now() + 30000;
for (;;) {
const attr = await db.getAttribute(databaseId, collectionId, ATTRIBUTE.key);
if (attr.status === "available") break;
if (attr.status === "failed" || attr.status === "stuck") throw new Error(`Attribut fehlgeschlagen: ${attr.error || attr.status}`);
if (Date.now() > until) throw new Error("Attribut nach 30 s nicht verfügbar – Status in der Appwrite-Konsole prüfen.");
await sleep(1000);
}
console.log(`Attribut ${ATTRIBUTE.key}: available`);
}
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
run().catch((e) => {
console.error(e.message || e);
process.exit(1);
});
}
+16
View File
@@ -0,0 +1,16 @@
import { test } from 'node:test'
import assert from 'node:assert/strict'
import { ATTRIBUTE, planAttribute } from '../scripts/setup-supporters.mjs'
test('Attribut supporters: String 4000, nicht Pflicht', () => {
assert.deepEqual(ATTRIBUTE, { key: 'supporters', type: 'string', size: 4000, required: false })
})
test('planAttribute: anlegen, vorhanden oder Konflikt', () => {
assert.equal(planAttribute([]), 'create')
assert.equal(planAttribute([{ key: 'wsid', type: 'string', size: 10 }]), 'create')
assert.equal(planAttribute([{ key: 'supporters', type: 'string', size: 4000 }]), 'exists')
assert.equal(planAttribute([{ key: 'supporters', type: 'string', size: 8000 }]), 'exists')
assert.equal(planAttribute([{ key: 'supporters', type: 'string', size: 255 }]), 'conflict')
assert.equal(planAttribute([{ key: 'supporters', type: 'integer' }]), 'conflict')
})