Jede Idee bekommt ihre eigene Seite mit der Unterhaltung aus dem Thread
Vorbild windrose.support: Klick auf eine Idee, und man sieht sie ganz — Stand, Begruendung, wer sie eingereicht hat, und darunter, was dazu geschrieben wurde. Der Unterschied bleibt, wo geschrieben wird. Die Beitraege sind aus dem Discord-Thread gespiegelt, nicht hier getippt. Deshalb fuehrt der einzige Knopf am Ende in den Thread und nicht in ein Formular. Ein zweiter Ort fuer dieselbe Unterhaltung waere genau das, was ich beim Konzept als das Falsche bezeichnet habe. Bisher wurde nur mitgezaehlt. Jetzt landen die Beitraege in einer eigenen Tabelle — mit Bearbeiten und Loeschen, sonst stuende auf der Webseite fuer immer, was in Discord laengst zurueckgenommen wurde. Reine Bild-Posts ohne Text bleiben draussen, die haetten hier nichts zu sagen. Der Kommentar-Zaehler wird jetzt aus der Tabelle gezaehlt statt in einer Spalte mitgefuehrt. Eine Wahrheit statt zwei, die auseinanderlaufen koennen — dieselbe Ueberlegung wie beim Zuspruch. Nebenbei geprueft, weil es haette schiefgehen koennen: /api/wishes/suche und /api/wishes/:id liegen auf derselben Ebene. Der Router bevorzugt die feste Route vor der mit Platzhalter — nachgestellt mit find-my-way, nicht aus dem Gedaechtnis behauptet. Geprueft: im Browser die Seite mit drei Beitraegen und die ohne (kein Thread, keine Begruendung, Hinweis statt Liste), der Weg von der Roadmap dorthin ohne Neuladen, Migration erneut durchgespielt. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -16,6 +16,7 @@ import {
|
||||
saveTemplate, listTemplates, deleteTemplate,
|
||||
getLevelRow, isPlaytester, saveWish, toggleWishVote, myWishVotes,
|
||||
getWish, searchWishes, setWishStatus, mergeWish, deleteWish, wishVoters, setWishCategory,
|
||||
wishComments,
|
||||
listWishCategories, createWishCategory, updateWishCategory, deleteWishCategory,
|
||||
logAudit, listAudit, playerHistory, uptimeBuckets, watchdogBuckets, watchdogDays,
|
||||
heartbeatBuckets, heartbeatFirst,
|
||||
@@ -1984,6 +1985,27 @@ ${rssItems}
|
||||
return { voted: toggleWishVote(id, user.id) };
|
||||
});
|
||||
|
||||
// Ein einzelner Wunsch mit allem, was im Thread darunter steht.
|
||||
// Muss vor /api/wishes/:id/... stehen? Nein — andere Tiefe, kein Konflikt.
|
||||
app.get('/api/wishes/:id', async (request, reply) => {
|
||||
const id = Number(request.params.id);
|
||||
const wunsch = getWish(id);
|
||||
if (!wunsch) return reply.code(404).send({ error: 'Wunsch nicht gefunden' });
|
||||
const user = getSessionUser(request);
|
||||
const gid = discordGuildId();
|
||||
return {
|
||||
wunsch: {
|
||||
...wunsch,
|
||||
voted: user ? myWishVotes(user.id).includes(id) : false,
|
||||
thread_url: gid && wunsch.thread_id
|
||||
? `https://discord.com/channels/${gid}/${wunsch.thread_id}`
|
||||
: null,
|
||||
},
|
||||
kommentare: wishComments(id),
|
||||
canVote: Boolean(user),
|
||||
};
|
||||
});
|
||||
|
||||
// Suche vor dem Einreichen — Doppler gar nicht erst entstehen lassen
|
||||
app.get('/api/wishes/suche', async (request) => {
|
||||
const q = String(request.query?.q ?? '').trim();
|
||||
|
||||
Reference in New Issue
Block a user