Wissen: "Neu" laeuft nach 48 Stunden von selbst ab
Filipe: neue Anleitungen sollen nach 48 Stunden aus dem oberen Block
verschwinden und nur noch in ihrer Kategorie zu finden sein. Vorher
standen sie dort 30 Tage.
ZUERST EIN PROBLEM IM BESTAND: Es gab gar keinen Zeitpunkt, nur ein
Datum (veroeffentlicht). Eine abends um 23 Uhr eingestellte Anleitung
waere damit nur 25 statt 48 Stunden neu gewesen. Neue Spalte
"hochgeladen" mit dem genauen Zeitpunkt -- eine Spalte anzuhaengen laesst
SQLite anstandslos zu, anders als eine geaenderte CHECK-Regel. Alte
Eintraege ohne Zeitstempel fallen auf Mitternacht des Datums zurueck,
geprueft.
ZWEI DINGE BEWUSST GETRENNT:
NEU laeuft nach 48 Stunden ab, gemessen ab dem Hochladen. Nicht ab
"veroeffentlicht" -- das ist nur ein Datum und darf frei gesetzt werden.
WICHTIG bleibt stehen, bis es jemand abschaltet. Es ist eine
Entscheidung von Hand ("Erscheint zusaetzlich ganz oben unter Neu &
wichtig"), keine Eigenschaft, die von selbst verfaellt -- sonst waere der
Schalter sinnlos. Wer eine angepinnte Anleitung loswerden will, nimmt
sie ueber "Bearbeiten" wieder heraus.
Damit man sieht, WARUM etwas oben steht, gibt es jetzt zwei Marken statt
einer: "Neu" (gruen, laeuft ab) und "Wichtig" (gold, bleibt). Sonst
wundert man sich, wenn eine verschwindet und die andere nicht. Unter der
Ueberschrift steht dieselbe Regel in einem Satz.
Geprueft mit kuenstlich gealterten Eintraegen:
0 h -> im Block, Marke "Neu"
47 h -> im Block, Marke "Neu"
49 h -> raus, aber weiterhin in der Kategorie
200 h + wichtig -> im Block, nur Marke "Wichtig"
300 h -> raus, in der Kategorie auffindbar
ohne Zeitstempel -> faellt auf das Datum zurueck
This commit is contained in:
@@ -34,6 +34,11 @@ const TITEL_MAX = 140;
|
||||
const TEXT_MAX = 400;
|
||||
const TAGS_MAX = 8;
|
||||
|
||||
/* Wie lange eine Anleitung unter "Neu & wichtig" steht. Danach ist sie
|
||||
nur noch in ihrer Kategorie zu finden -- so wie es sein soll: Der
|
||||
Block oben ist eine Neuigkeitenanzeige, kein zweites Regal. */
|
||||
const NEU_STUNDEN = 48;
|
||||
|
||||
const jetzt = () => new Date().toISOString();
|
||||
const heute = () => new Date().toISOString().slice(0, 10);
|
||||
|
||||
@@ -233,7 +238,7 @@ wissenRouter.get("/workspace/api/wissen", (req, res) => {
|
||||
const liste = db().prepare(`
|
||||
SELECT w.id, w.titel, w.beschreibung, w.kategorie, w.stufe, w.geraet, w.tags,
|
||||
w.name_original, w.groesse, w.wichtig, w.veroeffentlicht, w.aktualisiert,
|
||||
p.name AS von
|
||||
w.hochgeladen, p.name AS von
|
||||
FROM wissen w LEFT JOIN personen p ON p.id = w.erstellt_von
|
||||
${wo}
|
||||
ORDER BY w.wichtig DESC,
|
||||
@@ -243,12 +248,31 @@ wissenRouter.get("/workspace/api/wissen", (req, res) => {
|
||||
for (const e of liste) e.tags = e.tags ? String(e.tags).split(",").filter(Boolean) : [];
|
||||
|
||||
/* Neu und wichtig -- der Einstieg fuer alle, die nicht suchen,
|
||||
sondern schauen wollen, was sich getan hat. */
|
||||
sondern schauen wollen, was sich getan hat.
|
||||
|
||||
ZWEI VERSCHIEDENE DINGE, bewusst getrennt:
|
||||
|
||||
NEU laeuft nach 48 Stunden von selbst ab. Gemessen ab dem
|
||||
Hochladen, nicht ab dem Veroeffentlichungsdatum -- das ist nur ein
|
||||
Datum und darf frei gesetzt werden. Bei alten Eintraegen ohne
|
||||
Zeitstempel wird auf Mitternacht des Datums zurueckgefallen.
|
||||
|
||||
WICHTIG bleibt stehen, bis es jemand wieder abschaltet. Es ist
|
||||
eine Entscheidung von Hand ("Erscheint zusaetzlich ganz oben"),
|
||||
keine Eigenschaft, die von selbst verfaellt -- sonst waere der
|
||||
Schalter sinnlos. */
|
||||
const grenze = Date.now() - NEU_STUNDEN * 3600_000;
|
||||
const istNeu = (e) => {
|
||||
const wann = e.hochgeladen
|
||||
? Date.parse(e.hochgeladen)
|
||||
: Date.parse((e.veroeffentlicht || "") + "T00:00:00");
|
||||
return Number.isFinite(wann) && wann >= grenze;
|
||||
};
|
||||
const neu = !k && !q && !stufe && !geraet && !tag
|
||||
? liste.filter((e) => e.wichtig
|
||||
|| (Date.now() - Date.parse(e.aktualisiert || e.veroeffentlicht) < 30 * 86400_000))
|
||||
.slice(0, 6)
|
||||
? liste.filter((e) => e.wichtig || istNeu(e)).slice(0, 6)
|
||||
: [];
|
||||
/* Damit die Oberflaeche sagen kann, WARUM etwas oben steht. */
|
||||
for (const e of neu) e.ist_neu = istNeu(e);
|
||||
|
||||
res.json({ eintraege: liste, neu, gesamt: liste.length });
|
||||
} catch (fehler) {
|
||||
@@ -364,12 +388,12 @@ wissenRouter.post(
|
||||
const { lastInsertRowid } = db().prepare(`
|
||||
INSERT INTO wissen
|
||||
(titel, beschreibung, kategorie, stufe, geraet, tags,
|
||||
name_original, name_datei, groesse, wichtig, veroeffentlicht, erstellt_von)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?,?,?)`).run(
|
||||
name_original, name_datei, groesse, wichtig, veroeffentlicht, hochgeladen, erstellt_von)
|
||||
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)`).run(
|
||||
aus.titel, aus.beschreibung ?? null, aus.kategorie,
|
||||
aus.stufe ?? "einsteiger", aus.geraet ?? "egal", aus.tags ?? null,
|
||||
name, dateiname, req.body.length, aus.wichtig ?? 0,
|
||||
aus.veroeffentlicht ?? heute(), req.person.id);
|
||||
aus.veroeffentlicht ?? heute(), jetzt(), req.person.id);
|
||||
|
||||
protokolliere("wissen_hochgeladen", {
|
||||
personId: req.person.id, rolle: req.person.rolle, ip: echteIp(req),
|
||||
|
||||
@@ -117,6 +117,20 @@ let _dbFehler = null;
|
||||
function umstellungen(d) {
|
||||
const jetztStempel = new Date().toISOString().slice(0, 16).replace(/[-:T]/g, "");
|
||||
|
||||
/* ---- Zeitpunkt des Hochladens in der Bibliothek ----
|
||||
Eine neue Spalte laesst SQLite anstandslos anhaengen -- anders als
|
||||
eine CHECK-Regel. Alte Eintraege bleiben leer und fallen auf das
|
||||
Veroeffentlichungsdatum zurueck. */
|
||||
try {
|
||||
const spalten = d.prepare("PRAGMA table_info(wissen)").all().map((s) => s.name);
|
||||
if (spalten.length && !spalten.includes("hochgeladen")) {
|
||||
d.exec("ALTER TABLE wissen ADD COLUMN hochgeladen TEXT");
|
||||
console.log("[workspace] Spalte 'hochgeladen' in der Bibliothek ergaenzt.");
|
||||
}
|
||||
} catch (fehler) {
|
||||
console.error("[workspace] Spalte 'hochgeladen':", fehler?.message);
|
||||
}
|
||||
|
||||
/* ---- Rolle "manager" erlauben ---- */
|
||||
const bauplan = d.prepare(
|
||||
"SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'personen'").get()?.sql || "";
|
||||
|
||||
Reference in New Issue
Block a user