Devlog-Seite: Bildergalerie, Projekt-Chips, Monats-Trenner
- Bild-Attachments werden beim Archivieren lokal gespeichert (Discord-CDN-URLs laufen ab) und unter /devlog-assets/ ausgeliefert; DB-Migration: images-Spalte - Frontend: Bildergalerie im Grid (responsive nach Anzahl), Embed-Titel als Projekt-Chip, Commit-Fußzeile abgesetzt, Monats-Trenner in der Timeline - Backfill lädt Bilder alter Devlogs nach (Dedupe verhindert Doppel-Downloads) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -35,6 +35,12 @@ db.exec(`
|
||||
CREATE INDEX IF NOT EXISTS idx_devlogs_posted ON devlogs (posted_at DESC);
|
||||
`);
|
||||
|
||||
// Migration: images-Spalte (JSON-Array lokaler Dateinamen) für bestehende DBs
|
||||
const devlogCols = db.prepare('PRAGMA table_info(devlogs)').all();
|
||||
if (!devlogCols.some((c) => c.name === 'images')) {
|
||||
db.exec(`ALTER TABLE devlogs ADD COLUMN images TEXT NOT NULL DEFAULT '[]'`);
|
||||
}
|
||||
|
||||
const insertCommit = db.prepare(`
|
||||
INSERT OR IGNORE INTO commits (sha, repo, branch, message, author_name, author_user, url, committed_at)
|
||||
VALUES (@sha, @repo, @branch, @message, @author_name, @author_user, @url, @committed_at)
|
||||
@@ -50,19 +56,25 @@ export const saveCommits = db.transaction((commits) => {
|
||||
});
|
||||
|
||||
const insertDevlog = db.prepare(`
|
||||
INSERT OR IGNORE INTO devlogs (message_id, channel_id, content, author_name, posted_at)
|
||||
VALUES (@message_id, @channel_id, @content, @author_name, @posted_at)
|
||||
INSERT OR IGNORE INTO devlogs (message_id, channel_id, content, author_name, posted_at, images)
|
||||
VALUES (@message_id, @channel_id, @content, @author_name, @posted_at, @images)
|
||||
`);
|
||||
const hasDevlogStmt = db.prepare('SELECT 1 FROM devlogs WHERE message_id = ?');
|
||||
|
||||
/** Devlog speichern — bereits bekannte Message-IDs werden ignoriert. Gibt true zurück, wenn neu. */
|
||||
export function saveDevlog(devlog) {
|
||||
return insertDevlog.run(devlog).changes > 0;
|
||||
return insertDevlog.run({ images: '[]', ...devlog }).changes > 0;
|
||||
}
|
||||
|
||||
/** true, wenn die Message schon archiviert ist (spart z. B. erneute Bild-Downloads) */
|
||||
export function hasDevlog(messageId) {
|
||||
return Boolean(hasDevlogStmt.get(messageId));
|
||||
}
|
||||
|
||||
// --- Lese-Queries für die Web-API (Feature 4) ---
|
||||
|
||||
const selectDevlogs = db.prepare(`
|
||||
SELECT message_id, content, author_name, posted_at
|
||||
SELECT message_id, content, author_name, posted_at, images
|
||||
FROM devlogs ORDER BY posted_at DESC LIMIT ? OFFSET ?
|
||||
`);
|
||||
const countDevlogsStmt = db.prepare('SELECT COUNT(*) AS n FROM devlogs');
|
||||
|
||||
Reference in New Issue
Block a user