Files
KIBU/scripts/reset-instance.ts
T
Paul Schoeneck 75af38a4b6 Add licensing information and update README for KIBU
- Introduced additional terms under Section 7 of the GNU AGPL v3 for KIBU, including attribution, marking of modified versions, and trademark usage.
- Added MIT License file for clarity on licensing options.
- Updated README.md to reflect the new licensing terms, including detailed usage rights and obligations.
- Created REUSE.toml for SPDX compliance and license annotations.
- Added THIRD_PARTY_NOTICES.md to clarify third-party dependencies and their licenses.
- Updated various source files and scripts to include SPDX headers for copyright and licensing.
- Enhanced footer in layout to display licensing information and project link.
- Implemented a new license page to present the AGPL and additional terms clearly.
2026-11-03 08:27:12 +01:00

74 lines
3.7 KiB
TypeScript

// SPDX-FileCopyrightText: 2026 Paul Schoeneck
//
// SPDX-License-Identifier: AGPL-3.0-only AND LicenseRef-KIBU-Additional-Terms
import "dotenv/config";
import { spawnSync } from "node:child_process";
import { createRequire } from "node:module";
import { fileURLToPath } from "node:url";
import { db } from "../src/lib/db";
async function reset() {
const [mode, confirmation, ...extra] = process.argv.slice(2);
if (!["clear", "demo"].includes(mode) || confirmation !== "--confirm-reset" || extra.length) {
throw new Error("Aufruf: npm run db:clear|db:reset -- --confirm-reset. Alle Instanzdaten und Zugaenge werden geloescht!");
}
if (!process.env.DATABASE_URL) throw new Error("DATABASE_URL fehlt. Zuerst npm run configure ausfuehren.");
const target = new URL(process.env.DATABASE_URL);
if (!["postgres:", "postgresql:"].includes(target.protocol)
|| !["localhost", "127.0.0.1", "[::1]"].includes(target.hostname)
|| !target.pathname.slice(1) || ["/postgres", "/template0", "/template1"].includes(target.pathname)) {
throw new Error("Reset nur fuer eine ausdruecklich konfigurierte lokale Anwendungsdatenbank erlaubt.");
}
if (mode === "demo" && process.env.BOOTSTRAP_PASSWORD !== undefined && process.env.BOOTSTRAP_PASSWORD.length < 12) {
throw new Error("BOOTSTRAP_PASSWORD muss mindestens 12 Zeichen haben. Es wurde nichts geloescht.");
}
console.log(`ACHTUNG: Alle Instanzdaten einschliesslich Konten, Sitzungen und Audit-Verlauf in ${target.hostname}:${target.port || "5432"}${target.pathname} werden geloescht.`);
const client = await db.connect();
try {
await client.query("BEGIN");
await client.query("SET LOCAL lock_timeout = '5s'");
await client.query("SELECT pg_advisory_xact_lock(724139002)");
await client.query("ALTER TABLE public.audit_log DISABLE TRIGGER audit_immutable");
await client.query(`TRUNCATE TABLE
public.applications, public.admission_rounds, public.application_limits,
public.attendance, public.day_overrides, public.weekly_schedules,
public.pickup_contacts, public.alone_rules, public.children, public.audit_log,
public.sessions, public.login_attempts, public.staff, public.pickup_slots
RESTART IDENTITY`);
await client.query("ALTER SEQUENCE public.attendance_revision RESTART WITH 1");
await client.query("ALTER TABLE public.audit_log ENABLE TRIGGER audit_immutable");
await client.query(`INSERT INTO public.pickup_slots(starts_at, ends_at) VALUES
('14:00', '14:15'), ('15:00', '15:15'), ('16:00', '16:15'), ('17:00', '17:15')`);
await client.query("COMMIT");
console.log("Instanzdaten geloescht. Schema, Migrationen und vier Standardslots sind bereit.");
} catch (error) {
await client.query("ROLLBACK");
throw error;
} finally {
client.release();
}
if (mode === "clear") {
console.log("Keine Konten vorhanden. Neuer Zugang: npm run db:setup. Demodaten: npm run db:seed.");
return;
}
const tsx = createRequire(import.meta.url).resolve("tsx/cli");
for (const script of ["setup.ts", "seed-demo.ts"]) {
const result = spawnSync(process.execPath, [tsx, fileURLToPath(new URL(script, import.meta.url))], {
cwd: fileURLToPath(new URL("../", import.meta.url)),
env: process.env,
stdio: "inherit",
});
if (result.error) throw result.error;
if (result.status !== 0) {
throw new Error(`${script} fehlgeschlagen. Daten wurden bereits geleert; db:setup und db:seed nach Fehlerbehebung erneut ausfuehren.`);
}
}
console.log("Demo-Instanz bereit. Mit dem neu ausgegebenen Zugang anmelden; alte Sitzungen sind ungueltig.");
}
reset().catch((error: unknown) => {
console.error("Instanz-Reset fehlgeschlagen:", error);
process.exitCode = 1;
}).finally(() => db.end());