/* ===================================================================== UNTERSTÜTZEN — Tabellen (24.09.2026) Filipe: „ich brauch auch noch eine kachel im community bereich. wo mein paypal und meine amazon liste sein wird. wo die leute alle supporten können auf andere art anstatt nur tiktok. … jeder soll diese kachel sehen aber nur dogfather soll sie verändern können oder vieles mehr sehen. alle anderen, rechte und linke hand, modis und community sollen supporten können." --------------------------------------------------------------------- WARUM DIE WEGE IN DER DATENBANK STEHEN UND NICHT IM QUELLTEXT Es wäre kürzer gewesen, PayPal und die Wunschliste als zwei feste Einträge in eine Datei zu schreiben. Drei Gründe dagegen, und der dritte ist der entscheidende: 1. EIN LINK ÄNDERT SICH. Eine Wunschliste wird neu angelegt, ein Zahlungsweg kommt dazu. Stünde er im Quelltext, hinge jede Änderung an einem Deploy — und damit an mir. 2. FILIPE SOLL IHN SELBST ÄNDERN KÖNNEN. Genau das hat er verlangt („nur dogfather soll sie verändern können"). Ein Recht, das man nur über einen Entwickler ausüben kann, ist keines. 3. UND DER PAYPAL-LINK STEHT NIRGENDS IM HAUS. Filipe schrieb „mein paypal kennst du ja schon" — gesucht habe ich, gefunden nicht. Ihn zu RATEN wäre der schlimmste Fehler dieser ganzen Seite: Ein falscher Zahlungslink schickt Geld an einen Fremden, und niemand merkt es. Deshalb steht dort am Anfang nichts, der Weg ist unsichtbar, und die Seite sagt DogFather (und nur ihm), dass dort noch etwas fehlt. --------------------------------------------------------------------- DREI ARTEN, UND DIE DRITTE IST DIE WICHTIGSTE geld Direkt Geld — PayPal. geschenk Etwas schenken — die Wunschliste. frei Kostet nichts. „frei" ist nicht Beiwerk. Eine Seite, die nur zwei Wege zum Zahlen zeigt, liest sich wie eine hohle Hand — und die meisten, die hier lesen, sind Zuschauer ohne Geld übrig. Wer gar nichts geben kann, soll trotzdem etwas finden, das er tun kann, statt die Seite mit einem schlechten Gefühl zu schließen. Deshalb stehen die freien Wege gleichberechtigt daneben und nicht als Trostpflaster darunter. --------------------------------------------------------------------- DIE ZÄHLUNG IST ANONYM — UND ZWAR VON DER TABELLE HER „nur dogfather soll … vieles mehr sehen": Er sieht, wie oft ein Weg geöffnet wurde. Was er NICHT sieht, ist WER — und das liegt nicht an einer Abfrage, die man später ändern könnte, sondern daran, dass es in dieser Tabelle keine Spalte dafür gibt. Das ist Absicht und keine Nachlässigkeit. „Wer hat auf PayPal gedrückt und dann doch nichts geschickt" ist eine Frage, die niemandem nützt und mehrere Leute beschämt. Sie lässt sich hier nicht beantworten, auch nicht von mir, auch nicht mit Datenbank- zugriff. Gezählt wird je Weg und je TAG. Der Tag reicht für „läuft das überhaupt an?" und ergibt bei einer Community dieser Größe keine Spur zu einzelnen Menschen. ===================================================================== */ /** Wie lange die Tagesstriche stehen bleiben. * * Ein Jahr: Lang genug, um Weihnachten mit Weihnachten zu * vergleichen, kurz genug, dass hier nichts für immer liegt. Aufgeräumt * wird im Rundgang, nicht beim Lesen — sonst hinge das Löschen davon * ab, dass jemand die Seite öffnet. */ export const ZAEHLUNG_TAGE = 365; /** Die drei Arten. Steht hier und nicht in der Oberfläche: Der Server * prüft dagegen, und eine zweite Liste im Browser wäre die, die beim * nächsten Zuwachs vergessen wird. */ export const UNTERSTUETZUNG_ARTEN = { geld: "Direkt", geschenk: "Schenken", frei: "Kostet nichts", }; /* Die Startbelegung. Sie wird EINMAL eingesetzt (INSERT OR IGNORE über den Schlüssel) und danach nie wieder angefasst — wer einen Weg löscht, soll ihn nicht beim nächsten Serverstart wiederfinden. DER PAYPAL-WEG KOMMT OHNE ADRESSE UND UNSICHTBAR. Siehe oben: Raten ist hier die gefährlichste aller Abkürzungen. */ const START_WEGE = [ { schluessel: "paypal", art: "geld", platz: 10, sichtbar: 0, titel: "PayPal", text: "Direkt und ohne Umweg. Auch ein kleiner Betrag hilft – " + "und niemand muss etwas geben, um dazuzugehören.", knopf: "Bei PayPal öffnen", ziel: "", }, { schluessel: "amazon", art: "geschenk", platz: 20, sichtbar: 1, titel: "Wunschliste", text: "Etwas Konkretes schenken statt Geld – die Liste sagt, " + "was gerade gebraucht wird.", knopf: "Wunschliste ansehen", ziel: "https://www.amazon.de/hz/wishlist/ls/3BGGNNHYAO5QL?ref_=wl_share", }, { schluessel: "dabei", art: "frei", platz: 30, sichtbar: 1, titel: "Einfach da sein", text: "Im Live dabei sein, mitreden, jemanden begrüßen, der neu ist. " + "Das kostet nichts und ist am meisten wert.", knopf: "", ziel: "", }, { schluessel: "weitersagen", art: "frei", platz: 40, sichtbar: 1, titel: "Weitersagen", text: "Einen Clip teilen oder jemandem von hier erzählen. " + "Neue Leute kommen über euch, nicht über Werbung.", knopf: "", ziel: "", }, { schluessel: "draussen", art: "frei", platz: 50, sichtbar: 1, titel: "Wo es Dogi sonst gibt", text: "Kanäle, Shop und dein Rabatt stehen auf einer eigenen Seite.", knopf: "Zu „Draußen“", ziel: "unsere-seiten.html", }, ]; export function unterstuetzungTabellen(d) { d.exec(` CREATE TABLE IF NOT EXISTS unterstuetzung_wege ( id INTEGER PRIMARY KEY AUTOINCREMENT, /* Der Schlüssel ist die Kennung für die Startbelegung und für die Zählung. Er ändert sich nie — der TITEL darf sich ändern, ohne dass die Striche der letzten Monate zu einem anderen Weg gehören. */ schluessel TEXT NOT NULL UNIQUE, art TEXT NOT NULL CHECK (art IN ('geld','geschenk','frei')), titel TEXT NOT NULL, text TEXT NOT NULL DEFAULT '', /* Die Aufschrift des Knopfes. Leer heißt: Dieser Weg hat keinen Knopf — es gibt Wege, die man nicht anklickt („einfach da sein"). Ein Knopf ohne Ziel wäre ein Versprechen ins Leere. */ knopf TEXT NOT NULL DEFAULT '', /* Die Adresse. Darf leer sein. Geprüft wird sie beim SCHREIBEN (nur https:// oder eine Seite dieses Hauses) — nicht erst beim Anzeigen: Eine Adresse, die erst im Browser auffällt, steht vorher schon in der Datenbank. */ ziel TEXT NOT NULL DEFAULT '', sichtbar INTEGER NOT NULL DEFAULT 1, platz INTEGER NOT NULL DEFAULT 0, geaendert TEXT, geaendert_von INTEGER REFERENCES personen(id) ON DELETE SET NULL ); /* KEINE SPALTE FÜR EINE PERSON. Siehe den Kopf dieser Datei — das ist die eigentliche Zusage dieser Seite, und sie steht hier im Schema und nicht in einer Abfrage, die jemand später ändert. */ CREATE TABLE IF NOT EXISTS unterstuetzung_striche ( weg_id INTEGER NOT NULL REFERENCES unterstuetzung_wege(id) ON DELETE CASCADE, tag TEXT NOT NULL, anzahl INTEGER NOT NULL DEFAULT 0, PRIMARY KEY (weg_id, tag) ); CREATE INDEX IF NOT EXISTS idx_unterstuetzung_tag ON unterstuetzung_striche(tag); `); /* INSERT OR IGNORE über den eindeutigen Schlüssel: Beim ersten Start entstehen die fünf Wege, bei jedem weiteren passiert nichts. Wer einen löscht, findet ihn nicht beim nächsten Neustart wieder — das wäre eine Änderung, die sich von selbst zurücknimmt, und so etwas sucht man stundenlang. */ const setz = d.prepare(`INSERT OR IGNORE INTO unterstuetzung_wege (schluessel, art, titel, text, knopf, ziel, sichtbar, platz) VALUES (?,?,?,?,?,?,?,?)`); for (const w of START_WEGE) { setz.run(w.schluessel, w.art, w.titel, w.text, w.knopf, w.ziel, w.sichtbar, w.platz); } }