Wunsch Filipe: "ich will dass du diese seite viel krasser und
detaillierter machst, ich will dass du dich informierst und alles
reinsetzt was wir noch gebrauchen koennten."
NICHT ALLES, SONDERN WAS TAEGLICH FEHLT. Der Chat konnte schon Raeume,
Verlauf, Gelesen-Stand, Live-Zustellung, Gruppen und Zuruecknehmen.
Drei Dinge fehlten, und jedes davon kostet ohne es echte Zeit:
1. SUCHE IN DEN NACHRICHTEN. Ein Chat ohne sie ist ab dem zweiten
Monat ein Archiv, in dem man nichts findet. Ein Suchfeld gab es --
es durchsuchte aber nur die NAMEN der Gespraeche, also die kleinere
Haelfte. Jetzt durchsucht dasselbe Feld beides und zeigt die
Fundstellen UNTER der Gespraechsliste: Wer "Patrick" eingibt, will
vielleicht das Gespraech und vielleicht die Nachricht -- ein
Umschalter haette ihn zwingen wollen, das vorher zu wissen.
2. ANTWORTEN MIT ZITAT. Zu zweit weiss man meistens, worauf sich etwas
bezieht. In einer Gruppe laufen drei Faeden parallel, und "ja, mach
das" kann alles heissen. Das Zitat steht IN der Blase (es gehoert
zur Antwort, nicht darueber) und fuehrt per Klick zur Stelle.
3. DIE LINIE "AB HIER NEU". Wer nach zwei Tagen zurueckkommt, sucht
sonst die Stelle, an der er aufgehoert hat, indem er Uhrzeiten
liest.
BEWUSST NICHT GEBAUT: Anhaenge (dafuer gibt es den Dateien-Bereich mit
Rechten und Ablauf), Reaktionen (eine vierte Sache, bevor die drei sich
bewaehrt haben) und Tipp-Anzeigen (dauernder Verkehr fuer eine
Auskunft, die man in zwei Sekunden ohnehin sieht).
DIE SICHERHEIT DER SUCHE STEHT IM JOIN, nicht in einer nachtraeglichen
Pruefung: `chat_teilnehmer` wird mit der eigenen Personenkennung
verbunden, und was dort nicht drinsteht, kommt gar nicht erst aus der
Datenbank. Ein Filter, der erst hinterher aussortiert, ist eine Zeile
davon entfernt, vergessen zu werden. Ebenso beim Zitat: Worauf
geantwortet wird, muss im SELBEN Raum liegen -- sonst koennte jemand
die Kennung aus einem fremden Gespraech mitschicken, und beim
Empfaenger stuende ein Zitat aus einem Raum, den er nie gesehen hat.
DREI FEHLER, DIE DER DURCHLAUF GEFUNDEN HAT:
1. `ESCAPE '\'` IN EINEM TEMPLATE-LITERAL. Dort ist `\'` eine
Fluchtsequenz fuer das Anfuehrungszeichen -- SQLite bekam ein
LEERES Fluchtzeichen und antwortete "ESCAPE expression must be a
single character". Die Suche war damit komplett tot. Kein
Syntaxfehler, kein Warnhinweis: Erst der Aufruf mit echten Daten
hat es gezeigt.
2. DIE MASKIERUNG KANNTE ZWEI VON DREI ZEICHEN. `%` und `_` waren
dabei, der Backslash nicht -- ausgerechnet das Fluchtzeichen selbst.
Geprueft wird das jetzt an der ZEILE AUS DER DATEI, nicht an einem
Nachbau: Mein erster Test hat die Maskierung nachgebaut und dabei
die Shell-Maskierung mitgeschleppt -- er meldete einen Fehler, den
nur er hatte.
3. DIE UNGELESEN-LINIE SCHIEN NICHT ZU FUNKTIONIEREN. Sie tat es --
mein Testaufbau war falsch: Filipes Seite war noch offen, die neuen
Nachrichten kamen ueber den Live-Strom an und wurden sofort als
gelesen gemeldet. Es gab schlicht nichts Ungelesenes. Erst als er
die Seite verlaesst, bevor Patrick schreibt, steht die Linie da --
und zwar genau vor "Neu von Patrick, eins", und beim zweiten
Oeffnen ist sie weg.
Der Gelesen-Stand wird deshalb beim OEFFNEN mitgeschickt, bevor er
gesetzt wird -- eine Zeile spaeter waere er immer die letzte Nachricht,
und die Linie staende nie irgendwo.
Ohne Volltextindex, mit Absicht: `LIKE` liest die Tabelle, und bei
einem Team dieser Groesse sind das einige tausend Zeilen. Ein
FTS5-Index waere eine zweite Tabelle, die synchron gehalten werden
muss -- genau daran gehen solche Sachen kaputt. Wenn der Verlauf
sechsstellig wird, ist das der Zeitpunkt dafuer, nicht heute.
Geprueft: pruef-chat, pruef-chat-optik, pruef-css-klassen,
pruef-workspace-seiten, pruef-handy -- alle in Ordnung. Dazu im
Browser durchgespielt: Zitat gesetzt und gelesen, Suche nach
"Bitrate" (1 Treffer), nach "100 %" (1 Treffer -- die Maskierung
haelt), nach Unsinn (0), einbuchstabige Suche (zu kurz), Antwortleiste
mit dem richtigen Namen, Ungelesen-Linie an der richtigen Stelle und
beim zweiten Oeffnen weg.
Co-Authored-By: Claude Opus 5 <[email protected]>