diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 9e221ec..6d8c141 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,182 @@ TASKMATE - CHANGELOG ==================== +================================================================================ +30.12.2025 - BUGFIX: Login-Problem behoben (Sofort-Logout nach Login) +================================================================================ + +PROBLEM +-------------------------------------------------------------------------------- +Nach erfolgreichem Login wurde der Benutzer sofort wieder zum Login-Screen +zurückgeleitet. Dies war ein Race-Condition-Problem mit mehrfachen WebSocket- +Verbindungen und fehlenden Token-Prüfungen. + +URSACHE +-------------------------------------------------------------------------------- +1. syncManager.connect() wurde doppelt aufgerufen (einmal in sync.js Event- + Listener und einmal in app.js initializeApp()) +2. Der Socket-Error-Handler in sync.js löste auth:logout aus OHNE zu prüfen, + ob sich der Token in der Zwischenzeit geändert hatte + +LÖSUNG +-------------------------------------------------------------------------------- +1. Doppelten syncManager.connect() Aufruf entfernt (nur noch in app.js) +2. Socket-Error-Handler prüft nun, ob ein gültiger Token existiert, bevor + logout ausgelöst wird +3. syncManager.connect() prüft jetzt ob Socket bereits existiert (nicht nur + ob er verbunden ist), um Race Conditions während des Verbindungsaufbaus + zu verhindern + +BETROFFENE DATEIEN +-------------------------------------------------------------------------------- +- frontend/js/sync.js: Doppelten Connect-Aufruf entfernt, Token-Check hinzugefügt, + verbesserte Socket-Existenz-Prüfung +- frontend/sw.js: Cache-Version auf 151 erhöht + + +================================================================================ +30.12.2025 - UI-REDESIGN: Wissensmanagement-Tab komplett überarbeitet +================================================================================ + +NEUES LAYOUT: SIDEBAR + HAUPTBEREICH +-------------------------------------------------------------------------------- +Der Wissensmanagement-Tab wurde komplett überarbeitet mit einem neuen +2-Spalten-Layout für bessere Übersicht und Bedienbarkeit. + +NEUE FEATURES +-------------------------------------------------------------------------------- +- Sidebar-Layout: Kategorien links, Einträge rechts - beide gleichzeitig sichtbar +- Drag & Drop Sortierung: Kategorien UND Einträge per Drag & Drop sortierbar +- Kompakte Ansicht: Einträge zeigen nur Titel, Details per Klick aufklappbar +- Aktive Kategorie: Farbiger linker Rand zeigt die ausgewählte Kategorie +- Indikatoren: Icons zeigen auf einen Blick ob Link, Notizen oder Anhänge vorhanden +- Responsive Design: Auf Mobile werden Kategorien als horizontale Chips angezeigt + +UI-VERBESSERUNGEN +-------------------------------------------------------------------------------- +- Aufklappbare Einträge (▶/▼) für bessere Platznutzung +- Drag-Handles (⋮⋮) für intuitive Sortierung +- Hover-Aktionen (Bearbeiten, Löschen) erscheinen bei Mausbewegung +- Sanfte Animationen für Expand/Collapse + +BETROFFENE DATEIEN +-------------------------------------------------------------------------------- +- frontend/index.html: Komplette Neustrukturierung des Knowledge-Views + (Sidebar + Main Layout, Mobile Chips) +- frontend/css/knowledge.css: Komplett neu geschrieben für das neue Layout + (Grid-System, Sidebar, kompakte Einträge, Drag & Drop Styles) +- frontend/js/knowledge.js: Komplett überarbeitet mit neuem Rendering, + Drag & Drop Handlers, Expand/Collapse Logik +- frontend/sw.js: Cache-Version auf 149 erhöht + + +================================================================================ +30.12.2025 - VERBESSERUNG: Globale Suche für Wissensmanagement +================================================================================ + +ÄNDERUNG: SUCHFELD IN HEADER INTEGRIERT +-------------------------------------------------------------------------------- +Die Suchfunktion für den Wissensmanagement-Tab wurde vom Tab selbst in das +globale Suchfeld im Header verschoben. Wenn der Benutzer auf dem "Wissen"-Tab +ist, durchsucht das Header-Suchfeld automatisch die Wissensdatenbank. + +DETAILS +-------------------------------------------------------------------------------- +- Suchfeld aus dem Wissen-Tab entfernt +- "Neue Kategorie"-Button zentral positioniert +- Globales Suchfeld erkennt aktiven Tab und leitet Suchanfragen entsprechend weiter +- Suchfeld wird automatisch geleert beim Wechsel zwischen Tabs +- Konsistentes Suchverhalten über alle Bereiche (Board, Vorschläge, Wissen) + +BETROFFENE DATEIEN +-------------------------------------------------------------------------------- +- frontend/js/knowledge.js: Öffentliche setSearchQuery() Methode hinzugefügt, + alte Suchfeld-Referenzen entfernt +- frontend/js/app.js: setupSearch() und switchView() erweitert für + Knowledge-Suche Integration +- frontend/css/knowledge.css: Suchfeld-Styles entfernt, zentrierten Header + hinzugefügt +- frontend/index.html: Suchfeld aus Knowledge-Tab entfernt +- frontend/sw.js: Cache-Version auf 148 erhöht + + +================================================================================ +30.12.2025 - NEUES FEATURE: Wissensmanagement-Tab +================================================================================ + +FEATURE: WISSENSMANAGEMENT-TAB +-------------------------------------------------------------------------------- +Neuer Tab "Wissen" in der Hauptnavigation für projektunabhängiges +Wissensmanagement mit 2-Ebenen-Hierarchie. + +KATEGORIEN +-------------------------------------------------------------------------------- +- Kategorien mit Namen, Beschreibung, Farbe und Icon (Emoji) +- Kategorien-Grid mit Eintrags-Anzahl +- Erstellen, Bearbeiten und Löschen von Kategorien +- Farbcodierung für visuelle Unterscheidung + +EINTRÄGE +-------------------------------------------------------------------------------- +- Einträge innerhalb von Kategorien +- Jeder Eintrag kann enthalten: + - Titel (Pflichtfeld) + - Link/URL (optional, klickbar) + - Notizen (optional, Markdown-fähig) + - Dateianhänge (mehrere pro Eintrag möglich) +- Erstellen, Bearbeiten und Löschen von Einträgen + +SUCHFUNKTION +-------------------------------------------------------------------------------- +- Dedizierte Suche nur für den Wissensmanagement-Bereich +- Durchsucht Titel, Notizen und URLs +- Debounce für Performance-Optimierung +- Ergebnisse zeigen Kategorie-Zugehörigkeit + +BETROFFENE DATEIEN +-------------------------------------------------------------------------------- +Backend: +- backend/database.js: 3 neue Tabellen (knowledge_categories, knowledge_entries, + knowledge_attachments) mit Indizes +- backend/routes/knowledge.js: NEU - CRUD-Operationen für Kategorien, Einträge, + Anhänge und Suche +- backend/server.js: Route-Registrierung hinzugefügt + +Frontend: +- frontend/js/api.js: 15+ neue API-Methoden für Wissensmanagement +- frontend/js/knowledge.js: NEU - KnowledgeManager-Klasse +- frontend/css/knowledge.css: NEU - Styles für Kategorien, Einträge, Suche +- frontend/index.html: Tab, View und Modals hinzugefügt +- frontend/js/app.js: Import und Integration des KnowledgeManager +- frontend/sw.js: Cache-Version auf 144 erhöht, neue Dateien hinzugefügt + + +================================================================================ +30.12.2025 - KRITISCHER BUGFIX: Login-Problem behoben +================================================================================ + +BUGFIX: SOFORTIGER LOGOUT NACH ERFOLGREICHEM LOGIN +-------------------------------------------------------------------------------- +Problem: Nach erfolgreichem Login wurde der Benutzer sofort wieder ausgeloggt. + +Ursache: Race-Condition zwischen Session-Refresh und Login: +1. Beim Seitenaufruf mit altem Token startete refreshSession() einen async Request +2. Benutzer logt sich erfolgreich ein (neuer Token wird gesetzt) +3. Der alte Refresh-Request kehrt mit 401 zurück +4. Der 401-Fehler löste logout() aus, obwohl neuer gültiger Token existierte + +Lösung: +- Vor dem Logout wird geprüft ob der aktuelle Token noch der gleiche ist +- Wenn ein neuer Login stattfand (Token unterschiedlich), wird 401 ignoriert +- Prüfung in auth.js (refreshSession) und api.js (request) hinzugefügt + +BETROFFENE DATEIEN +-------------------------------------------------------------------------------- +- frontend/js/auth.js: refreshSession() prüft Token vor Logout +- frontend/js/api.js: request() prüft Token vor Logout bei 401 +- frontend/sw.js: Cache-Version auf 143 erhöht + + ================================================================================ 30.12.2025 - Checklisten-Unteraufgaben: Drag & Drop und Bearbeiten ================================================================================ diff --git a/backend/database.js b/backend/database.js index 58289dd..b7d1c4d 100644 --- a/backend/database.js +++ b/backend/database.js @@ -409,6 +409,54 @@ function createTables() { ) `); + // Wissensmanagement - Kategorien + db.exec(` + CREATE TABLE IF NOT EXISTS knowledge_categories ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + description TEXT, + color TEXT DEFAULT '#3B82F6', + icon TEXT, + position INTEGER NOT NULL DEFAULT 0, + created_by INTEGER, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (created_by) REFERENCES users(id) + ) + `); + + // Wissensmanagement - Einträge + db.exec(` + CREATE TABLE IF NOT EXISTS knowledge_entries ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + category_id INTEGER NOT NULL, + title TEXT NOT NULL, + url TEXT, + notes TEXT, + position INTEGER NOT NULL DEFAULT 0, + created_by INTEGER, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (category_id) REFERENCES knowledge_categories(id) ON DELETE CASCADE, + FOREIGN KEY (created_by) REFERENCES users(id) + ) + `); + + // Wissensmanagement - Anhänge + db.exec(` + CREATE TABLE IF NOT EXISTS knowledge_attachments ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + entry_id INTEGER NOT NULL, + filename TEXT NOT NULL, + original_name TEXT NOT NULL, + mime_type TEXT NOT NULL, + size_bytes INTEGER NOT NULL, + uploaded_by INTEGER, + uploaded_at DATETIME DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (entry_id) REFERENCES knowledge_entries(id) ON DELETE CASCADE, + FOREIGN KEY (uploaded_by) REFERENCES users(id) + ) + `); + // Indizes für Performance db.exec(` CREATE INDEX IF NOT EXISTS idx_tasks_project ON tasks(project_id); @@ -426,6 +474,8 @@ function createTables() { CREATE INDEX IF NOT EXISTS idx_notifications_user_read ON notifications(user_id, is_read); CREATE INDEX IF NOT EXISTS idx_notifications_created ON notifications(created_at); CREATE INDEX IF NOT EXISTS idx_applications_project ON applications(project_id); + CREATE INDEX IF NOT EXISTS idx_knowledge_entries_category ON knowledge_entries(category_id); + CREATE INDEX IF NOT EXISTS idx_knowledge_attachments_entry ON knowledge_attachments(entry_id); `); logger.info('Datenbank-Tabellen erstellt'); diff --git a/backend/middleware/auth.js b/backend/middleware/auth.js index 94cdf33..62efcaa 100644 --- a/backend/middleware/auth.js +++ b/backend/middleware/auth.js @@ -45,6 +45,10 @@ function verifyToken(token) { try { return jwt.verify(token, JWT_SECRET); } catch (error) { + // Nur bei unerwarteten Fehlern loggen (nicht bei normalen Ablauf/Ungültig-Fällen) + if (error.name !== 'TokenExpiredError' && error.name !== 'JsonWebTokenError') { + logger.error(`[AUTH] Unerwarteter Token-Fehler: ${error.name} - ${error.message}`); + } return null; } } diff --git a/backend/routes/knowledge.js b/backend/routes/knowledge.js new file mode 100644 index 0000000..15c5b57 --- /dev/null +++ b/backend/routes/knowledge.js @@ -0,0 +1,944 @@ +/** + * TASKMATE - Knowledge Management Routes + * ====================================== + * CRUD für Wissensmanagement: Kategorien, Einträge, Anhänge + */ + +const express = require('express'); +const router = express.Router(); +const path = require('path'); +const fs = require('fs'); +const multer = require('multer'); +const { getDb } = require('../database'); +const logger = require('../utils/logger'); +const { validators, stripHtml } = require('../middleware/validation'); + +// Upload-Konfiguration für Knowledge-Anhänge +const UPLOAD_DIR = path.join(__dirname, '..', 'uploads', 'knowledge'); + +// Sicherstellen, dass das Upload-Verzeichnis existiert +if (!fs.existsSync(UPLOAD_DIR)) { + fs.mkdirSync(UPLOAD_DIR, { recursive: true }); +} + +const storage = multer.diskStorage({ + destination: (req, file, cb) => { + cb(null, UPLOAD_DIR); + }, + filename: (req, file, cb) => { + const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9); + const ext = path.extname(file.originalname); + cb(null, `knowledge-${uniqueSuffix}${ext}`); + } +}); + +const upload = multer({ + storage, + limits: { + fileSize: 50 * 1024 * 1024 // 50MB max + } +}); + +// ===================== +// KATEGORIEN +// ===================== + +/** + * GET /api/knowledge/categories + * Alle Kategorien abrufen + */ +router.get('/categories', (req, res) => { + try { + const db = getDb(); + const categories = db.prepare(` + SELECT kc.*, + (SELECT COUNT(*) FROM knowledge_entries WHERE category_id = kc.id) as entry_count, + u.display_name as creator_name + FROM knowledge_categories kc + LEFT JOIN users u ON kc.created_by = u.id + ORDER BY kc.position, kc.created_at + `).all(); + + res.json(categories.map(c => ({ + id: c.id, + name: c.name, + description: c.description, + color: c.color, + icon: c.icon, + position: c.position, + entryCount: c.entry_count, + createdBy: c.created_by, + creatorName: c.creator_name, + createdAt: c.created_at + }))); + } catch (error) { + logger.error('Fehler beim Abrufen der Knowledge-Kategorien:', { error: error.message }); + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + +/** + * POST /api/knowledge/categories + * Neue Kategorie erstellen + */ +router.post('/categories', (req, res) => { + try { + const { name, description, color, icon } = req.body; + + // Validierung + const nameError = validators.required(name, 'Name') || + validators.maxLength(name, 50, 'Name'); + if (nameError) { + return res.status(400).json({ error: nameError }); + } + + if (color) { + const colorError = validators.hexColor(color, 'Farbe'); + if (colorError) { + return res.status(400).json({ error: colorError }); + } + } + + const db = getDb(); + + // Duplikat-Prüfung + const existing = db.prepare( + 'SELECT id FROM knowledge_categories WHERE LOWER(name) = LOWER(?)' + ).get(name); + + if (existing) { + return res.status(400).json({ error: 'Eine Kategorie mit diesem Namen existiert bereits' }); + } + + // Position ermitteln + const lastPosition = db.prepare( + 'SELECT MAX(position) as max_pos FROM knowledge_categories' + ).get(); + const position = (lastPosition.max_pos ?? -1) + 1; + + // Einfügen + const result = db.prepare(` + INSERT INTO knowledge_categories (name, description, color, icon, position, created_by) + VALUES (?, ?, ?, ?, ?, ?) + `).run( + stripHtml(name), + description ? stripHtml(description) : null, + color || '#3B82F6', + icon || null, + position, + req.user.id + ); + + const category = db.prepare('SELECT * FROM knowledge_categories WHERE id = ?') + .get(result.lastInsertRowid); + + logger.info(`Knowledge-Kategorie erstellt: ${name}`); + + res.status(201).json({ + id: category.id, + name: category.name, + description: category.description, + color: category.color, + icon: category.icon, + position: category.position, + entryCount: 0, + createdBy: category.created_by, + createdAt: category.created_at + }); + } catch (error) { + logger.error('Fehler beim Erstellen der Knowledge-Kategorie:', { error: error.message }); + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + +/** + * PUT /api/knowledge/categories/:id + * Kategorie aktualisieren + */ +router.put('/categories/:id', (req, res) => { + try { + const categoryId = req.params.id; + const { name, description, color, icon } = req.body; + + const db = getDb(); + + const existing = db.prepare('SELECT * FROM knowledge_categories WHERE id = ?').get(categoryId); + if (!existing) { + return res.status(404).json({ error: 'Kategorie nicht gefunden' }); + } + + // Validierung + if (name) { + const nameError = validators.maxLength(name, 50, 'Name'); + if (nameError) { + return res.status(400).json({ error: nameError }); + } + + // Duplikat-Prüfung (ausser eigene) + const duplicate = db.prepare( + 'SELECT id FROM knowledge_categories WHERE LOWER(name) = LOWER(?) AND id != ?' + ).get(name, categoryId); + + if (duplicate) { + return res.status(400).json({ error: 'Eine Kategorie mit diesem Namen existiert bereits' }); + } + } + + if (color) { + const colorError = validators.hexColor(color, 'Farbe'); + if (colorError) { + return res.status(400).json({ error: colorError }); + } + } + + db.prepare(` + UPDATE knowledge_categories SET + name = COALESCE(?, name), + description = COALESCE(?, description), + color = COALESCE(?, color), + icon = COALESCE(?, icon) + WHERE id = ? + `).run( + name ? stripHtml(name) : null, + description !== undefined ? (description ? stripHtml(description) : '') : null, + color || null, + icon !== undefined ? icon : null, + categoryId + ); + + const category = db.prepare('SELECT * FROM knowledge_categories WHERE id = ?').get(categoryId); + + logger.info(`Knowledge-Kategorie aktualisiert: ${category.name}`); + + res.json({ + id: category.id, + name: category.name, + description: category.description, + color: category.color, + icon: category.icon, + position: category.position, + createdBy: category.created_by, + createdAt: category.created_at + }); + } catch (error) { + logger.error('Fehler beim Aktualisieren der Knowledge-Kategorie:', { error: error.message }); + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + +/** + * PUT /api/knowledge/categories/:id/position + * Kategorie-Position ändern + */ +router.put('/categories/:id/position', (req, res) => { + try { + const categoryId = req.params.id; + const { newPosition } = req.body; + + const db = getDb(); + + const category = db.prepare('SELECT * FROM knowledge_categories WHERE id = ?').get(categoryId); + if (!category) { + return res.status(404).json({ error: 'Kategorie nicht gefunden' }); + } + + const oldPosition = category.position; + + if (newPosition > oldPosition) { + db.prepare(` + UPDATE knowledge_categories SET position = position - 1 + WHERE position > ? AND position <= ? + `).run(oldPosition, newPosition); + } else if (newPosition < oldPosition) { + db.prepare(` + UPDATE knowledge_categories SET position = position + 1 + WHERE position >= ? AND position < ? + `).run(newPosition, oldPosition); + } + + db.prepare('UPDATE knowledge_categories SET position = ? WHERE id = ?').run(newPosition, categoryId); + + const categories = db.prepare( + 'SELECT * FROM knowledge_categories ORDER BY position' + ).all(); + + res.json({ + categories: categories.map(c => ({ + id: c.id, + name: c.name, + position: c.position + })) + }); + } catch (error) { + logger.error('Fehler beim Verschieben der Knowledge-Kategorie:', { error: error.message }); + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + +/** + * DELETE /api/knowledge/categories/:id + * Kategorie löschen (inkl. aller Einträge und Anhänge) + */ +router.delete('/categories/:id', (req, res) => { + try { + const categoryId = req.params.id; + const db = getDb(); + + const category = db.prepare('SELECT * FROM knowledge_categories WHERE id = ?').get(categoryId); + if (!category) { + return res.status(404).json({ error: 'Kategorie nicht gefunden' }); + } + + // Anhänge von allen Einträgen dieser Kategorie löschen + const entries = db.prepare('SELECT id FROM knowledge_entries WHERE category_id = ?').all(categoryId); + for (const entry of entries) { + const attachments = db.prepare('SELECT * FROM knowledge_attachments WHERE entry_id = ?').all(entry.id); + for (const attachment of attachments) { + const filePath = path.join(UPLOAD_DIR, attachment.filename); + if (fs.existsSync(filePath)) { + fs.unlinkSync(filePath); + } + } + } + + // Kategorie löschen (CASCADE löscht Einträge und Anhänge aus DB) + db.prepare('DELETE FROM knowledge_categories WHERE id = ?').run(categoryId); + + // Positionen neu nummerieren + const remaining = db.prepare( + 'SELECT id FROM knowledge_categories ORDER BY position' + ).all(); + remaining.forEach((c, idx) => { + db.prepare('UPDATE knowledge_categories SET position = ? WHERE id = ?').run(idx, c.id); + }); + + logger.info(`Knowledge-Kategorie gelöscht: ${category.name}`); + + res.json({ message: 'Kategorie gelöscht' }); + } catch (error) { + logger.error('Fehler beim Löschen der Knowledge-Kategorie:', { error: error.message }); + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + +// ===================== +// EINTRÄGE +// ===================== + +/** + * GET /api/knowledge/entries + * Einträge abrufen (optional gefiltert nach Kategorie) + */ +router.get('/entries', (req, res) => { + try { + const { categoryId } = req.query; + const db = getDb(); + + let query = ` + SELECT ke.*, + kc.name as category_name, + kc.color as category_color, + u.display_name as creator_name, + (SELECT COUNT(*) FROM knowledge_attachments WHERE entry_id = ke.id) as attachment_count + FROM knowledge_entries ke + LEFT JOIN knowledge_categories kc ON ke.category_id = kc.id + LEFT JOIN users u ON ke.created_by = u.id + `; + + const params = []; + if (categoryId) { + query += ' WHERE ke.category_id = ?'; + params.push(categoryId); + } + + query += ' ORDER BY ke.position, ke.created_at DESC'; + + const entries = db.prepare(query).all(...params); + + res.json(entries.map(e => ({ + id: e.id, + categoryId: e.category_id, + categoryName: e.category_name, + categoryColor: e.category_color, + title: e.title, + url: e.url, + notes: e.notes, + position: e.position, + attachmentCount: e.attachment_count, + createdBy: e.created_by, + creatorName: e.creator_name, + createdAt: e.created_at, + updatedAt: e.updated_at + }))); + } catch (error) { + logger.error('Fehler beim Abrufen der Knowledge-Einträge:', { error: error.message }); + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + +/** + * GET /api/knowledge/entries/:id + * Einzelnen Eintrag abrufen (mit Anhängen) + */ +router.get('/entries/:id', (req, res) => { + try { + const entryId = req.params.id; + const db = getDb(); + + const entry = db.prepare(` + SELECT ke.*, + kc.name as category_name, + kc.color as category_color, + u.display_name as creator_name + FROM knowledge_entries ke + LEFT JOIN knowledge_categories kc ON ke.category_id = kc.id + LEFT JOIN users u ON ke.created_by = u.id + WHERE ke.id = ? + `).get(entryId); + + if (!entry) { + return res.status(404).json({ error: 'Eintrag nicht gefunden' }); + } + + const attachments = db.prepare(` + SELECT ka.*, u.display_name as uploader_name + FROM knowledge_attachments ka + LEFT JOIN users u ON ka.uploaded_by = u.id + WHERE ka.entry_id = ? + ORDER BY ka.uploaded_at DESC + `).all(entryId); + + res.json({ + id: entry.id, + categoryId: entry.category_id, + categoryName: entry.category_name, + categoryColor: entry.category_color, + title: entry.title, + url: entry.url, + notes: entry.notes, + position: entry.position, + createdBy: entry.created_by, + creatorName: entry.creator_name, + createdAt: entry.created_at, + updatedAt: entry.updated_at, + attachments: attachments.map(a => ({ + id: a.id, + filename: a.filename, + originalName: a.original_name, + mimeType: a.mime_type, + sizeBytes: a.size_bytes, + uploadedBy: a.uploaded_by, + uploaderName: a.uploader_name, + uploadedAt: a.uploaded_at + })) + }); + } catch (error) { + logger.error('Fehler beim Abrufen des Knowledge-Eintrags:', { error: error.message }); + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + +/** + * POST /api/knowledge/entries + * Neuen Eintrag erstellen + */ +router.post('/entries', (req, res) => { + try { + const { categoryId, title, url, notes } = req.body; + + // Validierung + const categoryError = validators.required(categoryId, 'Kategorie'); + if (categoryError) { + return res.status(400).json({ error: categoryError }); + } + + const titleError = validators.required(title, 'Titel') || + validators.maxLength(title, 200, 'Titel'); + if (titleError) { + return res.status(400).json({ error: titleError }); + } + + if (url) { + const urlError = validators.url(url, 'URL'); + if (urlError) { + return res.status(400).json({ error: urlError }); + } + } + + const db = getDb(); + + // Kategorie prüfen + const category = db.prepare('SELECT * FROM knowledge_categories WHERE id = ?').get(categoryId); + if (!category) { + return res.status(404).json({ error: 'Kategorie nicht gefunden' }); + } + + // Position ermitteln + const lastPosition = db.prepare( + 'SELECT MAX(position) as max_pos FROM knowledge_entries WHERE category_id = ?' + ).get(categoryId); + const position = (lastPosition.max_pos ?? -1) + 1; + + // Einfügen + const result = db.prepare(` + INSERT INTO knowledge_entries (category_id, title, url, notes, position, created_by) + VALUES (?, ?, ?, ?, ?, ?) + `).run( + categoryId, + stripHtml(title), + url || null, + notes || null, + position, + req.user.id + ); + + const entry = db.prepare('SELECT * FROM knowledge_entries WHERE id = ?') + .get(result.lastInsertRowid); + + logger.info(`Knowledge-Eintrag erstellt: ${title}`); + + res.status(201).json({ + id: entry.id, + categoryId: entry.category_id, + title: entry.title, + url: entry.url, + notes: entry.notes, + position: entry.position, + attachmentCount: 0, + createdBy: entry.created_by, + createdAt: entry.created_at, + updatedAt: entry.updated_at + }); + } catch (error) { + logger.error('Fehler beim Erstellen des Knowledge-Eintrags:', { error: error.message }); + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + +/** + * PUT /api/knowledge/entries/:id + * Eintrag aktualisieren + */ +router.put('/entries/:id', (req, res) => { + try { + const entryId = req.params.id; + const { categoryId, title, url, notes } = req.body; + + const db = getDb(); + + const existing = db.prepare('SELECT * FROM knowledge_entries WHERE id = ?').get(entryId); + if (!existing) { + return res.status(404).json({ error: 'Eintrag nicht gefunden' }); + } + + // Validierung + if (title) { + const titleError = validators.maxLength(title, 200, 'Titel'); + if (titleError) { + return res.status(400).json({ error: titleError }); + } + } + + if (url) { + const urlError = validators.url(url, 'URL'); + if (urlError) { + return res.status(400).json({ error: urlError }); + } + } + + if (categoryId) { + const category = db.prepare('SELECT * FROM knowledge_categories WHERE id = ?').get(categoryId); + if (!category) { + return res.status(404).json({ error: 'Kategorie nicht gefunden' }); + } + } + + db.prepare(` + UPDATE knowledge_entries SET + category_id = COALESCE(?, category_id), + title = COALESCE(?, title), + url = ?, + notes = ?, + updated_at = CURRENT_TIMESTAMP + WHERE id = ? + `).run( + categoryId || null, + title ? stripHtml(title) : null, + url !== undefined ? url : existing.url, + notes !== undefined ? notes : existing.notes, + entryId + ); + + const entry = db.prepare(` + SELECT ke.*, kc.name as category_name, kc.color as category_color + FROM knowledge_entries ke + LEFT JOIN knowledge_categories kc ON ke.category_id = kc.id + WHERE ke.id = ? + `).get(entryId); + + logger.info(`Knowledge-Eintrag aktualisiert: ${entry.title}`); + + res.json({ + id: entry.id, + categoryId: entry.category_id, + categoryName: entry.category_name, + categoryColor: entry.category_color, + title: entry.title, + url: entry.url, + notes: entry.notes, + position: entry.position, + createdBy: entry.created_by, + createdAt: entry.created_at, + updatedAt: entry.updated_at + }); + } catch (error) { + logger.error('Fehler beim Aktualisieren des Knowledge-Eintrags:', { error: error.message }); + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + +/** + * PUT /api/knowledge/entries/:id/position + * Eintrag-Position ändern (oder in andere Kategorie verschieben) + */ +router.put('/entries/:id/position', (req, res) => { + try { + const entryId = req.params.id; + const { newPosition, newCategoryId } = req.body; + + const db = getDb(); + + const entry = db.prepare('SELECT * FROM knowledge_entries WHERE id = ?').get(entryId); + if (!entry) { + return res.status(404).json({ error: 'Eintrag nicht gefunden' }); + } + + const oldPosition = entry.position; + const oldCategoryId = entry.category_id; + const targetCategoryId = newCategoryId || oldCategoryId; + + // Wenn Kategorie wechselt + if (targetCategoryId !== oldCategoryId) { + // Alte Kategorie: Positionen nach dem entfernten Eintrag reduzieren + db.prepare(` + UPDATE knowledge_entries SET position = position - 1 + WHERE category_id = ? AND position > ? + `).run(oldCategoryId, oldPosition); + + // Neue Kategorie: Platz für neuen Eintrag schaffen + db.prepare(` + UPDATE knowledge_entries SET position = position + 1 + WHERE category_id = ? AND position >= ? + `).run(targetCategoryId, newPosition); + + // Eintrag verschieben + db.prepare(` + UPDATE knowledge_entries SET category_id = ?, position = ? + WHERE id = ? + `).run(targetCategoryId, newPosition, entryId); + } else { + // Innerhalb der gleichen Kategorie + if (newPosition > oldPosition) { + db.prepare(` + UPDATE knowledge_entries SET position = position - 1 + WHERE category_id = ? AND position > ? AND position <= ? + `).run(oldCategoryId, oldPosition, newPosition); + } else if (newPosition < oldPosition) { + db.prepare(` + UPDATE knowledge_entries SET position = position + 1 + WHERE category_id = ? AND position >= ? AND position < ? + `).run(oldCategoryId, newPosition, oldPosition); + } + + db.prepare('UPDATE knowledge_entries SET position = ? WHERE id = ?').run(newPosition, entryId); + } + + res.json({ message: 'Position aktualisiert' }); + } catch (error) { + logger.error('Fehler beim Verschieben des Knowledge-Eintrags:', { error: error.message }); + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + +/** + * DELETE /api/knowledge/entries/:id + * Eintrag löschen + */ +router.delete('/entries/:id', (req, res) => { + try { + const entryId = req.params.id; + const db = getDb(); + + const entry = db.prepare('SELECT * FROM knowledge_entries WHERE id = ?').get(entryId); + if (!entry) { + return res.status(404).json({ error: 'Eintrag nicht gefunden' }); + } + + // Anhänge vom Dateisystem löschen + const attachments = db.prepare('SELECT * FROM knowledge_attachments WHERE entry_id = ?').all(entryId); + for (const attachment of attachments) { + const filePath = path.join(UPLOAD_DIR, attachment.filename); + if (fs.existsSync(filePath)) { + fs.unlinkSync(filePath); + } + } + + const categoryId = entry.category_id; + + // Eintrag löschen + db.prepare('DELETE FROM knowledge_entries WHERE id = ?').run(entryId); + + // Positionen neu nummerieren + const remaining = db.prepare( + 'SELECT id FROM knowledge_entries WHERE category_id = ? ORDER BY position' + ).all(categoryId); + remaining.forEach((e, idx) => { + db.prepare('UPDATE knowledge_entries SET position = ? WHERE id = ?').run(idx, e.id); + }); + + logger.info(`Knowledge-Eintrag gelöscht: ${entry.title}`); + + res.json({ message: 'Eintrag gelöscht' }); + } catch (error) { + logger.error('Fehler beim Löschen des Knowledge-Eintrags:', { error: error.message }); + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + +// ===================== +// ANHÄNGE +// ===================== + +/** + * GET /api/knowledge/attachments/:entryId + * Anhänge eines Eintrags abrufen + */ +router.get('/attachments/:entryId', (req, res) => { + try { + const entryId = req.params.entryId; + const db = getDb(); + + const entry = db.prepare('SELECT * FROM knowledge_entries WHERE id = ?').get(entryId); + if (!entry) { + return res.status(404).json({ error: 'Eintrag nicht gefunden' }); + } + + const attachments = db.prepare(` + SELECT ka.*, u.display_name as uploader_name + FROM knowledge_attachments ka + LEFT JOIN users u ON ka.uploaded_by = u.id + WHERE ka.entry_id = ? + ORDER BY ka.uploaded_at DESC + `).all(entryId); + + res.json(attachments.map(a => ({ + id: a.id, + entryId: a.entry_id, + filename: a.filename, + originalName: a.original_name, + mimeType: a.mime_type, + sizeBytes: a.size_bytes, + uploadedBy: a.uploaded_by, + uploaderName: a.uploader_name, + uploadedAt: a.uploaded_at + }))); + } catch (error) { + logger.error('Fehler beim Abrufen der Knowledge-Anhänge:', { error: error.message }); + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + +/** + * POST /api/knowledge/attachments/:entryId + * Anhang hochladen + */ +router.post('/attachments/:entryId', upload.single('file'), (req, res) => { + try { + const entryId = req.params.entryId; + const db = getDb(); + + const entry = db.prepare('SELECT * FROM knowledge_entries WHERE id = ?').get(entryId); + if (!entry) { + // Hochgeladene Datei löschen + if (req.file) { + fs.unlinkSync(req.file.path); + } + return res.status(404).json({ error: 'Eintrag nicht gefunden' }); + } + + if (!req.file) { + return res.status(400).json({ error: 'Keine Datei hochgeladen' }); + } + + const result = db.prepare(` + INSERT INTO knowledge_attachments (entry_id, filename, original_name, mime_type, size_bytes, uploaded_by) + VALUES (?, ?, ?, ?, ?, ?) + `).run( + entryId, + req.file.filename, + req.file.originalname, + req.file.mimetype, + req.file.size, + req.user.id + ); + + // Eintrag updated_at aktualisieren + db.prepare('UPDATE knowledge_entries SET updated_at = CURRENT_TIMESTAMP WHERE id = ?').run(entryId); + + const attachment = db.prepare('SELECT * FROM knowledge_attachments WHERE id = ?') + .get(result.lastInsertRowid); + + logger.info(`Knowledge-Anhang hochgeladen: ${req.file.originalname} für Eintrag ${entry.title}`); + + res.status(201).json({ + id: attachment.id, + entryId: attachment.entry_id, + filename: attachment.filename, + originalName: attachment.original_name, + mimeType: attachment.mime_type, + sizeBytes: attachment.size_bytes, + uploadedBy: attachment.uploaded_by, + uploadedAt: attachment.uploaded_at + }); + } catch (error) { + logger.error('Fehler beim Hochladen des Knowledge-Anhangs:', { error: error.message }); + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + +/** + * GET /api/knowledge/attachments/download/:id + * Anhang herunterladen + */ +router.get('/attachments/download/:id', (req, res) => { + try { + const attachmentId = req.params.id; + const db = getDb(); + + const attachment = db.prepare('SELECT * FROM knowledge_attachments WHERE id = ?').get(attachmentId); + if (!attachment) { + return res.status(404).json({ error: 'Anhang nicht gefunden' }); + } + + const filePath = path.join(UPLOAD_DIR, attachment.filename); + if (!fs.existsSync(filePath)) { + return res.status(404).json({ error: 'Datei nicht gefunden' }); + } + + res.download(filePath, attachment.original_name); + } catch (error) { + logger.error('Fehler beim Herunterladen des Knowledge-Anhangs:', { error: error.message }); + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + +/** + * DELETE /api/knowledge/attachments/:id + * Anhang löschen + */ +router.delete('/attachments/:id', (req, res) => { + try { + const attachmentId = req.params.id; + const db = getDb(); + + const attachment = db.prepare('SELECT * FROM knowledge_attachments WHERE id = ?').get(attachmentId); + if (!attachment) { + return res.status(404).json({ error: 'Anhang nicht gefunden' }); + } + + // Datei vom Dateisystem löschen + const filePath = path.join(UPLOAD_DIR, attachment.filename); + if (fs.existsSync(filePath)) { + fs.unlinkSync(filePath); + } + + // Aus Datenbank löschen + db.prepare('DELETE FROM knowledge_attachments WHERE id = ?').run(attachmentId); + + // Eintrag updated_at aktualisieren + db.prepare('UPDATE knowledge_entries SET updated_at = CURRENT_TIMESTAMP WHERE id = ?') + .run(attachment.entry_id); + + logger.info(`Knowledge-Anhang gelöscht: ${attachment.original_name}`); + + res.json({ message: 'Anhang gelöscht' }); + } catch (error) { + logger.error('Fehler beim Löschen des Knowledge-Anhangs:', { error: error.message }); + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + +// ===================== +// SUCHE +// ===================== + +/** + * GET /api/knowledge/search + * Wissensmanagement durchsuchen + */ +router.get('/search', (req, res) => { + try { + const { q } = req.query; + + if (!q || q.trim().length < 2) { + return res.json({ categories: [], entries: [] }); + } + + const searchTerm = `%${q.toLowerCase()}%`; + const db = getDb(); + + // Kategorien durchsuchen + const categories = db.prepare(` + SELECT kc.*, + (SELECT COUNT(*) FROM knowledge_entries WHERE category_id = kc.id) as entry_count + FROM knowledge_categories kc + WHERE LOWER(kc.name) LIKE ? OR LOWER(kc.description) LIKE ? + ORDER BY kc.position + `).all(searchTerm, searchTerm); + + // Einträge durchsuchen + const entries = db.prepare(` + SELECT ke.*, + kc.name as category_name, + kc.color as category_color, + (SELECT COUNT(*) FROM knowledge_attachments WHERE entry_id = ke.id) as attachment_count + FROM knowledge_entries ke + LEFT JOIN knowledge_categories kc ON ke.category_id = kc.id + WHERE LOWER(ke.title) LIKE ? OR LOWER(ke.notes) LIKE ? OR LOWER(ke.url) LIKE ? + ORDER BY + CASE + WHEN LOWER(ke.title) LIKE ? THEN 1 + ELSE 2 + END, + ke.created_at DESC + LIMIT 50 + `).all(searchTerm, searchTerm, searchTerm, searchTerm); + + res.json({ + categories: categories.map(c => ({ + id: c.id, + name: c.name, + description: c.description, + color: c.color, + icon: c.icon, + entryCount: c.entry_count + })), + entries: entries.map(e => ({ + id: e.id, + categoryId: e.category_id, + categoryName: e.category_name, + categoryColor: e.category_color, + title: e.title, + url: e.url, + notes: e.notes, + attachmentCount: e.attachment_count, + createdAt: e.created_at + })) + }); + } catch (error) { + logger.error('Fehler bei der Knowledge-Suche:', { error: error.message }); + res.status(500).json({ error: 'Interner Serverfehler' }); + } +}); + +module.exports = router; diff --git a/backend/routes/subtasks.js b/backend/routes/subtasks.js index aa4540d..020bcd1 100644 --- a/backend/routes/subtasks.js +++ b/backend/routes/subtasks.js @@ -57,16 +57,16 @@ router.post('/', (req, res) => { return res.status(404).json({ error: 'Aufgabe nicht gefunden' }); } - // Höchste Position ermitteln - const maxPos = db.prepare( - 'SELECT COALESCE(MAX(position), -1) as max FROM subtasks WHERE task_id = ?' - ).get(taskId).max; + // Alle bestehenden Subtasks um eine Position nach unten verschieben + db.prepare(` + UPDATE subtasks SET position = position + 1 WHERE task_id = ? + `).run(taskId); - // Subtask erstellen + // Neue Subtask an Position 0 erstellen (immer an erster Stelle) const result = db.prepare(` INSERT INTO subtasks (task_id, title, position) - VALUES (?, ?, ?) - `).run(taskId, title, maxPos + 1); + VALUES (?, ?, 0) + `).run(taskId, title); // Task updated_at aktualisieren db.prepare('UPDATE tasks SET updated_at = CURRENT_TIMESTAMP WHERE id = ?').run(taskId); diff --git a/backend/server.js b/backend/server.js index 9240bb2..11e77fb 100644 --- a/backend/server.js +++ b/backend/server.js @@ -41,6 +41,7 @@ const notificationService = require('./services/notificationService'); const gitRoutes = require('./routes/git'); const applicationsRoutes = require('./routes/applications'); const giteaRoutes = require('./routes/gitea'); +const knowledgeRoutes = require('./routes/knowledge'); // Express App erstellen const app = express(); @@ -144,6 +145,9 @@ app.use('/api/applications', authenticateToken, csrfProtection, applicationsRout // Gitea-Routes (Gitea API Integration) app.use('/api/gitea', authenticateToken, csrfProtection, giteaRoutes); +// Knowledge-Routes (Wissensmanagement) +app.use('/api/knowledge', authenticateToken, csrfProtection, knowledgeRoutes); + // ============================================================================= // SOCKET.IO // ============================================================================= diff --git a/backups/backup_2025-12-28T20-59-42-468Z.db b/backups/backup_2025-12-28T20-59-42-468Z.db deleted file mode 100644 index ecad564..0000000 Binary files a/backups/backup_2025-12-28T20-59-42-468Z.db and /dev/null differ diff --git a/backups/backup_2025-12-28T20-59-42-468Z.db-wal b/backups/backup_2025-12-28T20-59-42-468Z.db-wal deleted file mode 100644 index cdd777f..0000000 Binary files a/backups/backup_2025-12-28T20-59-42-468Z.db-wal and /dev/null differ diff --git a/backups/backup_2025-12-28T21-11-36-076Z.db b/backups/backup_2025-12-28T21-11-36-076Z.db deleted file mode 100644 index ecad564..0000000 Binary files a/backups/backup_2025-12-28T21-11-36-076Z.db and /dev/null differ diff --git a/backups/backup_2025-12-28T21-11-36-076Z.db-wal b/backups/backup_2025-12-28T21-11-36-076Z.db-wal deleted file mode 100644 index 65b1853..0000000 Binary files a/backups/backup_2025-12-28T21-11-36-076Z.db-wal and /dev/null differ diff --git a/backups/backup_2025-12-28T21-13-56-595Z.db b/backups/backup_2025-12-28T21-13-56-595Z.db deleted file mode 100644 index ecad564..0000000 Binary files a/backups/backup_2025-12-28T21-13-56-595Z.db and /dev/null differ diff --git a/backups/backup_2025-12-28T21-13-56-595Z.db-wal b/backups/backup_2025-12-28T21-13-56-595Z.db-wal deleted file mode 100644 index 65b1853..0000000 Binary files a/backups/backup_2025-12-28T21-13-56-595Z.db-wal and /dev/null differ diff --git a/backups/backup_2025-12-28T21-20-30-328Z.db b/backups/backup_2025-12-28T21-20-30-328Z.db deleted file mode 100644 index ecad564..0000000 Binary files a/backups/backup_2025-12-28T21-20-30-328Z.db and /dev/null differ diff --git a/backups/backup_2025-12-28T21-20-30-328Z.db-wal b/backups/backup_2025-12-28T21-20-30-328Z.db-wal deleted file mode 100644 index 65b1853..0000000 Binary files a/backups/backup_2025-12-28T21-20-30-328Z.db-wal and /dev/null differ diff --git a/backups/backup_2025-12-28T21-37-16-598Z.db b/backups/backup_2025-12-28T21-37-16-598Z.db deleted file mode 100644 index ecad564..0000000 Binary files a/backups/backup_2025-12-28T21-37-16-598Z.db and /dev/null differ diff --git a/backups/backup_2025-12-28T21-37-16-598Z.db-wal b/backups/backup_2025-12-28T21-37-16-598Z.db-wal deleted file mode 100644 index 65b1853..0000000 Binary files a/backups/backup_2025-12-28T21-37-16-598Z.db-wal and /dev/null differ diff --git a/backups/backup_2025-12-28T21-51-26-664Z.db b/backups/backup_2025-12-28T21-51-26-664Z.db deleted file mode 100644 index 7bef75d..0000000 Binary files a/backups/backup_2025-12-28T21-51-26-664Z.db and /dev/null differ diff --git a/backups/backup_2025-12-28T21-51-26-664Z.db-wal b/backups/backup_2025-12-28T21-51-26-664Z.db-wal deleted file mode 100644 index e69de29..0000000 diff --git a/backups/backup_2025-12-29T18-03-28-634Z.db b/backups/backup_2025-12-29T18-03-28-634Z.db deleted file mode 100644 index b8c4b1f..0000000 Binary files a/backups/backup_2025-12-29T18-03-28-634Z.db and /dev/null differ diff --git a/backups/backup_2025-12-29T18-03-28-634Z.db-wal b/backups/backup_2025-12-29T18-03-28-634Z.db-wal deleted file mode 100644 index e69de29..0000000 diff --git a/backups/backup_2025-12-29T18-30-58-187Z.db b/backups/backup_2025-12-29T18-30-58-187Z.db deleted file mode 100644 index 7dd48cc..0000000 Binary files a/backups/backup_2025-12-29T18-30-58-187Z.db and /dev/null differ diff --git a/backups/backup_2025-12-29T18-30-58-187Z.db-wal b/backups/backup_2025-12-29T18-30-58-187Z.db-wal deleted file mode 100644 index e69de29..0000000 diff --git a/backups/backup_2025-12-29T18-36-12-724Z.db b/backups/backup_2025-12-29T18-36-12-724Z.db deleted file mode 100644 index 08ea730..0000000 Binary files a/backups/backup_2025-12-29T18-36-12-724Z.db and /dev/null differ diff --git a/backups/backup_2025-12-29T18-36-12-724Z.db-wal b/backups/backup_2025-12-29T18-36-12-724Z.db-wal deleted file mode 100644 index e69de29..0000000 diff --git a/backups/backup_2025-12-29T18-46-49-826Z.db b/backups/backup_2025-12-29T18-46-49-826Z.db deleted file mode 100644 index 08ea730..0000000 Binary files a/backups/backup_2025-12-29T18-46-49-826Z.db and /dev/null differ diff --git a/backups/backup_2025-12-29T18-46-49-826Z.db-wal b/backups/backup_2025-12-29T18-46-49-826Z.db-wal deleted file mode 100644 index e69de29..0000000 diff --git a/backups/backup_2025-12-29T19-01-37-753Z.db b/backups/backup_2025-12-29T19-01-37-753Z.db deleted file mode 100644 index 08ea730..0000000 Binary files a/backups/backup_2025-12-29T19-01-37-753Z.db and /dev/null differ diff --git a/backups/backup_2025-12-29T19-01-37-753Z.db-wal b/backups/backup_2025-12-29T19-01-37-753Z.db-wal deleted file mode 100644 index 52406ee..0000000 Binary files a/backups/backup_2025-12-29T19-01-37-753Z.db-wal and /dev/null differ diff --git a/backups/backup_2025-12-29T19-15-04-246Z.db b/backups/backup_2025-12-29T19-15-04-246Z.db deleted file mode 100644 index dfdeb0e..0000000 Binary files a/backups/backup_2025-12-29T19-15-04-246Z.db and /dev/null differ diff --git a/backups/backup_2025-12-29T19-15-04-246Z.db-wal b/backups/backup_2025-12-29T19-15-04-246Z.db-wal deleted file mode 100644 index e69de29..0000000 diff --git a/backups/backup_2025-12-29T19-30-20-564Z.db b/backups/backup_2025-12-29T19-30-20-564Z.db deleted file mode 100644 index dfdeb0e..0000000 Binary files a/backups/backup_2025-12-29T19-30-20-564Z.db and /dev/null differ diff --git a/backups/backup_2025-12-29T19-30-20-564Z.db-wal b/backups/backup_2025-12-29T19-30-20-564Z.db-wal deleted file mode 100644 index 4f0f992..0000000 Binary files a/backups/backup_2025-12-29T19-30-20-564Z.db-wal and /dev/null differ diff --git a/backups/backup_2025-12-29T19-59-53-354Z.db b/backups/backup_2025-12-29T19-59-53-354Z.db deleted file mode 100644 index dfdeb0e..0000000 Binary files a/backups/backup_2025-12-29T19-59-53-354Z.db and /dev/null differ diff --git a/backups/backup_2025-12-29T19-59-53-354Z.db-wal b/backups/backup_2025-12-29T19-59-53-354Z.db-wal deleted file mode 100644 index c81d695..0000000 Binary files a/backups/backup_2025-12-29T19-59-53-354Z.db-wal and /dev/null differ diff --git a/backups/backup_2025-12-29T20-11-37-153Z.db b/backups/backup_2025-12-29T20-11-37-153Z.db deleted file mode 100644 index 37ebbb6..0000000 Binary files a/backups/backup_2025-12-29T20-11-37-153Z.db and /dev/null differ diff --git a/backups/backup_2025-12-29T20-11-37-153Z.db-wal b/backups/backup_2025-12-29T20-11-37-153Z.db-wal deleted file mode 100644 index c33befa..0000000 Binary files a/backups/backup_2025-12-29T20-11-37-153Z.db-wal and /dev/null differ diff --git a/backups/backup_2025-12-29T20-14-06-429Z.db b/backups/backup_2025-12-29T20-14-06-429Z.db deleted file mode 100644 index 2f7292d..0000000 Binary files a/backups/backup_2025-12-29T20-14-06-429Z.db and /dev/null differ diff --git a/backups/backup_2025-12-29T20-14-06-429Z.db-wal b/backups/backup_2025-12-29T20-14-06-429Z.db-wal deleted file mode 100644 index 6d67d05..0000000 Binary files a/backups/backup_2025-12-29T20-14-06-429Z.db-wal and /dev/null differ diff --git a/data/taskmate.db b/data/taskmate.db index 2cfcc23..9a05d3e 100644 Binary files a/data/taskmate.db and b/data/taskmate.db differ diff --git a/data/taskmate.db-shm b/data/taskmate.db-shm index b0c032b..7cc860a 100644 Binary files a/data/taskmate.db-shm and b/data/taskmate.db-shm differ diff --git a/data/taskmate.db-wal b/data/taskmate.db-wal index c2c28f3..185ffd4 100644 Binary files a/data/taskmate.db-wal and b/data/taskmate.db-wal differ diff --git a/frontend/css/knowledge.css b/frontend/css/knowledge.css new file mode 100644 index 0000000..b6e8a2e --- /dev/null +++ b/frontend/css/knowledge.css @@ -0,0 +1,853 @@ +/** + * TASKMATE - Knowledge Management Styles + * ====================================== + * Sidebar + Main Layout mit Drag & Drop + */ + +/* ============================================ + VIEW CONTAINER + ============================================ */ + +.view-knowledge { + padding: var(--spacing-md); + height: calc(100vh - 120px); + display: flex; + flex-direction: column; +} + +/* ============================================ + MAIN LAYOUT (Sidebar + Main) + ============================================ */ + +.knowledge-layout { + display: grid; + grid-template-columns: 280px 1fr; + gap: var(--spacing-lg); + flex: 1; + min-height: 0; + overflow: hidden; +} + +/* ============================================ + SIDEBAR (Kategorien) + ============================================ */ + +.knowledge-sidebar { + background: var(--bg-secondary); + border: 1px solid var(--border-color); + border-radius: var(--radius-lg); + display: flex; + flex-direction: column; + overflow: hidden; +} + +.knowledge-sidebar-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: var(--spacing-md); + border-bottom: 1px solid var(--border-color); + flex-shrink: 0; +} + +.knowledge-sidebar-title { + font-size: 1rem; + font-weight: 600; + color: var(--text-primary); + margin: 0; +} + +.knowledge-category-list { + flex: 1; + overflow-y: auto; + padding: var(--spacing-xs) 0; +} + +.knowledge-sidebar-empty { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: var(--spacing-xl); + color: var(--text-muted); + text-align: center; +} + +.knowledge-sidebar-empty svg { + opacity: 0.4; + margin-bottom: var(--spacing-sm); +} + +.knowledge-sidebar-empty p { + margin: 0; + font-size: 0.9rem; +} + +/* ============================================ + KATEGORIE-ITEMS (Sidebar) + ============================================ */ + +.knowledge-category-item { + display: flex; + align-items: center; + gap: var(--spacing-sm); + padding: var(--spacing-sm) var(--spacing-md); + cursor: pointer; + border-left: 3px solid transparent; + transition: all 0.15s ease; + user-select: none; +} + +.knowledge-category-item:hover { + background: var(--bg-hover); +} + +.knowledge-category-item.active { + border-left-color: var(--category-color, var(--primary)); + background: var(--bg-hover); +} + +.knowledge-category-item.dragging { + opacity: 0.5; + background: var(--primary-light); +} + +.knowledge-category-item.drag-over { + border-top: 2px solid var(--primary); +} + +.knowledge-category-icon { + font-size: 1.2rem; + flex-shrink: 0; + width: 28px; + text-align: center; +} + +.knowledge-category-info { + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + gap: 2px; +} + +.knowledge-category-name { + font-size: 0.9rem; + font-weight: 500; + color: var(--text-primary); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.knowledge-category-count { + font-size: 0.75rem; + color: var(--text-muted); +} + +.knowledge-category-actions { + display: flex; + gap: 2px; + opacity: 0; + transition: opacity 0.15s; +} + +.knowledge-category-item:hover .knowledge-category-actions { + opacity: 1; +} + +.knowledge-category-actions .btn-icon { + width: 24px; + height: 24px; + padding: 0; + background: transparent; + border: none; + border-radius: var(--radius-sm); + cursor: pointer; + color: var(--text-muted); + display: flex; + align-items: center; + justify-content: center; + transition: all 0.15s; +} + +.knowledge-category-actions .btn-icon:hover { + background: var(--bg-secondary); + color: var(--text-primary); +} + +.knowledge-category-actions .btn-icon.btn-danger-hover:hover { + background: var(--danger-bg); + color: var(--danger); +} + +.knowledge-drag-handle { + cursor: grab; + opacity: 0; + color: var(--text-muted); + font-size: 1rem; + padding: 0 var(--spacing-xs); + transition: opacity 0.15s; +} + +.knowledge-category-item:hover .knowledge-drag-handle { + opacity: 0.5; +} + +.knowledge-drag-handle:hover { + opacity: 1 !important; +} + +.knowledge-drag-handle:active { + cursor: grabbing; +} + +/* ============================================ + HAUPTBEREICH (Einträge) + ============================================ */ + +.knowledge-main { + display: flex; + flex-direction: column; + min-height: 0; + overflow: hidden; +} + +.knowledge-main-header { + display: flex; + justify-content: space-between; + align-items: center; + padding-bottom: var(--spacing-md); + border-bottom: 1px solid var(--border-color); + margin-bottom: var(--spacing-md); + flex-shrink: 0; +} + +.knowledge-main-title { + font-size: 1.25rem; + font-weight: 600; + color: var(--text-primary); + margin: 0; + display: flex; + align-items: center; + gap: var(--spacing-sm); +} + +.knowledge-main-title .category-icon { + font-size: 1.3rem; +} + +/* ============================================ + EINTRÄGE-LISTE + ============================================ */ + +.knowledge-entry-list { + flex: 1; + overflow-y: auto; + display: flex; + flex-direction: column; + gap: var(--spacing-xs); +} + +/* ============================================ + EINTRAG-ITEMS (Kompakt + Expand) + ============================================ */ + +.knowledge-entry-item { + background: var(--bg-primary); + border: 1px solid var(--border-color); + border-radius: var(--radius-md); + transition: all 0.15s ease; + user-select: none; +} + +.knowledge-entry-item:hover { + border-color: var(--primary); + box-shadow: var(--shadow-sm); +} + +.knowledge-entry-item.dragging { + opacity: 0.5; + box-shadow: var(--shadow-lg); +} + +.knowledge-entry-item.drag-over { + border-top: 2px solid var(--primary); + margin-top: -2px; +} + +/* Header (immer sichtbar) */ +.knowledge-entry-header { + display: flex; + align-items: center; + gap: var(--spacing-sm); + padding: var(--spacing-sm) var(--spacing-md); + cursor: pointer; +} + +.knowledge-entry-expand { + display: flex; + align-items: center; + justify-content: center; + width: 20px; + height: 20px; + flex-shrink: 0; + color: var(--text-muted); + transition: transform 0.2s ease; +} + +.knowledge-entry-item.expanded .knowledge-entry-expand { + transform: rotate(90deg); +} + +.knowledge-entry-title { + flex: 1; + font-size: 0.95rem; + font-weight: 500; + color: var(--text-primary); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.knowledge-entry-indicators { + display: flex; + align-items: center; + gap: var(--spacing-xs); + color: var(--text-muted); + font-size: 0.8rem; +} + +.knowledge-entry-indicator { + display: flex; + align-items: center; + gap: 2px; +} + +.knowledge-entry-actions { + display: flex; + gap: 2px; + opacity: 0; + transition: opacity 0.15s; +} + +.knowledge-entry-item:hover .knowledge-entry-actions { + opacity: 1; +} + +.knowledge-entry-actions .btn-icon { + width: 28px; + height: 28px; + padding: 0; + background: var(--bg-secondary); + border: 1px solid var(--border-color); + border-radius: var(--radius-sm); + cursor: pointer; + color: var(--text-secondary); + display: flex; + align-items: center; + justify-content: center; + transition: all 0.15s; +} + +.knowledge-entry-actions .btn-icon:hover { + background: var(--bg-hover); + color: var(--text-primary); +} + +.knowledge-entry-actions .btn-icon.btn-danger-hover:hover { + background: var(--danger-bg); + color: var(--danger); + border-color: var(--danger); +} + +.knowledge-entry-drag-handle { + cursor: grab; + opacity: 0; + color: var(--text-muted); + padding: 0 var(--spacing-xs); + transition: opacity 0.15s; +} + +.knowledge-entry-item:hover .knowledge-entry-drag-handle { + opacity: 0.5; +} + +.knowledge-entry-drag-handle:hover { + opacity: 1 !important; +} + +.knowledge-entry-drag-handle:active { + cursor: grabbing; +} + +/* Details (aufklappbar) */ +.knowledge-entry-details { + display: none; + padding: var(--spacing-md); + padding-top: 0; + border-top: 1px solid var(--border-light); + margin-top: var(--spacing-xs); + animation: fadeIn 0.15s ease; +} + +.knowledge-entry-item.expanded .knowledge-entry-details { + display: block; +} + +.knowledge-entry-url { + display: flex; + align-items: center; + gap: var(--spacing-xs); + font-size: 0.9rem; + color: var(--primary); + text-decoration: none; + margin-bottom: var(--spacing-sm); + word-break: break-all; +} + +.knowledge-entry-url:hover { + text-decoration: underline; +} + +.knowledge-entry-url svg { + flex-shrink: 0; + color: var(--text-muted); +} + +.knowledge-entry-notes { + font-size: 0.9rem; + color: var(--text-secondary); + line-height: 1.5; + margin-bottom: var(--spacing-sm); + white-space: pre-wrap; +} + +.knowledge-entry-attachments-info { + display: flex; + align-items: center; + gap: var(--spacing-xs); + font-size: 0.85rem; + color: var(--text-muted); +} + +/* ============================================ + EMPTY STATES + ============================================ */ + +.knowledge-empty { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: var(--spacing-xxl) var(--spacing-lg); + text-align: center; + color: var(--text-muted); + flex: 1; +} + +.knowledge-empty svg { + margin-bottom: var(--spacing-md); + opacity: 0.4; +} + +.knowledge-empty h3 { + font-size: 1.1rem; + font-weight: 600; + color: var(--text-secondary); + margin: 0 0 var(--spacing-xs) 0; +} + +.knowledge-empty p { + font-size: 0.95rem; + margin: 0; +} + +/* ============================================ + SUCHERGEBNISSE + ============================================ */ + +.knowledge-search-results { + flex: 1; + display: flex; + flex-direction: column; + overflow: hidden; +} + +.knowledge-search-header { + display: flex; + align-items: center; + gap: var(--spacing-md); + padding-bottom: var(--spacing-md); + border-bottom: 1px solid var(--border-color); + margin-bottom: var(--spacing-md); +} + +.knowledge-search-info { + font-size: 0.95rem; + color: var(--text-secondary); +} + +.knowledge-search-info span { + font-weight: 500; + color: var(--text-primary); +} + +/* Kategorie-Badge in Suchergebnissen */ +.knowledge-entry-category-badge { + font-size: 0.7rem; + padding: 2px 8px; + border-radius: var(--radius-full); + background: var(--category-color, var(--primary)); + color: white; + font-weight: 500; +} + +/* ============================================ + MOBILE KATEGORIEN (Chips) + ============================================ */ + +.knowledge-mobile-categories { + display: none; + gap: var(--spacing-sm); + padding: var(--spacing-sm) 0; + overflow-x: auto; + flex-shrink: 0; + -webkit-overflow-scrolling: touch; + scrollbar-width: none; +} + +.knowledge-mobile-categories::-webkit-scrollbar { + display: none; +} + +.knowledge-mobile-chip { + display: flex; + align-items: center; + gap: var(--spacing-xs); + padding: var(--spacing-xs) var(--spacing-md); + background: var(--bg-secondary); + border: 1px solid var(--border-color); + border-radius: var(--radius-full); + cursor: pointer; + white-space: nowrap; + font-size: 0.85rem; + color: var(--text-secondary); + transition: all 0.15s; + flex-shrink: 0; +} + +.knowledge-mobile-chip:hover { + background: var(--bg-hover); + border-color: var(--primary); +} + +.knowledge-mobile-chip.active { + background: var(--primary); + border-color: var(--primary); + color: white; +} + +.knowledge-mobile-chip .chip-icon { + font-size: 1rem; +} + +.knowledge-mobile-chip .chip-count { + font-size: 0.75rem; + opacity: 0.8; +} + +.knowledge-mobile-add { + background: var(--primary); + border-color: var(--primary); + color: white; +} + +/* ============================================ + ATTACHMENTS (Modal) + ============================================ */ + +.knowledge-attachments-container { + display: flex; + flex-direction: column; + gap: var(--spacing-xs); + margin-bottom: var(--spacing-sm); +} + +.knowledge-attachment-item { + display: flex; + align-items: center; + gap: var(--spacing-sm); + padding: var(--spacing-xs) var(--spacing-sm); + background: var(--bg-secondary); + border: 1px solid var(--border-color); + border-radius: var(--radius-sm); +} + +.knowledge-attachment-item svg { + flex-shrink: 0; + color: var(--text-muted); +} + +.knowledge-attachment-info { + flex: 1; + min-width: 0; +} + +.knowledge-attachment-name { + font-size: 0.9rem; + color: var(--text-primary); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.knowledge-attachment-size { + font-size: 0.8rem; + color: var(--text-muted); +} + +.knowledge-attachment-actions { + display: flex; + gap: var(--spacing-xs); +} + +.knowledge-attachment-actions .btn-icon { + width: 24px; + height: 24px; + padding: 0; + background: transparent; + border: none; + cursor: pointer; + color: var(--text-muted); + display: flex; + align-items: center; + justify-content: center; + border-radius: var(--radius-sm); + transition: all 0.15s; +} + +.knowledge-attachment-actions .btn-icon:hover { + background: var(--bg-hover); + color: var(--text-primary); +} + +.knowledge-attachment-actions .btn-icon.btn-danger-hover:hover { + background: var(--danger-bg); + color: var(--danger); +} + +/* ============================================ + DRAG & DROP INDICATOR + ============================================ */ + +.knowledge-drop-indicator { + height: 2px; + background: var(--primary); + border-radius: 1px; + margin: var(--spacing-xs) 0; +} + +/* ============================================ + ANIMATIONS + ============================================ */ + +@keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +/* ============================================ + RESPONSIVE + ============================================ */ + +@media (max-width: 900px) { + .knowledge-layout { + grid-template-columns: 220px 1fr; + } +} + +@media (max-width: 768px) { + .view-knowledge { + padding: var(--spacing-sm); + } + + .knowledge-layout { + grid-template-columns: 1fr; + } + + .knowledge-sidebar { + display: none; + } + + .knowledge-mobile-categories { + display: flex; + } + + .knowledge-main-header { + flex-wrap: wrap; + gap: var(--spacing-sm); + } + + .knowledge-main-title { + font-size: 1.1rem; + } + + /* Aktionen immer sichtbar auf Mobile */ + .knowledge-entry-actions, + .knowledge-category-actions { + opacity: 1; + } + + .knowledge-entry-drag-handle, + .knowledge-drag-handle { + opacity: 0.5; + } +} + +@media (max-width: 480px) { + .knowledge-entry-header { + padding: var(--spacing-xs) var(--spacing-sm); + } + + .knowledge-entry-details { + padding: var(--spacing-sm); + } + + .knowledge-main-header { + padding-bottom: var(--spacing-sm); + margin-bottom: var(--spacing-sm); + } +} + +/* ========================================== + ICON PICKER STYLES + ========================================== */ + +.icon-picker-container { + display: flex; + align-items: center; + gap: var(--spacing-sm); +} + +.icon-picker-preview { + display: flex; + align-items: center; + gap: var(--spacing-sm); + padding: var(--spacing-sm) var(--spacing-md); + background: var(--bg-secondary); + border: 2px solid var(--border-color); + border-radius: var(--radius-md); + cursor: pointer; + transition: all 0.2s ease; +} + +.icon-picker-preview:hover { + border-color: var(--primary); + background: var(--bg-hover); +} + +.icon-preview-emoji { + font-size: 1.75rem; + line-height: 1; +} + +.icon-preview-label { + font-size: 0.8rem; + color: var(--text-secondary); +} + +.icon-picker-section { + margin-top: var(--spacing-md); + padding-top: var(--spacing-md); + border-top: 1px solid var(--border-color); +} + +.icon-picker-tabs { + display: flex; + flex-wrap: wrap; + gap: var(--spacing-xs); + margin-bottom: var(--spacing-md); +} + +.icon-tab { + padding: var(--spacing-xs) var(--spacing-sm); + background: var(--bg-secondary); + border: 1px solid var(--border-color); + border-radius: var(--radius-sm); + font-size: 0.8rem; + cursor: pointer; + transition: all 0.2s ease; + white-space: nowrap; +} + +.icon-tab:hover { + background: var(--bg-hover); + border-color: var(--primary); +} + +.icon-tab.active { + background: var(--primary); + color: white; + border-color: var(--primary); +} + +.icon-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(40px, 1fr)); + gap: var(--spacing-xs); + max-height: 200px; + overflow-y: auto; + padding: var(--spacing-xs); + background: var(--bg-tertiary); + border-radius: var(--radius-md); +} + +.icon-btn { + display: flex; + align-items: center; + justify-content: center; + width: 40px; + height: 40px; + background: var(--bg-primary); + border: 1px solid transparent; + border-radius: var(--radius-sm); + font-size: 1.25rem; + cursor: pointer; + transition: all 0.15s ease; +} + +.icon-btn:hover { + background: var(--bg-hover); + border-color: var(--primary); + transform: scale(1.1); +} + +.icon-btn.selected { + background: var(--primary-light); + border-color: var(--primary); + box-shadow: 0 0 0 2px var(--primary-light); +} + +/* Scrollbar für Icon Grid */ +.icon-grid::-webkit-scrollbar { + width: 6px; +} + +.icon-grid::-webkit-scrollbar-track { + background: var(--bg-tertiary); + border-radius: 3px; +} + +.icon-grid::-webkit-scrollbar-thumb { + background: var(--border-color); + border-radius: 3px; +} + +.icon-grid::-webkit-scrollbar-thumb:hover { + background: var(--text-secondary); +} diff --git a/frontend/index.html b/frontend/index.html index 0d08213..794209b 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -25,6 +25,7 @@ + @@ -235,6 +236,7 @@ + @@ -886,6 +888,100 @@ + + + @@ -1479,6 +1575,339 @@ + + + + + +
diff --git a/frontend/js/api.js b/frontend/js/api.js index 9ed2449..6488d66 100644 --- a/frontend/js/api.js +++ b/frontend/js/api.js @@ -14,19 +14,23 @@ class ApiClient { // Token Management setToken(token) { + console.log('[API] setToken:', token ? token.substring(0, 20) + '...' : 'NULL'); this.token = token; if (token) { localStorage.setItem('auth_token', token); } else { + this.token = null; localStorage.removeItem('auth_token'); + localStorage.removeItem('current_user'); } } getToken() { - if (!this.token) { - this.token = localStorage.getItem('auth_token'); - } - return this.token; + // IMMER aus localStorage lesen um Synchronisationsprobleme zu vermeiden + // (z.B. wenn Token nach Login gesetzt wird während andere Requests laufen) + const token = localStorage.getItem('auth_token'); + this.token = token; // Cache aktualisieren + return token; } setCsrfToken(token) { @@ -39,10 +43,10 @@ class ApiClient { } getCsrfToken() { - if (!this.csrfToken) { - this.csrfToken = sessionStorage.getItem('csrf_token'); - } - return this.csrfToken; + // IMMER aus sessionStorage lesen um Synchronisationsprobleme zu vermeiden + const token = sessionStorage.getItem('csrf_token'); + this.csrfToken = token; // Cache aktualisieren + return token; } // Base Request Method @@ -56,6 +60,7 @@ class ApiClient { // Add auth token const token = this.getToken(); + console.log('[API] Request:', endpoint, 'Token:', token ? token.substring(0, 20) + '...' : 'NULL'); if (token) { headers['Authorization'] = `Bearer ${token}`; } @@ -98,8 +103,22 @@ class ApiClient { // Handle 401 Unauthorized if (response.status === 401) { - this.setToken(null); - window.dispatchEvent(new CustomEvent('auth:logout')); + // Token der für diesen Request verwendet wurde + const requestToken = token; + const currentToken = localStorage.getItem('auth_token'); + + console.log('[API] 401 received for:', endpoint); + console.log('[API] Request token:', requestToken ? requestToken.substring(0, 20) + '...' : 'NULL'); + console.log('[API] Current token:', currentToken ? currentToken.substring(0, 20) + '...' : 'NULL'); + + // Nur ausloggen wenn der Token der gleiche ist (kein neuer Login in der Zwischenzeit) + if (!currentToken || currentToken === requestToken) { + console.log('[API] Token invalid, triggering logout'); + this.setToken(null); + window.dispatchEvent(new CustomEvent('auth:logout')); + } else { + console.log('[API] 401 ignored - new login occurred while request was in flight'); + } throw new ApiError('Sitzung abgelaufen', 401); } @@ -274,7 +293,9 @@ class ApiClient { // ===================== async login(username, password) { + console.log('[API] login() called'); const response = await this.post('/auth/login', { username, password }); + console.log('[API] login() response:', response ? 'OK' : 'NULL', 'token:', response?.token ? 'EXISTS' : 'MISSING'); this.setToken(response.token); // Store CSRF token from login response if (response.csrfToken) { @@ -977,6 +998,79 @@ class ApiClient { xhr.send(formData); }); } + + // ===================== + // KNOWLEDGE ENDPOINTS (Wissensmanagement) + // ===================== + + // Kategorien + async getKnowledgeCategories() { + return this.get('/knowledge/categories'); + } + + async createKnowledgeCategory(data) { + return this.post('/knowledge/categories', data); + } + + async updateKnowledgeCategory(id, data) { + return this.put(`/knowledge/categories/${id}`, data); + } + + async deleteKnowledgeCategory(id) { + return this.delete(`/knowledge/categories/${id}`); + } + + async updateKnowledgeCategoryPosition(id, newPosition) { + return this.put(`/knowledge/categories/${id}/position`, { newPosition }); + } + + // Einträge + async getKnowledgeEntries(categoryId = null) { + const params = categoryId ? `?categoryId=${categoryId}` : ''; + return this.get(`/knowledge/entries${params}`); + } + + async getKnowledgeEntry(id) { + return this.get(`/knowledge/entries/${id}`); + } + + async createKnowledgeEntry(data) { + return this.post('/knowledge/entries', data); + } + + async updateKnowledgeEntry(id, data) { + return this.put(`/knowledge/entries/${id}`, data); + } + + async deleteKnowledgeEntry(id) { + return this.delete(`/knowledge/entries/${id}`); + } + + async updateKnowledgeEntryPosition(id, newPosition, newCategoryId = null) { + return this.put(`/knowledge/entries/${id}/position`, { newPosition, newCategoryId }); + } + + // Anhänge + async getKnowledgeAttachments(entryId) { + return this.get(`/knowledge/attachments/${entryId}`); + } + + async uploadKnowledgeAttachment(entryId, file, onProgress) { + return this.uploadFile(`/knowledge/attachments/${entryId}`, file, onProgress); + } + + async deleteKnowledgeAttachment(id) { + return this.delete(`/knowledge/attachments/${id}`); + } + + getKnowledgeAttachmentDownloadUrl(id) { + return `${this.baseUrl}/knowledge/attachments/download/${id}`; + } + + // Suche + async searchKnowledge(query) { + return this.get(`/knowledge/search?q=${encodeURIComponent(query)}`); + } } // Custom API Error Class diff --git a/frontend/js/app.js b/frontend/js/app.js index f70ecfa..8057768 100644 --- a/frontend/js/app.js +++ b/frontend/js/app.js @@ -20,6 +20,7 @@ import adminManager from './admin.js'; import proposalsManager from './proposals.js'; import notificationManager from './notifications.js'; import giteaManager from './gitea.js'; +import knowledgeManager from './knowledge.js'; import { $, $$, debounce, getFromStorage, setToStorage } from './utils.js'; class App { @@ -79,6 +80,9 @@ class App { // Initialize gitea manager await giteaManager.init(); + // Initialize knowledge manager + await knowledgeManager.init(); + // Update UI this.updateUserMenu(); } @@ -596,6 +600,18 @@ class App { v.classList.toggle('hidden', !isActive); }); + // Clear search field when switching views + const searchInput = $('#search-input'); + if (searchInput && searchInput.value) { + searchInput.value = ''; + store.setFilter('search', ''); + store.setState({ searchResultIds: [] }, 'CLEAR_SEARCH_RESULTS'); + proposalsManager.setSearchQuery(''); + knowledgeManager.setSearchQuery(''); + $('#search-clear')?.classList.add('hidden'); + $('.search-container')?.classList.remove('has-search'); + } + // Load proposals when switching to proposals view - reset to active (non-archived) if (view === 'proposals') { proposalsManager.resetToActiveView(); @@ -607,6 +623,13 @@ class App { } else { giteaManager.hide(); } + + // Show/hide knowledge manager + if (view === 'knowledge') { + knowledgeManager.show(); + } else { + knowledgeManager.hide(); + } } // ===================== @@ -823,8 +846,9 @@ class App { updateSearchUI(''); searchInput.focus(); - // Clear proposals search as well + // Clear view-specific search proposalsManager.setSearchQuery(''); + knowledgeManager.setSearchQuery(''); // Cancel any pending server search if (searchAbortController) { @@ -897,6 +921,9 @@ class App { if (currentView === 'proposals') { // Search proposals only proposalsManager.setSearchQuery(value); + } else if (currentView === 'knowledge') { + // Search knowledge base + knowledgeManager.setSearchQuery(value); } else { // Immediate client-side filtering for tasks store.setFilter('search', value); diff --git a/frontend/js/auth.js b/frontend/js/auth.js index 238d216..5bf92f3 100644 --- a/frontend/js/auth.js +++ b/frontend/js/auth.js @@ -19,11 +19,14 @@ class AuthManager { // Initialize authentication state async init() { const token = api.getToken(); + console.log('[Auth] init() - Token exists:', !!token); if (token) { try { // Verify token by making a request + console.log('[Auth] Verifying token...'); const users = await api.getUsers(); + console.log('[Auth] Token valid, users loaded'); this.isAuthenticated = true; // Get current user from stored data @@ -35,11 +38,13 @@ class AuthManager { return true; } catch (error) { // Token invalid + console.log('[Auth] Token invalid, logging out'); this.logout(); return false; } } + console.log('[Auth] No token found'); return false; } @@ -471,8 +476,18 @@ class SessionTimerHandler { } } } else if (response.status === 401) { - // Token ungültig - ausloggen - this.auth.logout(); + // Token ungültig - aber nur ausloggen wenn kein neuer Login stattfand + // (Race-Condition: Alter Refresh-Request kann 401 zurückgeben nachdem + // ein neuer Login erfolgreich war) + const currentToken = localStorage.getItem('auth_token'); + if (currentToken === token) { + // Gleicher Token, wirklich ungültig, ausloggen + console.log('[Auth] Refresh returned 401, logging out'); + this.auth.logout(); + } else { + // Token hat sich geändert (neuer Login oder bereits ausgeloggt) + console.log('[Auth] Refresh 401 ignored - token changed (new login occurred)'); + } } } catch (error) { console.error('Session refresh error:', error); diff --git a/frontend/js/knowledge.js b/frontend/js/knowledge.js new file mode 100644 index 0000000..f5a06c8 --- /dev/null +++ b/frontend/js/knowledge.js @@ -0,0 +1,1189 @@ +/** + * TASKMATE - Knowledge Manager + * ============================ + * Wissensmanagement mit Sidebar-Layout, Drag & Drop und kompakten Einträgen + */ + +import api from './api.js'; +import { $, $$ } from './utils.js'; +import store from './store.js'; + +class KnowledgeManager { + constructor() { + this.categories = []; + this.entries = []; + this.selectedCategory = null; + this.searchQuery = ''; + this.searchResults = []; + this.expandedEntries = new Set(); + this.initialized = false; + this.searchDebounceTimer = null; + + // Drag & Drop State + this.draggedCategoryId = null; + this.draggedEntryId = null; + } + + async init() { + console.log('[Knowledge] init() called, initialized:', this.initialized); + + if (this.initialized) { + await this.loadCategories(); + return; + } + + // DOM Elements - Layout + this.knowledgeView = $('#view-knowledge'); + this.mobileCategories = $('#knowledge-mobile-categories'); + + // DOM Elements - Sidebar + this.categoriesList = $('#knowledge-categories'); + this.categoriesEmpty = $('#knowledge-categories-empty'); + + // DOM Elements - Main + this.mainTitle = $('#knowledge-category-title'); + this.entriesList = $('#knowledge-entries'); + this.entriesEmpty = $('#knowledge-entries-empty'); + this.noSelection = $('#knowledge-no-selection'); + + // DOM Elements - Search + this.searchResultsSection = $('#knowledge-search-results'); + this.searchResultsList = $('#knowledge-search-list'); + this.searchResultsEmpty = $('#knowledge-search-empty'); + this.searchQuerySpan = $('#knowledge-search-query'); + + // Buttons + this.newCategoryBtn = $('#btn-new-category'); + this.newEntryBtn = $('#btn-new-entry'); + this.clearSearchBtn = $('#btn-clear-search'); + + // Category Modal Elements + this.categoryModal = $('#knowledge-category-modal'); + this.categoryForm = $('#knowledge-category-form'); + this.categoryModalTitle = $('#knowledge-category-modal-title'); + this.categoryIdInput = $('#knowledge-category-id'); + this.categoryNameInput = $('#knowledge-category-name'); + this.categoryDescriptionInput = $('#knowledge-category-description'); + this.categoryColorInput = $('#knowledge-category-color'); + this.categoryIconInput = $('#knowledge-category-icon'); + + // Icon Picker Elements + this.iconPickerPreview = $('#icon-picker-preview'); + this.iconPreviewEmoji = $('#icon-preview-emoji'); + this.iconPickerSection = $('#icon-picker-section'); + + // Entry Modal Elements + this.entryModal = $('#knowledge-entry-modal'); + this.entryForm = $('#knowledge-entry-form'); + this.entryModalTitle = $('#knowledge-entry-modal-title'); + this.entryIdInput = $('#knowledge-entry-id'); + this.entryCategoryIdInput = $('#knowledge-entry-category-id'); + this.entryTitleInput = $('#knowledge-entry-title'); + this.entryUrlInput = $('#knowledge-entry-url'); + this.entryNotesInput = $('#knowledge-entry-notes'); + this.attachmentsSection = $('#knowledge-attachments-section'); + this.attachmentsContainer = $('#knowledge-attachments-container'); + this.fileUploadArea = $('#knowledge-file-upload-area'); + this.fileInput = $('#knowledge-file-input'); + this.deleteEntryBtn = $('#btn-delete-entry'); + + this.bindEvents(); + this.initialized = true; + console.log('[Knowledge] Initialization complete'); + + await this.loadCategories(); + } + + bindEvents() { + console.log('[Knowledge] bindEvents() called'); + + // New Category Button + this.newCategoryBtn?.addEventListener('click', () => { + this.openCategoryModal(); + }); + + // New Entry Button + this.newEntryBtn?.addEventListener('click', () => { + this.openEntryModal(); + }); + + // Clear search + this.clearSearchBtn?.addEventListener('click', () => { + this.clearSearch(); + }); + + // Category Form Submit + this.categoryForm?.addEventListener('submit', (e) => this.handleCategorySubmit(e)); + + // Entry Form Submit + this.entryForm?.addEventListener('submit', (e) => this.handleEntrySubmit(e)); + + // Delete Entry Button + this.deleteEntryBtn?.addEventListener('click', () => { + const entryId = parseInt(this.entryIdInput?.value); + if (entryId) { + this.handleDeleteEntry(entryId); + } + }); + + // Modal close buttons + this.categoryModal?.querySelectorAll('[data-close-modal]').forEach(btn => { + btn.addEventListener('click', () => this.closeCategoryModal()); + }); + + this.entryModal?.querySelectorAll('[data-close-modal]').forEach(btn => { + btn.addEventListener('click', () => this.closeEntryModal()); + }); + + // Icon Picker Events + this.bindIconPickerEvents(); + + // File Upload + this.fileInput?.addEventListener('change', (e) => this.handleFileSelect(e)); + + // Drag & Drop for file upload + if (this.fileUploadArea) { + this.fileUploadArea.addEventListener('dragover', (e) => { + e.preventDefault(); + this.fileUploadArea.classList.add('drag-over'); + }); + + this.fileUploadArea.addEventListener('dragleave', () => { + this.fileUploadArea.classList.remove('drag-over'); + }); + + this.fileUploadArea.addEventListener('drop', (e) => { + e.preventDefault(); + this.fileUploadArea.classList.remove('drag-over'); + const files = e.dataTransfer.files; + if (files.length > 0) { + this.uploadFiles(files); + } + }); + } + + // Drag & Drop for categories + this.bindCategoryDragEvents(); + + // Drag & Drop for entries + this.bindEntryDragEvents(); + } + + // ========================================== + // DATA LOADING + // ========================================== + + async loadCategories() { + try { + this.categories = await api.getKnowledgeCategories(); + // Sort by position + this.categories.sort((a, b) => (a.position || 0) - (b.position || 0)); + this.renderCategories(); + this.renderMobileCategories(); + + // Update UI state + this.updateMainState(); + } catch (error) { + console.error('Error loading categories:', error); + this.showToast('Fehler beim Laden der Kategorien', 'error'); + } + } + + async loadEntries(categoryId) { + try { + this.entries = await api.getKnowledgeEntries(categoryId); + // Sort by position + this.entries.sort((a, b) => (a.position || 0) - (b.position || 0)); + this.renderEntries(); + } catch (error) { + console.error('Error loading entries:', error); + this.showToast('Fehler beim Laden der Einträge', 'error'); + } + } + + async loadEntryWithAttachments(entryId) { + try { + return await api.getKnowledgeEntry(entryId); + } catch (error) { + console.error('Error loading entry:', error); + this.showToast('Fehler beim Laden des Eintrags', 'error'); + return null; + } + } + + // ========================================== + // RENDERING - CATEGORIES (Sidebar) + // ========================================== + + renderCategories() { + if (!this.categoriesList) return; + + if (this.categories.length === 0) { + this.categoriesList.innerHTML = ''; + this.categoriesEmpty?.classList.remove('hidden'); + return; + } + + this.categoriesEmpty?.classList.add('hidden'); + + this.categoriesList.innerHTML = this.categories.map(cat => ` +
+ ${cat.icon || '📁'} +
+ ${this.escapeHtml(cat.name)} + ${cat.entryCount || 0} Einträge +
+
+ + +
+ ⋮⋮ +
+ `).join(''); + + this.bindCategoryClickEvents(); + } + + renderMobileCategories() { + if (!this.mobileCategories) return; + + const chips = this.categories.map(cat => ` +
+ ${cat.icon || '📁'} + ${this.escapeHtml(cat.name)} + (${cat.entryCount || 0}) +
+ `).join(''); + + const addChip = ` +
+ + Neu +
+ `; + + this.mobileCategories.innerHTML = chips + addChip; + this.bindMobileChipEvents(); + } + + // ========================================== + // RENDERING - ENTRIES (Main) + // ========================================== + + renderEntries() { + if (!this.entriesList) return; + + // Hide no-selection message + this.noSelection?.classList.add('hidden'); + + if (this.entries.length === 0) { + this.entriesList.innerHTML = ''; + this.entriesEmpty?.classList.remove('hidden'); + return; + } + + this.entriesEmpty?.classList.add('hidden'); + + this.entriesList.innerHTML = this.entries.map(entry => this.renderEntryItem(entry)).join(''); + this.bindEntryClickEvents(); + } + + renderEntryItem(entry, showCategory = false) { + const isExpanded = this.expandedEntries.has(entry.id); + const hasUrl = entry.url && entry.url.trim(); + const hasNotes = entry.notes && entry.notes.trim(); + const hasAttachments = entry.attachmentCount > 0; + + return ` +
+
+ + + + ${this.escapeHtml(entry.title)} +
+ ${hasUrl ? '🔗' : ''} + ${hasNotes ? '📝' : ''} + ${hasAttachments ? `📎${entry.attachmentCount}` : ''} +
+ ${showCategory && entry.categoryName ? ` + + ` : ''} + ⋮⋮ +
+ + +
+
+
+ ${hasUrl ? ` + + + ${this.escapeHtml(entry.url)} + + ` : ''} + ${hasNotes ? ` +
${this.escapeHtml(entry.notes)}
+ ` : ''} + ${hasAttachments ? ` +
+ + ${entry.attachmentCount} Anhang${entry.attachmentCount > 1 ? 'e' : ''} +
+ ` : ''} +
+
+ `; + } + + renderSearchResults() { + if (!this.searchResultsList) return; + + if (this.searchResults.length === 0) { + this.searchResultsList.innerHTML = ''; + this.searchResultsEmpty?.classList.remove('hidden'); + return; + } + + this.searchResultsEmpty?.classList.add('hidden'); + + this.searchResultsList.innerHTML = this.searchResults.map(entry => + this.renderEntryItem(entry, true) + ).join(''); + + this.bindSearchResultEvents(); + } + + renderAttachments(attachments) { + if (!this.attachmentsContainer) return; + + if (!attachments || attachments.length === 0) { + this.attachmentsContainer.innerHTML = '

Keine Anhänge vorhanden

'; + return; + } + + this.attachmentsContainer.innerHTML = attachments.map(att => ` +
+ +
+ ${this.escapeHtml(att.original_name)} + ${this.formatFileSize(att.size_bytes)} +
+
+ + + + +
+
+ `).join(''); + + this.bindAttachmentEvents(); + } + + updateMainState() { + if (!this.selectedCategory) { + this.mainTitle.textContent = 'Kategorie wählen'; + this.newEntryBtn.disabled = true; + this.entriesList.innerHTML = ''; + this.entriesEmpty?.classList.add('hidden'); + this.noSelection?.classList.remove('hidden'); + } else { + const icon = this.selectedCategory.icon || '📁'; + this.mainTitle.innerHTML = `${icon} ${this.escapeHtml(this.selectedCategory.name)}`; + this.newEntryBtn.disabled = false; + this.noSelection?.classList.add('hidden'); + } + } + + // ========================================== + // EVENT BINDING - CATEGORIES + // ========================================== + + bindCategoryClickEvents() { + this.categoriesList?.querySelectorAll('.knowledge-category-item').forEach(item => { + const categoryId = parseInt(item.dataset.categoryId); + + // Click on category (not on actions) - select category + item.addEventListener('click', (e) => { + if (!e.target.closest('.knowledge-category-actions') && !e.target.closest('.knowledge-drag-handle')) { + this.selectCategory(categoryId); + } + }); + + // Edit button + const editBtn = item.querySelector('[data-action="edit"]'); + editBtn?.addEventListener('click', (e) => { + e.stopPropagation(); + this.openCategoryModal(categoryId); + }); + + // Delete button + const deleteBtn = item.querySelector('[data-action="delete"]'); + deleteBtn?.addEventListener('click', (e) => { + e.stopPropagation(); + this.handleDeleteCategory(categoryId); + }); + }); + } + + bindMobileChipEvents() { + this.mobileCategories?.querySelectorAll('.knowledge-mobile-chip').forEach(chip => { + if (chip.dataset.action === 'add-category') { + chip.addEventListener('click', () => this.openCategoryModal()); + } else { + const categoryId = parseInt(chip.dataset.categoryId); + chip.addEventListener('click', () => this.selectCategory(categoryId)); + } + }); + } + + bindCategoryDragEvents() { + if (!this.categoriesList) return; + + this.categoriesList.addEventListener('dragstart', (e) => { + const item = e.target.closest('.knowledge-category-item'); + if (!item) return; + + this.draggedCategoryId = parseInt(item.dataset.categoryId); + item.classList.add('dragging'); + e.dataTransfer.effectAllowed = 'move'; + e.dataTransfer.setData('text/plain', this.draggedCategoryId); + }); + + this.categoriesList.addEventListener('dragend', (e) => { + const item = e.target.closest('.knowledge-category-item'); + if (item) { + item.classList.remove('dragging'); + } + this.draggedCategoryId = null; + this.categoriesList.querySelectorAll('.drag-over').forEach(el => el.classList.remove('drag-over')); + }); + + this.categoriesList.addEventListener('dragover', (e) => { + e.preventDefault(); + const item = e.target.closest('.knowledge-category-item'); + if (item && parseInt(item.dataset.categoryId) !== this.draggedCategoryId) { + this.categoriesList.querySelectorAll('.drag-over').forEach(el => el.classList.remove('drag-over')); + item.classList.add('drag-over'); + } + }); + + this.categoriesList.addEventListener('dragleave', (e) => { + const item = e.target.closest('.knowledge-category-item'); + if (item) { + item.classList.remove('drag-over'); + } + }); + + this.categoriesList.addEventListener('drop', async (e) => { + e.preventDefault(); + const targetItem = e.target.closest('.knowledge-category-item'); + if (!targetItem || !this.draggedCategoryId) return; + + const targetId = parseInt(targetItem.dataset.categoryId); + if (targetId === this.draggedCategoryId) return; + + targetItem.classList.remove('drag-over'); + + // Calculate new position + const targetIndex = this.categories.findIndex(c => c.id === targetId); + const draggedIndex = this.categories.findIndex(c => c.id === this.draggedCategoryId); + + if (targetIndex === -1 || draggedIndex === -1) return; + + // Optimistic update + const [moved] = this.categories.splice(draggedIndex, 1); + this.categories.splice(targetIndex, 0, moved); + + // Update positions in array + this.categories.forEach((cat, idx) => cat.position = idx); + + this.renderCategories(); + this.renderMobileCategories(); + + // Server update + try { + await api.updateKnowledgeCategoryPosition(this.draggedCategoryId, targetIndex); + } catch (error) { + console.error('Error updating category position:', error); + this.showToast('Fehler beim Speichern der Reihenfolge', 'error'); + await this.loadCategories(); + } + }); + } + + // ========================================== + // EVENT BINDING - ENTRIES + // ========================================== + + bindEntryClickEvents() { + this.entriesList?.querySelectorAll('.knowledge-entry-item').forEach(item => { + const entryId = parseInt(item.dataset.entryId); + + // Click on header to expand/collapse + const header = item.querySelector('.knowledge-entry-header'); + header?.addEventListener('click', (e) => { + if (!e.target.closest('.knowledge-entry-actions') && !e.target.closest('.knowledge-entry-drag-handle')) { + this.toggleEntry(entryId); + } + }); + + // Edit button + const editBtn = item.querySelector('[data-action="edit"]'); + editBtn?.addEventListener('click', (e) => { + e.stopPropagation(); + this.openEntryModal(entryId); + }); + + // Delete button + const deleteBtn = item.querySelector('[data-action="delete"]'); + deleteBtn?.addEventListener('click', (e) => { + e.stopPropagation(); + this.handleDeleteEntry(entryId); + }); + }); + } + + bindSearchResultEvents() { + this.searchResultsList?.querySelectorAll('.knowledge-entry-item').forEach(item => { + const entryId = parseInt(item.dataset.entryId); + + // Click on header to expand/collapse + const header = item.querySelector('.knowledge-entry-header'); + header?.addEventListener('click', (e) => { + if (!e.target.closest('.knowledge-entry-actions') && !e.target.closest('.knowledge-entry-drag-handle')) { + this.toggleEntry(entryId); + // Re-render to reflect change + this.renderSearchResults(); + } + }); + + // Edit button + const editBtn = item.querySelector('[data-action="edit"]'); + editBtn?.addEventListener('click', (e) => { + e.stopPropagation(); + this.openEntryModal(entryId); + }); + + // Delete button + const deleteBtn = item.querySelector('[data-action="delete"]'); + deleteBtn?.addEventListener('click', (e) => { + e.stopPropagation(); + this.handleDeleteEntry(entryId); + }); + }); + } + + bindEntryDragEvents() { + if (!this.entriesList) return; + + this.entriesList.addEventListener('dragstart', (e) => { + const item = e.target.closest('.knowledge-entry-item'); + if (!item) return; + + this.draggedEntryId = parseInt(item.dataset.entryId); + item.classList.add('dragging'); + e.dataTransfer.effectAllowed = 'move'; + e.dataTransfer.setData('text/plain', this.draggedEntryId); + }); + + this.entriesList.addEventListener('dragend', (e) => { + const item = e.target.closest('.knowledge-entry-item'); + if (item) { + item.classList.remove('dragging'); + } + this.draggedEntryId = null; + this.entriesList.querySelectorAll('.drag-over').forEach(el => el.classList.remove('drag-over')); + }); + + this.entriesList.addEventListener('dragover', (e) => { + e.preventDefault(); + const item = e.target.closest('.knowledge-entry-item'); + if (item && parseInt(item.dataset.entryId) !== this.draggedEntryId) { + this.entriesList.querySelectorAll('.drag-over').forEach(el => el.classList.remove('drag-over')); + item.classList.add('drag-over'); + } + }); + + this.entriesList.addEventListener('dragleave', (e) => { + const item = e.target.closest('.knowledge-entry-item'); + if (item) { + item.classList.remove('drag-over'); + } + }); + + this.entriesList.addEventListener('drop', async (e) => { + e.preventDefault(); + const targetItem = e.target.closest('.knowledge-entry-item'); + if (!targetItem || !this.draggedEntryId) return; + + const targetId = parseInt(targetItem.dataset.entryId); + if (targetId === this.draggedEntryId) return; + + targetItem.classList.remove('drag-over'); + + // Calculate new position + const targetIndex = this.entries.findIndex(en => en.id === targetId); + const draggedIndex = this.entries.findIndex(en => en.id === this.draggedEntryId); + + if (targetIndex === -1 || draggedIndex === -1) return; + + // Optimistic update + const [moved] = this.entries.splice(draggedIndex, 1); + this.entries.splice(targetIndex, 0, moved); + + // Update positions in array + this.entries.forEach((entry, idx) => entry.position = idx); + + this.renderEntries(); + + // Server update + try { + await api.updateKnowledgeEntryPosition(this.draggedEntryId, targetIndex); + } catch (error) { + console.error('Error updating entry position:', error); + this.showToast('Fehler beim Speichern der Reihenfolge', 'error'); + if (this.selectedCategory) { + await this.loadEntries(this.selectedCategory.id); + } + } + }); + } + + bindAttachmentEvents() { + this.attachmentsContainer?.querySelectorAll('[data-action="delete-attachment"]').forEach(btn => { + btn.addEventListener('click', () => { + const item = btn.closest('.knowledge-attachment-item'); + const attachmentId = parseInt(item?.dataset.attachmentId); + if (attachmentId) { + this.handleDeleteAttachment(attachmentId); + } + }); + }); + } + + // ========================================== + // ICON PICKER + // ========================================== + + bindIconPickerEvents() { + if (!this.iconPickerPreview || !this.iconPickerSection) return; + + // Toggle icon picker visibility + this.iconPickerPreview.addEventListener('click', () => { + this.iconPickerSection.classList.toggle('hidden'); + }); + + // Tab switching + const tabs = this.iconPickerSection.querySelectorAll('.icon-tab'); + tabs.forEach(tab => { + tab.addEventListener('click', () => { + const tabName = tab.dataset.tab; + this.switchIconTab(tabName); + }); + }); + + // Icon selection + const iconBtns = this.iconPickerSection.querySelectorAll('.icon-btn'); + iconBtns.forEach(btn => { + btn.addEventListener('click', () => { + const icon = btn.dataset.icon; + this.selectIcon(icon); + }); + }); + } + + switchIconTab(tabName) { + if (!this.iconPickerSection) return; + + // Update tab buttons + const tabs = this.iconPickerSection.querySelectorAll('.icon-tab'); + tabs.forEach(tab => { + tab.classList.toggle('active', tab.dataset.tab === tabName); + }); + + // Show/hide icon grids + const grids = this.iconPickerSection.querySelectorAll('.icon-grid'); + grids.forEach(grid => { + grid.classList.toggle('hidden', grid.dataset.tabContent !== tabName); + }); + } + + selectIcon(icon) { + if (!icon) return; + + // Update preview + if (this.iconPreviewEmoji) { + this.iconPreviewEmoji.textContent = icon; + } + + // Update hidden input + if (this.categoryIconInput) { + this.categoryIconInput.value = icon; + } + + // Hide the icon picker + if (this.iconPickerSection) { + this.iconPickerSection.classList.add('hidden'); + } + } + + // ========================================== + // CATEGORY SELECTION + // ========================================== + + async selectCategory(categoryId) { + const category = this.categories.find(c => c.id === categoryId); + if (!category) return; + + this.selectedCategory = category; + + // Clear search if active + if (this.searchQuery) { + this.searchQuery = ''; + this.searchResults = []; + this.searchResultsSection?.classList.add('hidden'); + } + + // Update sidebar selection + this.renderCategories(); + this.renderMobileCategories(); + + // Update main header + this.updateMainState(); + + // Load entries + await this.loadEntries(categoryId); + } + + toggleEntry(entryId) { + if (this.expandedEntries.has(entryId)) { + this.expandedEntries.delete(entryId); + } else { + this.expandedEntries.add(entryId); + } + + // Update just the affected entry + const entryItem = this.entriesList?.querySelector(`[data-entry-id="${entryId}"]`); + if (entryItem) { + entryItem.classList.toggle('expanded', this.expandedEntries.has(entryId)); + } + } + + // ========================================== + // SEARCH + // ========================================== + + async handleSearch(query) { + this.searchQuery = query.trim(); + + if (!this.searchQuery) { + this.clearSearch(); + return; + } + + try { + const results = await api.searchKnowledge(this.searchQuery); + this.searchResults = results.entries || []; + this.searchQuerySpan.textContent = this.searchQuery; + + // Show search results, hide other content + this.noSelection?.classList.add('hidden'); + this.entriesEmpty?.classList.add('hidden'); + this.entriesList.innerHTML = ''; + this.searchResultsSection?.classList.remove('hidden'); + + this.renderSearchResults(); + } catch (error) { + console.error('Error searching:', error); + this.showToast('Fehler bei der Suche', 'error'); + } + } + + clearSearch() { + this.searchQuery = ''; + this.searchResults = []; + + // Hide search results + this.searchResultsSection?.classList.add('hidden'); + + // Show normal view + if (this.selectedCategory) { + this.loadEntries(this.selectedCategory.id); + } else { + this.updateMainState(); + } + } + + /** + * Public method for global search from header + */ + setSearchQuery(query) { + clearTimeout(this.searchDebounceTimer); + + if (!query || !query.trim()) { + this.clearSearch(); + return; + } + + this.searchDebounceTimer = setTimeout(() => { + this.handleSearch(query); + }, 300); + } + + // ========================================== + // CATEGORY CRUD + // ========================================== + + openCategoryModal(categoryId = null) { + const isEdit = !!categoryId; + this.categoryModalTitle.textContent = isEdit ? 'Kategorie bearbeiten' : 'Neue Kategorie'; + this.categoryForm?.reset(); + + // Hide icon picker section + this.iconPickerSection?.classList.add('hidden'); + + if (isEdit) { + const category = this.categories.find(c => c.id === categoryId); + if (category) { + this.categoryIdInput.value = category.id; + this.categoryNameInput.value = category.name; + this.categoryDescriptionInput.value = category.description || ''; + this.categoryColorInput.value = category.color || '#3B82F6'; + const icon = category.icon || '📁'; + this.categoryIconInput.value = icon; + if (this.iconPreviewEmoji) { + this.iconPreviewEmoji.textContent = icon; + } + } + } else { + this.categoryIdInput.value = ''; + this.categoryColorInput.value = '#3B82F6'; + this.categoryIconInput.value = '📁'; + if (this.iconPreviewEmoji) { + this.iconPreviewEmoji.textContent = '📁'; + } + } + + this.openModal(this.categoryModal, 'knowledge-category-modal'); + this.categoryNameInput?.focus(); + } + + closeCategoryModal() { + this.closeModal(this.categoryModal, 'knowledge-category-modal'); + } + + async handleCategorySubmit(e) { + e.preventDefault(); + + const categoryId = this.categoryIdInput?.value ? parseInt(this.categoryIdInput.value) : null; + const data = { + name: this.categoryNameInput?.value.trim(), + description: this.categoryDescriptionInput?.value.trim() || null, + color: this.categoryColorInput?.value || '#3B82F6', + icon: this.categoryIconInput?.value.trim() || null + }; + + if (!data.name) { + this.showToast('Bitte einen Namen eingeben', 'error'); + return; + } + + try { + if (categoryId) { + await api.updateKnowledgeCategory(categoryId, data); + this.showToast('Kategorie aktualisiert', 'success'); + } else { + await api.createKnowledgeCategory(data); + this.showToast('Kategorie erstellt', 'success'); + } + + this.closeCategoryModal(); + await this.loadCategories(); + } catch (error) { + this.showToast(error.message || 'Fehler beim Speichern', 'error'); + } + } + + async handleDeleteCategory(categoryId) { + const category = this.categories.find(c => c.id === categoryId); + if (!category) return; + + const confirmDelete = confirm(`Kategorie "${category.name}" und alle Einträge wirklich löschen?`); + if (!confirmDelete) return; + + try { + await api.deleteKnowledgeCategory(categoryId); + this.showToast('Kategorie gelöscht', 'success'); + + // If deleted category was selected, clear selection + if (this.selectedCategory?.id === categoryId) { + this.selectedCategory = null; + this.entries = []; + this.updateMainState(); + } + + await this.loadCategories(); + } catch (error) { + this.showToast(error.message || 'Fehler beim Löschen', 'error'); + } + } + + // ========================================== + // ENTRY CRUD + // ========================================== + + async openEntryModal(entryId = null) { + const isEdit = !!entryId; + this.entryModalTitle.textContent = isEdit ? 'Eintrag bearbeiten' : 'Neuer Eintrag'; + this.entryForm?.reset(); + this.deleteEntryBtn?.classList.toggle('hidden', !isEdit); + this.attachmentsSection.style.display = isEdit ? 'block' : 'none'; + + if (isEdit) { + const entry = await this.loadEntryWithAttachments(entryId); + if (entry) { + this.entryIdInput.value = entry.id; + this.entryCategoryIdInput.value = entry.categoryId; + this.entryTitleInput.value = entry.title; + this.entryUrlInput.value = entry.url || ''; + this.entryNotesInput.value = entry.notes || ''; + this.renderAttachments(entry.attachments); + } + } else { + this.entryIdInput.value = ''; + this.entryCategoryIdInput.value = this.selectedCategory?.id || ''; + this.attachmentsContainer.innerHTML = ''; + } + + this.openModal(this.entryModal, 'knowledge-entry-modal'); + this.entryTitleInput?.focus(); + } + + closeEntryModal() { + this.closeModal(this.entryModal, 'knowledge-entry-modal'); + } + + async handleEntrySubmit(e) { + e.preventDefault(); + + const entryId = this.entryIdInput?.value ? parseInt(this.entryIdInput.value) : null; + const categoryId = parseInt(this.entryCategoryIdInput?.value) || this.selectedCategory?.id; + const data = { + categoryId: categoryId, + title: this.entryTitleInput?.value.trim(), + url: this.entryUrlInput?.value.trim() || null, + notes: this.entryNotesInput?.value.trim() || null + }; + + if (!data.title) { + this.showToast('Bitte einen Titel eingeben', 'error'); + return; + } + + if (!data.categoryId) { + this.showToast('Keine Kategorie ausgewählt', 'error'); + return; + } + + try { + if (entryId) { + await api.updateKnowledgeEntry(entryId, data); + this.showToast('Eintrag aktualisiert', 'success'); + } else { + await api.createKnowledgeEntry(data); + this.showToast('Eintrag erstellt', 'success'); + } + + this.closeEntryModal(); + + // Refresh view + if (this.searchQuery) { + await this.handleSearch(this.searchQuery); + } else if (this.selectedCategory) { + await this.loadEntries(this.selectedCategory.id); + } + await this.loadCategories(); // Update entry counts + } catch (error) { + this.showToast(error.message || 'Fehler beim Speichern', 'error'); + } + } + + async handleDeleteEntry(entryId) { + const entry = this.entries.find(e => e.id === entryId) || + this.searchResults.find(e => e.id === entryId); + const title = entry?.title || 'Dieser Eintrag'; + + const confirmDelete = confirm(`${title} wirklich löschen?`); + if (!confirmDelete) return; + + try { + await api.deleteKnowledgeEntry(entryId); + this.showToast('Eintrag gelöscht', 'success'); + this.closeEntryModal(); + + // Remove from expanded set + this.expandedEntries.delete(entryId); + + // Refresh view + if (this.searchQuery) { + await this.handleSearch(this.searchQuery); + } else if (this.selectedCategory) { + await this.loadEntries(this.selectedCategory.id); + } + await this.loadCategories(); // Update entry counts + } catch (error) { + this.showToast(error.message || 'Fehler beim Löschen', 'error'); + } + } + + // ========================================== + // ATTACHMENTS + // ========================================== + + handleFileSelect(e) { + const files = e.target.files; + if (files.length > 0) { + this.uploadFiles(files); + } + e.target.value = ''; + } + + async uploadFiles(files) { + const entryId = parseInt(this.entryIdInput?.value); + if (!entryId) { + this.showToast('Bitte zuerst den Eintrag speichern', 'error'); + return; + } + + for (const file of files) { + try { + await api.uploadKnowledgeAttachment(entryId, file); + this.showToast(`${file.name} hochgeladen`, 'success'); + } catch (error) { + this.showToast(`Fehler beim Hochladen von ${file.name}`, 'error'); + } + } + + // Reload entry to show new attachments + const entry = await this.loadEntryWithAttachments(entryId); + if (entry) { + this.renderAttachments(entry.attachments); + } + } + + async handleDeleteAttachment(attachmentId) { + const confirmDelete = confirm('Anhang wirklich löschen?'); + if (!confirmDelete) return; + + try { + await api.deleteKnowledgeAttachment(attachmentId); + this.showToast('Anhang gelöscht', 'success'); + + // Reload entry to refresh attachments + const entryId = parseInt(this.entryIdInput?.value); + if (entryId) { + const entry = await this.loadEntryWithAttachments(entryId); + if (entry) { + this.renderAttachments(entry.attachments); + } + } + } catch (error) { + this.showToast(error.message || 'Fehler beim Löschen', 'error'); + } + } + + // ========================================== + // MODAL HELPERS + // ========================================== + + openModal(modal, modalId) { + if (modal) { + modal.classList.remove('hidden'); + modal.classList.add('visible'); + } + const overlay = $('#modal-overlay'); + if (overlay) { + overlay.classList.remove('hidden'); + overlay.classList.add('visible'); + } + store.openModal(modalId); + } + + closeModal(modal, modalId) { + if (modal) { + modal.classList.remove('visible'); + modal.classList.add('hidden'); + } + // Only hide overlay if no other modals are open + const openModals = store.get('openModals').filter(id => id !== modalId); + if (openModals.length === 0) { + const overlay = $('#modal-overlay'); + if (overlay) { + overlay.classList.remove('visible'); + overlay.classList.add('hidden'); + } + } + store.closeModal(modalId); + } + + // ========================================== + // UTILITIES + // ========================================== + + formatFileSize(bytes) { + if (!bytes) return '0 B'; + const sizes = ['B', 'KB', 'MB', 'GB']; + const i = Math.floor(Math.log(bytes) / Math.log(1024)); + return `${(bytes / Math.pow(1024, i)).toFixed(1)} ${sizes[i]}`; + } + + escapeHtml(str) { + if (!str) return ''; + const div = document.createElement('div'); + div.textContent = str; + return div.innerHTML; + } + + showToast(message, type = 'info') { + window.dispatchEvent(new CustomEvent('toast:show', { + detail: { message, type } + })); + } + + // ========================================== + // SHOW/HIDE + // ========================================== + + show() { + this.knowledgeView?.classList.remove('hidden'); + this.knowledgeView?.classList.add('active'); + } + + hide() { + this.knowledgeView?.classList.add('hidden'); + this.knowledgeView?.classList.remove('active'); + } +} + +// Create singleton instance +const knowledgeManager = new KnowledgeManager(); + +export { knowledgeManager }; +export default knowledgeManager; diff --git a/frontend/js/sync.js b/frontend/js/sync.js index c61897c..d476f64 100644 --- a/frontend/js/sync.js +++ b/frontend/js/sync.js @@ -21,7 +21,9 @@ class SyncManager { // Initialize Socket.io connection async connect() { - if (this.socket?.connected) { + // Verhindere doppelte Verbindungen (auch während des Verbindungsaufbaus) + if (this.socket) { + console.log('[Sync] Socket already exists, skipping connect'); return; } @@ -102,8 +104,15 @@ class SyncManager { console.error('[Sync] Socket error:', error); if (error.type === 'auth') { - // Auth failed, logout - window.dispatchEvent(new CustomEvent('auth:logout')); + // Nur ausloggen wenn wir wirklich nicht eingeloggt sind + // (verhindert Logout durch alte Socket-Verbindungen nach neuem Login) + const currentToken = localStorage.getItem('auth_token'); + if (!currentToken) { + console.log('[Sync] Auth error and no token, triggering logout'); + window.dispatchEvent(new CustomEvent('auth:logout')); + } else { + console.log('[Sync] Auth error ignored - new login occurred'); + } } }); @@ -546,9 +555,8 @@ class SyncManager { const syncManager = new SyncManager(); // Listen for auth events -window.addEventListener('auth:login', () => { - syncManager.connect(); -}); +// Hinweis: syncManager.connect() wird NICHT hier aufgerufen, +// sondern in app.js initializeApp() um doppelte Verbindungen zu vermeiden window.addEventListener('auth:logout', () => { syncManager.disconnect(); diff --git a/frontend/js/task-modal.js b/frontend/js/task-modal.js index a3843f8..ee5c61d 100644 --- a/frontend/js/task-modal.js +++ b/frontend/js/task-modal.js @@ -1321,7 +1321,8 @@ class TaskModalManager { try { const projectId = store.get('currentProjectId'); const subtask = await api.createSubtask(projectId, this.taskId, { title }); - this.subtasks.push(subtask); + // Neue Subtask an erster Stelle einfügen + this.subtasks.unshift(subtask); this.renderSubtasks(); input.value = ''; @@ -1331,8 +1332,8 @@ class TaskModalManager { this.showError('Fehler beim Hinzufügen'); } } else { - // For new tasks, store locally - this.subtasks.push({ + // For new tasks, store locally - an erster Stelle + this.subtasks.unshift({ id: generateTempId(), title, completed: false @@ -1346,6 +1347,7 @@ class TaskModalManager { const subtask = this.subtasks.find(s => s.id === subtaskId); if (!subtask) return; + const wasCompleted = subtask.completed; subtask.completed = !subtask.completed; if (this.mode === 'edit' && this.taskId) { @@ -1355,10 +1357,26 @@ class TaskModalManager { completed: subtask.completed }); + // Wenn abgehakt: ans Ende der Liste verschieben + if (subtask.completed && !wasCompleted) { + const currentIndex = this.subtasks.findIndex(s => s.id === subtaskId); + const lastPosition = this.subtasks.length - 1; + + if (currentIndex < lastPosition) { + // Aus aktueller Position entfernen + const [moved] = this.subtasks.splice(currentIndex, 1); + // Ans Ende anfügen + this.subtasks.push(moved); + + // API-Call für neue Position + await api.reorderSubtasks(projectId, this.taskId, subtaskId, lastPosition); + } + } + // Update subtask progress in store for immediate board update this.updateSubtaskProgressInStore(); } catch (error) { - subtask.completed = !subtask.completed; + subtask.completed = wasCompleted; this.showError('Fehler beim Aktualisieren'); } } diff --git a/frontend/sw.js b/frontend/sw.js index d4805a4..3a12914 100644 --- a/frontend/sw.js +++ b/frontend/sw.js @@ -4,7 +4,7 @@ * Offline support and caching */ -const CACHE_VERSION = '138'; +const CACHE_VERSION = '152'; const CACHE_NAME = 'taskmate-v' + CACHE_VERSION; const STATIC_CACHE_NAME = 'taskmate-static-v' + CACHE_VERSION; const DYNAMIC_CACHE_NAME = 'taskmate-dynamic-v' + CACHE_VERSION; @@ -38,11 +38,13 @@ const STATIC_ASSETS = [ '/js/proposals.js', '/js/notifications.js', '/js/gitea.js', + '/js/knowledge.js', '/css/list.css', '/css/admin.css', '/css/proposals.css', '/css/notifications.css', - '/css/gitea.css' + '/css/gitea.css', + '/css/knowledge.css' ]; // API routes to cache diff --git a/logs/app.log b/logs/app.log index 477ae1a..b836edc 100644 --- a/logs/app.log +++ b/logs/app.log @@ -46830,3 +46830,3756 @@ hint: See the 'Note about fast-forwards' in 'git push --help' for details. [2025-12-30T19:55:23.041Z] [INFO] GET /api/health 200 2ms [2025-12-30T19:55:26.554Z] [INFO] POST /api/auth/refresh 200 9ms [2025-12-30T19:55:37.907Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T19:55:39.165Z] [INFO] Commit mit Autor: HG +[2025-12-30T19:55:39.342Z] [INFO] POST /api/git/server/commit 200 340ms +[2025-12-30T19:55:39.407Z] [INFO] GET /api/git/server/status 200 30ms +[2025-12-30T19:55:39.418Z] [INFO] GET /api/git/server/branches 304 10ms +[2025-12-30T19:55:39.433Z] [INFO] GET /api/git/server/commits?limit=10 200 13ms +[2025-12-30T19:55:40.001Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T19:55:41.471Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T19:55:45.298Z] [INFO] POST /api/git/server/push 200 2241ms +[2025-12-30T19:55:45.316Z] [INFO] POST /api/auth/refresh 200 14ms +[2025-12-30T19:55:45.358Z] [INFO] GET /api/git/server/branches 304 24ms +[2025-12-30T19:55:45.390Z] [INFO] GET /api/git/server/status 200 29ms +[2025-12-30T19:55:45.403Z] [INFO] GET /api/git/server/commits?limit=10 304 11ms +[2025-12-30T19:55:48.883Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T19:55:49.360Z] [INFO] Subtask erstellt: Kontakte einpflegen können in Task 6 +[2025-12-30T19:55:49.362Z] [INFO] POST /api/subtasks 201 14ms +[2025-12-30T19:55:50.362Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T19:55:53.157Z] [INFO] GET /api/health 200 1ms +[2025-12-30T19:55:53.275Z] [INFO] PUT /api/subtasks/43/position 200 10ms +[2025-12-30T19:56:01.402Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6) +[2025-12-30T19:56:01.408Z] [INFO] PUT /api/tasks/6 200 28ms +[2025-12-30T19:56:02.394Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T19:56:02.604Z] [INFO] GET / 304 2ms +[2025-12-30T19:56:02.624Z] [INFO] Socket disconnected: MH (AkN_8fCwOYNx8k5WAAAH) +[2025-12-30T19:56:02.638Z] [INFO] GET /css/variables.css 304 1ms +[2025-12-30T19:56:02.641Z] [INFO] GET /css/calendar.css 304 1ms +[2025-12-30T19:56:02.643Z] [INFO] GET /css/base.css 304 2ms +[2025-12-30T19:56:02.647Z] [INFO] GET /css/board.css 304 2ms +[2025-12-30T19:56:02.648Z] [INFO] GET /css/modal.css 304 0ms +[2025-12-30T19:56:02.651Z] [INFO] GET /css/components.css 304 1ms +[2025-12-30T19:56:02.657Z] [INFO] GET /css/list.css 304 2ms +[2025-12-30T19:56:02.660Z] [INFO] GET /css/admin.css 304 1ms +[2025-12-30T19:56:02.663Z] [INFO] GET /css/proposals.css 304 1ms +[2025-12-30T19:56:02.667Z] [INFO] GET /css/notifications.css 304 1ms +[2025-12-30T19:56:02.670Z] [INFO] GET /css/gitea.css 304 2ms +[2025-12-30T19:56:02.672Z] [INFO] GET /css/responsive.css 304 1ms +[2025-12-30T19:56:02.682Z] [INFO] GET /js/app.js 304 1ms +[2025-12-30T19:56:02.722Z] [INFO] GET /js/api.js 304 1ms +[2025-12-30T19:56:02.723Z] [INFO] GET /js/store.js 304 2ms +[2025-12-30T19:56:02.732Z] [INFO] GET /js/auth.js 304 1ms +[2025-12-30T19:56:02.738Z] [INFO] GET /js/board.js 304 1ms +[2025-12-30T19:56:02.742Z] [INFO] GET /js/sync.js 304 1ms +[2025-12-30T19:56:02.745Z] [INFO] GET /js/offline.js 304 2ms +[2025-12-30T19:56:02.746Z] [INFO] GET /js/task-modal.js 304 2ms +[2025-12-30T19:56:02.749Z] [INFO] GET /js/calendar.js 304 2ms +[2025-12-30T19:56:02.752Z] [INFO] GET /js/list.js 304 2ms +[2025-12-30T19:56:02.756Z] [INFO] GET /js/shortcuts.js 304 1ms +[2025-12-30T19:56:02.759Z] [INFO] GET /js/undo.js 304 0ms +[2025-12-30T19:56:02.762Z] [INFO] GET /js/admin.js 304 1ms +[2025-12-30T19:56:02.764Z] [INFO] GET /js/proposals.js 304 1ms +[2025-12-30T19:56:02.766Z] [INFO] GET /js/notifications.js 304 1ms +[2025-12-30T19:56:02.770Z] [INFO] GET /js/gitea.js 304 1ms +[2025-12-30T19:56:02.773Z] [INFO] GET /js/utils.js 304 0ms +[2025-12-30T19:56:02.802Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T19:56:02.968Z] [INFO] GET /api/auth/users 304 7ms +[2025-12-30T19:56:03.045Z] [INFO] GET /api/auth/users 304 3ms +[2025-12-30T19:56:03.057Z] [INFO] GET /assets/icons/task.svg 304 2ms +[2025-12-30T19:56:03.075Z] [INFO] Socket connected: MH (N1bzTAZ_FsWCS3YkAAAJ) +[2025-12-30T19:56:03.085Z] [INFO] GET /api/projects 304 6ms +[2025-12-30T19:56:03.108Z] [INFO] MH joined project:[object Object] +[2025-12-30T19:56:03.117Z] [INFO] GET /api/stats/dashboard?projectId=2 304 8ms +[2025-12-30T19:56:03.120Z] [INFO] GET /api/columns/2 304 9ms +[2025-12-30T19:56:03.125Z] [INFO] GET /api/labels/2 304 3ms +[2025-12-30T19:56:03.134Z] [INFO] GET /api/tasks/project/2 200 9ms +[2025-12-30T19:56:03.165Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 4ms +[2025-12-30T19:56:03.190Z] [INFO] GET /api/notifications 304 4ms +[2025-12-30T19:56:04.711Z] [INFO] GET /sw.js 304 1ms +[2025-12-30T19:56:10.189Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T19:56:23.268Z] [INFO] GET /api/health 200 1ms +[2025-12-30T19:56:53.372Z] [INFO] GET /api/health 200 3ms +[2025-12-30T19:57:04.875Z] [INFO] SIGTERM empfangen, fahre herunter... +[2025-12-30T19:57:16.678Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen: +[2025-12-30T19:57:16.776Z] [INFO] Datenbank-Tabellen erstellt +[2025-12-30T19:57:16.780Z] [INFO] Datenbank initialisiert +[2025-12-30T19:57:16.786Z] [INFO] Server läuft auf Port 3000 +[2025-12-30T19:57:16.786Z] [INFO] Umgebung: production +[2025-12-30T19:57:16.788Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden) +[2025-12-30T19:57:16.788Z] [INFO] Automatische Backups aktiviert +[2025-12-30T19:57:17.962Z] [INFO] Socket connected: MH (oEZIycxjJi8t2uEeAAAB) +[2025-12-30T19:57:18.185Z] [INFO] MH joined project:[object Object] +[2025-12-30T19:57:18.863Z] [INFO] Socket connected: HG (bCb9rpT6lsxfXTZyAAAD) +[2025-12-30T19:57:18.983Z] [INFO] HG joined project:[object Object] +[2025-12-30T19:57:20.861Z] [INFO] GET /api/health 200 12ms +[2025-12-30T19:57:50.957Z] [INFO] GET /api/health 200 2ms +[2025-12-30T19:58:16.813Z] [INFO] Backup erstellt: backup_2025-12-30T19-58-16-797Z.db +[2025-12-30T19:58:16.817Z] [INFO] Altes Backup gelöscht: backup_2025-12-28T20-59-42-468Z.db +[2025-12-30T19:58:16.819Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet +[2025-12-30T19:58:19.684Z] [INFO] SIGTERM empfangen, fahre herunter... +[2025-12-30T19:58:24.785Z] [INFO] Socket disconnected: MH (oEZIycxjJi8t2uEeAAAB) +[2025-12-30T19:58:31.236Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen: +[2025-12-30T19:58:31.311Z] [INFO] Datenbank-Tabellen erstellt +[2025-12-30T19:58:31.317Z] [INFO] Datenbank initialisiert +[2025-12-30T19:58:31.323Z] [INFO] Server läuft auf Port 3000 +[2025-12-30T19:58:31.323Z] [INFO] Umgebung: production +[2025-12-30T19:58:31.325Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden) +[2025-12-30T19:58:31.325Z] [INFO] Automatische Backups aktiviert +[2025-12-30T19:58:32.517Z] [INFO] Socket connected: HG (ra7gWNXKHTKDS69pAAAB) +[2025-12-30T19:58:32.555Z] [INFO] HG joined project:[object Object] +[2025-12-30T19:58:35.564Z] [INFO] GET /api/health 200 7ms +[2025-12-30T19:59:05.657Z] [INFO] GET /api/health 200 4ms +[2025-12-30T19:59:30.251Z] [INFO] GET / 200 12ms +[2025-12-30T19:59:30.314Z] [INFO] GET /css/variables.css 304 3ms +[2025-12-30T19:59:30.318Z] [INFO] GET /css/base.css 304 2ms +[2025-12-30T19:59:30.343Z] [INFO] GET /css/board.css 304 2ms +[2025-12-30T19:59:30.345Z] [INFO] GET /css/components.css 304 3ms +[2025-12-30T19:59:30.353Z] [INFO] GET /css/modal.css 304 1ms +[2025-12-30T19:59:30.359Z] [INFO] GET /css/list.css 304 2ms +[2025-12-30T19:59:30.362Z] [INFO] GET /css/calendar.css 304 2ms +[2025-12-30T19:59:30.363Z] [INFO] GET /css/admin.css 304 2ms +[2025-12-30T19:59:30.366Z] [INFO] GET /css/proposals.css 304 1ms +[2025-12-30T19:59:30.370Z] [INFO] GET /css/notifications.css 304 1ms +[2025-12-30T19:59:30.372Z] [INFO] GET /css/gitea.css 304 1ms +[2025-12-30T19:59:30.376Z] [INFO] GET /css/responsive.css 304 1ms +[2025-12-30T19:59:30.382Z] [INFO] GET /js/app.js 304 1ms +[2025-12-30T19:59:30.424Z] [INFO] GET /js/store.js 304 3ms +[2025-12-30T19:59:30.428Z] [INFO] GET /js/auth.js 304 2ms +[2025-12-30T19:59:30.430Z] [INFO] GET /js/offline.js 304 1ms +[2025-12-30T19:59:30.433Z] [INFO] GET /js/board.js 304 1ms +[2025-12-30T19:59:30.435Z] [INFO] GET /js/api.js 304 1ms +[2025-12-30T19:59:30.437Z] [INFO] GET /js/sync.js 304 1ms +[2025-12-30T19:59:30.446Z] [INFO] GET /js/task-modal.js 200 3ms +[2025-12-30T19:59:30.447Z] [INFO] GET /js/calendar.js 304 2ms +[2025-12-30T19:59:30.452Z] [INFO] GET /js/list.js 304 2ms +[2025-12-30T19:59:30.454Z] [INFO] GET /js/shortcuts.js 304 1ms +[2025-12-30T19:59:30.457Z] [INFO] GET /js/undo.js 304 1ms +[2025-12-30T19:59:30.459Z] [INFO] GET /js/admin.js 304 1ms +[2025-12-30T19:59:30.475Z] [INFO] GET /js/notifications.js 304 2ms +[2025-12-30T19:59:30.482Z] [INFO] GET /js/gitea.js 304 3ms +[2025-12-30T19:59:30.486Z] [INFO] GET /js/proposals.js 304 2ms +[2025-12-30T19:59:30.489Z] [INFO] GET /js/utils.js 304 1ms +[2025-12-30T19:59:30.586Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T19:59:30.742Z] [INFO] GET /api/auth/users 304 9ms +[2025-12-30T19:59:30.822Z] [INFO] GET /api/auth/users 304 6ms +[2025-12-30T19:59:30.859Z] [INFO] Socket connected: MH (LF-AW1wwa7cigUNeAAAD) +[2025-12-30T19:59:30.871Z] [INFO] GET /assets/icons/task.svg 304 9ms +[2025-12-30T19:59:30.877Z] [INFO] GET /api/projects 304 7ms +[2025-12-30T19:59:30.900Z] [INFO] MH joined project:[object Object] +[2025-12-30T19:59:30.910Z] [INFO] GET /api/stats/dashboard?projectId=2 304 6ms +[2025-12-30T19:59:30.917Z] [INFO] GET /api/columns/2 200 5ms +[2025-12-30T19:59:30.930Z] [INFO] GET /api/tasks/project/2 200 12ms +[2025-12-30T19:59:30.936Z] [INFO] GET /api/labels/2 200 3ms +[2025-12-30T19:59:30.981Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 12ms +[2025-12-30T19:59:31.013Z] [INFO] GET /api/notifications 304 11ms +[2025-12-30T19:59:31.345Z] [INFO] Backup erstellt: backup_2025-12-30T19-59-31-325Z.db +[2025-12-30T19:59:31.347Z] [INFO] Altes Backup gelöscht: backup_2025-12-28T21-11-36-076Z.db +[2025-12-30T19:59:31.348Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet +[2025-12-30T19:59:32.506Z] [INFO] GET /sw.js 200 2ms +[2025-12-30T19:59:32.539Z] [INFO] GET / 304 3ms +[2025-12-30T19:59:32.540Z] [INFO] GET /css/variables.css 304 3ms +[2025-12-30T19:59:32.542Z] [INFO] GET /index.html 304 1ms +[2025-12-30T19:59:32.557Z] [INFO] GET /css/base.css 304 1ms +[2025-12-30T19:59:32.559Z] [INFO] GET /css/components.css 304 1ms +[2025-12-30T19:59:32.561Z] [INFO] GET /css/board.css 304 1ms +[2025-12-30T19:59:32.580Z] [INFO] GET /css/modal.css 304 3ms +[2025-12-30T19:59:32.581Z] [INFO] GET /css/calendar.css 304 2ms +[2025-12-30T19:59:32.583Z] [INFO] GET /css/responsive.css 304 1ms +[2025-12-30T19:59:32.600Z] [INFO] GET /js/app.js 304 1ms +[2025-12-30T19:59:32.601Z] [INFO] GET /js/utils.js 304 2ms +[2025-12-30T19:59:32.603Z] [INFO] GET /js/api.js 304 1ms +[2025-12-30T19:59:32.622Z] [INFO] GET /js/auth.js 304 2ms +[2025-12-30T19:59:32.624Z] [INFO] GET /js/sync.js 304 2ms +[2025-12-30T19:59:32.623Z] [INFO] GET /js/store.js 304 2ms +[2025-12-30T19:59:32.646Z] [INFO] GET /js/offline.js 304 3ms +[2025-12-30T19:59:32.650Z] [INFO] GET /js/board.js 304 2ms +[2025-12-30T19:59:32.653Z] [INFO] GET /js/task-modal.js 304 2ms +[2025-12-30T19:59:32.665Z] [INFO] GET /js/calendar.js 304 1ms +[2025-12-30T19:59:32.669Z] [INFO] GET /js/list.js 304 2ms +[2025-12-30T19:59:32.672Z] [INFO] GET /js/shortcuts.js 304 0ms +[2025-12-30T19:59:32.684Z] [INFO] GET /js/undo.js 304 1ms +[2025-12-30T19:59:32.690Z] [INFO] GET /js/tour.js 304 2ms +[2025-12-30T19:59:32.694Z] [INFO] GET /js/admin.js 304 2ms +[2025-12-30T19:59:32.706Z] [INFO] GET /js/proposals.js 304 2ms +[2025-12-30T19:59:32.710Z] [INFO] GET /js/notifications.js 304 1ms +[2025-12-30T19:59:32.713Z] [INFO] GET /js/gitea.js 304 1ms +[2025-12-30T19:59:32.724Z] [INFO] GET /css/list.css 304 1ms +[2025-12-30T19:59:32.729Z] [INFO] GET /css/admin.css 304 1ms +[2025-12-30T19:59:32.732Z] [INFO] GET /css/proposals.css 304 1ms +[2025-12-30T19:59:32.743Z] [INFO] GET /css/notifications.css 304 0ms +[2025-12-30T19:59:32.746Z] [INFO] GET /css/gitea.css 304 1ms +[2025-12-30T19:59:35.757Z] [INFO] GET /api/health 200 3ms +[2025-12-30T19:59:40.209Z] [INFO] Aufgabe verschoben: Bilanzbuchhaltung - Finanzamt -> In Arbeit +[2025-12-30T19:59:40.212Z] [INFO] PUT /api/tasks/10/move 200 9ms +[2025-12-30T19:59:41.975Z] [INFO] GET /api/tasks/10 200 15ms +[2025-12-30T19:59:42.006Z] [INFO] GET /api/links/10 304 4ms +[2025-12-30T19:59:42.010Z] [INFO] GET /api/subtasks/10 200 3ms +[2025-12-30T19:59:42.014Z] [INFO] GET /api/files/10 304 3ms +[2025-12-30T19:59:42.018Z] [INFO] GET /api/comments/10 304 3ms +[2025-12-30T19:59:42.022Z] [INFO] GET /api/tasks/10/history 404 7ms +[2025-12-30T19:59:42.964Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T19:59:49.446Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T19:59:51.145Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T20:00:01.401Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T20:00:02.508Z] [INFO] PUT /api/subtasks/39 200 12ms +[2025-12-30T20:00:05.855Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:00:12.301Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:00:13.149Z] [INFO] PUT /api/subtasks/40 200 4ms +[2025-12-30T20:00:35.310Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T20:00:35.317Z] [INFO] PUT /api/subtasks/41 200 5ms +[2025-12-30T20:00:35.936Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:00:36.362Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:00:39.749Z] [INFO] Aufgabe aktualisiert: Bilanzbuchhaltung - Finanzamt (ID: 10) +[2025-12-30T20:00:39.751Z] [INFO] PUT /api/tasks/10 200 8ms +[2025-12-30T20:00:40.771Z] [INFO] POST /api/auth/refresh 200 15ms +[2025-12-30T20:00:46.279Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T20:00:56.777Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:01:00.777Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T20:01:01.336Z] [INFO] Aufgabe erstellt: Gewerbeamt Langenfeld Namensänderung (ID: 14) von MH +[2025-12-30T20:01:01.339Z] [INFO] POST /api/tasks 201 9ms +[2025-12-30T20:01:03.252Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:01:06.029Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:01:23.084Z] [INFO] GET /api/tasks/14 200 6ms +[2025-12-30T20:01:23.111Z] [INFO] GET /api/subtasks/14 200 4ms +[2025-12-30T20:01:23.118Z] [INFO] GET /api/links/14 200 5ms +[2025-12-30T20:01:23.141Z] [INFO] GET /api/files/14 200 5ms +[2025-12-30T20:01:23.147Z] [INFO] GET /api/comments/14 200 4ms +[2025-12-30T20:01:23.151Z] [INFO] GET /api/tasks/14/history 404 3ms +[2025-12-30T20:01:24.101Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T20:01:27.035Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T20:01:28.085Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T20:01:28.092Z] [INFO] Aufgabe aktualisiert: Namensänderung (ID: 14) +[2025-12-30T20:01:28.094Z] [INFO] PUT /api/tasks/14 200 7ms +[2025-12-30T20:01:29.570Z] [INFO] POST /api/auth/refresh 200 14ms +[2025-12-30T20:01:35.984Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T20:01:35.999Z] [INFO] Aufgabe aktualisiert: Namensänderung - Woghin alles eine E-Mail schicken? (ID: 14) +[2025-12-30T20:01:36.003Z] [INFO] PUT /api/tasks/14 200 14ms +[2025-12-30T20:01:36.133Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:01:37.139Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T20:01:41.086Z] [INFO] Aufgabe aktualisiert: Namensänderung - Woghin alles eine E-Mail schicken? (ID: 14) +[2025-12-30T20:01:41.088Z] [INFO] PUT /api/tasks/14 200 12ms +[2025-12-30T20:01:42.096Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T20:01:43.167Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:01:46.251Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T20:02:06.249Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:02:36.371Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:03:06.474Z] [INFO] GET /api/health 200 3ms +[2025-12-30T20:03:36.570Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:04:02.823Z] [INFO] Subtask erstellt: Website ändern in Task 14 +[2025-12-30T20:04:02.825Z] [INFO] POST /api/subtasks 201 7ms +[2025-12-30T20:04:03.797Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:04:06.672Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:04:36.764Z] [INFO] GET /api/health 200 3ms +[2025-12-30T20:04:59.156Z] [INFO] Subtask erstellt: FYRST in Task 14 +[2025-12-30T20:04:59.158Z] [INFO] POST /api/subtasks 201 6ms +[2025-12-30T20:05:00.164Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:05:06.901Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:05:08.450Z] [INFO] Subtask erstellt: Gewerbeamt Langenfeld in Task 14 +[2025-12-30T20:05:08.452Z] [INFO] POST /api/subtasks 201 7ms +[2025-12-30T20:05:09.462Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:05:16.729Z] [INFO] Subtask erstellt: IHK Düsseldorf in Task 14 +[2025-12-30T20:05:16.732Z] [INFO] POST /api/subtasks 201 7ms +[2025-12-30T20:05:17.744Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:05:23.298Z] [INFO] Subtask erstellt: Finanzamt Hilden in Task 14 +[2025-12-30T20:05:23.301Z] [INFO] POST /api/subtasks 201 9ms +[2025-12-30T20:05:24.309Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T20:05:28.706Z] [INFO] Aufgabe aktualisiert: Namensänderung - Woghin alles eine E-Mail schicken? (ID: 14) +[2025-12-30T20:05:28.707Z] [INFO] PUT /api/tasks/14 200 6ms +[2025-12-30T20:05:29.725Z] [INFO] POST /api/auth/refresh 200 15ms +[2025-12-30T20:05:29.833Z] [INFO] Aufgabe aktualisiert: Namensänderung - Woghin alles eine E-Mail schicken? (ID: 14) +[2025-12-30T20:05:29.835Z] [INFO] PUT /api/tasks/14 200 20ms +[2025-12-30T20:05:30.526Z] [INFO] Aufgabe aktualisiert: Namensänderung - Woghin alles eine E-Mail schicken? (ID: 14) +[2025-12-30T20:05:30.528Z] [INFO] PUT /api/tasks/14 200 13ms +[2025-12-30T20:05:31.530Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:05:31.689Z] [INFO] Aufgabe aktualisiert: Namensänderung - Woghin alles eine E-Mail schicken? (ID: 14) +[2025-12-30T20:05:31.690Z] [INFO] PUT /api/tasks/14 200 7ms +[2025-12-30T20:05:32.708Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T20:05:35.889Z] [INFO] Aufgabe verschoben: Namensänderung - Woghin alles eine E-Mail schicken? -> Offen +[2025-12-30T20:05:35.892Z] [INFO] PUT /api/tasks/14/move 200 14ms +[2025-12-30T20:05:36.554Z] [INFO] GET /api/tasks/14 200 6ms +[2025-12-30T20:05:36.585Z] [INFO] GET /api/subtasks/14 200 7ms +[2025-12-30T20:05:36.609Z] [INFO] GET /api/links/14 304 6ms +[2025-12-30T20:05:36.628Z] [INFO] GET /api/comments/14 304 5ms +[2025-12-30T20:05:36.633Z] [INFO] GET /api/files/14 304 10ms +[2025-12-30T20:05:36.652Z] [INFO] GET /api/tasks/14/history 404 18ms +[2025-12-30T20:05:37.029Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:05:37.563Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:06:07.144Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:06:09.337Z] [INFO] Logout: HG +[2025-12-30T20:06:09.339Z] [INFO] POST /api/auth/logout 200 7ms +[2025-12-30T20:06:09.370Z] [INFO] Socket disconnected: HG (ra7gWNXKHTKDS69pAAAB) +[2025-12-30T20:06:37.225Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:07:07.318Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:07:07.802Z] [INFO] Aufgabe aktualisiert: Namensänderung - Woghin alles eine E-Mail schicken? (ID: 14) +[2025-12-30T20:07:07.804Z] [INFO] PUT /api/tasks/14 200 10ms +[2025-12-30T20:07:08.746Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T20:07:11.309Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T20:07:12.776Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T20:07:26.770Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de +[2025-12-30T20:07:26.771Z] [INFO] POST /api/auth/login 200 520ms +[2025-12-30T20:07:26.874Z] [INFO] GET /api/auth/users 304 8ms +[2025-12-30T20:07:26.881Z] [INFO] Socket connected: HG (b0eW_2L_ZKBd4IxBAAAG) +[2025-12-30T20:07:26.907Z] [INFO] Socket connected: HG (j117YGPEvCR8ntzYAAAH) +[2025-12-30T20:07:26.919Z] [INFO] GET /api/projects 401 4ms +[2025-12-30T20:07:26.923Z] [INFO] POST /api/auth/logout 401 2ms +[2025-12-30T20:07:26.949Z] [INFO] Socket disconnected: HG (j117YGPEvCR8ntzYAAAH) +[2025-12-30T20:07:26.955Z] [INFO] GET /api/proposals?sort=date&archived=0 401 2ms +[2025-12-30T20:07:29.360Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de +[2025-12-30T20:07:29.361Z] [INFO] POST /api/auth/login 200 514ms +[2025-12-30T20:07:29.407Z] [INFO] GET /api/auth/users 304 7ms +[2025-12-30T20:07:29.432Z] [INFO] Socket connected: HG (VpE0T9ZaJhQftditAAAK) +[2025-12-30T20:07:29.440Z] [INFO] Socket connected: HG (F3mrnXe5cOP-wcQXAAAL) +[2025-12-30T20:07:29.458Z] [INFO] GET /api/projects 401 4ms +[2025-12-30T20:07:29.486Z] [INFO] Socket disconnected: HG (VpE0T9ZaJhQftditAAAK) +[2025-12-30T20:07:29.491Z] [INFO] GET /api/proposals?sort=date&archived=0 401 1ms +[2025-12-30T20:07:30.511Z] [INFO] GET / 200 5ms +[2025-12-30T20:07:30.571Z] [INFO] Socket disconnected: HG (F3mrnXe5cOP-wcQXAAAL) +[2025-12-30T20:07:30.578Z] [INFO] Socket disconnected: HG (b0eW_2L_ZKBd4IxBAAAG) +[2025-12-30T20:07:30.585Z] [INFO] GET /css/variables.css 200 4ms +[2025-12-30T20:07:30.588Z] [INFO] GET /css/base.css 200 5ms +[2025-12-30T20:07:30.590Z] [INFO] GET /css/components.css 200 6ms +[2025-12-30T20:07:30.591Z] [INFO] GET /css/board.css 200 4ms +[2025-12-30T20:07:30.594Z] [INFO] GET /css/modal.css 200 4ms +[2025-12-30T20:07:30.595Z] [INFO] GET /css/calendar.css 200 3ms +[2025-12-30T20:07:30.622Z] [INFO] GET /css/list.css 200 4ms +[2025-12-30T20:07:30.624Z] [INFO] GET /css/admin.css 200 5ms +[2025-12-30T20:07:30.650Z] [INFO] GET /css/notifications.css 200 6ms +[2025-12-30T20:07:30.653Z] [INFO] GET /css/gitea.css 200 8ms +[2025-12-30T20:07:30.656Z] [INFO] GET /css/proposals.css 200 10ms +[2025-12-30T20:07:30.661Z] [INFO] GET /css/responsive.css 200 6ms +[2025-12-30T20:07:30.677Z] [INFO] GET /js/app.js 200 18ms +[2025-12-30T20:07:30.782Z] [INFO] GET /js/sync.js 200 7ms +[2025-12-30T20:07:30.787Z] [INFO] GET /js/auth.js 200 9ms +[2025-12-30T20:07:30.790Z] [INFO] GET /js/board.js 200 9ms +[2025-12-30T20:07:30.793Z] [INFO] GET /js/offline.js 200 8ms +[2025-12-30T20:07:30.796Z] [INFO] GET /js/api.js 200 7ms +[2025-12-30T20:07:30.797Z] [INFO] GET /js/store.js 200 6ms +[2025-12-30T20:07:30.806Z] [INFO] GET /js/task-modal.js 200 2ms +[2025-12-30T20:07:30.818Z] [INFO] GET /js/calendar.js 200 2ms +[2025-12-30T20:07:30.823Z] [INFO] GET /js/list.js 200 2ms +[2025-12-30T20:07:30.829Z] [INFO] GET /js/shortcuts.js 200 3ms +[2025-12-30T20:07:30.830Z] [INFO] GET /js/undo.js 200 2ms +[2025-12-30T20:07:30.853Z] [INFO] GET /js/admin.js 200 5ms +[2025-12-30T20:07:30.856Z] [INFO] GET /js/proposals.js 200 7ms +[2025-12-30T20:07:30.861Z] [INFO] GET /js/notifications.js 200 5ms +[2025-12-30T20:07:30.863Z] [INFO] GET /js/gitea.js 200 5ms +[2025-12-30T20:07:30.865Z] [INFO] GET /js/utils.js 200 6ms +[2025-12-30T20:07:30.927Z] [INFO] GET /assets/icons/task.svg 304 3ms +[2025-12-30T20:07:31.399Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T20:07:33.556Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de +[2025-12-30T20:07:33.559Z] [INFO] POST /api/auth/login 200 466ms +[2025-12-30T20:07:33.600Z] [INFO] GET /api/auth/users 304 4ms +[2025-12-30T20:07:33.625Z] [INFO] Socket connected: HG (g8gjr18xf99eyPizAAAO) +[2025-12-30T20:07:33.631Z] [INFO] Socket connected: HG (GRADNCx-kLPVKMbxAAAP) +[2025-12-30T20:07:33.638Z] [INFO] GET /api/projects 401 4ms +[2025-12-30T20:07:33.671Z] [INFO] Socket disconnected: HG (GRADNCx-kLPVKMbxAAAP) +[2025-12-30T20:07:33.679Z] [INFO] GET /api/proposals?sort=date&archived=0 401 3ms +[2025-12-30T20:07:33.721Z] [INFO] GET /api/notifications 401 2ms +[2025-12-30T20:07:35.794Z] [INFO] Socket disconnected: HG (g8gjr18xf99eyPizAAAO) +[2025-12-30T20:07:37.419Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:07:38.412Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T20:07:40.373Z] [INFO] GET / 304 2ms +[2025-12-30T20:07:40.419Z] [INFO] GET /css/base.css 304 1ms +[2025-12-30T20:07:40.423Z] [INFO] GET /css/board.css 304 2ms +[2025-12-30T20:07:40.427Z] [INFO] GET /css/variables.css 304 3ms +[2025-12-30T20:07:40.430Z] [INFO] GET /css/components.css 304 2ms +[2025-12-30T20:07:40.432Z] [INFO] GET /css/modal.css 304 1ms +[2025-12-30T20:07:40.435Z] [INFO] GET /css/calendar.css 304 2ms +[2025-12-30T20:07:40.449Z] [INFO] GET /css/admin.css 304 2ms +[2025-12-30T20:07:40.459Z] [INFO] GET /css/list.css 304 2ms +[2025-12-30T20:07:40.465Z] [INFO] GET /css/proposals.css 304 5ms +[2025-12-30T20:07:40.468Z] [INFO] GET /css/notifications.css 304 1ms +[2025-12-30T20:07:40.471Z] [INFO] GET /css/gitea.css 304 2ms +[2025-12-30T20:07:40.473Z] [INFO] GET /css/responsive.css 304 1ms +[2025-12-30T20:07:40.489Z] [INFO] GET /js/app.js 304 2ms +[2025-12-30T20:07:40.535Z] [INFO] GET /js/sync.js 304 6ms +[2025-12-30T20:07:40.537Z] [INFO] GET /js/store.js 304 6ms +[2025-12-30T20:07:40.539Z] [INFO] GET /js/auth.js 304 7ms +[2025-12-30T20:07:40.540Z] [INFO] GET /js/offline.js 304 7ms +[2025-12-30T20:07:40.542Z] [INFO] GET /js/api.js 304 1ms +[2025-12-30T20:07:40.545Z] [INFO] GET /js/board.js 304 2ms +[2025-12-30T20:07:40.562Z] [INFO] GET /js/task-modal.js 304 1ms +[2025-12-30T20:07:40.567Z] [INFO] GET /js/calendar.js 304 1ms +[2025-12-30T20:07:40.571Z] [INFO] GET /js/undo.js 304 1ms +[2025-12-30T20:07:40.574Z] [INFO] GET /js/list.js 304 1ms +[2025-12-30T20:07:40.577Z] [INFO] GET /js/shortcuts.js 304 2ms +[2025-12-30T20:07:40.580Z] [INFO] GET /js/admin.js 304 2ms +[2025-12-30T20:07:40.591Z] [INFO] GET /js/proposals.js 304 0ms +[2025-12-30T20:07:40.601Z] [INFO] GET /js/notifications.js 304 2ms +[2025-12-30T20:07:40.604Z] [INFO] GET /js/gitea.js 304 1ms +[2025-12-30T20:07:40.618Z] [INFO] GET /js/utils.js 304 1ms +[2025-12-30T20:07:40.658Z] [INFO] GET /assets/icons/task.svg 304 1ms +[2025-12-30T20:07:41.030Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:07:42.190Z] [INFO] GET /sw.js 200 3ms +[2025-12-30T20:07:42.230Z] [INFO] GET /css/variables.css 304 1ms +[2025-12-30T20:07:42.232Z] [INFO] GET / 304 1ms +[2025-12-30T20:07:42.236Z] [INFO] GET /index.html 200 3ms +[2025-12-30T20:07:42.261Z] [INFO] GET /css/base.css 304 1ms +[2025-12-30T20:07:42.265Z] [INFO] GET /css/components.css 304 1ms +[2025-12-30T20:07:42.290Z] [INFO] GET /css/board.css 304 2ms +[2025-12-30T20:07:42.294Z] [INFO] GET /css/modal.css 304 2ms +[2025-12-30T20:07:42.302Z] [INFO] GET /css/calendar.css 304 2ms +[2025-12-30T20:07:42.319Z] [INFO] GET /css/responsive.css 304 1ms +[2025-12-30T20:07:42.326Z] [INFO] GET /js/app.js 304 1ms +[2025-12-30T20:07:42.332Z] [INFO] GET /js/utils.js 304 2ms +[2025-12-30T20:07:42.359Z] [INFO] GET /js/api.js 304 2ms +[2025-12-30T20:07:42.374Z] [INFO] GET /js/store.js 304 1ms +[2025-12-30T20:07:42.376Z] [INFO] GET /js/auth.js 304 1ms +[2025-12-30T20:07:42.393Z] [INFO] GET /js/sync.js 304 1ms +[2025-12-30T20:07:42.407Z] [INFO] GET /js/board.js 304 2ms +[2025-12-30T20:07:42.411Z] [INFO] GET /js/offline.js 304 2ms +[2025-12-30T20:07:42.423Z] [INFO] GET /js/task-modal.js 304 1ms +[2025-12-30T20:07:42.440Z] [INFO] GET /js/calendar.js 304 2ms +[2025-12-30T20:07:42.448Z] [INFO] GET /js/list.js 304 1ms +[2025-12-30T20:07:42.452Z] [INFO] GET /js/shortcuts.js 304 1ms +[2025-12-30T20:07:42.470Z] [INFO] GET /js/undo.js 304 1ms +[2025-12-30T20:07:42.480Z] [INFO] GET /js/admin.js 304 1ms +[2025-12-30T20:07:42.486Z] [INFO] GET /js/tour.js 200 2ms +[2025-12-30T20:07:42.503Z] [INFO] GET /js/proposals.js 304 2ms +[2025-12-30T20:07:42.512Z] [INFO] GET /js/notifications.js 304 2ms +[2025-12-30T20:07:42.519Z] [INFO] GET /js/gitea.js 304 2ms +[2025-12-30T20:07:42.537Z] [INFO] GET /css/list.css 304 2ms +[2025-12-30T20:07:42.551Z] [INFO] GET /css/admin.css 304 2ms +[2025-12-30T20:07:42.559Z] [INFO] GET /css/proposals.css 304 2ms +[2025-12-30T20:07:42.568Z] [INFO] GET /css/notifications.css 304 2ms +[2025-12-30T20:07:42.584Z] [INFO] GET /css/gitea.css 304 1ms +[2025-12-30T20:07:43.139Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de +[2025-12-30T20:07:43.141Z] [INFO] POST /api/auth/login 200 504ms +[2025-12-30T20:07:43.203Z] [INFO] GET /api/auth/users 304 6ms +[2025-12-30T20:07:43.221Z] [INFO] Socket connected: HG (RRXGtbn32odtTbikAAAS) +[2025-12-30T20:07:43.230Z] [INFO] Socket connected: HG (7bI9dRwnREgfkfJKAAAT) +[2025-12-30T20:07:43.239Z] [INFO] GET /api/projects 401 5ms +[2025-12-30T20:07:43.273Z] [INFO] Socket disconnected: HG (7bI9dRwnREgfkfJKAAAT) +[2025-12-30T20:07:43.278Z] [INFO] GET /api/proposals?sort=date&archived=0 401 2ms +[2025-12-30T20:07:43.312Z] [INFO] GET /api/notifications 401 2ms +[2025-12-30T20:08:07.522Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:08:37.609Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:09:07.698Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:09:37.822Z] [INFO] GET /api/health 200 3ms +[2025-12-30T20:09:54.630Z] [INFO] POST /api/columns 201 10ms +[2025-12-30T20:09:54.628Z] [INFO] Spalte erstellt: Ausstehend in Projekt 2 (Filter: in_progress) +[2025-12-30T20:09:54.645Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T20:09:55.581Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T20:09:59.791Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T20:10:07.097Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T20:10:07.938Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:10:08.167Z] [INFO] POST /api/auth/refresh 200 14ms +[2025-12-30T20:10:09.509Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T20:10:17.143Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T20:10:17.857Z] [INFO] Aufgabe erstellt: Antwort von WERFT 4.0 - Namensänderung (ID: 15) von MH +[2025-12-30T20:10:17.860Z] [INFO] POST /api/tasks 201 11ms +[2025-12-30T20:10:18.858Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:10:22.293Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:10:24.433Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T20:10:25.492Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T20:10:26.438Z] [INFO] Spalte aktualisiert: Ausstehend (ID: 10) +[2025-12-30T20:10:26.440Z] [INFO] PUT /api/columns/10 200 14ms +[2025-12-30T20:10:27.445Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:10:38.050Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:10:44.601Z] [INFO] GET /api/tasks/6 200 11ms +[2025-12-30T20:10:44.637Z] [INFO] GET /api/subtasks/6 200 9ms +[2025-12-30T20:10:44.651Z] [INFO] GET /api/links/6 304 11ms +[2025-12-30T20:10:44.661Z] [INFO] GET /api/files/6 304 6ms +[2025-12-30T20:10:44.670Z] [INFO] GET /api/tasks/6/history 404 6ms +[2025-12-30T20:10:44.674Z] [INFO] GET /api/comments/6 304 8ms +[2025-12-30T20:10:44.687Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMjU0MjcsImV4cCI6MTc2NzEyNjAyN30.wzO67IRoiMIPUX1lkTZclbnzgHYvWcCDJzQT40hFYxI 200 6ms +[2025-12-30T20:10:45.602Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T20:11:00.619Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T20:11:06.713Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T20:11:08.149Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:11:11.796Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T20:11:23.508Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:11:29.778Z] [INFO] POST /api/subtasks 400 3ms +[2025-12-30T20:11:30.791Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T20:11:34.399Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T20:11:34.781Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6) +[2025-12-30T20:11:34.784Z] [INFO] PUT /api/tasks/6 200 13ms +[2025-12-30T20:11:35.795Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:11:36.846Z] [INFO] GET / 200 7ms +[2025-12-30T20:11:36.884Z] [INFO] Socket disconnected: MH (LF-AW1wwa7cigUNeAAAD) +[2025-12-30T20:11:36.908Z] [INFO] GET /css/variables.css 200 8ms +[2025-12-30T20:11:36.911Z] [INFO] GET /css/components.css 200 9ms +[2025-12-30T20:11:36.914Z] [INFO] GET /css/board.css 200 10ms +[2025-12-30T20:11:36.917Z] [INFO] GET /css/modal.css 200 11ms +[2025-12-30T20:11:36.922Z] [INFO] GET /css/base.css 200 9ms +[2025-12-30T20:11:36.934Z] [INFO] GET /css/calendar.css 200 2ms +[2025-12-30T20:11:36.950Z] [INFO] GET /css/admin.css 200 5ms +[2025-12-30T20:11:36.951Z] [INFO] GET /css/list.css 200 5ms +[2025-12-30T20:11:36.953Z] [INFO] GET /css/proposals.css 200 4ms +[2025-12-30T20:11:36.956Z] [INFO] GET /css/notifications.css 200 4ms +[2025-12-30T20:11:36.969Z] [INFO] GET /css/gitea.css 200 2ms +[2025-12-30T20:11:36.971Z] [INFO] GET /css/responsive.css 200 3ms +[2025-12-30T20:11:36.979Z] [INFO] GET /js/app.js 200 3ms +[2025-12-30T20:11:37.085Z] [INFO] GET /js/auth.js 200 11ms +[2025-12-30T20:11:37.086Z] [INFO] GET /js/store.js 200 11ms +[2025-12-30T20:11:37.089Z] [INFO] GET /js/offline.js 200 12ms +[2025-12-30T20:11:37.090Z] [INFO] GET /js/api.js 200 11ms +[2025-12-30T20:11:37.093Z] [INFO] GET /js/board.js 200 10ms +[2025-12-30T20:11:37.094Z] [INFO] GET /js/app.js 304 2ms +[2025-12-30T20:11:37.094Z] [INFO] GET /js/sync.js 200 4ms +[2025-12-30T20:11:37.115Z] [INFO] GET /js/task-modal.js 200 6ms +[2025-12-30T20:11:37.117Z] [INFO] GET /js/auth.js 304 3ms +[2025-12-30T20:11:37.120Z] [INFO] GET /js/calendar.js 200 8ms +[2025-12-30T20:11:37.123Z] [INFO] GET /js/list.js 200 5ms +[2025-12-30T20:11:37.132Z] [INFO] GET /js/shortcuts.js 200 5ms +[2025-12-30T20:11:37.133Z] [INFO] GET /js/undo.js 200 5ms +[2025-12-30T20:11:37.147Z] [INFO] GET /js/admin.js 200 2ms +[2025-12-30T20:11:37.156Z] [INFO] GET /js/proposals.js 200 5ms +[2025-12-30T20:11:37.158Z] [INFO] GET /js/utils.js 200 5ms +[2025-12-30T20:11:37.159Z] [INFO] GET /js/notifications.js 200 4ms +[2025-12-30T20:11:37.161Z] [INFO] GET /js/gitea.js 200 5ms +[2025-12-30T20:11:37.210Z] [INFO] POST /api/auth/refresh 200 16ms +[2025-12-30T20:11:37.281Z] [INFO] GET /js/store.js 304 1ms +[2025-12-30T20:11:37.283Z] [INFO] GET /js/offline.js 304 1ms +[2025-12-30T20:11:37.285Z] [INFO] GET /js/api.js 304 1ms +[2025-12-30T20:11:37.299Z] [INFO] GET /js/sync.js 304 1ms +[2025-12-30T20:11:37.303Z] [INFO] GET /js/calendar.js 304 1ms +[2025-12-30T20:11:37.304Z] [INFO] GET /js/board.js 200 3ms +[2025-12-30T20:11:37.318Z] [INFO] GET /js/list.js 304 2ms +[2025-12-30T20:11:37.334Z] [INFO] GET /js/shortcuts.js 304 3ms +[2025-12-30T20:11:37.336Z] [INFO] GET /js/task-modal.js 200 6ms +[2025-12-30T20:11:37.338Z] [INFO] GET /js/undo.js 304 5ms +[2025-12-30T20:11:37.339Z] [INFO] GET /js/admin.js 304 3ms +[2025-12-30T20:11:37.341Z] [INFO] GET /js/proposals.js 304 1ms +[2025-12-30T20:11:37.370Z] [INFO] GET /api/auth/users 200 9ms +[2025-12-30T20:11:37.446Z] [INFO] GET /api/auth/users 304 8ms +[2025-12-30T20:11:37.449Z] [INFO] GET /assets/icons/task.svg 200 14ms +[2025-12-30T20:11:37.465Z] [INFO] Socket connected: MH (Ev1DRio03xzQ4o2jAAAV) +[2025-12-30T20:11:37.474Z] [INFO] GET /api/projects 200 6ms +[2025-12-30T20:11:37.509Z] [INFO] MH joined project:[object Object] +[2025-12-30T20:11:37.520Z] [INFO] GET /api/stats/dashboard?projectId=2 200 8ms +[2025-12-30T20:11:37.533Z] [INFO] GET /api/tasks/project/2 200 12ms +[2025-12-30T20:11:37.545Z] [INFO] GET /api/columns/2 200 7ms +[2025-12-30T20:11:37.553Z] [INFO] GET /api/labels/2 304 6ms +[2025-12-30T20:11:37.606Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 8ms +[2025-12-30T20:11:37.640Z] [INFO] GET /api/notifications 304 12ms +[2025-12-30T20:11:38.244Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:11:39.235Z] [INFO] GET /api/tasks/6 200 14ms +[2025-12-30T20:11:39.265Z] [INFO] GET /api/subtasks/6 304 7ms +[2025-12-30T20:11:39.271Z] [INFO] GET /api/links/6 304 5ms +[2025-12-30T20:11:39.278Z] [INFO] GET /api/files/6 304 6ms +[2025-12-30T20:11:39.287Z] [INFO] GET /api/tasks/6/history 404 9ms +[2025-12-30T20:11:39.292Z] [INFO] GET /api/comments/6 304 10ms +[2025-12-30T20:11:39.302Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMjU0OTcsImV4cCI6MTc2NzEyNjA5N30.YWXiReZJkLp6quTbByUGXCOeY4CEp8L7NHfXSI0iALU 200 4ms +[2025-12-30T20:11:40.243Z] [INFO] POST /api/auth/refresh 200 14ms +[2025-12-30T20:11:43.547Z] [INFO] POST /api/subtasks 400 6ms +[2025-12-30T20:11:44.567Z] [INFO] POST /api/auth/refresh 200 14ms +[2025-12-30T20:11:45.222Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6) +[2025-12-30T20:11:45.224Z] [INFO] PUT /api/tasks/6 200 12ms +[2025-12-30T20:11:46.226Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T20:11:46.893Z] [INFO] GET /api/tasks/6 200 8ms +[2025-12-30T20:11:46.926Z] [INFO] GET /api/subtasks/6 304 5ms +[2025-12-30T20:11:46.935Z] [INFO] GET /api/comments/6 304 5ms +[2025-12-30T20:11:46.942Z] [INFO] GET /api/files/6 304 6ms +[2025-12-30T20:11:46.948Z] [INFO] GET /api/links/6 304 5ms +[2025-12-30T20:11:46.953Z] [INFO] GET /api/tasks/6/history 404 4ms +[2025-12-30T20:11:46.968Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMjU1MDYsImV4cCI6MTc2NzEyNjEwNn0.rhJ8QnvxBgb7vzWIPn0exejdy0iZ6PIeZ2UyXALo3LU 200 6ms +[2025-12-30T20:11:47.895Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:11:51.312Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T20:11:59.832Z] [INFO] Subtask erstellt: "Statuskarte aktualisiert" solche Benachrichtigungen machen oben mehr Sinn, weil sie damit keine Buttons überlappen in Task 6 +[2025-12-30T20:11:59.834Z] [INFO] POST /api/subtasks 201 9ms +[2025-12-30T20:12:00.845Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:12:08.366Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6) +[2025-12-30T20:12:08.373Z] [INFO] PUT /api/tasks/6 200 21ms +[2025-12-30T20:12:08.377Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:12:09.359Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T20:12:09.950Z] [INFO] GET /api/tasks/6 200 10ms +[2025-12-30T20:12:09.982Z] [INFO] GET /api/subtasks/6 200 7ms +[2025-12-30T20:12:09.987Z] [INFO] GET /api/tasks/6/history 404 4ms +[2025-12-30T20:12:09.993Z] [INFO] GET /api/files/6 304 5ms +[2025-12-30T20:12:10.002Z] [INFO] GET /api/links/6 304 8ms +[2025-12-30T20:12:10.012Z] [INFO] GET /api/comments/6 304 8ms +[2025-12-30T20:12:10.020Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMjU1MjksImV4cCI6MTc2NzEyNjEyOX0.z8MQTCxZTkfB2eN9TK1YLpHws-AgJrWPnK0rSbPE2WI 200 5ms +[2025-12-30T20:12:10.955Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T20:12:11.361Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6) +[2025-12-30T20:12:11.363Z] [INFO] PUT /api/tasks/6 200 9ms +[2025-12-30T20:12:12.373Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T20:12:20.833Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T20:12:23.366Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T20:12:28.983Z] [INFO] GET /api/tasks/14 200 8ms +[2025-12-30T20:12:29.013Z] [INFO] GET /api/links/14 304 7ms +[2025-12-30T20:12:29.020Z] [INFO] GET /api/subtasks/14 304 6ms +[2025-12-30T20:12:29.026Z] [INFO] GET /api/files/14 304 5ms +[2025-12-30T20:12:29.033Z] [INFO] GET /api/comments/14 304 4ms +[2025-12-30T20:12:29.038Z] [INFO] GET /api/tasks/14/history 404 4ms +[2025-12-30T20:12:29.992Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T20:12:32.612Z] [INFO] Aufgabe aktualisiert: Namensänderung - Wohin alles eine E-Mail schicken? (ID: 14) +[2025-12-30T20:12:32.614Z] [INFO] PUT /api/tasks/14 200 10ms +[2025-12-30T20:12:38.509Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:12:39.046Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14) +[2025-12-30T20:12:39.048Z] [INFO] PUT /api/tasks/14 200 12ms +[2025-12-30T20:12:39.665Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:12:40.059Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14) +[2025-12-30T20:12:40.061Z] [INFO] PUT /api/tasks/14 200 11ms +[2025-12-30T20:12:41.058Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T20:13:08.618Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:13:38.733Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:14:08.854Z] [INFO] GET /api/health 200 4ms +[2025-12-30T20:14:38.948Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:15:09.066Z] [INFO] GET /api/health 200 4ms +[2025-12-30T20:15:17.500Z] [INFO] SIGTERM empfangen, fahre herunter... +[2025-12-30T20:15:29.087Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen: +[2025-12-30T20:15:29.151Z] [INFO] Datenbank-Tabellen erstellt +[2025-12-30T20:15:29.155Z] [INFO] Datenbank initialisiert +[2025-12-30T20:15:29.159Z] [INFO] Server läuft auf Port 3000 +[2025-12-30T20:15:29.159Z] [INFO] Umgebung: production +[2025-12-30T20:15:29.161Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden) +[2025-12-30T20:15:29.161Z] [INFO] Automatische Backups aktiviert +[2025-12-30T20:15:29.322Z] [INFO] Socket connected: HG (qgKtn1deEBv1AvK_AAAB) +[2025-12-30T20:15:29.408Z] [INFO] Socket connected: MH (lEFmiz6oENY5uR4OAAAD) +[2025-12-30T20:15:29.454Z] [INFO] MH joined project:[object Object] +[2025-12-30T20:15:33.415Z] [INFO] GET /api/health 200 10ms +[2025-12-30T20:16:03.545Z] [INFO] GET /api/health 200 4ms +[2025-12-30T20:16:04.778Z] [INFO] GET / 200 7ms +[2025-12-30T20:16:04.853Z] [INFO] Socket disconnected: HG (qgKtn1deEBv1AvK_AAAB) +[2025-12-30T20:16:04.864Z] [INFO] GET /css/variables.css 200 6ms +[2025-12-30T20:16:04.868Z] [INFO] GET /css/base.css 200 6ms +[2025-12-30T20:16:04.893Z] [INFO] GET /css/components.css 200 5ms +[2025-12-30T20:16:04.901Z] [INFO] GET /css/board.css 200 3ms +[2025-12-30T20:16:04.929Z] [INFO] GET /css/modal.css 200 9ms +[2025-12-30T20:16:04.937Z] [INFO] GET /css/list.css 200 13ms +[2025-12-30T20:16:04.942Z] [INFO] GET /css/admin.css 200 15ms +[2025-12-30T20:16:04.944Z] [INFO] GET /css/calendar.css 200 11ms +[2025-12-30T20:16:04.946Z] [INFO] GET /css/proposals.css 200 5ms +[2025-12-30T20:16:04.955Z] [INFO] GET /css/notifications.css 200 4ms +[2025-12-30T20:16:04.968Z] [INFO] GET /css/gitea.css 200 3ms +[2025-12-30T20:16:04.983Z] [INFO] GET /css/responsive.css 200 4ms +[2025-12-30T20:16:05.001Z] [INFO] GET /js/app.js 200 5ms +[2025-12-30T20:16:05.100Z] [INFO] GET /js/board.js 200 5ms +[2025-12-30T20:16:05.101Z] [INFO] GET /js/sync.js 200 6ms +[2025-12-30T20:16:05.103Z] [INFO] GET /js/store.js 200 6ms +[2025-12-30T20:16:05.107Z] [INFO] GET /js/offline.js 200 9ms +[2025-12-30T20:16:05.109Z] [INFO] GET /js/api.js 200 4ms +[2025-12-30T20:16:05.111Z] [INFO] GET /js/auth.js 200 9ms +[2025-12-30T20:16:05.137Z] [INFO] GET /js/task-modal.js 200 8ms +[2025-12-30T20:16:05.138Z] [INFO] GET /js/calendar.js 200 7ms +[2025-12-30T20:16:05.144Z] [INFO] GET /js/shortcuts.js 200 9ms +[2025-12-30T20:16:05.146Z] [INFO] GET /js/list.js 200 4ms +[2025-12-30T20:16:05.149Z] [INFO] GET /js/undo.js 200 4ms +[2025-12-30T20:16:05.153Z] [INFO] GET /js/admin.js 200 2ms +[2025-12-30T20:16:05.180Z] [INFO] GET /js/proposals.js 200 9ms +[2025-12-30T20:16:05.185Z] [INFO] GET /js/notifications.js 200 10ms +[2025-12-30T20:16:05.189Z] [INFO] GET /js/gitea.js 200 8ms +[2025-12-30T20:16:05.192Z] [INFO] GET /js/utils.js 200 5ms +[2025-12-30T20:16:05.267Z] [INFO] GET /assets/icons/task.svg 304 9ms +[2025-12-30T20:16:10.097Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de +[2025-12-30T20:16:10.099Z] [INFO] POST /api/auth/login 200 545ms +[2025-12-30T20:16:10.140Z] [INFO] GET /api/auth/users 304 9ms +[2025-12-30T20:16:10.166Z] [INFO] Socket connected: HG (EmoDiAXFj8WxN8mcAAAG) +[2025-12-30T20:16:10.179Z] [INFO] GET /api/projects 401 7ms +[2025-12-30T20:16:10.188Z] [INFO] Socket connected: HG (Rge3kBOED8O2fNukAAAH) +[2025-12-30T20:16:10.210Z] [INFO] Socket disconnected: HG (EmoDiAXFj8WxN8mcAAAG) +[2025-12-30T20:16:10.218Z] [INFO] GET /api/proposals?sort=date&archived=0 401 3ms +[2025-12-30T20:16:10.253Z] [INFO] GET /api/notifications 401 1ms +[2025-12-30T20:16:14.093Z] [INFO] GET /css/board.css 304 1ms +[2025-12-30T20:16:14.095Z] [INFO] GET /css/variables.css 304 1ms +[2025-12-30T20:16:14.096Z] [INFO] GET /css/base.css 304 1ms +[2025-12-30T20:16:14.098Z] [INFO] GET /css/components.css 304 1ms +[2025-12-30T20:16:14.100Z] [INFO] GET /css/calendar.css 304 1ms +[2025-12-30T20:16:14.101Z] [INFO] GET /css/modal.css 304 1ms +[2025-12-30T20:16:14.122Z] [INFO] GET /css/list.css 304 3ms +[2025-12-30T20:16:14.128Z] [INFO] GET /css/admin.css 304 2ms +[2025-12-30T20:16:14.132Z] [INFO] GET /css/proposals.css 304 1ms +[2025-12-30T20:16:14.136Z] [INFO] GET /css/notifications.css 304 1ms +[2025-12-30T20:16:14.140Z] [INFO] GET /css/responsive.css 304 1ms +[2025-12-30T20:16:14.143Z] [INFO] GET /css/gitea.css 304 1ms +[2025-12-30T20:16:29.199Z] [INFO] Backup erstellt: backup_2025-12-30T20-16-29-171Z.db +[2025-12-30T20:16:29.201Z] [INFO] Altes Backup gelöscht: backup_2025-12-28T21-13-56-595Z.db +[2025-12-30T20:16:29.202Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet +[2025-12-30T20:16:33.644Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:17:03.770Z] [INFO] GET /api/health 200 6ms +[2025-12-30T20:17:33.866Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:17:59.758Z] [INFO] SIGTERM empfangen, fahre herunter... +[2025-12-30T20:18:11.223Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen: +[2025-12-30T20:18:11.273Z] [INFO] Datenbank-Tabellen erstellt +[2025-12-30T20:18:11.275Z] [INFO] Datenbank initialisiert +[2025-12-30T20:18:11.278Z] [INFO] Server läuft auf Port 3000 +[2025-12-30T20:18:11.278Z] [INFO] Umgebung: production +[2025-12-30T20:18:11.280Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden) +[2025-12-30T20:18:11.280Z] [INFO] Automatische Backups aktiviert +[2025-12-30T20:18:11.481Z] [INFO] Socket connected: HG (8HLUd19BRas_IYNNAAAB) +[2025-12-30T20:18:12.363Z] [INFO] Socket connected: MH (xUbKBNYSbnkzcsY1AAAD) +[2025-12-30T20:18:12.398Z] [INFO] MH joined project:[object Object] +[2025-12-30T20:18:15.575Z] [INFO] GET /api/health 200 8ms +[2025-12-30T20:18:45.670Z] [INFO] GET /api/health 200 4ms +[2025-12-30T20:19:11.303Z] [INFO] Backup erstellt: backup_2025-12-30T20-19-11-288Z.db +[2025-12-30T20:19:11.305Z] [INFO] Altes Backup gelöscht: backup_2025-12-28T21-20-30-328Z.db +[2025-12-30T20:19:11.307Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet +[2025-12-30T20:19:15.774Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:19:30.280Z] [INFO] GET / 200 17ms +[2025-12-30T20:19:30.341Z] [INFO] Socket disconnected: HG (8HLUd19BRas_IYNNAAAB) +[2025-12-30T20:19:30.353Z] [INFO] GET /css/variables.css 200 3ms +[2025-12-30T20:19:30.384Z] [INFO] GET /css/base.css 200 5ms +[2025-12-30T20:19:30.420Z] [INFO] GET /css/components.css 200 7ms +[2025-12-30T20:19:30.428Z] [INFO] GET /css/board.css 200 11ms +[2025-12-30T20:19:30.433Z] [INFO] GET /css/calendar.css 200 10ms +[2025-12-30T20:19:30.434Z] [INFO] GET /css/list.css 200 8ms +[2025-12-30T20:19:30.437Z] [INFO] GET /css/modal.css 200 6ms +[2025-12-30T20:19:30.439Z] [INFO] GET /css/admin.css 200 7ms +[2025-12-30T20:19:30.447Z] [INFO] GET /css/proposals.css 200 3ms +[2025-12-30T20:19:30.477Z] [INFO] GET /css/notifications.css 200 6ms +[2025-12-30T20:19:30.490Z] [INFO] GET /css/gitea.css 200 6ms +[2025-12-30T20:19:30.497Z] [INFO] GET /css/responsive.css 200 4ms +[2025-12-30T20:19:30.531Z] [INFO] GET /js/app.js 200 4ms +[2025-12-30T20:19:30.600Z] [INFO] GET /js/store.js 200 7ms +[2025-12-30T20:19:30.606Z] [INFO] GET /js/api.js 200 11ms +[2025-12-30T20:19:30.610Z] [INFO] GET /js/board.js 200 13ms +[2025-12-30T20:19:30.614Z] [INFO] GET /js/auth.js 200 11ms +[2025-12-30T20:19:30.616Z] [INFO] GET /js/offline.js 200 8ms +[2025-12-30T20:19:30.618Z] [INFO] GET /js/sync.js 200 7ms +[2025-12-30T20:19:30.636Z] [INFO] GET /js/task-modal.js 200 6ms +[2025-12-30T20:19:30.640Z] [INFO] GET /js/calendar.js 200 2ms +[2025-12-30T20:19:30.645Z] [INFO] GET /js/undo.js 200 2ms +[2025-12-30T20:19:30.647Z] [INFO] GET /js/shortcuts.js 200 3ms +[2025-12-30T20:19:30.650Z] [INFO] GET /js/list.js 200 2ms +[2025-12-30T20:19:30.663Z] [INFO] GET /js/admin.js 200 1ms +[2025-12-30T20:19:30.667Z] [INFO] GET /js/proposals.js 200 1ms +[2025-12-30T20:19:30.671Z] [INFO] GET /js/notifications.js 200 2ms +[2025-12-30T20:19:30.682Z] [INFO] GET /js/gitea.js 200 7ms +[2025-12-30T20:19:30.688Z] [INFO] GET /js/utils.js 200 5ms +[2025-12-30T20:19:30.760Z] [INFO] GET /assets/icons/task.svg 304 11ms +[2025-12-30T20:19:35.536Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de +[2025-12-30T20:19:35.538Z] [INFO] POST /api/auth/login 200 495ms +[2025-12-30T20:19:35.580Z] [INFO] GET /api/auth/users 304 6ms +[2025-12-30T20:19:35.615Z] [INFO] Socket connected: HG (7Zh8X7vAVWM8LhdAAAAG) +[2025-12-30T20:19:35.625Z] [INFO] GET /api/projects 401 7ms +[2025-12-30T20:19:35.630Z] [INFO] Socket connected: HG (SN_-zK-L9x4VIw3WAAAH) +[2025-12-30T20:19:35.653Z] [INFO] Socket disconnected: HG (7Zh8X7vAVWM8LhdAAAAG) +[2025-12-30T20:19:35.662Z] [INFO] GET /api/proposals?sort=date&archived=0 401 2ms +[2025-12-30T20:19:35.692Z] [INFO] GET /api/notifications 401 1ms +[2025-12-30T20:19:40.576Z] [INFO] GET /css/base.css 304 3ms +[2025-12-30T20:19:40.580Z] [INFO] GET /css/modal.css 304 2ms +[2025-12-30T20:19:40.583Z] [INFO] GET /css/variables.css 304 2ms +[2025-12-30T20:19:40.586Z] [INFO] GET /css/board.css 304 2ms +[2025-12-30T20:19:40.588Z] [INFO] GET /css/calendar.css 304 1ms +[2025-12-30T20:19:40.590Z] [INFO] GET /css/components.css 304 1ms +[2025-12-30T20:19:40.604Z] [INFO] GET /css/list.css 304 0ms +[2025-12-30T20:19:40.610Z] [INFO] GET /css/proposals.css 304 2ms +[2025-12-30T20:19:40.617Z] [INFO] GET /css/notifications.css 304 2ms +[2025-12-30T20:19:40.621Z] [INFO] GET /css/responsive.css 304 1ms +[2025-12-30T20:19:40.624Z] [INFO] GET /css/admin.css 304 2ms +[2025-12-30T20:19:40.626Z] [INFO] GET /css/gitea.css 304 3ms +[2025-12-30T20:19:45.890Z] [INFO] GET /api/health 200 4ms +[2025-12-30T20:20:15.998Z] [INFO] GET /api/health 200 3ms +[2025-12-30T20:20:46.131Z] [INFO] GET /api/health 200 5ms +[2025-12-30T20:21:16.253Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:21:46.365Z] [INFO] GET /api/health 200 4ms +[2025-12-30T20:22:16.469Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:22:46.586Z] [INFO] GET /api/health 200 5ms +[2025-12-30T20:23:16.689Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:23:32.343Z] [INFO] POST /api/auth/logout 401 6ms +[2025-12-30T20:23:32.362Z] [INFO] Socket disconnected: MH (xUbKBNYSbnkzcsY1AAAD) +[2025-12-30T20:23:46.801Z] [INFO] GET /api/health 200 3ms +[2025-12-30T20:24:16.487Z] [INFO] Login erfolgreich: momohomma@googlemail.com +[2025-12-30T20:24:16.488Z] [INFO] POST /api/auth/login 200 497ms +[2025-12-30T20:24:16.552Z] [INFO] Socket connected: MH (CXJPZxy3YyB1jw79AAAK) +[2025-12-30T20:24:16.557Z] [INFO] GET /api/auth/users 304 10ms +[2025-12-30T20:24:16.583Z] [INFO] Socket connected: MH (LaPq7mNfG3b2hx8WAAAL) +[2025-12-30T20:24:16.600Z] [INFO] GET /api/projects 304 10ms +[2025-12-30T20:24:16.630Z] [INFO] GET /api/stats/dashboard?projectId=2 304 7ms +[2025-12-30T20:24:16.636Z] [INFO] GET /api/columns/2 304 5ms +[2025-12-30T20:24:16.638Z] [INFO] MH joined project:[object Object] +[2025-12-30T20:24:16.681Z] [INFO] GET /api/tasks/project/2 200 35ms +[2025-12-30T20:24:16.687Z] [INFO] GET /api/labels/2 304 4ms +[2025-12-30T20:24:16.717Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 6ms +[2025-12-30T20:24:16.919Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:24:20.722Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:24:22.472Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T20:24:23.700Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T20:24:32.737Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T20:24:35.173Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T20:24:39.281Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:24:47.017Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:25:17.115Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:25:28.143Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:25:37.693Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:25:40.433Z] [INFO] Aufgabe erstellt: Mein Unternehmenskonto (ID: 16) von MH +[2025-12-30T20:25:40.436Z] [INFO] POST /api/tasks 201 16ms +[2025-12-30T20:25:41.440Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T20:25:42.959Z] [INFO] GET /api/tasks/16 200 14ms +[2025-12-30T20:25:42.982Z] [INFO] GET /api/subtasks/16 200 4ms +[2025-12-30T20:25:43.005Z] [INFO] GET /api/links/16 200 4ms +[2025-12-30T20:25:43.023Z] [INFO] GET /api/files/16 200 7ms +[2025-12-30T20:25:43.033Z] [INFO] GET /api/comments/16 200 7ms +[2025-12-30T20:25:43.039Z] [INFO] GET /api/tasks/16/history 404 5ms +[2025-12-30T20:25:43.963Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T20:25:47.219Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:25:51.013Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T20:25:53.821Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:25:59.490Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:25:59.880Z] [INFO] Link erstellt: https://info.mein-unternehmenskonto.de/ für Task 16 +[2025-12-30T20:25:59.883Z] [INFO] POST /api/links 201 17ms +[2025-12-30T20:26:00.873Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T20:26:01.295Z] [INFO] Aufgabe aktualisiert: Mein Unternehmenskonto (ID: 16) +[2025-12-30T20:26:01.298Z] [INFO] PUT /api/tasks/16 200 12ms +[2025-12-30T20:26:02.314Z] [INFO] POST /api/auth/refresh 200 15ms +[2025-12-30T20:26:17.298Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:26:40.335Z] [INFO] GET /api/tasks/1 200 8ms +[2025-12-30T20:26:40.375Z] [INFO] GET /api/files/1 200 13ms +[2025-12-30T20:26:40.381Z] [INFO] GET /api/subtasks/1 200 17ms +[2025-12-30T20:26:40.386Z] [INFO] GET /api/tasks/1/history 404 20ms +[2025-12-30T20:26:40.390Z] [INFO] GET /api/comments/1 200 3ms +[2025-12-30T20:26:40.396Z] [INFO] GET /api/links/1 200 4ms +[2025-12-30T20:26:41.340Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T20:26:41.458Z] [INFO] Aufgabe aktualisiert: Router (ID: 1) +[2025-12-30T20:26:41.460Z] [INFO] PUT /api/tasks/1 200 9ms +[2025-12-30T20:26:42.466Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T20:26:45.217Z] [INFO] GET /api/tasks/6 200 15ms +[2025-12-30T20:26:45.252Z] [INFO] GET /api/subtasks/6 304 11ms +[2025-12-30T20:26:45.262Z] [INFO] GET /api/tasks/6/history 404 9ms +[2025-12-30T20:26:45.272Z] [INFO] GET /api/links/6 304 8ms +[2025-12-30T20:26:45.287Z] [INFO] GET /api/files/6 304 13ms +[2025-12-30T20:26:45.299Z] [INFO] GET /api/comments/6 304 10ms +[2025-12-30T20:26:45.335Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMjY0MDIsImV4cCI6MTc2NzEyNzAwMn0.TuH-a9Z1eGfrAq4TmXkofWajKlCUcPvNwQpDwLi2Zf0 200 28ms +[2025-12-30T20:26:46.211Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:26:47.423Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:26:50.386Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T20:27:01.479Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T20:27:17.531Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:27:21.875Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:27:25.994Z] [INFO] Subtask erstellt: Unteraufgaben Personen zuweisen können (oder wird es dann zu unübersichtlich?) in Task 6 +[2025-12-30T20:27:25.996Z] [INFO] POST /api/subtasks 201 12ms +[2025-12-30T20:27:26.998Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T20:27:27.690Z] [INFO] SIGTERM empfangen, fahre herunter... +[2025-12-30T20:27:48.774Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen: +[2025-12-30T20:27:48.896Z] [INFO] Umgebung: production +[2025-12-30T20:27:48.898Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden) +[2025-12-30T20:27:48.898Z] [INFO] Automatische Backups aktiviert +[2025-12-30T20:27:48.885Z] [INFO] Datenbank-Tabellen erstellt +[2025-12-30T20:27:48.890Z] [INFO] Datenbank initialisiert +[2025-12-30T20:27:48.896Z] [INFO] Server läuft auf Port 3000 +[2025-12-30T20:27:49.846Z] [INFO] CSRF: Token missing or not stored for user 4, generated new token +[2025-12-30T20:27:49.854Z] [INFO] PUT /api/subtasks/50/position 403 18ms +[2025-12-30T20:27:49.885Z] [INFO] PUT /api/subtasks/50/position 200 9ms +[2025-12-30T20:27:50.713Z] [INFO] Socket connected: MH (dzTKALyMJSagyR3LAAAB) +[2025-12-30T20:27:50.735Z] [INFO] MH joined project:[object Object] +[2025-12-30T20:27:51.249Z] [INFO] Socket connected: MH (Yplg6doWhillx6riAAAD) +[2025-12-30T20:27:51.273Z] [INFO] MH joined project:[object Object] +[2025-12-30T20:27:52.967Z] [INFO] GET /api/health 200 4ms +[2025-12-30T20:27:53.203Z] [INFO] Socket connected: HG (5w29K0T8xu_5EruwAAAF) +[2025-12-30T20:27:54.950Z] [INFO] POST /api/auth/refresh 200 17ms +[2025-12-30T20:28:02.809Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:28:12.426Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:28:21.061Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T20:28:22.426Z] [INFO] Subtask erstellt: Das Verschieben von Unteraufgaben geht nur innerhalb des sichtbaren Fensters und nicht darüber hinaus in Task 6 +[2025-12-30T20:28:22.429Z] [INFO] POST /api/subtasks 201 9ms +[2025-12-30T20:28:23.102Z] [INFO] GET /api/health 200 3ms +[2025-12-30T20:28:23.443Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T20:28:41.374Z] [INFO] PUT /api/subtasks/51/position 200 5ms +[2025-12-30T20:28:45.279Z] [INFO] DELETE /api/subtasks/51 200 5ms +[2025-12-30T20:28:46.296Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T20:28:46.801Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6) +[2025-12-30T20:28:46.806Z] [INFO] PUT /api/tasks/6 200 20ms +[2025-12-30T20:28:47.802Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:28:48.914Z] [INFO] Backup erstellt: backup_2025-12-30T20-28-48-898Z.db +[2025-12-30T20:28:48.918Z] [INFO] Altes Backup gelöscht: backup_2025-12-28T21-37-16-598Z.db +[2025-12-30T20:28:48.919Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet +[2025-12-30T20:28:51.631Z] [INFO] GET /api/tasks/14 200 9ms +[2025-12-30T20:28:51.677Z] [INFO] GET /api/subtasks/14 304 24ms +[2025-12-30T20:28:51.700Z] [INFO] GET /api/links/14 304 20ms +[2025-12-30T20:28:51.710Z] [INFO] GET /api/comments/14 304 4ms +[2025-12-30T20:28:51.715Z] [INFO] GET /api/files/14 304 4ms +[2025-12-30T20:28:51.727Z] [INFO] GET /api/tasks/14/history 404 8ms +[2025-12-30T20:28:52.642Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:28:53.207Z] [INFO] GET /api/health 200 3ms +[2025-12-30T20:29:23.327Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:29:53.455Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:30:00.677Z] [INFO] GET / 200 20ms +[2025-12-30T20:30:00.740Z] [INFO] Socket disconnected: HG (5w29K0T8xu_5EruwAAAF) +[2025-12-30T20:30:00.755Z] [INFO] GET /css/variables.css 200 6ms +[2025-12-30T20:30:00.786Z] [INFO] GET /css/base.css 200 7ms +[2025-12-30T20:30:00.822Z] [INFO] GET /css/components.css 200 11ms +[2025-12-30T20:30:00.832Z] [INFO] GET /css/board.css 200 12ms +[2025-12-30T20:30:00.835Z] [INFO] GET /css/modal.css 200 10ms +[2025-12-30T20:30:00.837Z] [INFO] GET /css/list.css 200 10ms +[2025-12-30T20:30:00.839Z] [INFO] GET /css/admin.css 200 9ms +[2025-12-30T20:30:00.841Z] [INFO] GET /css/calendar.css 200 7ms +[2025-12-30T20:30:00.873Z] [INFO] GET /css/proposals.css 200 8ms +[2025-12-30T20:30:00.880Z] [INFO] GET /css/notifications.css 200 10ms +[2025-12-30T20:30:00.887Z] [INFO] GET /css/gitea.css 200 10ms +[2025-12-30T20:30:00.904Z] [INFO] GET /css/responsive.css 200 16ms +[2025-12-30T20:30:00.908Z] [INFO] GET /js/app.js 200 17ms +[2025-12-30T20:30:00.991Z] [INFO] GET /js/api.js 200 7ms +[2025-12-30T20:30:00.994Z] [INFO] GET /js/store.js 200 11ms +[2025-12-30T20:30:00.997Z] [INFO] GET /js/auth.js 200 12ms +[2025-12-30T20:30:01.001Z] [INFO] GET /js/sync.js 200 15ms +[2025-12-30T20:30:01.005Z] [INFO] GET /js/offline.js 200 17ms +[2025-12-30T20:30:01.039Z] [INFO] GET /js/board.js 200 11ms +[2025-12-30T20:30:01.040Z] [INFO] GET /js/task-modal.js 200 10ms +[2025-12-30T20:30:01.044Z] [INFO] GET /js/calendar.js 200 7ms +[2025-12-30T20:30:01.049Z] [INFO] GET /js/list.js 200 3ms +[2025-12-30T20:30:01.063Z] [INFO] GET /js/shortcuts.js 200 2ms +[2025-12-30T20:30:01.077Z] [INFO] GET /js/admin.js 200 7ms +[2025-12-30T20:30:01.080Z] [INFO] GET /js/proposals.js 200 7ms +[2025-12-30T20:30:01.084Z] [INFO] GET /js/notifications.js 200 8ms +[2025-12-30T20:30:01.087Z] [INFO] GET /js/undo.js 200 5ms +[2025-12-30T20:30:01.094Z] [INFO] GET /js/gitea.js 200 3ms +[2025-12-30T20:30:01.103Z] [INFO] GET /js/utils.js 200 3ms +[2025-12-30T20:30:01.153Z] [INFO] GET /assets/icons/task.svg 200 5ms +[2025-12-30T20:30:07.505Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de +[2025-12-30T20:30:07.506Z] [INFO] POST /api/auth/login 200 524ms +[2025-12-30T20:30:07.555Z] [INFO] GET /api/auth/users 200 10ms +[2025-12-30T20:30:07.582Z] [INFO] Socket connected: HG (QQTtl6gwGKN65DwHAAAI) +[2025-12-30T20:30:07.594Z] [INFO] Socket connected: HG (ERDM9SnwIE1YS2KPAAAJ) +[2025-12-30T20:30:07.604Z] [INFO] GET /api/projects 200 7ms +[2025-12-30T20:30:07.640Z] [INFO] GET /api/stats/dashboard?projectId=2 200 4ms +[2025-12-30T20:30:07.647Z] [INFO] GET /api/columns/2 200 6ms +[2025-12-30T20:30:07.652Z] [INFO] GET /api/labels/2 200 4ms +[2025-12-30T20:30:07.664Z] [INFO] GET /api/tasks/project/2 200 11ms +[2025-12-30T20:30:07.666Z] [INFO] HG joined project:[object Object] +[2025-12-30T20:30:07.713Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 200 5ms +[2025-12-30T20:30:07.756Z] [INFO] GET /api/notifications 200 9ms +[2025-12-30T20:30:10.316Z] [INFO] GET /api/tasks/6 200 9ms +[2025-12-30T20:30:10.363Z] [INFO] GET /api/subtasks/6 200 12ms +[2025-12-30T20:30:10.369Z] [INFO] GET /api/files/6 304 16ms +[2025-12-30T20:30:10.376Z] [INFO] GET /api/links/6 304 22ms +[2025-12-30T20:30:10.381Z] [INFO] GET /api/tasks/6/history 404 4ms +[2025-12-30T20:30:10.391Z] [INFO] GET /api/comments/6 304 9ms +[2025-12-30T20:30:10.419Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJIRyIsImRpc3BsYXlOYW1lIjoiSGVuZHJpayIsImNvbG9yIjoiI0Y1OUUwQiIsInJvbGUiOiJ1c2VyIiwicGVybWlzc2lvbnMiOlsiZ2VuZWhtaWd1bmciXSwiaWF0IjoxNzY3MTI2NjA3LCJleHAiOjE3NjcxMjcyMDd9.vIy0ZHDHMsvm-54mjkT5qIPJOZLj9Q_aXRUAqzasC8I 200 10ms +[2025-12-30T20:30:11.322Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T20:30:23.560Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:30:23.706Z] [INFO] PUT /api/subtasks/49 200 8ms +[2025-12-30T20:30:23.748Z] [INFO] PUT /api/subtasks/49/position 200 4ms +[2025-12-30T20:30:24.703Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:30:28.198Z] [INFO] PUT /api/subtasks/49 200 9ms +[2025-12-30T20:30:29.203Z] [INFO] POST /api/auth/refresh 200 14ms +[2025-12-30T20:30:33.087Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:30:33.093Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6) +[2025-12-30T20:30:33.095Z] [INFO] PUT /api/tasks/6 200 6ms +[2025-12-30T20:30:35.923Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T20:30:35.928Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6) +[2025-12-30T20:30:35.930Z] [INFO] PUT /api/tasks/6 200 5ms +[2025-12-30T20:30:46.350Z] [INFO] PUT /api/subtasks/49/position 200 11ms +[2025-12-30T20:30:51.182Z] [INFO] PUT /api/subtasks/49/position 200 10ms +[2025-12-30T20:30:53.653Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:31:03.312Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:31:04.325Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T20:31:07.633Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:31:11.459Z] [INFO] PUT /api/subtasks/49 200 7ms +[2025-12-30T20:31:12.460Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T20:31:16.023Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:31:17.242Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T20:31:23.751Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:31:26.849Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T20:31:26.856Z] [INFO] PUT /api/subtasks/49 200 5ms +[2025-12-30T20:31:27.851Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:31:32.042Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6) +[2025-12-30T20:31:32.044Z] [INFO] PUT /api/tasks/6 200 9ms +[2025-12-30T20:31:33.046Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:31:35.010Z] [INFO] GET /api/tasks/14 200 9ms +[2025-12-30T20:31:35.053Z] [INFO] GET /api/subtasks/14 200 8ms +[2025-12-30T20:31:35.061Z] [INFO] GET /api/links/14 200 5ms +[2025-12-30T20:31:35.094Z] [INFO] GET /api/files/14 200 8ms +[2025-12-30T20:31:35.101Z] [INFO] GET /api/comments/14 200 4ms +[2025-12-30T20:31:35.119Z] [INFO] GET /api/tasks/14/history 404 8ms +[2025-12-30T20:31:36.012Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:31:37.814Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14) +[2025-12-30T20:31:37.817Z] [INFO] PUT /api/tasks/14 200 10ms +[2025-12-30T20:31:38.815Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:31:40.590Z] [INFO] GET /api/tasks/6 200 15ms +[2025-12-30T20:31:40.630Z] [INFO] GET /api/subtasks/6 200 6ms +[2025-12-30T20:31:40.634Z] [INFO] GET /api/files/6 304 9ms +[2025-12-30T20:31:40.639Z] [INFO] GET /api/comments/6 304 4ms +[2025-12-30T20:31:40.644Z] [INFO] GET /api/tasks/6/history 404 8ms +[2025-12-30T20:31:40.648Z] [INFO] GET /api/links/6 304 8ms +[2025-12-30T20:31:40.674Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJIRyIsImRpc3BsYXlOYW1lIjoiSGVuZHJpayIsImNvbG9yIjoiI0Y1OUUwQiIsInJvbGUiOiJ1c2VyIiwicGVybWlzc2lvbnMiOlsiZ2VuZWhtaWd1bmciXSwiaWF0IjoxNzY3MTI2Njk4LCJleHAiOjE3NjcxMjcyOTh9.gTw8iM6iQLzKeTMLkhe1gfK75H4LQ7rTf9oVCma4_mY 200 8ms +[2025-12-30T20:31:41.591Z] [INFO] POST /api/auth/refresh 200 14ms +[2025-12-30T20:31:53.858Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:32:00.610Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T20:32:01.117Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJIRyIsImRpc3BsYXlOYW1lIjoiSGVuZHJpayIsImNvbG9yIjoiI0Y1OUUwQiIsInJvbGUiOiJ1c2VyIiwicGVybWlzc2lvbnMiOlsiZ2VuZWhtaWd1bmciXSwiaWF0IjoxNzY3MTI2NzIwLCJleHAiOjE3NjcxMjczMjB9.Oa1KmGqDkZWQKY9ne6Yl5ikxqupnmYkPq8IhqJI-BOA 200 6ms +[2025-12-30T20:32:02.118Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T20:32:03.216Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6) +[2025-12-30T20:32:03.219Z] [INFO] PUT /api/tasks/6 200 12ms +[2025-12-30T20:32:04.210Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:32:04.644Z] [INFO] GET /api/tasks/6 200 8ms +[2025-12-30T20:32:04.689Z] [INFO] GET /api/subtasks/6 304 8ms +[2025-12-30T20:32:04.699Z] [INFO] GET /api/links/6 304 5ms +[2025-12-30T20:32:04.706Z] [INFO] GET /api/files/6 304 5ms +[2025-12-30T20:32:04.714Z] [INFO] GET /api/comments/6 304 6ms +[2025-12-30T20:32:04.718Z] [INFO] GET /api/tasks/6/history 404 9ms +[2025-12-30T20:32:04.756Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJIRyIsImRpc3BsYXlOYW1lIjoiSGVuZHJpayIsImNvbG9yIjoiI0Y1OUUwQiIsInJvbGUiOiJ1c2VyIiwicGVybWlzc2lvbnMiOlsiZ2VuZWhtaWd1bmciXSwiaWF0IjoxNzY3MTI2NzI0LCJleHAiOjE3NjcxMjczMjR9.9akOrEBOKlTSPM0XsDvWDonZMYfRCP1eONc1TJjQweA 200 6ms +[2025-12-30T20:32:05.658Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T20:32:05.893Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14) +[2025-12-30T20:32:05.895Z] [INFO] PUT /api/tasks/14 200 7ms +[2025-12-30T20:32:05.929Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14) +[2025-12-30T20:32:05.931Z] [INFO] PUT /api/tasks/14 200 11ms +[2025-12-30T20:32:07.500Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T20:32:09.658Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6) +[2025-12-30T20:32:09.660Z] [INFO] PUT /api/tasks/6 200 11ms +[2025-12-30T20:32:10.660Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T20:32:18.758Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T20:32:20.561Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T20:32:21.505Z] [INFO] Aufgabe erstellt: test (ID: 17) von MH +[2025-12-30T20:32:21.507Z] [INFO] POST /api/tasks 201 8ms +[2025-12-30T20:32:22.530Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T20:32:23.963Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:32:25.822Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T20:32:26.446Z] [INFO] GET /api/tasks/17 200 11ms +[2025-12-30T20:32:26.480Z] [INFO] GET /api/subtasks/17 200 10ms +[2025-12-30T20:32:26.512Z] [INFO] GET /api/links/17 200 13ms +[2025-12-30T20:32:26.524Z] [INFO] GET /api/files/17 200 9ms +[2025-12-30T20:32:26.532Z] [INFO] GET /api/comments/17 200 6ms +[2025-12-30T20:32:26.538Z] [INFO] GET /api/tasks/17/history 404 4ms +[2025-12-30T20:32:27.453Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T20:32:29.291Z] [INFO] Aufgabe gelöscht: test (ID: 17) +[2025-12-30T20:32:29.293Z] [INFO] DELETE /api/tasks/17 200 5ms +[2025-12-30T20:32:29.318Z] [INFO] PUT /api/tasks/17 404 4ms +[2025-12-30T20:32:30.308Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T20:32:41.821Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T20:32:43.279Z] [INFO] Spalte aktualisiert: Ausstehend (ID: 10) +[2025-12-30T20:32:43.280Z] [INFO] PUT /api/columns/10 200 7ms +[2025-12-30T20:32:44.293Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T20:32:54.089Z] [INFO] GET /api/health 200 3ms +[2025-12-30T20:33:23.857Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T20:33:24.193Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:33:24.542Z] [INFO] Spalte Ausstehend von Position 5 zu 4 verschoben +[2025-12-30T20:33:24.545Z] [INFO] PUT /api/columns/10/position 200 14ms +[2025-12-30T20:33:26.662Z] [INFO] Spalte Ausstehend von Position 4 zu 5 verschoben +[2025-12-30T20:33:26.666Z] [INFO] PUT /api/columns/10/position 200 11ms +[2025-12-30T20:33:33.176Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:33:35.468Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:33:37.409Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T20:33:37.762Z] [INFO] Spalte aktualisiert: Ausstehend + (ID: 10) +[2025-12-30T20:33:37.764Z] [INFO] PUT /api/columns/10 200 6ms +[2025-12-30T20:33:38.755Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T20:33:43.265Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T20:33:44.490Z] [INFO] Spalte aktualisiert: Ausstehend (ID: 10) +[2025-12-30T20:33:44.492Z] [INFO] PUT /api/columns/10 200 7ms +[2025-12-30T20:33:45.494Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T20:33:54.314Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:34:12.008Z] [INFO] GET /api/tasks/6 200 8ms +[2025-12-30T20:34:12.058Z] [INFO] GET /api/subtasks/6 304 10ms +[2025-12-30T20:34:12.096Z] [INFO] GET /api/links/6 304 10ms +[2025-12-30T20:34:12.130Z] [INFO] GET /api/comments/6 304 8ms +[2025-12-30T20:34:12.138Z] [INFO] GET /api/files/6 304 6ms +[2025-12-30T20:34:12.144Z] [INFO] GET /api/tasks/6/history 404 4ms +[2025-12-30T20:34:12.178Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJIRyIsImRpc3BsYXlOYW1lIjoiSGVuZHJpayIsImNvbG9yIjoiI0Y1OUUwQiIsInJvbGUiOiJ1c2VyIiwicGVybWlzc2lvbnMiOlsiZ2VuZWhtaWd1bmciXSwiaWF0IjoxNzY3MTI2ODI1LCJleHAiOjE3NjcxMjc0MjV9.W-ZvipW2H9JrHyw0X871exdLVzQ0PE4T7MhFujY8POE 200 7ms +[2025-12-30T20:34:13.021Z] [INFO] POST /api/auth/refresh 200 14ms +[2025-12-30T20:34:16.700Z] [INFO] 1 Datei(en) hochgeladen für Task 6 +[2025-12-30T20:34:16.702Z] [INFO] POST /api/files/6 201 25ms +[2025-12-30T20:34:16.746Z] [INFO] GET /api/files/preview/7?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJIRyIsImRpc3BsYXlOYW1lIjoiSGVuZHJpayIsImNvbG9yIjoiI0Y1OUUwQiIsInJvbGUiOiJ1c2VyIiwicGVybWlzc2lvbnMiOlsiZ2VuZWhtaWd1bmciXSwiaWF0IjoxNzY3MTI2ODUzLCJleHAiOjE3NjcxMjc0NTN9.jQDcVPoaNC1Zj2KOL4F09HRpv4YYsGjt8Ij93Hjrn0Q 200 10ms +[2025-12-30T20:34:16.756Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJIRyIsImRpc3BsYXlOYW1lIjoiSGVuZHJpayIsImNvbG9yIjoiI0Y1OUUwQiIsInJvbGUiOiJ1c2VyIiwicGVybWlzc2lvbnMiOlsiZ2VuZWhtaWd1bmciXSwiaWF0IjoxNzY3MTI2ODUzLCJleHAiOjE3NjcxMjc0NTN9.jQDcVPoaNC1Zj2KOL4F09HRpv4YYsGjt8Ij93Hjrn0Q 200 7ms +[2025-12-30T20:34:24.405Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:34:50.055Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6) +[2025-12-30T20:34:50.058Z] [INFO] PUT /api/tasks/6 200 10ms +[2025-12-30T20:34:51.062Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T20:34:54.499Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:34:56.211Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T20:34:58.259Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T20:34:59.599Z] [INFO] POST /api/auth/refresh 200 18ms +[2025-12-30T20:35:00.736Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T20:35:05.223Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T20:35:05.627Z] [INFO] Aufgabe erstellt: Testaufgabe Statuskarte (ID: 18) von HG +[2025-12-30T20:35:05.629Z] [INFO] POST /api/tasks 201 8ms +[2025-12-30T20:35:06.629Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T20:35:12.410Z] [INFO] GET /api/tasks/18 200 6ms +[2025-12-30T20:35:12.443Z] [INFO] GET /api/subtasks/18 200 4ms +[2025-12-30T20:35:12.450Z] [INFO] GET /api/links/18 200 5ms +[2025-12-30T20:35:12.457Z] [INFO] GET /api/files/18 200 5ms +[2025-12-30T20:35:12.480Z] [INFO] GET /api/comments/18 200 6ms +[2025-12-30T20:35:12.489Z] [INFO] GET /api/tasks/18/history 404 6ms +[2025-12-30T20:35:13.421Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T20:35:15.607Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T20:35:15.997Z] [INFO] Aufgabe gelöscht: Testaufgabe Statuskarte (ID: 18) +[2025-12-30T20:35:16.000Z] [INFO] DELETE /api/tasks/18 200 11ms +[2025-12-30T20:35:16.037Z] [INFO] PUT /api/tasks/18 404 5ms +[2025-12-30T20:35:17.017Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T20:35:24.604Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:35:50.947Z] [INFO] GET /api/tasks/16 200 6ms +[2025-12-30T20:35:50.974Z] [INFO] GET /api/subtasks/16 304 6ms +[2025-12-30T20:35:51.004Z] [INFO] GET /api/links/16 200 11ms +[2025-12-30T20:35:51.012Z] [INFO] GET /api/comments/16 304 6ms +[2025-12-30T20:35:51.017Z] [INFO] GET /api/files/16 304 4ms +[2025-12-30T20:35:51.021Z] [INFO] GET /api/tasks/16/history 404 3ms +[2025-12-30T20:35:51.885Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:35:52.885Z] [INFO] Aufgabe aktualisiert: Mein Unternehmenskonto (ID: 16) +[2025-12-30T20:35:52.886Z] [INFO] PUT /api/tasks/16 200 7ms +[2025-12-30T20:35:53.888Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:35:54.685Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:36:04.540Z] [INFO] GET /api/tasks/4 200 7ms +[2025-12-30T20:36:04.571Z] [INFO] GET /api/subtasks/4 200 4ms +[2025-12-30T20:36:04.576Z] [INFO] GET /api/links/4 200 4ms +[2025-12-30T20:36:04.581Z] [INFO] GET /api/files/4 200 4ms +[2025-12-30T20:36:04.585Z] [INFO] GET /api/tasks/4/history 404 4ms +[2025-12-30T20:36:04.589Z] [INFO] GET /api/comments/4 200 7ms +[2025-12-30T20:36:05.541Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T20:36:06.856Z] [INFO] PUT /api/subtasks/2 200 6ms +[2025-12-30T20:36:06.879Z] [INFO] PUT /api/subtasks/2/position 200 4ms +[2025-12-30T20:36:07.878Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T20:36:11.774Z] [INFO] Aufgabe aktualisiert: Corporated Design (ID: 4) +[2025-12-30T20:36:11.777Z] [INFO] PUT /api/tasks/4 200 9ms +[2025-12-30T20:36:12.793Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T20:36:17.143Z] [INFO] GET /api/tasks/3 200 7ms +[2025-12-30T20:36:17.175Z] [INFO] GET /api/subtasks/3 200 6ms +[2025-12-30T20:36:17.178Z] [INFO] GET /api/tasks/3/history 404 8ms +[2025-12-30T20:36:17.181Z] [INFO] GET /api/files/3 200 11ms +[2025-12-30T20:36:17.185Z] [INFO] GET /api/comments/3 200 14ms +[2025-12-30T20:36:17.188Z] [INFO] GET /api/links/3 200 17ms +[2025-12-30T20:36:18.161Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T20:36:24.260Z] [INFO] Aufgabe aktualisiert: Bilanzbuchhaltung - Bundesanzeiger (ID: 3) +[2025-12-30T20:36:24.262Z] [INFO] PUT /api/tasks/3 200 7ms +[2025-12-30T20:36:24.776Z] [INFO] GET /api/health 200 3ms +[2025-12-30T20:36:25.285Z] [INFO] POST /api/auth/refresh 200 15ms +[2025-12-30T20:36:54.874Z] [INFO] GET /api/health 200 3ms +[2025-12-30T20:37:24.996Z] [INFO] GET /api/health 200 4ms +[2025-12-30T20:37:55.125Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:38:25.226Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:38:55.325Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:39:25.426Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:39:38.258Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T20:39:55.542Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:39:57.010Z] [INFO] GET /api/tasks/14 200 10ms +[2025-12-30T20:39:57.052Z] [INFO] GET /api/subtasks/14 304 12ms +[2025-12-30T20:39:57.076Z] [INFO] GET /api/links/14 304 5ms +[2025-12-30T20:39:57.083Z] [INFO] GET /api/files/14 304 5ms +[2025-12-30T20:39:57.088Z] [INFO] GET /api/comments/14 304 4ms +[2025-12-30T20:39:57.093Z] [INFO] GET /api/tasks/14/history 404 3ms +[2025-12-30T20:39:58.013Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T20:40:18.600Z] [INFO] PUT /api/subtasks/44 200 21ms +[2025-12-30T20:40:19.596Z] [INFO] POST /api/auth/refresh 200 14ms +[2025-12-30T20:40:20.427Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14) +[2025-12-30T20:40:20.429Z] [INFO] PUT /api/tasks/14 200 8ms +[2025-12-30T20:40:21.444Z] [INFO] POST /api/auth/refresh 200 15ms +[2025-12-30T20:40:25.707Z] [INFO] GET /api/health 200 3ms +[2025-12-30T20:40:31.416Z] [INFO] GET /api/tasks/14 200 9ms +[2025-12-30T20:40:31.456Z] [INFO] GET /api/links/14 304 8ms +[2025-12-30T20:40:31.463Z] [INFO] GET /api/subtasks/14 200 6ms +[2025-12-30T20:40:31.468Z] [INFO] GET /api/tasks/14/history 404 4ms +[2025-12-30T20:40:31.473Z] [INFO] GET /api/files/14 304 4ms +[2025-12-30T20:40:31.481Z] [INFO] GET /api/comments/14 304 4ms +[2025-12-30T20:40:32.427Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T20:40:55.821Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:41:02.536Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T20:41:06.356Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14) +[2025-12-30T20:41:06.362Z] [INFO] PUT /api/tasks/14 200 28ms +[2025-12-30T20:41:07.353Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T20:41:25.917Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:41:56.030Z] [INFO] GET /api/health 200 3ms +[2025-12-30T20:42:09.299Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T20:42:21.326Z] [INFO] POST / 200 13ms +[2025-12-30T20:42:21.424Z] [INFO] POST / 200 1ms +[2025-12-30T20:42:26.137Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:42:56.246Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:42:57.918Z] [INFO] GET / 304 6ms +[2025-12-30T20:42:57.958Z] [INFO] Socket disconnected: HG (QQTtl6gwGKN65DwHAAAI) +[2025-12-30T20:42:57.963Z] [INFO] Socket disconnected: HG (ERDM9SnwIE1YS2KPAAAJ) +[2025-12-30T20:42:57.965Z] [INFO] GET /css/variables.css 304 3ms +[2025-12-30T20:42:57.992Z] [INFO] GET /css/base.css 304 1ms +[2025-12-30T20:42:58.020Z] [INFO] GET /css/components.css 304 1ms +[2025-12-30T20:42:58.027Z] [INFO] GET /css/board.css 304 2ms +[2025-12-30T20:42:58.034Z] [INFO] GET /css/modal.css 304 4ms +[2025-12-30T20:42:58.039Z] [INFO] GET /css/calendar.css 304 3ms +[2025-12-30T20:42:58.042Z] [INFO] GET /css/list.css 304 2ms +[2025-12-30T20:42:58.043Z] [INFO] GET /css/admin.css 304 2ms +[2025-12-30T20:42:58.051Z] [INFO] GET /css/proposals.css 304 3ms +[2025-12-30T20:42:58.061Z] [INFO] GET /css/notifications.css 304 1ms +[2025-12-30T20:42:58.063Z] [INFO] GET /css/gitea.css 304 1ms +[2025-12-30T20:42:58.066Z] [INFO] GET /css/responsive.css 304 1ms +[2025-12-30T20:42:58.074Z] [INFO] GET /js/app.js 304 1ms +[2025-12-30T20:42:58.130Z] [INFO] GET /js/board.js 304 3ms +[2025-12-30T20:42:58.132Z] [INFO] GET /js/auth.js 304 3ms +[2025-12-30T20:42:58.134Z] [INFO] GET /js/sync.js 304 1ms +[2025-12-30T20:42:58.137Z] [INFO] GET /js/api.js 304 2ms +[2025-12-30T20:42:58.138Z] [INFO] GET /js/offline.js 304 1ms +[2025-12-30T20:42:58.140Z] [INFO] GET /js/store.js 304 1ms +[2025-12-30T20:42:58.162Z] [INFO] GET /js/task-modal.js 304 2ms +[2025-12-30T20:42:58.168Z] [INFO] GET /js/calendar.js 304 5ms +[2025-12-30T20:42:58.170Z] [INFO] GET /js/list.js 304 1ms +[2025-12-30T20:42:58.172Z] [INFO] GET /js/shortcuts.js 304 1ms +[2025-12-30T20:42:58.174Z] [INFO] GET /js/undo.js 304 2ms +[2025-12-30T20:42:58.175Z] [INFO] GET /js/admin.js 304 2ms +[2025-12-30T20:42:58.187Z] [INFO] GET /js/proposals.js 304 1ms +[2025-12-30T20:42:58.195Z] [INFO] GET /js/notifications.js 304 0ms +[2025-12-30T20:42:58.199Z] [INFO] GET /js/gitea.js 304 1ms +[2025-12-30T20:42:58.203Z] [INFO] GET /js/utils.js 304 1ms +[2025-12-30T20:42:58.244Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T20:42:58.247Z] [INFO] GET /assets/icons/task.svg 304 2ms +[2025-12-30T20:42:58.255Z] [INFO] GET /api/auth/users 304 9ms +[2025-12-30T20:42:58.291Z] [INFO] GET /api/auth/users 304 4ms +[2025-12-30T20:42:58.326Z] [INFO] Socket connected: HG (8VNfH2tQTUDGNBCQAAAL) +[2025-12-30T20:42:58.334Z] [INFO] GET /api/projects 304 6ms +[2025-12-30T20:42:58.372Z] [INFO] GET /api/stats/dashboard?projectId=2 304 6ms +[2025-12-30T20:42:58.376Z] [INFO] GET /api/columns/2 200 4ms +[2025-12-30T20:42:58.382Z] [INFO] GET /api/labels/2 304 5ms +[2025-12-30T20:42:58.384Z] [INFO] HG joined project:[object Object] +[2025-12-30T20:42:58.399Z] [INFO] GET /api/tasks/project/2 200 16ms +[2025-12-30T20:42:58.444Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 9ms +[2025-12-30T20:42:58.485Z] [INFO] GET /api/notifications 304 11ms +[2025-12-30T20:42:59.952Z] [INFO] GET /sw.js 200 3ms +[2025-12-30T20:43:00.001Z] [INFO] GET / 304 14ms +[2025-12-30T20:43:00.006Z] [INFO] GET /index.html 304 3ms +[2025-12-30T20:43:00.009Z] [INFO] GET /css/variables.css 304 2ms +[2025-12-30T20:43:00.040Z] [INFO] GET /css/base.css 304 1ms +[2025-12-30T20:43:00.045Z] [INFO] GET /css/board.css 304 2ms +[2025-12-30T20:43:00.046Z] [INFO] GET /css/components.css 304 2ms +[2025-12-30T20:43:00.076Z] [INFO] GET /css/modal.css 304 2ms +[2025-12-30T20:43:00.084Z] [INFO] GET /css/calendar.css 304 1ms +[2025-12-30T20:43:00.086Z] [INFO] GET /css/responsive.css 304 1ms +[2025-12-30T20:43:00.118Z] [INFO] GET /js/app.js 304 1ms +[2025-12-30T20:43:00.119Z] [INFO] GET /js/utils.js 304 2ms +[2025-12-30T20:43:00.123Z] [INFO] GET /js/api.js 304 0ms +[2025-12-30T20:43:00.155Z] [INFO] GET /js/auth.js 304 2ms +[2025-12-30T20:43:00.160Z] [INFO] GET /js/store.js 304 2ms +[2025-12-30T20:43:00.166Z] [INFO] GET /js/sync.js 304 2ms +[2025-12-30T20:43:00.191Z] [INFO] GET /js/offline.js 304 1ms +[2025-12-30T20:43:00.194Z] [INFO] GET /js/board.js 304 0ms +[2025-12-30T20:43:00.206Z] [INFO] GET /js/task-modal.js 304 2ms +[2025-12-30T20:43:00.226Z] [INFO] GET /js/calendar.js 304 1ms +[2025-12-30T20:43:00.229Z] [INFO] GET /js/list.js 304 0ms +[2025-12-30T20:43:00.241Z] [INFO] GET /js/shortcuts.js 304 2ms +[2025-12-30T20:43:00.258Z] [INFO] GET /js/tour.js 304 1ms +[2025-12-30T20:43:00.259Z] [INFO] GET /js/undo.js 304 2ms +[2025-12-30T20:43:00.274Z] [INFO] GET /js/admin.js 304 1ms +[2025-12-30T20:43:00.292Z] [INFO] GET /js/proposals.js 304 1ms +[2025-12-30T20:43:00.297Z] [INFO] GET /js/notifications.js 304 3ms +[2025-12-30T20:43:00.332Z] [INFO] GET /js/gitea.js 304 2ms +[2025-12-30T20:43:00.336Z] [INFO] GET /css/list.css 304 2ms +[2025-12-30T20:43:00.339Z] [INFO] GET /css/admin.css 304 1ms +[2025-12-30T20:43:00.369Z] [INFO] GET /css/proposals.css 304 1ms +[2025-12-30T20:43:00.375Z] [INFO] GET /css/notifications.css 304 1ms +[2025-12-30T20:43:00.387Z] [INFO] GET /css/gitea.css 304 2ms +[2025-12-30T20:43:04.637Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:43:26.368Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:43:56.462Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:44:26.575Z] [INFO] GET /api/health 200 3ms +[2025-12-30T20:44:56.677Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:45:10.821Z] [INFO] GET /api/tasks/14 200 15ms +[2025-12-30T20:45:10.857Z] [INFO] GET /api/subtasks/14 304 7ms +[2025-12-30T20:45:10.915Z] [INFO] GET /api/links/14 304 10ms +[2025-12-30T20:45:10.922Z] [INFO] GET /api/files/14 304 5ms +[2025-12-30T20:45:10.925Z] [INFO] GET /api/tasks/14/history 404 6ms +[2025-12-30T20:45:10.928Z] [INFO] GET /api/comments/14 304 10ms +[2025-12-30T20:45:11.754Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T20:45:22.949Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:45:26.793Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:45:34.941Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:45:37.316Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T20:45:38.998Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T20:45:41.024Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T20:45:42.576Z] [INFO] GET /api/tasks/15 200 5ms +[2025-12-30T20:45:42.614Z] [INFO] GET /api/subtasks/15 200 6ms +[2025-12-30T20:45:42.651Z] [INFO] GET /api/links/15 200 8ms +[2025-12-30T20:45:42.687Z] [INFO] GET /api/files/15 200 4ms +[2025-12-30T20:45:42.692Z] [INFO] GET /api/comments/15 200 4ms +[2025-12-30T20:45:42.695Z] [INFO] GET /api/tasks/15/history 404 7ms +[2025-12-30T20:45:43.583Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T20:45:45.154Z] [INFO] Aufgabe aktualisiert: Antwort von WERFT 4.0 - Namensänderung (ID: 15) +[2025-12-30T20:45:45.156Z] [INFO] PUT /api/tasks/15 200 12ms +[2025-12-30T20:45:46.153Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:45:46.725Z] [INFO] GET / 304 1ms +[2025-12-30T20:45:46.762Z] [INFO] Socket disconnected: HG (8VNfH2tQTUDGNBCQAAAL) +[2025-12-30T20:45:46.774Z] [INFO] GET /css/base.css 304 3ms +[2025-12-30T20:45:46.776Z] [INFO] GET /css/board.css 304 4ms +[2025-12-30T20:45:46.778Z] [INFO] GET /css/variables.css 304 6ms +[2025-12-30T20:45:46.779Z] [INFO] GET /css/components.css 304 2ms +[2025-12-30T20:45:46.785Z] [INFO] GET /css/modal.css 304 1ms +[2025-12-30T20:45:46.804Z] [INFO] GET /css/calendar.css 304 1ms +[2025-12-30T20:45:46.805Z] [INFO] GET /css/list.css 304 2ms +[2025-12-30T20:45:46.808Z] [INFO] GET /css/proposals.css 304 1ms +[2025-12-30T20:45:46.810Z] [INFO] GET /css/admin.css 304 1ms +[2025-12-30T20:45:46.812Z] [INFO] GET /css/notifications.css 304 1ms +[2025-12-30T20:45:46.834Z] [INFO] GET /css/gitea.css 304 1ms +[2025-12-30T20:45:46.839Z] [INFO] GET /css/responsive.css 304 2ms +[2025-12-30T20:45:46.842Z] [INFO] GET /js/app.js 304 1ms +[2025-12-30T20:45:46.887Z] [INFO] GET /js/store.js 304 9ms +[2025-12-30T20:45:46.892Z] [INFO] GET /js/api.js 304 1ms +[2025-12-30T20:45:46.894Z] [INFO] GET /js/auth.js 304 1ms +[2025-12-30T20:45:46.896Z] [INFO] GET /js/sync.js 304 1ms +[2025-12-30T20:45:46.897Z] [INFO] GET /js/board.js 304 0ms +[2025-12-30T20:45:46.899Z] [INFO] GET /js/offline.js 304 1ms +[2025-12-30T20:45:46.916Z] [INFO] GET /js/task-modal.js 304 1ms +[2025-12-30T20:45:46.920Z] [INFO] GET /js/calendar.js 304 1ms +[2025-12-30T20:45:46.925Z] [INFO] GET /js/shortcuts.js 304 1ms +[2025-12-30T20:45:46.926Z] [INFO] GET /js/undo.js 304 1ms +[2025-12-30T20:45:46.928Z] [INFO] GET /js/list.js 304 1ms +[2025-12-30T20:45:46.930Z] [INFO] GET /js/admin.js 304 1ms +[2025-12-30T20:45:46.944Z] [INFO] GET /js/proposals.js 304 1ms +[2025-12-30T20:45:46.947Z] [INFO] GET /js/notifications.js 304 0ms +[2025-12-30T20:45:46.951Z] [INFO] GET /js/gitea.js 304 0ms +[2025-12-30T20:45:46.956Z] [INFO] GET /js/utils.js 304 1ms +[2025-12-30T20:45:46.996Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:45:47.003Z] [INFO] GET /api/auth/users 304 5ms +[2025-12-30T20:45:47.005Z] [INFO] GET /assets/icons/task.svg 304 6ms +[2025-12-30T20:45:47.043Z] [INFO] GET /api/auth/users 304 8ms +[2025-12-30T20:45:47.079Z] [INFO] GET /api/projects 304 5ms +[2025-12-30T20:45:47.084Z] [INFO] Socket connected: HG (kKJ3x0Yq712agD3fAAAN) +[2025-12-30T20:45:47.137Z] [INFO] GET /api/tasks/project/2 200 25ms +[2025-12-30T20:45:47.149Z] [INFO] GET /api/labels/2 304 8ms +[2025-12-30T20:45:47.154Z] [INFO] GET /api/columns/2 304 5ms +[2025-12-30T20:45:47.160Z] [INFO] GET /api/stats/dashboard?projectId=2 304 10ms +[2025-12-30T20:45:47.161Z] [INFO] HG joined project:[object Object] +[2025-12-30T20:45:47.195Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 5ms +[2025-12-30T20:45:47.229Z] [INFO] GET /api/notifications 304 5ms +[2025-12-30T20:45:48.730Z] [INFO] GET /sw.js 304 1ms +[2025-12-30T20:45:52.626Z] [INFO] GET /api/tasks/6 200 6ms +[2025-12-30T20:45:52.670Z] [INFO] GET /api/files/6 200 9ms +[2025-12-30T20:45:52.674Z] [INFO] GET /api/tasks/6/history 404 11ms +[2025-12-30T20:45:52.682Z] [INFO] GET /api/links/6 304 5ms +[2025-12-30T20:45:52.689Z] [INFO] GET /api/subtasks/6 304 6ms +[2025-12-30T20:45:52.692Z] [INFO] GET /api/comments/6 304 7ms +[2025-12-30T20:45:52.711Z] [INFO] GET /api/files/preview/7?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJIRyIsImRpc3BsYXlOYW1lIjoiSGVuZHJpayIsImNvbG9yIjoiI0Y1OUUwQiIsInJvbGUiOiJ1c2VyIiwicGVybWlzc2lvbnMiOlsiZ2VuZWhtaWd1bmciXSwiaWF0IjoxNzY3MTI3Mzc4LCJleHAiOjE3NjcxMjc5Nzh9.9wr_dPVScjZvvIT8-GU3_X6Y9Opdv7GBSor1dwrjMAo 200 9ms +[2025-12-30T20:45:52.710Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJIRyIsImRpc3BsYXlOYW1lIjoiSGVuZHJpayIsImNvbG9yIjoiI0Y1OUUwQiIsInJvbGUiOiJ1c2VyIiwicGVybWlzc2lvbnMiOlsiZ2VuZWhtaWd1bmciXSwiaWF0IjoxNzY3MTI3Mzc4LCJleHAiOjE3NjcxMjc5Nzh9.9wr_dPVScjZvvIT8-GU3_X6Y9Opdv7GBSor1dwrjMAo 200 5ms +[2025-12-30T20:45:53.638Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T20:45:56.880Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:46:00.308Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6) +[2025-12-30T20:46:00.310Z] [INFO] PUT /api/tasks/6 200 7ms +[2025-12-30T20:46:01.316Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T20:46:17.447Z] [INFO] POST /api/auth/refresh 200 18ms +[2025-12-30T20:46:23.249Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T20:46:26.977Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:46:57.083Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:47:27.208Z] [INFO] GET /api/health 200 4ms +[2025-12-30T20:47:57.357Z] [INFO] GET /api/health 200 4ms +[2025-12-30T20:48:27.456Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:48:35.807Z] [INFO] GET / 200 11ms +[2025-12-30T20:48:39.179Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14) +[2025-12-30T20:48:39.181Z] [INFO] PUT /api/tasks/14 200 9ms +[2025-12-30T20:48:40.102Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T20:48:40.621Z] [INFO] GET /api/tasks/6 200 10ms +[2025-12-30T20:48:40.651Z] [INFO] GET /api/subtasks/6 200 5ms +[2025-12-30T20:48:40.677Z] [INFO] GET /api/links/6 304 5ms +[2025-12-30T20:48:40.689Z] [INFO] GET /api/files/6 200 6ms +[2025-12-30T20:48:40.692Z] [INFO] GET /api/comments/6 304 8ms +[2025-12-30T20:48:40.698Z] [INFO] GET /api/tasks/6/history 404 3ms +[2025-12-30T20:48:40.731Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMjc3MjAsImV4cCI6MTc2NzEyODMyMH0.JyNhpY_TtjuQZfoZOS0sAJyhSK0LIrZmuoPJETH6eE4 200 9ms +[2025-12-30T20:48:40.729Z] [INFO] GET /api/files/preview/7?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMjc3MjAsImV4cCI6MTc2NzEyODMyMH0.JyNhpY_TtjuQZfoZOS0sAJyhSK0LIrZmuoPJETH6eE4 200 15ms +[2025-12-30T20:48:41.627Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T20:48:57.573Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:48:59.880Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T20:49:19.754Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:49:20.764Z] [INFO] Subtask erstellt: Erinnerungsfunktion im Kalender (z.B. LexOffice mit dem L Paket Buchen, oder Vertrag X kündigen oder sowas) in Task 6 +[2025-12-30T20:49:20.767Z] [INFO] POST /api/subtasks 201 8ms +[2025-12-30T20:49:21.765Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T20:49:22.246Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6) +[2025-12-30T20:49:22.249Z] [INFO] PUT /api/tasks/6 200 13ms +[2025-12-30T20:49:23.248Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T20:49:27.667Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:49:57.773Z] [INFO] GET /api/health 200 5ms +[2025-12-30T20:50:27.859Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:50:41.841Z] [INFO] GET /api/tasks/14 200 12ms +[2025-12-30T20:50:41.885Z] [INFO] GET /api/subtasks/14 304 6ms +[2025-12-30T20:50:41.908Z] [INFO] GET /api/links/14 304 4ms +[2025-12-30T20:50:41.918Z] [INFO] GET /api/files/14 304 5ms +[2025-12-30T20:50:41.922Z] [INFO] GET /api/comments/14 304 9ms +[2025-12-30T20:50:41.927Z] [INFO] GET /api/tasks/14/history 404 4ms +[2025-12-30T20:50:42.802Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T20:50:58.002Z] [INFO] GET /api/health 200 4ms +[2025-12-30T20:51:28.104Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:51:58.212Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:52:28.298Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:52:58.453Z] [INFO] GET /api/health 200 11ms +[2025-12-30T20:53:28.566Z] [INFO] GET /api/health 200 3ms +[2025-12-30T20:53:58.677Z] [INFO] GET /api/health 200 3ms +[2025-12-30T20:54:02.217Z] [INFO] Socket disconnected: MH (dzTKALyMJSagyR3LAAAB) +[2025-12-30T20:54:02.484Z] [INFO] Socket disconnected: MH (Yplg6doWhillx6riAAAD) +[2025-12-30T20:54:28.796Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:54:58.891Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:55:28.998Z] [INFO] GET /api/health 200 2ms +[2025-12-30T20:55:59.120Z] [INFO] GET /api/health 200 8ms +[2025-12-30T20:56:22.233Z] [INFO] Logout: HG +[2025-12-30T20:56:22.235Z] [INFO] POST /api/auth/logout 200 18ms +[2025-12-30T20:56:22.268Z] [INFO] Socket disconnected: HG (kKJ3x0Yq712agD3fAAAN) +[2025-12-30T20:56:29.232Z] [INFO] GET /api/health 200 6ms +[2025-12-30T20:56:59.354Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:57:29.447Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:57:59.539Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:58:29.661Z] [INFO] GET /api/health 200 6ms +[2025-12-30T20:58:59.757Z] [INFO] GET /api/health 200 1ms +[2025-12-30T20:59:29.887Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:00:00.013Z] [INFO] GET /api/health 200 8ms +[2025-12-30T21:00:30.140Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:01:00.246Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:01:40.785Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen: +[2025-12-30T21:01:40.870Z] [INFO] Datenbank-Tabellen erstellt +[2025-12-30T21:01:40.877Z] [INFO] Umgebung: production +[2025-12-30T21:01:40.873Z] [INFO] Datenbank initialisiert +[2025-12-30T21:01:40.876Z] [INFO] Server läuft auf Port 3000 +[2025-12-30T21:01:40.878Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden) +[2025-12-30T21:01:40.878Z] [INFO] Automatische Backups aktiviert +[2025-12-30T21:01:44.724Z] [INFO] GET /api/health 200 14ms +[2025-12-30T21:01:50.571Z] [INFO] HEAD / 200 7ms +[2025-12-30T21:01:55.982Z] [INFO] GET /api/knowledge/categories 401 5ms +[2025-12-30T21:02:14.828Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:02:40.903Z] [INFO] Backup erstellt: backup_2025-12-30T21-02-40-899Z.db +[2025-12-30T21:02:40.907Z] [INFO] Altes Backup gelöscht: backup_2025-12-28T21-51-26-664Z.db +[2025-12-30T21:02:40.910Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet +[2025-12-30T21:02:44.933Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:03:15.073Z] [INFO] GET /api/health 200 5ms +[2025-12-30T21:03:45.183Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:04:15.294Z] [INFO] GET /api/health 200 4ms +[2025-12-30T21:04:25.340Z] [INFO] GET / 200 17ms +[2025-12-30T21:04:25.418Z] [INFO] GET /css/variables.css 200 4ms +[2025-12-30T21:04:25.457Z] [INFO] GET /css/base.css 200 7ms +[2025-12-30T21:04:25.508Z] [INFO] GET /css/components.css 200 11ms +[2025-12-30T21:04:25.514Z] [INFO] GET /css/calendar.css 200 11ms +[2025-12-30T21:04:25.519Z] [INFO] GET /css/modal.css 200 9ms +[2025-12-30T21:04:25.520Z] [INFO] GET /css/board.css 200 9ms +[2025-12-30T21:04:25.521Z] [INFO] GET /css/list.css 200 9ms +[2025-12-30T21:04:25.523Z] [INFO] GET /css/admin.css 200 7ms +[2025-12-30T21:04:25.562Z] [INFO] GET /css/proposals.css 200 6ms +[2025-12-30T21:04:25.563Z] [INFO] GET /css/notifications.css 200 5ms +[2025-12-30T21:04:25.569Z] [INFO] GET /css/knowledge.css 200 4ms +[2025-12-30T21:04:25.573Z] [INFO] GET /css/gitea.css 200 6ms +[2025-12-30T21:04:25.587Z] [INFO] GET /css/responsive.css 200 16ms +[2025-12-30T21:04:25.594Z] [INFO] GET /js/app.js 200 3ms +[2025-12-30T21:04:25.656Z] [INFO] GET /js/api.js 200 5ms +[2025-12-30T21:04:25.661Z] [INFO] GET /js/store.js 200 8ms +[2025-12-30T21:04:25.666Z] [INFO] GET /js/board.js 200 7ms +[2025-12-30T21:04:25.667Z] [INFO] GET /js/auth.js 200 7ms +[2025-12-30T21:04:25.670Z] [INFO] GET /js/offline.js 200 5ms +[2025-12-30T21:04:25.671Z] [INFO] GET /js/sync.js 200 3ms +[2025-12-30T21:04:25.688Z] [INFO] GET /js/calendar.js 200 2ms +[2025-12-30T21:04:25.689Z] [INFO] GET /js/task-modal.js 200 4ms +[2025-12-30T21:04:25.698Z] [INFO] GET /js/list.js 200 3ms +[2025-12-30T21:04:25.700Z] [INFO] GET /js/shortcuts.js 200 3ms +[2025-12-30T21:04:25.701Z] [INFO] GET /js/undo.js 200 2ms +[2025-12-30T21:04:25.726Z] [INFO] GET /js/proposals.js 200 7ms +[2025-12-30T21:04:25.728Z] [INFO] GET /js/notifications.js 200 8ms +[2025-12-30T21:04:25.735Z] [INFO] GET /js/gitea.js 200 4ms +[2025-12-30T21:04:25.737Z] [INFO] GET /js/knowledge.js 200 4ms +[2025-12-30T21:04:25.740Z] [INFO] GET /js/utils.js 200 6ms +[2025-12-30T21:04:25.743Z] [INFO] GET /js/admin.js 200 4ms +[2025-12-30T21:04:25.822Z] [INFO] GET /assets/icons/task.svg 200 10ms +[2025-12-30T21:04:31.018Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de +[2025-12-30T21:04:31.020Z] [INFO] POST /api/auth/login 200 491ms +[2025-12-30T21:04:31.054Z] [INFO] GET /api/auth/users 304 8ms +[2025-12-30T21:04:31.090Z] [INFO] GET /api/projects 401 8ms +[2025-12-30T21:04:31.102Z] [INFO] Socket connected: HG (IUkPAgmQtZqH93PlAAAC) +[2025-12-30T21:04:31.111Z] [INFO] Socket connected: HG (KXOy45I_OxDMIxauAAAD) +[2025-12-30T21:04:31.123Z] [INFO] GET /api/proposals?sort=date&archived=0 401 1ms +[2025-12-30T21:04:31.140Z] [INFO] Socket disconnected: HG (KXOy45I_OxDMIxauAAAD) +[2025-12-30T21:04:31.155Z] [INFO] GET /api/notifications 401 4ms +[2025-12-30T21:04:31.188Z] [INFO] GET /api/knowledge/categories 401 3ms +[2025-12-30T21:04:45.440Z] [INFO] GET /api/health 200 7ms +[2025-12-30T21:04:55.351Z] [INFO] Socket disconnected: HG (IUkPAgmQtZqH93PlAAAC) +[2025-12-30T21:04:58.656Z] [INFO] GET / 304 4ms +[2025-12-30T21:04:58.704Z] [INFO] GET /css/variables.css 304 1ms +[2025-12-30T21:04:58.713Z] [INFO] GET /css/base.css 304 5ms +[2025-12-30T21:04:58.716Z] [INFO] GET /css/components.css 304 1ms +[2025-12-30T21:04:58.719Z] [INFO] GET /css/board.css 304 1ms +[2025-12-30T21:04:58.722Z] [INFO] GET /css/modal.css 304 1ms +[2025-12-30T21:04:58.724Z] [INFO] GET /css/calendar.css 304 1ms +[2025-12-30T21:04:58.759Z] [INFO] GET /css/list.css 304 10ms +[2025-12-30T21:04:58.763Z] [INFO] GET /css/admin.css 304 2ms +[2025-12-30T21:04:58.767Z] [INFO] GET /css/proposals.css 304 3ms +[2025-12-30T21:04:58.771Z] [INFO] GET /css/notifications.css 304 2ms +[2025-12-30T21:04:58.774Z] [INFO] GET /css/gitea.css 304 2ms +[2025-12-30T21:04:58.775Z] [INFO] GET /css/knowledge.css 304 2ms +[2025-12-30T21:04:58.786Z] [INFO] GET /css/responsive.css 304 1ms +[2025-12-30T21:04:58.794Z] [INFO] GET /js/app.js 304 0ms +[2025-12-30T21:04:58.841Z] [INFO] GET /js/api.js 304 2ms +[2025-12-30T21:04:58.844Z] [INFO] GET /js/auth.js 304 2ms +[2025-12-30T21:04:58.847Z] [INFO] GET /js/board.js 304 1ms +[2025-12-30T21:04:58.851Z] [INFO] GET /js/offline.js 304 2ms +[2025-12-30T21:04:58.853Z] [INFO] GET /js/store.js 304 1ms +[2025-12-30T21:04:58.854Z] [INFO] GET /js/sync.js 304 1ms +[2025-12-30T21:04:58.878Z] [INFO] GET /js/calendar.js 304 4ms +[2025-12-30T21:04:58.881Z] [INFO] GET /js/task-modal.js 304 5ms +[2025-12-30T21:04:58.885Z] [INFO] GET /js/list.js 304 2ms +[2025-12-30T21:04:58.888Z] [INFO] GET /js/shortcuts.js 304 2ms +[2025-12-30T21:04:58.893Z] [INFO] GET /js/undo.js 304 2ms +[2025-12-30T21:04:58.895Z] [INFO] GET /js/admin.js 304 1ms +[2025-12-30T21:04:58.907Z] [INFO] GET /js/notifications.js 304 0ms +[2025-12-30T21:04:58.910Z] [INFO] GET /js/proposals.js 304 2ms +[2025-12-30T21:04:58.915Z] [INFO] GET /js/knowledge.js 304 0ms +[2025-12-30T21:04:58.918Z] [INFO] GET /js/gitea.js 304 1ms +[2025-12-30T21:04:58.920Z] [INFO] GET /js/utils.js 304 1ms +[2025-12-30T21:04:58.966Z] [INFO] GET /assets/icons/task.svg 304 2ms +[2025-12-30T21:05:00.481Z] [INFO] GET /sw.js 200 4ms +[2025-12-30T21:05:00.521Z] [INFO] GET / 304 5ms +[2025-12-30T21:05:00.525Z] [INFO] GET /css/variables.css 304 3ms +[2025-12-30T21:05:00.527Z] [INFO] GET /index.html 200 9ms +[2025-12-30T21:05:00.552Z] [INFO] GET /css/base.css 304 1ms +[2025-12-30T21:05:00.555Z] [INFO] GET /css/components.css 304 2ms +[2025-12-30T21:05:00.579Z] [INFO] GET /css/board.css 304 2ms +[2025-12-30T21:05:00.584Z] [INFO] GET /css/modal.css 304 1ms +[2025-12-30T21:05:00.590Z] [INFO] GET /css/calendar.css 304 2ms +[2025-12-30T21:05:00.608Z] [INFO] GET /css/responsive.css 304 1ms +[2025-12-30T21:05:00.621Z] [INFO] GET /js/app.js 304 6ms +[2025-12-30T21:05:00.626Z] [INFO] GET /js/utils.js 304 3ms +[2025-12-30T21:05:00.638Z] [INFO] GET /js/api.js 304 1ms +[2025-12-30T21:05:00.652Z] [INFO] GET /js/auth.js 304 2ms +[2025-12-30T21:05:00.655Z] [INFO] GET /js/store.js 304 1ms +[2025-12-30T21:05:00.668Z] [INFO] GET /js/sync.js 304 1ms +[2025-12-30T21:05:00.681Z] [INFO] GET /js/offline.js 304 1ms +[2025-12-30T21:05:00.685Z] [INFO] GET /js/board.js 304 1ms +[2025-12-30T21:05:00.700Z] [INFO] GET /js/task-modal.js 304 2ms +[2025-12-30T21:05:00.716Z] [INFO] GET /js/calendar.js 304 1ms +[2025-12-30T21:05:00.722Z] [INFO] GET /js/list.js 304 1ms +[2025-12-30T21:05:00.730Z] [INFO] GET /js/shortcuts.js 304 1ms +[2025-12-30T21:05:00.745Z] [INFO] GET /js/undo.js 304 3ms +[2025-12-30T21:05:00.751Z] [INFO] GET /js/tour.js 304 1ms +[2025-12-30T21:05:00.761Z] [INFO] GET /js/admin.js 304 2ms +[2025-12-30T21:05:00.773Z] [INFO] GET /js/proposals.js 304 0ms +[2025-12-30T21:05:00.784Z] [INFO] GET /js/notifications.js 304 2ms +[2025-12-30T21:05:00.793Z] [INFO] GET /js/gitea.js 304 2ms +[2025-12-30T21:05:00.805Z] [INFO] GET /js/knowledge.js 304 2ms +[2025-12-30T21:05:00.815Z] [INFO] GET /css/list.css 304 3ms +[2025-12-30T21:05:00.826Z] [INFO] GET /css/admin.css 304 1ms +[2025-12-30T21:05:00.836Z] [INFO] GET /css/proposals.css 304 2ms +[2025-12-30T21:05:00.844Z] [INFO] GET /css/notifications.css 304 2ms +[2025-12-30T21:05:00.860Z] [INFO] GET /css/gitea.css 304 2ms +[2025-12-30T21:05:00.868Z] [INFO] GET /css/knowledge.css 304 1ms +[2025-12-30T21:05:02.666Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de +[2025-12-30T21:05:02.667Z] [INFO] POST /api/auth/login 200 489ms +[2025-12-30T21:05:02.719Z] [INFO] GET /api/auth/users 304 7ms +[2025-12-30T21:05:02.746Z] [INFO] Socket connected: HG (lomE46ZOLutTY811AAAG) +[2025-12-30T21:05:02.754Z] [INFO] Socket connected: HG (S5rHyMMOmF8hjNSSAAAH) +[2025-12-30T21:05:02.776Z] [INFO] GET /api/projects 401 6ms +[2025-12-30T21:05:02.805Z] [INFO] Socket disconnected: HG (S5rHyMMOmF8hjNSSAAAH) +[2025-12-30T21:05:02.808Z] [INFO] GET /api/proposals?sort=date&archived=0 401 5ms +[2025-12-30T21:05:02.818Z] [INFO] POST /api/auth/logout 401 8ms +[2025-12-30T21:05:02.841Z] [INFO] GET /api/notifications 401 2ms +[2025-12-30T21:05:02.878Z] [INFO] GET /api/knowledge/categories 401 2ms +[2025-12-30T21:05:04.509Z] [INFO] Socket disconnected: HG (lomE46ZOLutTY811AAAG) +[2025-12-30T21:05:15.534Z] [INFO] GET /api/health 200 3ms +[2025-12-30T21:05:45.672Z] [INFO] GET /api/health 200 4ms +[2025-12-30T21:06:15.790Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:06:45.891Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:07:16.018Z] [INFO] GET /api/health 200 4ms +[2025-12-30T21:07:46.126Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:08:16.230Z] [INFO] GET /api/health 200 4ms +[2025-12-30T21:08:46.319Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:09:16.446Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:10:21.562Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen: +[2025-12-30T21:10:21.694Z] [INFO] Datenbank-Tabellen erstellt +[2025-12-30T21:10:21.704Z] [INFO] Umgebung: production +[2025-12-30T21:10:21.706Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden) +[2025-12-30T21:10:21.707Z] [INFO] Automatische Backups aktiviert +[2025-12-30T21:10:21.698Z] [INFO] Datenbank initialisiert +[2025-12-30T21:10:21.703Z] [INFO] Server läuft auf Port 3000 +[2025-12-30T21:10:25.241Z] [INFO] GET /api/health 200 14ms +[2025-12-30T21:10:55.406Z] [INFO] GET /api/health 200 3ms +[2025-12-30T21:10:59.801Z] [INFO] GET / 304 8ms +[2025-12-30T21:10:59.858Z] [INFO] GET /css/variables.css 304 2ms +[2025-12-30T21:10:59.891Z] [INFO] GET /css/base.css 304 2ms +[2025-12-30T21:10:59.930Z] [INFO] GET /css/components.css 304 3ms +[2025-12-30T21:10:59.932Z] [INFO] GET /css/board.css 304 3ms +[2025-12-30T21:10:59.953Z] [INFO] GET /css/modal.css 304 1ms +[2025-12-30T21:10:59.957Z] [INFO] GET /css/calendar.css 304 2ms +[2025-12-30T21:10:59.972Z] [INFO] GET /css/list.css 304 2ms +[2025-12-30T21:10:59.977Z] [INFO] GET /css/admin.css 304 2ms +[2025-12-30T21:10:59.987Z] [INFO] GET /css/proposals.css 304 1ms +[2025-12-30T21:10:59.995Z] [INFO] GET /css/notifications.css 304 2ms +[2025-12-30T21:11:00.006Z] [INFO] GET /css/gitea.css 304 2ms +[2025-12-30T21:11:00.013Z] [INFO] GET /css/knowledge.css 304 3ms +[2025-12-30T21:11:00.020Z] [INFO] GET /js/app.js 304 2ms +[2025-12-30T21:11:00.034Z] [INFO] GET /css/responsive.css 304 1ms +[2025-12-30T21:11:00.089Z] [INFO] GET /js/store.js 304 6ms +[2025-12-30T21:11:00.090Z] [INFO] GET /js/auth.js 304 3ms +[2025-12-30T21:11:00.108Z] [INFO] GET /js/sync.js 304 5ms +[2025-12-30T21:11:00.114Z] [INFO] GET /js/api.js 200 23ms +[2025-12-30T21:11:00.117Z] [INFO] GET /js/board.js 304 7ms +[2025-12-30T21:11:00.121Z] [INFO] GET /js/offline.js 304 1ms +[2025-12-30T21:11:00.124Z] [INFO] GET /js/task-modal.js 304 1ms +[2025-12-30T21:11:00.139Z] [INFO] GET /js/calendar.js 304 1ms +[2025-12-30T21:11:00.143Z] [INFO] GET /js/list.js 304 1ms +[2025-12-30T21:11:00.147Z] [INFO] GET /js/shortcuts.js 304 1ms +[2025-12-30T21:11:00.152Z] [INFO] GET /js/undo.js 304 1ms +[2025-12-30T21:11:00.160Z] [INFO] GET /js/admin.js 304 1ms +[2025-12-30T21:11:00.169Z] [INFO] GET /js/proposals.js 304 1ms +[2025-12-30T21:11:00.170Z] [INFO] GET /js/notifications.js 304 0ms +[2025-12-30T21:11:00.174Z] [INFO] GET /js/gitea.js 304 1ms +[2025-12-30T21:11:00.177Z] [INFO] GET /js/knowledge.js 304 1ms +[2025-12-30T21:11:00.179Z] [INFO] GET /js/utils.js 304 1ms +[2025-12-30T21:11:00.232Z] [INFO] GET /assets/icons/task.svg 304 12ms +[2025-12-30T21:11:01.753Z] [INFO] GET /sw.js 200 6ms +[2025-12-30T21:11:01.791Z] [INFO] GET / 304 2ms +[2025-12-30T21:11:01.794Z] [INFO] GET /css/variables.css 304 1ms +[2025-12-30T21:11:01.798Z] [INFO] GET /index.html 304 2ms +[2025-12-30T21:11:01.822Z] [INFO] GET /css/base.css 304 1ms +[2025-12-30T21:11:01.828Z] [INFO] GET /css/components.css 304 2ms +[2025-12-30T21:11:01.838Z] [INFO] GET /css/board.css 304 2ms +[2025-12-30T21:11:01.854Z] [INFO] GET /css/modal.css 304 1ms +[2025-12-30T21:11:01.861Z] [INFO] GET /css/calendar.css 304 1ms +[2025-12-30T21:11:01.866Z] [INFO] GET /css/responsive.css 304 1ms +[2025-12-30T21:11:01.886Z] [INFO] GET /js/app.js 304 2ms +[2025-12-30T21:11:01.892Z] [INFO] GET /js/utils.js 304 1ms +[2025-12-30T21:11:01.906Z] [INFO] GET /js/api.js 304 1ms +[2025-12-30T21:11:01.917Z] [INFO] GET /js/auth.js 304 1ms +[2025-12-30T21:11:01.921Z] [INFO] GET /js/store.js 304 1ms +[2025-12-30T21:11:01.931Z] [INFO] GET /js/sync.js 304 1ms +[2025-12-30T21:11:01.949Z] [INFO] GET /js/offline.js 304 1ms +[2025-12-30T21:11:01.963Z] [INFO] GET /js/board.js 304 2ms +[2025-12-30T21:11:01.978Z] [INFO] GET /js/calendar.js 304 1ms +[2025-12-30T21:11:01.980Z] [INFO] GET /js/task-modal.js 304 1ms +[2025-12-30T21:11:01.995Z] [INFO] GET /js/list.js 304 1ms +[2025-12-30T21:11:02.009Z] [INFO] GET /js/shortcuts.js 304 1ms +[2025-12-30T21:11:02.012Z] [INFO] GET /js/undo.js 304 1ms +[2025-12-30T21:11:02.027Z] [INFO] GET /js/tour.js 304 1ms +[2025-12-30T21:11:02.041Z] [INFO] GET /js/admin.js 304 2ms +[2025-12-30T21:11:02.045Z] [INFO] GET /js/proposals.js 304 1ms +[2025-12-30T21:11:02.061Z] [INFO] GET /js/notifications.js 304 1ms +[2025-12-30T21:11:02.074Z] [INFO] GET /js/gitea.js 304 2ms +[2025-12-30T21:11:02.075Z] [INFO] GET /js/knowledge.js 304 2ms +[2025-12-30T21:11:02.091Z] [INFO] GET /css/list.css 304 2ms +[2025-12-30T21:11:02.104Z] [INFO] GET /css/admin.css 304 2ms +[2025-12-30T21:11:02.108Z] [INFO] GET /css/proposals.css 304 2ms +[2025-12-30T21:11:02.121Z] [INFO] GET /css/notifications.css 304 1ms +[2025-12-30T21:11:02.131Z] [INFO] GET /css/gitea.css 304 1ms +[2025-12-30T21:11:02.138Z] [INFO] GET /css/knowledge.css 304 1ms +[2025-12-30T21:11:04.465Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de +[2025-12-30T21:11:04.469Z] [INFO] POST /api/auth/login 200 542ms +[2025-12-30T21:11:04.511Z] [INFO] GET /api/auth/users 304 5ms +[2025-12-30T21:11:04.548Z] [INFO] Socket connected: HG (qoxUBLbbUbXh-FbfAAAC) +[2025-12-30T21:11:04.561Z] [INFO] Socket connected: HG (dR0A4oIB_XXPHzuBAAAD) +[2025-12-30T21:11:04.567Z] [INFO] GET /api/projects 401 5ms +[2025-12-30T21:11:04.601Z] [INFO] Socket disconnected: HG (dR0A4oIB_XXPHzuBAAAD) +[2025-12-30T21:11:04.613Z] [INFO] GET /api/proposals?sort=date&archived=0 401 2ms +[2025-12-30T21:11:04.643Z] [INFO] GET /api/notifications 401 1ms +[2025-12-30T21:11:04.675Z] [INFO] GET /api/knowledge/categories 401 3ms +[2025-12-30T21:11:12.905Z] [INFO] GET / 304 2ms +[2025-12-30T21:11:12.906Z] [INFO] GET /css/variables.css 304 2ms +[2025-12-30T21:11:12.908Z] [INFO] GET /css/base.css 304 1ms +[2025-12-30T21:11:12.913Z] [INFO] GET /css/modal.css 304 1ms +[2025-12-30T21:11:12.917Z] [INFO] GET /css/components.css 304 2ms +[2025-12-30T21:11:12.918Z] [INFO] GET /css/board.css 304 2ms +[2025-12-30T21:11:12.937Z] [INFO] GET /css/calendar.css 304 2ms +[2025-12-30T21:11:12.940Z] [INFO] GET /css/list.css 304 2ms +[2025-12-30T21:11:12.943Z] [INFO] GET /css/admin.css 304 2ms +[2025-12-30T21:11:12.947Z] [INFO] GET /css/proposals.css 304 2ms +[2025-12-30T21:11:12.950Z] [INFO] GET /css/notifications.css 304 1ms +[2025-12-30T21:11:12.951Z] [INFO] GET /css/gitea.css 304 0ms +[2025-12-30T21:11:12.972Z] [INFO] GET /css/knowledge.css 304 3ms +[2025-12-30T21:11:12.988Z] [INFO] GET /css/responsive.css 304 13ms +[2025-12-30T21:11:14.492Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de +[2025-12-30T21:11:14.493Z] [INFO] POST /api/auth/login 200 480ms +[2025-12-30T21:11:14.531Z] [INFO] GET /api/auth/users 200 6ms +[2025-12-30T21:11:14.571Z] [INFO] GET /api/projects 200 11ms +[2025-12-30T21:11:14.576Z] [INFO] Socket connected: HG (840OAwmiaWVWz1JFAAAG) +[2025-12-30T21:11:14.585Z] [INFO] Socket connected: HG (k_EZuy2fKM3rGHhvAAAH) +[2025-12-30T21:11:14.622Z] [INFO] GET /api/tasks/project/2 200 19ms +[2025-12-30T21:11:14.629Z] [INFO] GET /api/columns/2 200 6ms +[2025-12-30T21:11:14.636Z] [INFO] GET /api/stats/dashboard?projectId=2 200 6ms +[2025-12-30T21:11:14.644Z] [INFO] GET /api/labels/2 200 4ms +[2025-12-30T21:11:14.660Z] [INFO] HG joined project:[object Object] +[2025-12-30T21:11:14.700Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 200 9ms +[2025-12-30T21:11:14.745Z] [INFO] GET /api/knowledge/categories 200 11ms +[2025-12-30T21:11:18.351Z] [INFO] POST /api/auth/refresh 200 18ms +[2025-12-30T21:11:21.715Z] [INFO] Backup erstellt: backup_2025-12-30T21-11-21-710Z.db +[2025-12-30T21:11:21.719Z] [INFO] Altes Backup gelöscht: backup_2025-12-29T18-03-28-634Z.db +[2025-12-30T21:11:21.721Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet +[2025-12-30T21:11:22.995Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T21:11:25.528Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:11:29.583Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T21:11:32.389Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T21:11:35.429Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T21:11:37.009Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T21:11:52.819Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T21:11:54.055Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T21:11:55.645Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:11:56.720Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T21:12:00.698Z] [INFO] Knowledge-Kategorie erstellt: Router +[2025-12-30T21:12:00.700Z] [INFO] POST /api/knowledge/categories 201 12ms +[2025-12-30T21:12:00.737Z] [INFO] GET /api/knowledge/categories 200 4ms +[2025-12-30T21:12:01.707Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T21:12:06.370Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T21:12:12.553Z] [INFO] Knowledge-Kategorie erstellt: AccountForger +[2025-12-30T21:12:12.555Z] [INFO] POST /api/knowledge/categories 201 7ms +[2025-12-30T21:12:12.591Z] [INFO] GET /api/knowledge/categories 200 6ms +[2025-12-30T21:12:13.559Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T21:12:17.300Z] [INFO] Knowledge-Kategorie aktualisiert: AccountForger +[2025-12-30T21:12:17.301Z] [INFO] PUT /api/knowledge/categories/2 200 7ms +[2025-12-30T21:12:17.344Z] [INFO] GET /api/knowledge/categories 200 11ms +[2025-12-30T21:12:18.312Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T21:12:18.385Z] [INFO] GET /api/knowledge/entries?categoryId=2 200 4ms +[2025-12-30T21:12:19.390Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T21:12:25.747Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:12:26.569Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T21:12:30.542Z] [INFO] POST /api/auth/refresh 200 16ms +[2025-12-30T21:12:55.861Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:13:21.993Z] [INFO] Login erfolgreich: momohomma@googlemail.com +[2025-12-30T21:13:21.994Z] [INFO] POST /api/auth/login 200 515ms +[2025-12-30T21:13:22.061Z] [INFO] GET /api/auth/users 304 6ms +[2025-12-30T21:13:22.073Z] [INFO] Socket connected: MH (TTXdYPE1S8QInvKpAAAK) +[2025-12-30T21:13:22.090Z] [INFO] Socket connected: MH (h83-5eHHTeKdc6e5AAAL) +[2025-12-30T21:13:22.105Z] [INFO] GET /api/projects 200 9ms +[2025-12-30T21:13:22.138Z] [INFO] GET /api/stats/dashboard?projectId=2 200 5ms +[2025-12-30T21:13:22.140Z] [INFO] MH joined project:[object Object] +[2025-12-30T21:13:22.151Z] [INFO] GET /api/tasks/project/2 200 10ms +[2025-12-30T21:13:22.155Z] [INFO] GET /api/columns/2 200 3ms +[2025-12-30T21:13:22.160Z] [INFO] GET /api/labels/2 304 4ms +[2025-12-30T21:13:22.193Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 6ms +[2025-12-30T21:13:23.154Z] [INFO] GET / 200 4ms +[2025-12-30T21:13:23.566Z] [INFO] GET /api/tasks/14 304 7ms +[2025-12-30T21:13:23.590Z] [INFO] GET /api/subtasks/14 304 4ms +[2025-12-30T21:13:23.594Z] [INFO] GET /api/files/14 304 3ms +[2025-12-30T21:13:23.601Z] [INFO] GET /api/links/14 304 5ms +[2025-12-30T21:13:23.607Z] [INFO] GET /api/tasks/14/history 404 5ms +[2025-12-30T21:13:23.610Z] [INFO] GET /api/comments/14 304 7ms +[2025-12-30T21:13:23.817Z] [INFO] GET /favicon.ico 200 8ms +[2025-12-30T21:13:24.147Z] [INFO] GET /assets/icons/task.svg 200 5ms +[2025-12-30T21:13:24.574Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T21:13:25.956Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:13:29.133Z] [INFO] PUT /api/subtasks/47 200 7ms +[2025-12-30T21:13:29.167Z] [INFO] PUT /api/subtasks/47/position 200 10ms +[2025-12-30T21:13:30.138Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T21:13:31.328Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14) +[2025-12-30T21:13:31.330Z] [INFO] PUT /api/tasks/14 200 16ms +[2025-12-30T21:13:32.334Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T21:13:56.056Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:14:26.166Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:14:54.780Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T21:14:56.292Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:15:00.309Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T21:15:04.726Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T21:15:05.190Z] [INFO] Aufgabe erstellt: pCloud Unterlagen Ablage (ID: 19) von MH +[2025-12-30T21:15:05.191Z] [INFO] POST /api/tasks 201 6ms +[2025-12-30T21:15:06.195Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T21:15:06.973Z] [INFO] GET /api/tasks/19 200 10ms +[2025-12-30T21:15:06.998Z] [INFO] GET /api/subtasks/19 200 5ms +[2025-12-30T21:15:07.020Z] [INFO] GET /api/links/19 200 4ms +[2025-12-30T21:15:07.032Z] [INFO] GET /api/files/19 200 4ms +[2025-12-30T21:15:07.038Z] [INFO] GET /api/comments/19 200 4ms +[2025-12-30T21:15:07.043Z] [INFO] GET /api/tasks/19/history 404 4ms +[2025-12-30T21:15:07.974Z] [INFO] POST /api/auth/refresh 200 4ms +[2025-12-30T21:15:10.046Z] [INFO] Aufgabe aktualisiert: pCloud Unterlagen Ablage (ID: 19) +[2025-12-30T21:15:10.049Z] [INFO] PUT /api/tasks/19 200 8ms +[2025-12-30T21:15:10.396Z] [INFO] Aufgabe aktualisiert: pCloud Unterlagen Ablage (ID: 19) +[2025-12-30T21:15:10.398Z] [INFO] PUT /api/tasks/19 200 9ms +[2025-12-30T21:15:10.998Z] [INFO] Aufgabe aktualisiert: pCloud Unterlagen Ablage (ID: 19) +[2025-12-30T21:15:11.002Z] [INFO] PUT /api/tasks/19 200 9ms +[2025-12-30T21:15:11.030Z] [INFO] Aufgabe aktualisiert: pCloud Unterlagen Ablage (ID: 19) +[2025-12-30T21:15:11.032Z] [INFO] PUT /api/tasks/19 200 9ms +[2025-12-30T21:15:12.010Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T21:15:26.406Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:15:56.510Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:16:16.202Z] [INFO] GET /api/tasks/19 200 8ms +[2025-12-30T21:16:16.231Z] [INFO] GET /api/subtasks/19 304 7ms +[2025-12-30T21:16:16.238Z] [INFO] GET /api/files/19 304 13ms +[2025-12-30T21:16:16.245Z] [INFO] GET /api/links/19 304 12ms +[2025-12-30T21:16:16.250Z] [INFO] GET /api/comments/19 304 10ms +[2025-12-30T21:16:16.256Z] [INFO] GET /api/tasks/19/history 404 3ms +[2025-12-30T21:16:17.218Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T21:16:21.550Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T21:16:23.014Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T21:16:26.609Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:16:27.648Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T21:16:34.402Z] [INFO] Subtask erstellt: FYRST - Unterlagen als das Konto eröffnet wurde in Task 19 +[2025-12-30T21:16:34.404Z] [INFO] POST /api/subtasks 201 8ms +[2025-12-30T21:16:35.412Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T21:16:44.356Z] [INFO] Subtask erstellt: FYRST - monatliche Kontoauszüge in Task 19 +[2025-12-30T21:16:44.358Z] [INFO] POST /api/subtasks 201 8ms +[2025-12-30T21:16:45.361Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T21:16:45.921Z] [INFO] Aufgabe aktualisiert: pCloud Unterlagen Ablage (ID: 19) +[2025-12-30T21:16:45.924Z] [INFO] PUT /api/tasks/19 200 13ms +[2025-12-30T21:16:46.933Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T21:16:56.705Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:17:03.836Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T21:17:04.921Z] [INFO] POST /api/knowledge/entries 400 9ms +[2025-12-30T21:17:05.923Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T21:17:08.795Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T21:17:08.884Z] [INFO] POST /api/knowledge/entries 400 6ms +[2025-12-30T21:17:10.863Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T21:17:18.094Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T21:17:20.819Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T21:17:21.851Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T21:17:23.436Z] [INFO] POST /api/knowledge/entries 400 6ms +[2025-12-30T21:17:24.454Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T21:17:26.808Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:17:37.750Z] [INFO] POST /api/knowledge/entries 400 5ms +[2025-12-30T21:17:38.746Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T21:17:39.486Z] [INFO] POST /api/knowledge/entries 400 5ms +[2025-12-30T21:17:40.491Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T21:17:56.906Z] [INFO] GET /api/health 200 3ms +[2025-12-30T21:18:14.683Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T21:18:16.717Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T21:18:20.514Z] [INFO] POST /api/auth/refresh 200 16ms +[2025-12-30T21:18:21.226Z] [INFO] Knowledge-Kategorie erstellt: WD +[2025-12-30T21:18:21.227Z] [INFO] POST /api/knowledge/categories 201 5ms +[2025-12-30T21:18:21.274Z] [INFO] GET /api/knowledge/categories 200 6ms +[2025-12-30T21:18:22.233Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T21:18:24.068Z] [INFO] Knowledge-Kategorie erstellt: fewqFEWF +[2025-12-30T21:18:24.070Z] [INFO] POST /api/knowledge/categories 201 9ms +[2025-12-30T21:18:24.108Z] [INFO] GET /api/knowledge/categories 200 6ms +[2025-12-30T21:18:25.074Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T21:18:26.139Z] [INFO] Knowledge-Kategorie erstellt: ewfewfewf +[2025-12-30T21:18:26.140Z] [INFO] POST /api/knowledge/categories 201 7ms +[2025-12-30T21:18:26.185Z] [INFO] GET /api/knowledge/categories 200 12ms +[2025-12-30T21:18:27.005Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:18:27.143Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T21:18:29.463Z] [INFO] Knowledge-Kategorie erstellt: fewfewf +[2025-12-30T21:18:29.465Z] [INFO] POST /api/knowledge/categories 201 8ms +[2025-12-30T21:18:29.499Z] [INFO] GET /api/knowledge/categories 200 5ms +[2025-12-30T21:18:31.141Z] [INFO] Knowledge-Kategorie erstellt: ewfewf32 +[2025-12-30T21:18:31.143Z] [INFO] POST /api/knowledge/categories 201 8ms +[2025-12-30T21:18:31.183Z] [INFO] GET /api/knowledge/categories 200 9ms +[2025-12-30T21:18:32.856Z] [INFO] Knowledge-Kategorie erstellt: 213 +[2025-12-30T21:18:32.858Z] [INFO] POST /api/knowledge/categories 201 5ms +[2025-12-30T21:18:32.894Z] [INFO] GET /api/knowledge/categories 200 6ms +[2025-12-30T21:18:34.744Z] [INFO] POST /api/knowledge/categories 400 9ms +[2025-12-30T21:18:35.748Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T21:18:36.668Z] [INFO] Knowledge-Kategorie erstellt: WD2 +[2025-12-30T21:18:36.670Z] [INFO] POST /api/knowledge/categories 201 5ms +[2025-12-30T21:18:36.704Z] [INFO] GET /api/knowledge/categories 200 6ms +[2025-12-30T21:18:37.677Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T21:18:39.044Z] [INFO] Knowledge-Kategorie erstellt: 2312134 +[2025-12-30T21:18:39.046Z] [INFO] POST /api/knowledge/categories 201 5ms +[2025-12-30T21:18:39.080Z] [INFO] GET /api/knowledge/categories 200 5ms +[2025-12-30T21:18:40.053Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T21:18:52.343Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T21:18:53.500Z] [INFO] GET /api/knowledge/search?q=route 200 17ms +[2025-12-30T21:18:54.192Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T21:18:54.884Z] [INFO] GET /api/knowledge/search?q=rout 200 10ms +[2025-12-30T21:18:55.739Z] [INFO] GET /api/knowledge/search?q=rou 200 9ms +[2025-12-30T21:18:57.121Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:18:57.741Z] [INFO] POST /api/auth/refresh 200 14ms +[2025-12-30T21:18:57.961Z] [INFO] GET /api/knowledge/entries?categoryId=1 200 2ms +[2025-12-30T21:18:58.980Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T21:19:01.022Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T21:19:13.323Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T21:19:17.473Z] [INFO] POST /api/auth/refresh 200 15ms +[2025-12-30T21:19:19.110Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T21:19:21.211Z] [INFO] Socket disconnected: HG (qoxUBLbbUbXh-FbfAAAC) +[2025-12-30T21:19:21.220Z] [INFO] Socket disconnected: HG (840OAwmiaWVWz1JFAAAG) +[2025-12-30T21:19:21.221Z] [INFO] Socket disconnected: HG (k_EZuy2fKM3rGHhvAAAH) +[2025-12-30T21:19:22.030Z] [INFO] GET /js/app.js 304 1ms +[2025-12-30T21:19:22.086Z] [INFO] GET /js/store.js 304 1ms +[2025-12-30T21:19:22.123Z] [INFO] GET /js/api.js 304 7ms +[2025-12-30T21:19:22.148Z] [INFO] GET /js/auth.js 304 1ms +[2025-12-30T21:19:22.167Z] [INFO] GET /js/sync.js 304 6ms +[2025-12-30T21:19:22.171Z] [INFO] GET /js/offline.js 304 1ms +[2025-12-30T21:19:22.185Z] [INFO] GET /js/list.js 304 4ms +[2025-12-30T21:19:22.187Z] [INFO] GET /js/calendar.js 304 5ms +[2025-12-30T21:19:22.188Z] [INFO] GET /js/task-modal.js 304 4ms +[2025-12-30T21:19:22.191Z] [INFO] GET /js/board.js 304 2ms +[2025-12-30T21:19:22.205Z] [INFO] GET /js/shortcuts.js 304 1ms +[2025-12-30T21:19:22.216Z] [INFO] GET /js/undo.js 304 3ms +[2025-12-30T21:19:22.217Z] [INFO] GET /js/admin.js 304 3ms +[2025-12-30T21:19:22.221Z] [INFO] GET /js/proposals.js 304 2ms +[2025-12-30T21:19:22.224Z] [INFO] GET /js/notifications.js 304 1ms +[2025-12-30T21:19:22.226Z] [INFO] GET /js/gitea.js 304 1ms +[2025-12-30T21:19:22.239Z] [INFO] GET /js/knowledge.js 304 3ms +[2025-12-30T21:19:22.244Z] [INFO] GET /js/utils.js 304 1ms +[2025-12-30T21:19:22.293Z] [INFO] POST /api/auth/refresh 200 14ms +[2025-12-30T21:19:22.301Z] [INFO] GET /api/auth/users 304 4ms +[2025-12-30T21:19:22.303Z] [INFO] GET /assets/icons/task.svg 304 1ms +[2025-12-30T21:19:22.343Z] [INFO] GET /api/auth/users 304 6ms +[2025-12-30T21:19:22.375Z] [INFO] Socket connected: HG (60xy0PfzJiBxQbE1AAAN) +[2025-12-30T21:19:22.386Z] [INFO] GET /api/projects 200 6ms +[2025-12-30T21:19:22.442Z] [INFO] GET /api/tasks/project/2 200 22ms +[2025-12-30T21:19:22.444Z] [INFO] HG joined project:[object Object] +[2025-12-30T21:19:22.450Z] [INFO] GET /api/columns/2 304 5ms +[2025-12-30T21:19:22.455Z] [INFO] GET /api/labels/2 304 4ms +[2025-12-30T21:19:22.461Z] [INFO] GET /api/stats/dashboard?projectId=2 200 5ms +[2025-12-30T21:19:22.498Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 4ms +[2025-12-30T21:19:22.536Z] [INFO] GET /api/notifications 304 6ms +[2025-12-30T21:19:22.574Z] [INFO] GET /api/knowledge/categories 304 5ms +[2025-12-30T21:19:24.039Z] [INFO] GET /sw.js 304 1ms +[2025-12-30T21:19:25.245Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T21:19:27.225Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:19:48.863Z] [INFO] SIGTERM empfangen, fahre herunter... +[2025-12-30T21:20:34.636Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen: +[2025-12-30T21:20:34.747Z] [INFO] Umgebung: production +[2025-12-30T21:20:34.749Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden) +[2025-12-30T21:20:34.749Z] [INFO] Automatische Backups aktiviert +[2025-12-30T21:20:34.738Z] [INFO] Datenbank-Tabellen erstellt +[2025-12-30T21:20:34.742Z] [INFO] Datenbank initialisiert +[2025-12-30T21:20:34.747Z] [INFO] Server läuft auf Port 3000 +[2025-12-30T21:20:36.196Z] [INFO] Socket connected: HG (dCbkOC9luvI4DKLfAAAB) +[2025-12-30T21:20:36.241Z] [INFO] HG joined project:[object Object] +[2025-12-30T21:20:36.636Z] [INFO] Socket connected: MH (0kKAsWJPzxsTafS5AAAD) +[2025-12-30T21:20:38.538Z] [INFO] GET /api/health 200 8ms +[2025-12-30T21:20:42.361Z] [INFO] Socket connected: MH (jLcet5G4vlIdefYJAAAF) +[2025-12-30T21:20:42.401Z] [INFO] MH joined project:[object Object] +[2025-12-30T21:21:08.690Z] [INFO] GET /api/health 200 4ms +[2025-12-30T21:21:25.119Z] [INFO] GET / 200 11ms +[2025-12-30T21:21:25.211Z] [INFO] Socket disconnected: HG (dCbkOC9luvI4DKLfAAAB) +[2025-12-30T21:21:25.215Z] [INFO] GET /css/variables.css 200 13ms +[2025-12-30T21:21:25.218Z] [INFO] GET /css/base.css 200 10ms +[2025-12-30T21:21:25.244Z] [INFO] GET /css/components.css 200 2ms +[2025-12-30T21:21:25.258Z] [INFO] GET /css/board.css 200 4ms +[2025-12-30T21:21:25.275Z] [INFO] GET /css/modal.css 200 4ms +[2025-12-30T21:21:25.313Z] [INFO] GET /css/calendar.css 200 6ms +[2025-12-30T21:21:25.319Z] [INFO] GET /css/list.css 200 8ms +[2025-12-30T21:21:25.328Z] [INFO] GET /css/admin.css 200 5ms +[2025-12-30T21:21:25.341Z] [INFO] GET /css/proposals.css 200 7ms +[2025-12-30T21:21:25.347Z] [INFO] GET /css/notifications.css 200 8ms +[2025-12-30T21:21:25.353Z] [INFO] GET /css/gitea.css 200 8ms +[2025-12-30T21:21:25.355Z] [INFO] GET /css/knowledge.css 200 6ms +[2025-12-30T21:21:25.358Z] [INFO] GET /css/responsive.css 200 7ms +[2025-12-30T21:21:25.376Z] [INFO] GET /js/app.js 200 5ms +[2025-12-30T21:21:25.447Z] [INFO] GET /js/api.js 200 9ms +[2025-12-30T21:21:25.450Z] [INFO] GET /js/board.js 200 15ms +[2025-12-30T21:21:25.454Z] [INFO] GET /js/store.js 200 12ms +[2025-12-30T21:21:25.459Z] [INFO] GET /js/sync.js 200 14ms +[2025-12-30T21:21:25.461Z] [INFO] GET /js/auth.js 200 9ms +[2025-12-30T21:21:25.463Z] [INFO] GET /js/offline.js 200 7ms +[2025-12-30T21:21:25.479Z] [INFO] GET /js/task-modal.js 200 3ms +[2025-12-30T21:21:25.490Z] [INFO] GET /js/calendar.js 200 6ms +[2025-12-30T21:21:25.496Z] [INFO] GET /js/list.js 200 5ms +[2025-12-30T21:21:25.498Z] [INFO] GET /js/shortcuts.js 200 6ms +[2025-12-30T21:21:25.499Z] [INFO] GET /js/undo.js 200 5ms +[2025-12-30T21:21:25.504Z] [INFO] GET /js/admin.js 200 3ms +[2025-12-30T21:21:25.509Z] [INFO] GET /js/proposals.js 200 3ms +[2025-12-30T21:21:25.524Z] [INFO] GET /js/notifications.js 200 3ms +[2025-12-30T21:21:25.534Z] [INFO] GET /js/utils.js 200 7ms +[2025-12-30T21:21:25.539Z] [INFO] GET /js/gitea.js 200 8ms +[2025-12-30T21:21:25.542Z] [INFO] GET /js/knowledge.js 200 10ms +[2025-12-30T21:21:25.648Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T21:21:25.655Z] [INFO] GET /api/auth/users 304 5ms +[2025-12-30T21:21:25.662Z] [INFO] GET /assets/icons/task.svg 304 6ms +[2025-12-30T21:21:25.691Z] [INFO] GET /api/auth/users 304 8ms +[2025-12-30T21:21:25.733Z] [INFO] GET /api/projects 304 11ms +[2025-12-30T21:21:25.741Z] [INFO] Socket connected: HG (vHz2c8ryg9X633w0AAAH) +[2025-12-30T21:21:25.794Z] [INFO] GET /api/tasks/project/2 304 28ms +[2025-12-30T21:21:25.799Z] [INFO] GET /api/columns/2 304 5ms +[2025-12-30T21:21:25.805Z] [INFO] GET /api/labels/2 304 4ms +[2025-12-30T21:21:25.816Z] [INFO] GET /api/stats/dashboard?projectId=2 304 5ms +[2025-12-30T21:21:25.819Z] [INFO] HG joined project:[object Object] +[2025-12-30T21:21:25.845Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 6ms +[2025-12-30T21:21:25.887Z] [INFO] GET /api/notifications 304 9ms +[2025-12-30T21:21:25.928Z] [INFO] GET /api/knowledge/categories 304 10ms +[2025-12-30T21:21:28.138Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 8ms +[2025-12-30T21:21:33.187Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T21:21:33.973Z] [INFO] Knowledge-Eintrag erstellt: Testeintrag +[2025-12-30T21:21:33.975Z] [INFO] POST /api/knowledge/entries 201 13ms +[2025-12-30T21:21:34.017Z] [INFO] GET /api/knowledge/entries?categoryId=1 200 9ms +[2025-12-30T21:21:34.051Z] [INFO] GET /api/knowledge/categories 200 5ms +[2025-12-30T21:21:34.755Z] [INFO] Backup erstellt: backup_2025-12-30T21-21-34-750Z.db +[2025-12-30T21:21:34.757Z] [INFO] Altes Backup gelöscht: backup_2025-12-29T18-30-58-187Z.db +[2025-12-30T21:21:34.759Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet +[2025-12-30T21:21:34.985Z] [INFO] POST /api/auth/refresh 200 14ms +[2025-12-30T21:21:38.812Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:21:39.849Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T21:21:40.864Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 8ms +[2025-12-30T21:21:41.877Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T21:21:44.274Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T21:21:46.185Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 10ms +[2025-12-30T21:21:49.041Z] [INFO] GET /api/knowledge/search?q=test 200 13ms +[2025-12-30T21:21:49.737Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T21:21:50.698Z] [INFO] GET /api/knowledge/search?q=test 304 12ms +[2025-12-30T21:21:51.648Z] [INFO] GET /api/knowledge/search?q=tes 200 10ms +[2025-12-30T21:21:53.126Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T21:22:08.915Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:22:10.207Z] [INFO] GET /api/tasks/19 200 16ms +[2025-12-30T21:22:10.240Z] [INFO] GET /api/subtasks/19 200 10ms +[2025-12-30T21:22:10.264Z] [INFO] GET /api/links/19 304 5ms +[2025-12-30T21:22:10.270Z] [INFO] GET /api/tasks/19/history 404 4ms +[2025-12-30T21:22:10.276Z] [INFO] GET /api/files/19 304 4ms +[2025-12-30T21:22:10.283Z] [INFO] GET /api/comments/19 304 5ms +[2025-12-30T21:22:11.059Z] [INFO] CSRF: Token missing or not stored for user 4, generated new token +[2025-12-30T21:22:11.061Z] [INFO] PUT /api/tasks/19 403 8ms +[2025-12-30T21:22:11.088Z] [INFO] Aufgabe aktualisiert: pCloud Unterlagen Ablage (ID: 19) +[2025-12-30T21:22:11.090Z] [INFO] PUT /api/tasks/19 200 10ms +[2025-12-30T21:22:11.643Z] [INFO] GET /api/tasks/14 200 13ms +[2025-12-30T21:22:11.678Z] [INFO] GET /api/subtasks/14 200 9ms +[2025-12-30T21:22:11.689Z] [INFO] GET /api/tasks/14/history 404 8ms +[2025-12-30T21:22:11.698Z] [INFO] GET /api/links/14 304 8ms +[2025-12-30T21:22:11.703Z] [INFO] GET /api/files/14 304 3ms +[2025-12-30T21:22:11.708Z] [INFO] GET /api/comments/14 304 4ms +[2025-12-30T21:22:12.631Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T21:22:14.725Z] [INFO] PUT /api/subtasks/45 200 11ms +[2025-12-30T21:22:14.755Z] [INFO] PUT /api/subtasks/45/position 200 9ms +[2025-12-30T21:22:15.728Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T21:22:20.743Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14) +[2025-12-30T21:22:20.746Z] [INFO] PUT /api/tasks/14 200 8ms +[2025-12-30T21:22:21.767Z] [INFO] POST /api/auth/refresh 200 15ms +[2025-12-30T21:22:39.058Z] [INFO] GET /api/health 200 4ms +[2025-12-30T21:23:09.171Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:23:39.280Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:24:09.377Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:24:13.779Z] [INFO] SIGTERM empfangen, fahre herunter... +[2025-12-30T21:24:58.697Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen: +[2025-12-30T21:24:58.803Z] [INFO] Datenbank-Tabellen erstellt +[2025-12-30T21:24:58.813Z] [INFO] Umgebung: production +[2025-12-30T21:24:58.816Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden) +[2025-12-30T21:24:58.816Z] [INFO] Automatische Backups aktiviert +[2025-12-30T21:24:58.807Z] [INFO] Datenbank initialisiert +[2025-12-30T21:24:58.813Z] [INFO] Server läuft auf Port 3000 +[2025-12-30T21:25:02.345Z] [INFO] GET /api/health 200 11ms +[2025-12-30T21:25:03.127Z] [INFO] Socket connected: HG (AQAnKnv8DA1rpkxfAAAD) +[2025-12-30T21:25:03.208Z] [INFO] HG joined project:[object Object] +[2025-12-30T21:25:32.442Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:25:37.318Z] [INFO] GET / 200 19ms +[2025-12-30T21:25:37.391Z] [INFO] Socket disconnected: HG (AQAnKnv8DA1rpkxfAAAD) +[2025-12-30T21:25:37.407Z] [INFO] GET /css/variables.css 200 7ms +[2025-12-30T21:25:37.419Z] [INFO] GET /css/base.css 200 6ms +[2025-12-30T21:25:37.423Z] [INFO] GET /css/components.css 200 7ms +[2025-12-30T21:25:37.437Z] [INFO] GET /css/board.css 200 4ms +[2025-12-30T21:25:37.460Z] [INFO] GET /css/modal.css 200 5ms +[2025-12-30T21:25:37.482Z] [INFO] GET /css/calendar.css 200 11ms +[2025-12-30T21:25:37.484Z] [INFO] GET /css/list.css 200 11ms +[2025-12-30T21:25:37.485Z] [INFO] GET /css/admin.css 200 10ms +[2025-12-30T21:25:37.491Z] [INFO] GET /css/proposals.css 200 3ms +[2025-12-30T21:25:37.525Z] [INFO] GET /css/notifications.css 200 9ms +[2025-12-30T21:25:37.530Z] [INFO] GET /css/gitea.css 200 7ms +[2025-12-30T21:25:37.532Z] [INFO] GET /css/knowledge.css 200 4ms +[2025-12-30T21:25:37.543Z] [INFO] GET /css/responsive.css 200 12ms +[2025-12-30T21:25:37.551Z] [INFO] GET /js/app.js 200 6ms +[2025-12-30T21:25:37.640Z] [INFO] GET /js/auth.js 200 14ms +[2025-12-30T21:25:37.641Z] [INFO] GET /js/api.js 200 13ms +[2025-12-30T21:25:37.644Z] [INFO] GET /js/sync.js 200 15ms +[2025-12-30T21:25:37.648Z] [INFO] GET /js/store.js 200 15ms +[2025-12-30T21:25:37.649Z] [INFO] GET /js/offline.js 200 12ms +[2025-12-30T21:25:37.651Z] [INFO] GET /js/board.js 200 8ms +[2025-12-30T21:25:37.679Z] [INFO] GET /js/task-modal.js 200 7ms +[2025-12-30T21:25:37.681Z] [INFO] GET /js/list.js 200 8ms +[2025-12-30T21:25:37.683Z] [INFO] GET /js/calendar.js 200 8ms +[2025-12-30T21:25:37.686Z] [INFO] GET /js/shortcuts.js 200 9ms +[2025-12-30T21:25:37.688Z] [INFO] GET /js/undo.js 200 4ms +[2025-12-30T21:25:37.690Z] [INFO] GET /js/admin.js 200 3ms +[2025-12-30T21:25:37.714Z] [INFO] GET /js/proposals.js 200 3ms +[2025-12-30T21:25:37.722Z] [INFO] GET /js/gitea.js 200 6ms +[2025-12-30T21:25:37.723Z] [INFO] GET /js/notifications.js 200 5ms +[2025-12-30T21:25:37.728Z] [INFO] GET /js/utils.js 200 8ms +[2025-12-30T21:25:37.729Z] [INFO] GET /js/knowledge.js 200 5ms +[2025-12-30T21:25:37.808Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T21:25:37.820Z] [INFO] GET /api/auth/users 304 6ms +[2025-12-30T21:25:37.816Z] [INFO] GET /assets/icons/task.svg 304 6ms +[2025-12-30T21:25:37.860Z] [INFO] GET /api/auth/users 304 7ms +[2025-12-30T21:25:37.893Z] [INFO] Socket connected: HG (4yU22TU1kTzCtvA-AAAH) +[2025-12-30T21:25:37.911Z] [INFO] GET /api/projects 304 9ms +[2025-12-30T21:25:37.939Z] [INFO] HG joined project:[object Object] +[2025-12-30T21:25:37.950Z] [INFO] GET /api/stats/dashboard?projectId=2 304 6ms +[2025-12-30T21:25:37.958Z] [INFO] GET /api/columns/2 304 4ms +[2025-12-30T21:25:37.963Z] [INFO] GET /api/labels/2 304 8ms +[2025-12-30T21:25:37.981Z] [INFO] GET /api/tasks/project/2 200 17ms +[2025-12-30T21:25:38.029Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 7ms +[2025-12-30T21:25:38.069Z] [INFO] GET /api/notifications 304 9ms +[2025-12-30T21:25:38.105Z] [INFO] GET /api/knowledge/categories 304 7ms +[2025-12-30T21:25:41.039Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T21:25:42.774Z] [INFO] GET /api/knowledge/search?q=youtube 200 14ms +[2025-12-30T21:25:43.471Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T21:25:44.288Z] [INFO] GET /api/knowledge/search?q=youtub 200 11ms +[2025-12-30T21:25:45.769Z] [INFO] POST /api/auth/refresh 200 16ms +[2025-12-30T21:25:58.832Z] [INFO] Backup erstellt: backup_2025-12-30T21-25-58-826Z.db +[2025-12-30T21:25:58.836Z] [INFO] Altes Backup gelöscht: backup_2025-12-29T18-36-12-724Z.db +[2025-12-30T21:25:58.838Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet +[2025-12-30T21:26:02.537Z] [INFO] GET /api/health 200 4ms +[2025-12-30T21:26:13.438Z] [INFO] Suche nach "testeintrag" in Projekt 2: 0 Treffer +[2025-12-30T21:26:13.439Z] [INFO] GET /api/tasks/search?projectId=2&q=testeintrag 200 6ms +[2025-12-30T21:26:14.447Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T21:26:15.507Z] [INFO] Suche nach "testeintra" in Projekt 2: 0 Treffer +[2025-12-30T21:26:15.509Z] [INFO] GET /api/tasks/search?projectId=2&q=testeintra 200 6ms +[2025-12-30T21:26:16.886Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T21:26:19.827Z] [INFO] Suche nach "af" in Projekt 2: 5 Treffer +[2025-12-30T21:26:19.828Z] [INFO] GET /api/tasks/search?projectId=2&q=af 200 7ms +[2025-12-30T21:26:21.622Z] [INFO] GET /api/tasks/search?projectId=2&q=aufgaben 200 10ms +[2025-12-30T21:26:21.620Z] [INFO] Suche nach "aufgaben" in Projekt 2: 1 Treffer +[2025-12-30T21:26:22.258Z] [INFO] Suche nach "aufgabe" in Projekt 2: 1 Treffer +[2025-12-30T21:26:22.259Z] [INFO] GET /api/tasks/search?projectId=2&q=aufgabe 200 11ms +[2025-12-30T21:26:23.469Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T21:26:32.638Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:27:02.750Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:27:32.855Z] [INFO] GET /api/health 200 3ms +[2025-12-30T21:28:02.959Z] [INFO] GET /api/health 200 3ms +[2025-12-30T21:28:33.063Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:29:03.171Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:29:33.264Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:30:03.400Z] [INFO] GET /api/health 200 3ms +[2025-12-30T21:30:33.502Z] [INFO] GET /api/health 200 3ms +[2025-12-30T21:31:03.612Z] [INFO] GET /api/health 200 6ms +[2025-12-30T21:31:33.708Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:32:03.826Z] [INFO] GET /api/health 200 4ms +[2025-12-30T21:32:32.398Z] [INFO] POST /api/auth/logout 401 7ms +[2025-12-30T21:32:33.939Z] [INFO] GET /api/health 200 4ms +[2025-12-30T21:33:04.042Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:33:27.515Z] [INFO] SIGTERM empfangen, fahre herunter... +[2025-12-30T21:33:50.322Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen: +[2025-12-30T21:33:50.432Z] [INFO] Datenbank-Tabellen erstellt +[2025-12-30T21:33:50.439Z] [INFO] Umgebung: production +[2025-12-30T21:33:50.441Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden) +[2025-12-30T21:33:50.441Z] [INFO] Automatische Backups aktiviert +[2025-12-30T21:33:50.435Z] [INFO] Datenbank initialisiert +[2025-12-30T21:33:50.439Z] [INFO] Server läuft auf Port 3000 +[2025-12-30T21:33:54.378Z] [INFO] GET /api/health 200 16ms +[2025-12-30T21:33:57.137Z] [INFO] Socket connected: HG (Kw_J1cufXX_AxH0BAAAB) +[2025-12-30T21:33:57.188Z] [INFO] HG joined project:[object Object] +[2025-12-30T21:34:04.426Z] [INFO] HEAD / 200 3ms +[2025-12-30T21:34:11.652Z] [INFO] HEAD / 200 3ms +[2025-12-30T21:34:24.544Z] [INFO] GET /api/health 200 6ms +[2025-12-30T21:34:50.451Z] [INFO] Backup erstellt: backup_2025-12-30T21-34-50-446Z.db +[2025-12-30T21:34:50.453Z] [INFO] Altes Backup gelöscht: backup_2025-12-29T18-46-49-826Z.db +[2025-12-30T21:34:50.454Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet +[2025-12-30T21:34:54.673Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:35:06.568Z] [INFO] GET / 200 14ms +[2025-12-30T21:35:06.641Z] [INFO] Socket disconnected: HG (Kw_J1cufXX_AxH0BAAAB) +[2025-12-30T21:35:06.653Z] [INFO] GET /css/variables.css 200 6ms +[2025-12-30T21:35:06.655Z] [INFO] GET /css/base.css 200 4ms +[2025-12-30T21:35:06.694Z] [INFO] GET /css/board.css 200 9ms +[2025-12-30T21:35:06.698Z] [INFO] GET /css/components.css 200 10ms +[2025-12-30T21:35:06.723Z] [INFO] GET /css/modal.css 200 8ms +[2025-12-30T21:35:06.729Z] [INFO] GET /css/list.css 200 9ms +[2025-12-30T21:35:06.733Z] [INFO] GET /css/calendar.css 200 5ms +[2025-12-30T21:35:06.735Z] [INFO] GET /css/proposals.css 200 4ms +[2025-12-30T21:35:06.737Z] [INFO] GET /css/admin.css 200 5ms +[2025-12-30T21:35:06.744Z] [INFO] GET /css/notifications.css 200 3ms +[2025-12-30T21:35:06.762Z] [INFO] GET /css/gitea.css 200 3ms +[2025-12-30T21:35:06.767Z] [INFO] GET /css/knowledge.css 200 4ms +[2025-12-30T21:35:06.794Z] [INFO] GET /css/responsive.css 200 19ms +[2025-12-30T21:35:06.799Z] [INFO] GET /js/app.js 200 6ms +[2025-12-30T21:35:06.863Z] [INFO] GET /js/store.js 200 8ms +[2025-12-30T21:35:06.865Z] [INFO] GET /js/auth.js 200 9ms +[2025-12-30T21:35:06.867Z] [INFO] GET /js/api.js 200 11ms +[2025-12-30T21:35:06.871Z] [INFO] GET /js/offline.js 200 12ms +[2025-12-30T21:35:06.875Z] [INFO] GET /js/board.js 200 13ms +[2025-12-30T21:35:06.876Z] [INFO] GET /js/sync.js 200 7ms +[2025-12-30T21:35:06.900Z] [INFO] GET /js/task-modal.js 200 6ms +[2025-12-30T21:35:06.902Z] [INFO] GET /js/calendar.js 200 7ms +[2025-12-30T21:35:06.908Z] [INFO] GET /js/list.js 200 10ms +[2025-12-30T21:35:06.913Z] [INFO] GET /js/shortcuts.js 200 7ms +[2025-12-30T21:35:06.914Z] [INFO] GET /js/undo.js 200 4ms +[2025-12-30T21:35:06.936Z] [INFO] GET /js/admin.js 200 7ms +[2025-12-30T21:35:06.942Z] [INFO] GET /js/proposals.js 200 8ms +[2025-12-30T21:35:06.945Z] [INFO] GET /js/notifications.js 200 7ms +[2025-12-30T21:35:06.950Z] [INFO] GET /js/gitea.js 200 6ms +[2025-12-30T21:35:06.955Z] [INFO] GET /js/knowledge.js 200 7ms +[2025-12-30T21:35:06.957Z] [INFO] GET /js/utils.js 200 4ms +[2025-12-30T21:35:07.011Z] [INFO] GET /api/auth/users 304 14ms +[2025-12-30T21:35:07.044Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T21:35:07.056Z] [INFO] GET /api/auth/users 304 5ms +[2025-12-30T21:35:07.063Z] [INFO] GET /assets/icons/task.svg 200 17ms +[2025-12-30T21:35:07.092Z] [INFO] GET /api/projects 304 7ms +[2025-12-30T21:35:07.099Z] [INFO] Socket connected: HG (A5kjXDn7-Eak3wi6AAAD) +[2025-12-30T21:35:07.146Z] [INFO] GET /api/tasks/project/2 304 22ms +[2025-12-30T21:35:07.154Z] [INFO] GET /api/columns/2 304 6ms +[2025-12-30T21:35:07.169Z] [INFO] GET /api/stats/dashboard?projectId=2 304 7ms +[2025-12-30T21:35:07.175Z] [INFO] GET /api/labels/2 304 5ms +[2025-12-30T21:35:07.178Z] [INFO] HG joined project:[object Object] +[2025-12-30T21:35:07.226Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 12ms +[2025-12-30T21:35:07.265Z] [INFO] GET /api/notifications 304 9ms +[2025-12-30T21:35:07.305Z] [INFO] GET /api/knowledge/categories 304 7ms +[2025-12-30T21:35:10.453Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T21:35:11.706Z] [INFO] Suche nach "youtube" in Projekt 2: 0 Treffer +[2025-12-30T21:35:11.710Z] [INFO] GET /api/tasks/search?projectId=2&q=youtube 200 14ms +[2025-12-30T21:35:12.212Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T21:35:14.852Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T21:35:17.788Z] [INFO] GET /api/knowledge/search?q=youtube 304 12ms +[2025-12-30T21:35:18.484Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T21:35:19.088Z] [INFO] GET /api/knowledge/search?q=youtub 304 7ms +[2025-12-30T21:35:20.712Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T21:35:24.722Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 6ms +[2025-12-30T21:35:24.793Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:35:25.706Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T21:35:27.030Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 7ms +[2025-12-30T21:35:28.327Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 7ms +[2025-12-30T21:35:29.864Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T21:35:36.345Z] [INFO] Knowledge-Kategorie gelöscht: fewqFEWF +[2025-12-30T21:35:36.348Z] [INFO] DELETE /api/knowledge/categories/4 200 10ms +[2025-12-30T21:35:36.388Z] [INFO] GET /api/knowledge/categories 200 7ms +[2025-12-30T21:35:37.458Z] [INFO] Knowledge-Kategorie gelöscht: WD +[2025-12-30T21:35:37.460Z] [INFO] DELETE /api/knowledge/categories/3 200 10ms +[2025-12-30T21:35:37.499Z] [INFO] GET /api/knowledge/categories 200 9ms +[2025-12-30T21:35:38.350Z] [INFO] Knowledge-Kategorie gelöscht: ewfewfewf +[2025-12-30T21:35:38.352Z] [INFO] DELETE /api/knowledge/categories/5 200 5ms +[2025-12-30T21:35:38.392Z] [INFO] GET /api/knowledge/categories 200 9ms +[2025-12-30T21:35:38.950Z] [INFO] Knowledge-Kategorie gelöscht: fewfewf +[2025-12-30T21:35:38.952Z] [INFO] DELETE /api/knowledge/categories/6 200 12ms +[2025-12-30T21:35:38.991Z] [INFO] GET /api/knowledge/categories 200 10ms +[2025-12-30T21:35:39.381Z] [INFO] Knowledge-Kategorie gelöscht: ewfewf32 +[2025-12-30T21:35:39.383Z] [INFO] DELETE /api/knowledge/categories/7 200 9ms +[2025-12-30T21:35:39.416Z] [INFO] GET /api/knowledge/categories 200 5ms +[2025-12-30T21:35:39.768Z] [INFO] Knowledge-Kategorie gelöscht: 213 +[2025-12-30T21:35:39.769Z] [INFO] DELETE /api/knowledge/categories/8 200 5ms +[2025-12-30T21:35:39.804Z] [INFO] GET /api/knowledge/categories 200 5ms +[2025-12-30T21:35:40.147Z] [INFO] Knowledge-Kategorie gelöscht: WD2 +[2025-12-30T21:35:40.148Z] [INFO] DELETE /api/knowledge/categories/9 200 5ms +[2025-12-30T21:35:40.188Z] [INFO] GET /api/knowledge/categories 200 10ms +[2025-12-30T21:35:40.621Z] [INFO] Knowledge-Kategorie gelöscht: 2312134 +[2025-12-30T21:35:40.622Z] [INFO] DELETE /api/knowledge/categories/10 200 6ms +[2025-12-30T21:35:40.657Z] [INFO] GET /api/knowledge/categories 200 6ms +[2025-12-30T21:35:54.911Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:36:25.015Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:36:55.130Z] [INFO] GET /api/health 200 3ms +[2025-12-30T21:37:25.229Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:37:55.326Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:38:08.465Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T21:38:14.503Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T21:38:25.429Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:38:55.547Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:39:25.655Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:39:55.764Z] [INFO] GET /api/health 200 5ms +[2025-12-30T21:40:25.873Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:40:55.985Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:41:26.073Z] [INFO] GET /api/health 200 7ms +[2025-12-30T21:41:56.185Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:42:26.296Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:42:56.400Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:43:26.514Z] [INFO] GET /api/health 200 3ms +[2025-12-30T21:43:48.863Z] [INFO] Login erfolgreich: momohomma@googlemail.com +[2025-12-30T21:43:48.865Z] [INFO] POST /api/auth/login 200 563ms +[2025-12-30T21:43:48.937Z] [INFO] GET /api/auth/users 304 5ms +[2025-12-30T21:43:48.943Z] [INFO] Socket connected: MH (pWW1uSHtX_sLG3P2AAAG) +[2025-12-30T21:43:48.969Z] [INFO] Socket connected: MH (1ccoM78xQZCp-LiGAAAH) +[2025-12-30T21:43:48.982Z] [INFO] GET /api/projects 200 6ms +[2025-12-30T21:43:49.016Z] [INFO] MH joined project:[object Object] +[2025-12-30T21:43:49.027Z] [INFO] GET /api/stats/dashboard?projectId=2 200 8ms +[2025-12-30T21:43:49.033Z] [INFO] GET /api/columns/2 304 5ms +[2025-12-30T21:43:49.048Z] [INFO] GET /api/tasks/project/2 200 15ms +[2025-12-30T21:43:49.057Z] [INFO] GET /api/labels/2 304 5ms +[2025-12-30T21:43:49.086Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 4ms +[2025-12-30T21:43:50.718Z] [INFO] GET /api/tasks/15 200 8ms +[2025-12-30T21:43:50.750Z] [INFO] GET /api/subtasks/15 200 9ms +[2025-12-30T21:43:50.746Z] [INFO] GET /api/links/15 200 6ms +[2025-12-30T21:43:50.755Z] [INFO] GET /api/comments/15 200 4ms +[2025-12-30T21:43:50.760Z] [INFO] GET /api/files/15 200 4ms +[2025-12-30T21:43:50.765Z] [INFO] GET /api/tasks/15/history 404 4ms +[2025-12-30T21:43:51.719Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T21:43:54.549Z] [INFO] Aufgabe aktualisiert: Antwort von WERFT 4.0 - Namensänderung (ID: 15) +[2025-12-30T21:43:54.552Z] [INFO] PUT /api/tasks/15 200 16ms +[2025-12-30T21:43:55.560Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T21:43:56.609Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:43:58.292Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T21:44:03.305Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T21:44:04.459Z] [INFO] POST /api/auth/refresh 200 14ms +[2025-12-30T21:44:04.779Z] [INFO] Aufgabe erstellt: Antwort von FYRST - Namensänderung (ID: 20) von MH +[2025-12-30T21:44:04.781Z] [INFO] POST /api/tasks 201 16ms +[2025-12-30T21:44:05.788Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T21:44:08.885Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T21:44:14.558Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T21:44:15.342Z] [INFO] Aufgabe erstellt: Antwort von IHK - Namensänderung (ID: 21) von MH +[2025-12-30T21:44:15.344Z] [INFO] POST /api/tasks 201 14ms +[2025-12-30T21:44:16.334Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T21:44:17.460Z] [INFO] GET /api/tasks/19 200 6ms +[2025-12-30T21:44:17.497Z] [INFO] GET /api/links/19 304 8ms +[2025-12-30T21:44:17.505Z] [INFO] GET /api/tasks/19/history 404 6ms +[2025-12-30T21:44:17.510Z] [INFO] GET /api/files/19 304 10ms +[2025-12-30T21:44:17.516Z] [INFO] GET /api/comments/19 304 4ms +[2025-12-30T21:44:17.525Z] [INFO] GET /api/subtasks/19 304 8ms +[2025-12-30T21:44:18.481Z] [INFO] POST /api/auth/refresh 200 17ms +[2025-12-30T21:44:21.463Z] [INFO] Aufgabe aktualisiert: pCloud Unterlagen Ablage (ID: 19) +[2025-12-30T21:44:21.466Z] [INFO] PUT /api/tasks/19 200 13ms +[2025-12-30T21:44:22.481Z] [INFO] POST /api/auth/refresh 200 16ms +[2025-12-30T21:44:22.585Z] [INFO] GET /api/tasks/14 200 9ms +[2025-12-30T21:44:22.614Z] [INFO] GET /api/subtasks/14 200 5ms +[2025-12-30T21:44:22.621Z] [INFO] GET /api/files/14 304 6ms +[2025-12-30T21:44:22.628Z] [INFO] GET /api/links/14 304 6ms +[2025-12-30T21:44:22.633Z] [INFO] GET /api/tasks/14/history 404 4ms +[2025-12-30T21:44:22.638Z] [INFO] GET /api/comments/14 304 4ms +[2025-12-30T21:44:23.587Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T21:44:26.723Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:44:26.866Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14) +[2025-12-30T21:44:26.869Z] [INFO] PUT /api/tasks/14 200 10ms +[2025-12-30T21:44:27.875Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T21:44:56.831Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:45:26.957Z] [INFO] GET /api/health 200 5ms +[2025-12-30T21:45:57.075Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:46:27.169Z] [INFO] GET /api/health 200 3ms +[2025-12-30T21:46:29.861Z] [INFO] GET /api/tasks/14 200 10ms +[2025-12-30T21:46:29.892Z] [INFO] GET /api/subtasks/14 304 7ms +[2025-12-30T21:46:29.921Z] [INFO] GET /api/links/14 304 7ms +[2025-12-30T21:46:29.928Z] [INFO] GET /api/files/14 304 3ms +[2025-12-30T21:46:29.935Z] [INFO] GET /api/comments/14 304 4ms +[2025-12-30T21:46:29.939Z] [INFO] GET /api/tasks/14/history 404 3ms +[2025-12-30T21:46:30.825Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T21:46:44.425Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T21:46:44.920Z] [INFO] Link erstellt: https://service.wirtschaft.nrw/unternehmensfuehrung/gewerbe-ummelden-online/ für Task 14 +[2025-12-30T21:46:44.922Z] [INFO] POST /api/links 201 16ms +[2025-12-30T21:46:45.922Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T21:46:45.997Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14) +[2025-12-30T21:46:45.998Z] [INFO] PUT /api/tasks/14 200 6ms +[2025-12-30T21:46:47.008Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T21:46:54.454Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T21:46:57.284Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:46:59.735Z] [INFO] POST /api/auth/refresh 200 4ms +[2025-12-30T21:47:02.457Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T21:47:05.011Z] [INFO] POST /api/auth/refresh 200 15ms +[2025-12-30T21:47:09.074Z] [INFO] Aufgabe erstellt: Gewerbeummeldung (ID: 22) von MH +[2025-12-30T21:47:09.076Z] [INFO] POST /api/tasks 201 6ms +[2025-12-30T21:47:10.083Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T21:47:27.389Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:47:55.824Z] [INFO] GET /api/tasks/22 200 6ms +[2025-12-30T21:47:55.848Z] [INFO] GET /api/subtasks/22 200 3ms +[2025-12-30T21:47:55.884Z] [INFO] GET /api/links/22 200 10ms +[2025-12-30T21:47:55.893Z] [INFO] GET /api/files/22 200 6ms +[2025-12-30T21:47:55.898Z] [INFO] GET /api/comments/22 200 3ms +[2025-12-30T21:47:55.902Z] [INFO] GET /api/tasks/22/history 404 3ms +[2025-12-30T21:47:56.845Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T21:47:57.521Z] [INFO] GET /api/health 200 4ms +[2025-12-30T21:48:00.350Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T21:48:00.356Z] [INFO] Aufgabe aktualisiert: Gewerbeummeldung (ID: 22) +[2025-12-30T21:48:00.358Z] [INFO] PUT /api/tasks/22 200 6ms +[2025-12-30T21:48:13.250Z] [INFO] Logout: HG +[2025-12-30T21:48:13.252Z] [INFO] POST /api/auth/logout 200 7ms +[2025-12-30T21:48:13.295Z] [INFO] Socket disconnected: HG (A5kjXDn7-Eak3wi6AAAD) +[2025-12-30T21:48:14.437Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T21:48:14.446Z] [INFO] Aufgabe aktualisiert: Gewerbeummeldung (ID: 22) +[2025-12-30T21:48:14.447Z] [INFO] PUT /api/tasks/22 200 6ms +[2025-12-30T21:48:24.644Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T21:48:24.654Z] [INFO] Aufgabe aktualisiert: Gewerbeummeldung (ID: 22) +[2025-12-30T21:48:24.656Z] [INFO] PUT /api/tasks/22 200 10ms +[2025-12-30T21:48:26.738Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T21:48:26.747Z] [INFO] Aufgabe aktualisiert: Gewerbeummeldung (ID: 22) +[2025-12-30T21:48:26.748Z] [INFO] PUT /api/tasks/22 200 7ms +[2025-12-30T21:48:27.633Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:48:43.855Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T21:48:44.203Z] [INFO] Link erstellt: https://service.wirtschaft.nrw/unternehmensfuehrung/gewerbe-ummelden-online/ für Task 22 +[2025-12-30T21:48:44.204Z] [INFO] POST /api/links 201 10ms +[2025-12-30T21:48:44.713Z] [INFO] Aufgabe aktualisiert: Gewerbeummeldung (ID: 22) +[2025-12-30T21:48:44.715Z] [INFO] PUT /api/tasks/22 200 6ms +[2025-12-30T21:48:45.714Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T21:48:51.684Z] [INFO] GET /api/tasks/14 200 10ms +[2025-12-30T21:48:51.723Z] [INFO] GET /api/links/14 200 9ms +[2025-12-30T21:48:51.731Z] [INFO] GET /api/subtasks/14 304 5ms +[2025-12-30T21:48:51.735Z] [INFO] GET /api/comments/14 304 8ms +[2025-12-30T21:48:51.739Z] [INFO] GET /api/tasks/14/history 404 3ms +[2025-12-30T21:48:51.745Z] [INFO] GET /api/files/14 304 4ms +[2025-12-30T21:48:52.694Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T21:48:57.735Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:49:27.839Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:49:57.950Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:50:28.061Z] [INFO] GET /api/health 200 3ms +[2025-12-30T21:50:58.188Z] [INFO] GET /api/health 200 8ms +[2025-12-30T21:51:28.284Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:51:58.397Z] [INFO] GET /api/health 200 0ms +[2025-12-30T21:52:28.506Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:52:58.641Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:53:28.753Z] [INFO] GET /api/health 200 3ms +[2025-12-30T21:53:58.855Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:54:28.967Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:54:59.048Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:55:29.171Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:55:49.600Z] [INFO] GET / 200 5ms +[2025-12-30T21:55:49.687Z] [INFO] GET /css/knowledge.css 200 3ms +[2025-12-30T21:55:49.735Z] [INFO] GET /css/support_parent.css 200 14ms +[2025-12-30T21:55:49.760Z] [INFO] GET /css/board.css 200 2ms +[2025-12-30T21:55:49.796Z] [INFO] GET /css/gitea.css 200 5ms +[2025-12-30T21:55:49.830Z] [INFO] GET /css/responsive.css 200 4ms +[2025-12-30T21:55:49.853Z] [INFO] GET /css/modal.css 200 4ms +[2025-12-30T21:55:49.881Z] [INFO] GET /css/components.css 200 5ms +[2025-12-30T21:55:49.907Z] [INFO] GET /css/calendar.css 200 2ms +[2025-12-30T21:55:49.954Z] [INFO] GET /css/list.css 200 5ms +[2025-12-30T21:55:49.997Z] [INFO] GET /css/variables.css 200 4ms +[2025-12-30T21:55:50.154Z] [INFO] GET /css/proposals.css 200 2ms +[2025-12-30T21:55:50.191Z] [INFO] GET /css/base.css 200 7ms +[2025-12-30T21:55:50.216Z] [INFO] GET /js/twint_ch.js 200 5ms +[2025-12-30T21:55:50.241Z] [INFO] GET /css/notifications.css 200 2ms +[2025-12-30T21:55:50.265Z] [INFO] GET /js/lkk_ch.js 200 3ms +[2025-12-30T21:55:50.303Z] [INFO] GET /js/app.js 200 3ms +[2025-12-30T21:55:50.332Z] [INFO] GET /css/admin.css 200 2ms +[2025-12-30T21:55:50.372Z] [INFO] GET /assets/icons/task.svg 200 5ms +[2025-12-30T21:55:59.296Z] [INFO] GET /api/health 200 4ms +[2025-12-30T21:56:29.403Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:56:59.508Z] [INFO] GET /api/health 200 3ms +[2025-12-30T21:57:24.662Z] [INFO] SIGTERM empfangen, fahre herunter... +[2025-12-30T21:57:47.605Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen: +[2025-12-30T21:57:47.719Z] [INFO] Server läuft auf Port 3000 +[2025-12-30T21:57:47.721Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden) +[2025-12-30T21:57:47.722Z] [INFO] Automatische Backups aktiviert +[2025-12-30T21:57:47.710Z] [INFO] Datenbank-Tabellen erstellt +[2025-12-30T21:57:47.713Z] [INFO] Datenbank initialisiert +[2025-12-30T21:57:47.719Z] [INFO] Umgebung: production +[2025-12-30T21:57:51.770Z] [INFO] CSRF: Token missing or not stored for user 4, generated new token +[2025-12-30T21:57:51.774Z] [INFO] PUT /api/tasks/14 403 16ms +[2025-12-30T21:57:51.782Z] [INFO] GET /api/health 200 5ms +[2025-12-30T21:57:51.812Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14) +[2025-12-30T21:57:51.817Z] [INFO] PUT /api/tasks/14 200 21ms +[2025-12-30T21:57:52.458Z] [INFO] HEAD / 200 7ms +[2025-12-30T21:57:52.761Z] [INFO] POST /api/auth/refresh 200 14ms +[2025-12-30T21:57:54.651Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T21:58:00.293Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T21:58:13.828Z] [INFO] POST /api/auth/refresh 200 14ms +[2025-12-30T21:58:15.001Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T21:58:21.884Z] [INFO] GET /api/health 200 1ms +[2025-12-30T21:58:47.747Z] [INFO] Backup erstellt: backup_2025-12-30T21-58-47-741Z.db +[2025-12-30T21:58:47.751Z] [INFO] Altes Backup gelöscht: backup_2025-12-29T19-01-37-753Z.db +[2025-12-30T21:58:47.752Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet +[2025-12-30T21:58:51.134Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T21:58:51.988Z] [INFO] GET /api/health 200 2ms +[2025-12-30T21:58:54.256Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T21:59:00.491Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T21:59:02.323Z] [INFO] Aufgabe erstellt: Finzamt Hilden (ID: 23) von MH +[2025-12-30T21:59:02.325Z] [INFO] POST /api/tasks 201 8ms +[2025-12-30T21:59:03.340Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T21:59:15.262Z] [INFO] GET /api/tasks/14 200 13ms +[2025-12-30T21:59:15.299Z] [INFO] GET /api/subtasks/14 304 10ms +[2025-12-30T21:59:15.323Z] [INFO] GET /api/links/14 304 6ms +[2025-12-30T21:59:15.348Z] [INFO] GET /api/tasks/14/history 404 10ms +[2025-12-30T21:59:15.355Z] [INFO] GET /api/files/14 304 5ms +[2025-12-30T21:59:15.361Z] [INFO] GET /api/comments/14 304 5ms +[2025-12-30T21:59:16.265Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T21:59:21.749Z] [INFO] Aufgabe aktualisiert: Namensänderung - Damit verbundene Todos (ID: 14) +[2025-12-30T21:59:21.752Z] [INFO] PUT /api/tasks/14 200 9ms +[2025-12-30T21:59:22.100Z] [INFO] GET /api/health 200 3ms +[2025-12-30T21:59:22.761Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T21:59:24.185Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T21:59:26.893Z] [INFO] POST /api/auth/refresh 200 14ms +[2025-12-30T21:59:31.871Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T21:59:34.436Z] [INFO] Aufgabe erstellt: Allgemein Website anpassen (ID: 24) von MH +[2025-12-30T21:59:34.438Z] [INFO] POST /api/tasks 201 6ms +[2025-12-30T21:59:35.448Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T21:59:39.361Z] [INFO] Aufgabe verschoben: Allgemein Website anpassen -> zu Klären +[2025-12-30T21:59:39.363Z] [INFO] PUT /api/tasks/24/move 200 11ms +[2025-12-30T21:59:39.975Z] [INFO] GET /api/tasks/24 200 6ms +[2025-12-30T21:59:39.999Z] [INFO] GET /api/subtasks/24 200 4ms +[2025-12-30T21:59:40.004Z] [INFO] GET /api/links/24 200 4ms +[2025-12-30T21:59:40.009Z] [INFO] GET /api/files/24 200 4ms +[2025-12-30T21:59:40.014Z] [INFO] GET /api/comments/24 200 3ms +[2025-12-30T21:59:40.019Z] [INFO] GET /api/tasks/24/history 404 3ms +[2025-12-30T21:59:40.984Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T21:59:43.645Z] [INFO] Aufgabe aktualisiert: Allgemein Website anpassen (ID: 24) +[2025-12-30T21:59:43.647Z] [INFO] PUT /api/tasks/24 200 10ms +[2025-12-30T21:59:43.961Z] [INFO] Aufgabe aktualisiert: Allgemein Website anpassen (ID: 24) +[2025-12-30T21:59:43.963Z] [INFO] PUT /api/tasks/24 200 14ms +[2025-12-30T21:59:44.738Z] [INFO] Aufgabe aktualisiert: Allgemein Website anpassen (ID: 24) +[2025-12-30T21:59:44.740Z] [INFO] PUT /api/tasks/24 200 15ms +[2025-12-30T21:59:44.771Z] [INFO] Aufgabe aktualisiert: Allgemein Website anpassen (ID: 24) +[2025-12-30T21:59:44.774Z] [INFO] PUT /api/tasks/24 200 12ms +[2025-12-30T21:59:45.745Z] [INFO] POST /api/auth/refresh 200 15ms +[2025-12-30T21:59:52.192Z] [INFO] GET /api/health 200 3ms +[2025-12-30T22:00:04.074Z] [INFO] GET /api/tasks/6 200 7ms +[2025-12-30T22:00:04.102Z] [INFO] GET /api/links/6 304 3ms +[2025-12-30T22:00:04.111Z] [INFO] GET /api/subtasks/6 200 5ms +[2025-12-30T22:00:04.116Z] [INFO] GET /api/tasks/6/history 404 4ms +[2025-12-30T22:00:04.122Z] [INFO] GET /api/comments/6 304 5ms +[2025-12-30T22:00:04.128Z] [INFO] GET /api/files/6 304 5ms +[2025-12-30T22:00:04.174Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMzE5ODUsImV4cCI6MTc2NzEzMjU4NX0.7Sd5_kimAmBup49JGn2n5sBBLJ3kvkAl1gHBVZpJDJU 200 22ms +[2025-12-30T22:00:04.179Z] [INFO] GET /api/files/preview/7?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMzE5ODUsImV4cCI6MTc2NzEzMjU4NX0.7Sd5_kimAmBup49JGn2n5sBBLJ3kvkAl1gHBVZpJDJU 200 17ms +[2025-12-30T22:00:05.081Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T22:00:08.063Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T22:00:17.121Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T22:00:18.710Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMzIwMTcsImV4cCI6MTc2NzEzMjYxN30.T5GEfCVcVBUBMu-9UnvV8b3ix42htnfdHvIGD2uq0R8 200 5ms +[2025-12-30T22:00:19.723Z] [INFO] POST /api/auth/refresh 200 14ms +[2025-12-30T22:00:21.752Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T22:00:22.291Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:00:25.180Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T22:00:42.554Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T22:00:47.602Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T22:00:52.235Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T22:00:52.391Z] [INFO] GET /api/health 200 4ms +[2025-12-30T22:00:59.730Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T22:01:04.602Z] [INFO] Subtask erstellt: Braucht man die Kategorie "Erledigt" eigentlich? Wenn ich so überlege, dann kann das ja direkt ins Archiv... in Task 6 +[2025-12-30T22:01:04.603Z] [INFO] POST /api/subtasks 201 8ms +[2025-12-30T22:01:05.604Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T22:01:08.136Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6) +[2025-12-30T22:01:08.139Z] [INFO] PUT /api/tasks/6 200 15ms +[2025-12-30T22:01:09.133Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T22:01:16.406Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T22:01:22.490Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:01:43.405Z] [INFO] GET / 200 7ms +[2025-12-30T22:01:43.491Z] [INFO] GET /css/variables.css 304 3ms +[2025-12-30T22:01:43.521Z] [INFO] GET /css/base.css 304 2ms +[2025-12-30T22:01:43.554Z] [INFO] GET /css/components.css 304 2ms +[2025-12-30T22:01:43.558Z] [INFO] GET /css/board.css 304 1ms +[2025-12-30T22:01:43.569Z] [INFO] GET /css/calendar.css 304 2ms +[2025-12-30T22:01:43.572Z] [INFO] GET /css/modal.css 304 2ms +[2025-12-30T22:01:43.580Z] [INFO] GET /css/list.css 304 2ms +[2025-12-30T22:01:43.582Z] [INFO] GET /css/admin.css 304 1ms +[2025-12-30T22:01:43.593Z] [INFO] GET /css/proposals.css 304 2ms +[2025-12-30T22:01:43.604Z] [INFO] GET /css/notifications.css 304 4ms +[2025-12-30T22:01:43.607Z] [INFO] GET /css/gitea.css 304 5ms +[2025-12-30T22:01:43.615Z] [INFO] GET /css/knowledge.css 200 5ms +[2025-12-30T22:01:43.617Z] [INFO] GET /css/responsive.css 304 1ms +[2025-12-30T22:01:43.624Z] [INFO] GET /js/app.js 304 2ms +[2025-12-30T22:01:43.691Z] [INFO] GET /js/store.js 304 2ms +[2025-12-30T22:01:43.693Z] [INFO] GET /js/sync.js 304 3ms +[2025-12-30T22:01:43.695Z] [INFO] GET /js/api.js 304 4ms +[2025-12-30T22:01:43.696Z] [INFO] GET /js/auth.js 304 3ms +[2025-12-30T22:01:43.700Z] [INFO] GET /js/board.js 304 3ms +[2025-12-30T22:01:43.704Z] [INFO] GET /js/offline.js 304 2ms +[2025-12-30T22:01:43.723Z] [INFO] GET /js/task-modal.js 304 3ms +[2025-12-30T22:01:43.731Z] [INFO] GET /js/calendar.js 304 3ms +[2025-12-30T22:01:43.738Z] [INFO] GET /js/list.js 304 3ms +[2025-12-30T22:01:43.739Z] [INFO] GET /js/shortcuts.js 304 2ms +[2025-12-30T22:01:43.745Z] [INFO] GET /js/undo.js 304 4ms +[2025-12-30T22:01:43.746Z] [INFO] GET /js/admin.js 304 3ms +[2025-12-30T22:01:43.754Z] [INFO] GET /js/proposals.js 304 1ms +[2025-12-30T22:01:43.763Z] [INFO] GET /js/notifications.js 304 1ms +[2025-12-30T22:01:43.767Z] [INFO] GET /js/gitea.js 304 1ms +[2025-12-30T22:01:43.777Z] [INFO] GET /js/knowledge.js 200 5ms +[2025-12-30T22:01:43.790Z] [INFO] GET /js/utils.js 304 1ms +[2025-12-30T22:01:43.844Z] [INFO] GET /assets/icons/task.svg 200 4ms +[2025-12-30T22:01:45.363Z] [INFO] GET /sw.js 200 3ms +[2025-12-30T22:01:45.400Z] [INFO] GET /css/variables.css 304 2ms +[2025-12-30T22:01:45.401Z] [INFO] GET / 304 2ms +[2025-12-30T22:01:45.405Z] [INFO] GET /index.html 200 4ms +[2025-12-30T22:01:45.429Z] [INFO] GET /css/base.css 304 1ms +[2025-12-30T22:01:45.436Z] [INFO] GET /css/components.css 304 2ms +[2025-12-30T22:01:45.460Z] [INFO] GET /css/board.css 304 1ms +[2025-12-30T22:01:45.462Z] [INFO] GET /css/modal.css 304 0ms +[2025-12-30T22:01:45.464Z] [INFO] GET /css/calendar.css 304 1ms +[2025-12-30T22:01:45.490Z] [INFO] GET /css/responsive.css 304 1ms +[2025-12-30T22:01:45.493Z] [INFO] GET /js/utils.js 304 1ms +[2025-12-30T22:01:45.494Z] [INFO] GET /js/app.js 304 0ms +[2025-12-30T22:01:45.521Z] [INFO] GET /js/api.js 304 2ms +[2025-12-30T22:01:45.535Z] [INFO] GET /js/store.js 304 2ms +[2025-12-30T22:01:45.538Z] [INFO] GET /js/auth.js 304 1ms +[2025-12-30T22:01:45.551Z] [INFO] GET /js/sync.js 304 1ms +[2025-12-30T22:01:45.566Z] [INFO] GET /js/offline.js 304 2ms +[2025-12-30T22:01:45.576Z] [INFO] GET /js/board.js 304 3ms +[2025-12-30T22:01:45.580Z] [INFO] GET /js/task-modal.js 304 1ms +[2025-12-30T22:01:45.598Z] [INFO] GET /js/calendar.js 304 2ms +[2025-12-30T22:01:45.608Z] [INFO] GET /js/list.js 304 2ms +[2025-12-30T22:01:45.612Z] [INFO] GET /js/shortcuts.js 304 2ms +[2025-12-30T22:01:45.629Z] [INFO] GET /js/undo.js 304 1ms +[2025-12-30T22:01:45.639Z] [INFO] GET /js/tour.js 304 2ms +[2025-12-30T22:01:45.649Z] [INFO] GET /js/admin.js 304 3ms +[2025-12-30T22:01:45.661Z] [INFO] GET /js/proposals.js 304 3ms +[2025-12-30T22:01:45.673Z] [INFO] GET /js/notifications.js 304 1ms +[2025-12-30T22:01:45.681Z] [INFO] GET /js/gitea.js 304 2ms +[2025-12-30T22:01:45.697Z] [INFO] GET /js/knowledge.js 304 2ms +[2025-12-30T22:01:45.701Z] [INFO] GET /css/list.css 304 1ms +[2025-12-30T22:01:45.710Z] [INFO] GET /css/admin.css 304 1ms +[2025-12-30T22:01:45.729Z] [INFO] GET /css/proposals.css 304 1ms +[2025-12-30T22:01:45.732Z] [INFO] GET /css/notifications.css 304 2ms +[2025-12-30T22:01:45.741Z] [INFO] GET /css/gitea.css 304 1ms +[2025-12-30T22:01:45.759Z] [INFO] GET /css/knowledge.css 304 1ms +[2025-12-30T22:01:47.989Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de +[2025-12-30T22:01:47.990Z] [INFO] POST /api/auth/login 200 516ms +[2025-12-30T22:01:48.043Z] [INFO] GET /api/auth/users 304 8ms +[2025-12-30T22:01:48.068Z] [INFO] Socket connected: HG (XRFPPRNvrzVb8ZmlAAAG) +[2025-12-30T22:01:48.076Z] [INFO] Socket connected: HG (_BE4CtFW7GDfJbuGAAAH) +[2025-12-30T22:01:48.083Z] [INFO] GET /api/projects 401 3ms +[2025-12-30T22:01:48.124Z] [INFO] Socket disconnected: HG (XRFPPRNvrzVb8ZmlAAAG) +[2025-12-30T22:01:48.132Z] [INFO] GET /api/proposals?sort=date&archived=0 401 3ms +[2025-12-30T22:01:48.163Z] [INFO] GET /api/notifications 401 1ms +[2025-12-30T22:01:48.195Z] [INFO] GET /api/knowledge/categories 401 2ms +[2025-12-30T22:01:51.485Z] [INFO] GET / 200 4ms +[2025-12-30T22:01:51.542Z] [INFO] Socket disconnected: HG (_BE4CtFW7GDfJbuGAAAH) +[2025-12-30T22:01:51.557Z] [INFO] GET /css/components.css 200 5ms +[2025-12-30T22:01:51.558Z] [INFO] GET /css/calendar.css 200 5ms +[2025-12-30T22:01:51.565Z] [INFO] GET /css/board.css 200 10ms +[2025-12-30T22:01:51.568Z] [INFO] GET /css/modal.css 200 6ms +[2025-12-30T22:01:51.570Z] [INFO] GET /css/variables.css 200 6ms +[2025-12-30T22:01:51.575Z] [INFO] GET /css/base.css 200 8ms +[2025-12-30T22:01:51.605Z] [INFO] GET /css/list.css 200 3ms +[2025-12-30T22:01:51.612Z] [INFO] GET /css/notifications.css 200 5ms +[2025-12-30T22:01:51.613Z] [INFO] GET /css/proposals.css 200 3ms +[2025-12-30T22:01:51.626Z] [INFO] GET /css/admin.css 200 2ms +[2025-12-30T22:01:51.632Z] [INFO] GET /css/knowledge.css 200 3ms +[2025-12-30T22:01:51.634Z] [INFO] GET /css/gitea.css 200 1ms +[2025-12-30T22:01:51.649Z] [INFO] GET /css/responsive.css 200 2ms +[2025-12-30T22:01:51.655Z] [INFO] GET /js/app.js 200 4ms +[2025-12-30T22:01:51.730Z] [INFO] GET /js/store.js 200 6ms +[2025-12-30T22:01:51.737Z] [INFO] GET /js/offline.js 200 5ms +[2025-12-30T22:01:51.741Z] [INFO] GET /js/auth.js 200 7ms +[2025-12-30T22:01:51.745Z] [INFO] GET /js/api.js 200 9ms +[2025-12-30T22:01:51.747Z] [INFO] GET /js/sync.js 200 8ms +[2025-12-30T22:01:51.749Z] [INFO] GET /js/board.js 200 7ms +[2025-12-30T22:01:51.760Z] [INFO] GET /js/task-modal.js 200 2ms +[2025-12-30T22:01:51.768Z] [INFO] GET /js/list.js 200 2ms +[2025-12-30T22:01:51.770Z] [INFO] GET /js/calendar.js 200 3ms +[2025-12-30T22:01:51.773Z] [INFO] GET /js/shortcuts.js 200 1ms +[2025-12-30T22:01:51.779Z] [INFO] GET /js/undo.js 200 2ms +[2025-12-30T22:01:51.790Z] [INFO] GET /js/admin.js 200 1ms +[2025-12-30T22:01:51.799Z] [INFO] GET /js/proposals.js 200 2ms +[2025-12-30T22:01:51.804Z] [INFO] GET /js/notifications.js 200 1ms +[2025-12-30T22:01:51.805Z] [INFO] GET /js/gitea.js 200 3ms +[2025-12-30T22:01:51.809Z] [INFO] GET /js/knowledge.js 200 2ms +[2025-12-30T22:01:51.824Z] [INFO] GET /js/utils.js 200 2ms +[2025-12-30T22:01:51.863Z] [INFO] GET /assets/icons/task.svg 304 1ms +[2025-12-30T22:01:52.591Z] [INFO] GET /api/health 200 1ms +[2025-12-30T22:01:54.739Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de +[2025-12-30T22:01:54.741Z] [INFO] POST /api/auth/login 200 477ms +[2025-12-30T22:01:54.785Z] [INFO] GET /api/auth/users 304 7ms +[2025-12-30T22:01:54.811Z] [INFO] Socket connected: HG (todk8J8UUZcQCg8zAAAK) +[2025-12-30T22:01:54.820Z] [INFO] Socket connected: HG (hLV2ErVRhSKM_xOvAAAL) +[2025-12-30T22:01:54.823Z] [INFO] GET /api/projects 401 7ms +[2025-12-30T22:01:54.855Z] [INFO] Socket disconnected: HG (hLV2ErVRhSKM_xOvAAAL) +[2025-12-30T22:01:54.858Z] [INFO] GET /api/proposals?sort=date&archived=0 401 1ms +[2025-12-30T22:01:54.896Z] [INFO] GET /api/notifications 401 2ms +[2025-12-30T22:01:54.932Z] [INFO] GET /api/knowledge/categories 401 3ms +[2025-12-30T22:02:07.099Z] [INFO] GET /api/tasks/23 200 8ms +[2025-12-30T22:02:07.132Z] [INFO] GET /api/subtasks/23 200 9ms +[2025-12-30T22:02:07.158Z] [INFO] GET /api/links/23 200 9ms +[2025-12-30T22:02:07.168Z] [INFO] GET /api/files/23 200 7ms +[2025-12-30T22:02:07.171Z] [INFO] GET /api/tasks/23/history 404 9ms +[2025-12-30T22:02:07.177Z] [INFO] GET /api/comments/23 200 4ms +[2025-12-30T22:02:08.100Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T22:02:08.738Z] [INFO] Aufgabe aktualisiert: Finzamt Hilden (ID: 23) +[2025-12-30T22:02:08.740Z] [INFO] PUT /api/tasks/23 200 11ms +[2025-12-30T22:02:09.742Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T22:02:22.681Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:02:43.349Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T22:02:48.821Z] [INFO] POST /api/auth/refresh 200 19ms +[2025-12-30T22:02:50.682Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T22:02:51.132Z] [INFO] Spalte aktualisiert: Informationsaustausch (ID: 8) +[2025-12-30T22:02:51.134Z] [INFO] PUT /api/columns/8 200 11ms +[2025-12-30T22:02:52.137Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T22:02:52.792Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:03:18.958Z] [INFO] GET /api/tasks/6 200 18ms +[2025-12-30T22:03:19.001Z] [INFO] GET /api/comments/6 304 11ms +[2025-12-30T22:03:19.008Z] [INFO] GET /api/subtasks/6 200 6ms +[2025-12-30T22:03:19.014Z] [INFO] GET /api/links/6 304 4ms +[2025-12-30T22:03:19.019Z] [INFO] GET /api/files/6 304 4ms +[2025-12-30T22:03:19.024Z] [INFO] GET /api/tasks/6/history 404 3ms +[2025-12-30T22:03:19.048Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMzIxNzIsImV4cCI6MTc2NzEzMjc3Mn0.nDVlaR_z55AYERKUz5CIEnLyupAdtps7_4nZk2kJKbk 200 5ms +[2025-12-30T22:03:19.049Z] [INFO] GET /api/files/preview/7?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMzIxNzIsImV4cCI6MTc2NzEzMjc3Mn0.nDVlaR_z55AYERKUz5CIEnLyupAdtps7_4nZk2kJKbk 200 10ms +[2025-12-30T22:03:19.954Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T22:03:22.895Z] [INFO] GET /api/health 200 1ms +[2025-12-30T22:03:22.951Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T22:03:26.369Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T22:03:35.352Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T22:03:37.181Z] [INFO] Subtask erstellt: ich würde eher seitwärts scrollen als default setzen in Task 6 +[2025-12-30T22:03:37.183Z] [INFO] POST /api/subtasks 201 7ms +[2025-12-30T22:03:38.183Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T22:03:38.607Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6) +[2025-12-30T22:03:38.609Z] [INFO] PUT /api/tasks/6 200 7ms +[2025-12-30T22:03:39.616Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T22:03:53.000Z] [INFO] GET /api/health 200 4ms +[2025-12-30T22:03:56.744Z] [INFO] GET /api/tasks/10 200 17ms +[2025-12-30T22:03:56.777Z] [INFO] GET /api/subtasks/10 200 6ms +[2025-12-30T22:03:56.786Z] [INFO] GET /api/tasks/10/history 404 6ms +[2025-12-30T22:03:56.790Z] [INFO] GET /api/comments/10 304 8ms +[2025-12-30T22:03:56.795Z] [INFO] GET /api/files/10 304 4ms +[2025-12-30T22:03:56.798Z] [INFO] GET /api/links/10 304 6ms +[2025-12-30T22:03:57.736Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T22:04:14.393Z] [INFO] Aufgabe aktualisiert: Bilanzbuchhaltung - Finanzamt (ID: 10) +[2025-12-30T22:04:14.396Z] [INFO] PUT /api/tasks/10 200 12ms +[2025-12-30T22:04:15.385Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T22:04:23.105Z] [INFO] GET /api/health 200 3ms +[2025-12-30T22:04:24.456Z] [INFO] GET /api/tasks/19 200 9ms +[2025-12-30T22:04:24.486Z] [INFO] GET /api/tasks/19/history 404 7ms +[2025-12-30T22:04:24.492Z] [INFO] GET /api/subtasks/19 304 12ms +[2025-12-30T22:04:24.497Z] [INFO] GET /api/links/19 304 4ms +[2025-12-30T22:04:24.502Z] [INFO] GET /api/files/19 304 4ms +[2025-12-30T22:04:24.506Z] [INFO] GET /api/comments/19 304 4ms +[2025-12-30T22:04:25.472Z] [INFO] POST /api/auth/refresh 200 15ms +[2025-12-30T22:04:29.773Z] [INFO] Aufgabe aktualisiert: pCloud Unterlagen Ablage (ID: 19) +[2025-12-30T22:04:29.774Z] [INFO] PUT /api/tasks/19 200 5ms +[2025-12-30T22:04:30.789Z] [INFO] POST /api/auth/refresh 200 14ms +[2025-12-30T22:04:53.204Z] [INFO] GET /api/health 200 3ms +[2025-12-30T22:05:23.310Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:05:53.398Z] [INFO] GET /api/health 200 4ms +[2025-12-30T22:06:23.522Z] [INFO] GET /api/health 200 3ms +[2025-12-30T22:06:53.653Z] [INFO] GET /api/health 200 3ms +[2025-12-30T22:07:23.771Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:07:53.870Z] [INFO] GET /api/health 200 3ms +[2025-12-30T22:08:24.003Z] [INFO] GET /api/health 200 5ms +[2025-12-30T22:08:54.095Z] [INFO] GET /api/health 200 1ms +[2025-12-30T22:09:24.216Z] [INFO] GET /api/health 200 1ms +[2025-12-30T22:09:54.324Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:10:24.429Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:10:54.564Z] [INFO] GET /api/health 200 7ms +[2025-12-30T22:11:24.673Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:11:54.769Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:12:24.895Z] [INFO] GET /api/health 200 4ms +[2025-12-30T22:12:36.080Z] [INFO] SIGTERM empfangen, fahre herunter... +[2025-12-30T22:12:57.583Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen: +[2025-12-30T22:12:57.716Z] [INFO] Umgebung: production +[2025-12-30T22:12:57.719Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden) +[2025-12-30T22:12:57.720Z] [INFO] Automatische Backups aktiviert +[2025-12-30T22:12:57.705Z] [INFO] Datenbank-Tabellen erstellt +[2025-12-30T22:12:57.709Z] [INFO] Datenbank initialisiert +[2025-12-30T22:12:57.715Z] [INFO] Server läuft auf Port 3000 +[2025-12-30T22:13:01.492Z] [INFO] GET /api/health 200 11ms +[2025-12-30T22:13:31.596Z] [INFO] GET /api/health 200 3ms +[2025-12-30T22:13:57.752Z] [INFO] Backup erstellt: backup_2025-12-30T22-13-57-741Z.db +[2025-12-30T22:13:57.757Z] [INFO] Altes Backup gelöscht: backup_2025-12-29T19-15-04-246Z.db +[2025-12-30T22:13:57.760Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet +[2025-12-30T22:14:01.709Z] [INFO] GET /api/health 200 1ms +[2025-12-30T22:14:08.751Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de +[2025-12-30T22:14:08.754Z] [INFO] POST /api/auth/login 200 574ms +[2025-12-30T22:14:08.872Z] [INFO] GET /api/auth/users 304 15ms +[2025-12-30T22:14:08.880Z] [INFO] Socket connected: HG (-5b7T0W7UM1CkOTbAAAE) +[2025-12-30T22:14:08.907Z] [INFO] Socket connected: HG (fIwuiQpVPsPv5fq4AAAF) +[2025-12-30T22:14:08.931Z] [INFO] GET /api/projects 401 9ms +[2025-12-30T22:14:08.970Z] [INFO] Socket disconnected: HG (fIwuiQpVPsPv5fq4AAAF) +[2025-12-30T22:14:08.974Z] [INFO] GET /api/proposals?sort=date&archived=0 401 7ms +[2025-12-30T22:14:09.004Z] [INFO] GET /api/knowledge/categories 401 3ms +[2025-12-30T22:14:10.730Z] [INFO] GET / 200 14ms +[2025-12-30T22:14:10.814Z] [INFO] Socket disconnected: HG (-5b7T0W7UM1CkOTbAAAE) +[2025-12-30T22:14:10.824Z] [INFO] GET /css/variables.css 200 8ms +[2025-12-30T22:14:10.827Z] [INFO] GET /css/board.css 200 8ms +[2025-12-30T22:14:10.830Z] [INFO] GET /css/modal.css 200 8ms +[2025-12-30T22:14:10.833Z] [INFO] GET /css/base.css 200 7ms +[2025-12-30T22:14:10.836Z] [INFO] GET /css/calendar.css 200 7ms +[2025-12-30T22:14:10.838Z] [INFO] GET /css/components.css 200 6ms +[2025-12-30T22:14:10.859Z] [INFO] GET /css/list.css 200 4ms +[2025-12-30T22:14:10.866Z] [INFO] GET /css/admin.css 200 3ms +[2025-12-30T22:14:10.880Z] [INFO] GET /css/proposals.css 200 3ms +[2025-12-30T22:14:10.896Z] [INFO] GET /css/notifications.css 200 9ms +[2025-12-30T22:14:10.901Z] [INFO] GET /css/gitea.css 200 10ms +[2025-12-30T22:14:10.910Z] [INFO] GET /css/responsive.css 200 16ms +[2025-12-30T22:14:10.913Z] [INFO] GET /css/knowledge.css 200 14ms +[2025-12-30T22:14:10.940Z] [INFO] GET /js/app.js 200 11ms +[2025-12-30T22:14:11.007Z] [INFO] GET /js/store.js 200 4ms +[2025-12-30T22:14:11.017Z] [INFO] GET /js/sync.js 200 5ms +[2025-12-30T22:14:11.021Z] [INFO] GET /js/auth.js 200 7ms +[2025-12-30T22:14:11.025Z] [INFO] GET /js/offline.js 200 7ms +[2025-12-30T22:14:11.026Z] [INFO] GET /js/api.js 200 10ms +[2025-12-30T22:14:11.027Z] [INFO] GET /js/board.js 200 8ms +[2025-12-30T22:14:11.044Z] [INFO] GET /js/calendar.js 200 2ms +[2025-12-30T22:14:11.054Z] [INFO] GET /js/task-modal.js 200 4ms +[2025-12-30T22:14:11.058Z] [INFO] GET /js/shortcuts.js 200 2ms +[2025-12-30T22:14:11.060Z] [INFO] GET /js/list.js 200 3ms +[2025-12-30T22:14:11.077Z] [INFO] GET /js/undo.js 200 2ms +[2025-12-30T22:14:11.084Z] [INFO] GET /js/admin.js 200 4ms +[2025-12-30T22:14:11.085Z] [INFO] GET /js/notifications.js 200 4ms +[2025-12-30T22:14:11.091Z] [INFO] GET /js/knowledge.js 200 3ms +[2025-12-30T22:14:11.095Z] [INFO] GET /js/proposals.js 200 4ms +[2025-12-30T22:14:11.112Z] [INFO] GET /js/gitea.js 200 4ms +[2025-12-30T22:14:11.126Z] [INFO] GET /js/utils.js 200 3ms +[2025-12-30T22:14:11.184Z] [INFO] GET /assets/icons/task.svg 304 4ms +[2025-12-30T22:14:16.313Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de +[2025-12-30T22:14:16.314Z] [INFO] POST /api/auth/login 200 459ms +[2025-12-30T22:14:16.353Z] [INFO] GET /api/auth/users 304 7ms +[2025-12-30T22:14:16.393Z] [INFO] Socket connected: HG (i_O1XvMVQQe4Y6LZAAAH) +[2025-12-30T22:14:16.403Z] [INFO] GET /api/projects 401 6ms +[2025-12-30T22:14:16.437Z] [INFO] Socket disconnected: HG (i_O1XvMVQQe4Y6LZAAAH) +[2025-12-30T22:14:16.441Z] [INFO] GET /api/proposals?sort=date&archived=0 401 2ms +[2025-12-30T22:14:16.472Z] [INFO] GET /api/notifications 401 1ms +[2025-12-30T22:14:16.504Z] [INFO] GET /api/knowledge/categories 401 1ms +[2025-12-30T22:14:22.684Z] [INFO] GET / 304 2ms +[2025-12-30T22:14:22.730Z] [INFO] GET /css/variables.css 304 1ms +[2025-12-30T22:14:22.734Z] [INFO] GET /css/base.css 304 1ms +[2025-12-30T22:14:22.737Z] [INFO] GET /css/components.css 304 2ms +[2025-12-30T22:14:22.739Z] [INFO] GET /css/board.css 304 0ms +[2025-12-30T22:14:22.741Z] [INFO] GET /css/calendar.css 304 1ms +[2025-12-30T22:14:22.744Z] [INFO] GET /css/modal.css 304 1ms +[2025-12-30T22:14:22.759Z] [INFO] GET /css/list.css 304 1ms +[2025-12-30T22:14:22.766Z] [INFO] GET /css/admin.css 304 2ms +[2025-12-30T22:14:22.769Z] [INFO] GET /css/notifications.css 304 2ms +[2025-12-30T22:14:22.776Z] [INFO] GET /css/knowledge.css 304 3ms +[2025-12-30T22:14:22.776Z] [INFO] GET /css/gitea.css 304 2ms +[2025-12-30T22:14:22.785Z] [INFO] GET /css/proposals.css 304 1ms +[2025-12-30T22:14:22.795Z] [INFO] GET /css/responsive.css 304 1ms +[2025-12-30T22:14:22.798Z] [INFO] GET /js/app.js 304 2ms +[2025-12-30T22:14:22.844Z] [INFO] GET /js/api.js 304 2ms +[2025-12-30T22:14:22.851Z] [INFO] GET /js/board.js 304 4ms +[2025-12-30T22:14:22.852Z] [INFO] GET /js/offline.js 304 3ms +[2025-12-30T22:14:22.859Z] [INFO] GET /js/auth.js 304 5ms +[2025-12-30T22:14:22.860Z] [INFO] GET /js/store.js 304 3ms +[2025-12-30T22:14:22.864Z] [INFO] GET /js/sync.js 304 3ms +[2025-12-30T22:14:22.875Z] [INFO] GET /js/task-modal.js 304 2ms +[2025-12-30T22:14:22.882Z] [INFO] GET /js/calendar.js 304 2ms +[2025-12-30T22:14:22.890Z] [INFO] GET /js/list.js 304 1ms +[2025-12-30T22:14:22.897Z] [INFO] GET /js/shortcuts.js 304 2ms +[2025-12-30T22:14:22.903Z] [INFO] GET /js/proposals.js 304 1ms +[2025-12-30T22:14:22.912Z] [INFO] GET /js/notifications.js 304 1ms +[2025-12-30T22:14:22.920Z] [INFO] GET /js/gitea.js 304 1ms +[2025-12-30T22:14:22.925Z] [INFO] GET /js/undo.js 304 0ms +[2025-12-30T22:14:22.933Z] [INFO] GET /js/utils.js 304 1ms +[2025-12-30T22:14:22.952Z] [INFO] GET /js/admin.js 304 1ms +[2025-12-30T22:14:22.953Z] [INFO] GET /js/knowledge.js 304 2ms +[2025-12-30T22:14:23.008Z] [INFO] GET /assets/icons/task.svg 304 2ms +[2025-12-30T22:14:24.542Z] [INFO] GET /sw.js 200 5ms +[2025-12-30T22:14:24.595Z] [INFO] GET /index.html 304 1ms +[2025-12-30T22:14:24.597Z] [INFO] GET /css/variables.css 304 0ms +[2025-12-30T22:14:24.599Z] [INFO] GET / 304 1ms +[2025-12-30T22:14:24.630Z] [INFO] GET /css/components.css 304 1ms +[2025-12-30T22:14:24.650Z] [INFO] GET /css/base.css 304 5ms +[2025-12-30T22:14:24.654Z] [INFO] GET /css/board.css 304 7ms +[2025-12-30T22:14:24.665Z] [INFO] GET /css/modal.css 304 1ms +[2025-12-30T22:14:24.698Z] [INFO] GET /js/app.js 304 0ms +[2025-12-30T22:14:24.711Z] [INFO] GET /css/responsive.css 304 1ms +[2025-12-30T22:14:24.712Z] [INFO] GET /css/calendar.css 304 2ms +[2025-12-30T22:14:24.730Z] [INFO] GET /js/utils.js 304 1ms +[2025-12-30T22:14:24.761Z] [INFO] GET /js/api.js 304 1ms +[2025-12-30T22:14:24.774Z] [INFO] GET /js/store.js 304 1ms +[2025-12-30T22:14:24.777Z] [INFO] GET /js/auth.js 304 1ms +[2025-12-30T22:14:24.795Z] [INFO] GET /js/sync.js 304 1ms +[2025-12-30T22:14:24.803Z] [INFO] GET /js/offline.js 304 1ms +[2025-12-30T22:14:24.808Z] [INFO] GET /js/board.js 304 1ms +[2025-12-30T22:14:24.828Z] [INFO] GET /js/task-modal.js 304 2ms +[2025-12-30T22:14:24.837Z] [INFO] GET /js/calendar.js 304 3ms +[2025-12-30T22:14:24.841Z] [INFO] GET /js/list.js 304 2ms +[2025-12-30T22:14:24.863Z] [INFO] GET /js/shortcuts.js 304 2ms +[2025-12-30T22:14:24.869Z] [INFO] GET /js/undo.js 304 2ms +[2025-12-30T22:14:24.873Z] [INFO] GET /js/tour.js 304 1ms +[2025-12-30T22:14:24.893Z] [INFO] GET /js/proposals.js 304 1ms +[2025-12-30T22:14:24.900Z] [INFO] GET /js/admin.js 304 1ms +[2025-12-30T22:14:24.903Z] [INFO] GET /js/notifications.js 304 1ms +[2025-12-30T22:14:24.925Z] [INFO] GET /js/gitea.js 304 1ms +[2025-12-30T22:14:24.936Z] [INFO] GET /js/knowledge.js 304 2ms +[2025-12-30T22:14:24.948Z] [INFO] GET /css/list.css 304 1ms +[2025-12-30T22:14:24.956Z] [INFO] GET /css/admin.css 304 1ms +[2025-12-30T22:14:24.970Z] [INFO] GET /css/proposals.css 304 1ms +[2025-12-30T22:14:24.989Z] [INFO] GET /css/gitea.css 304 2ms +[2025-12-30T22:14:25.000Z] [INFO] GET /css/notifications.css 304 2ms +[2025-12-30T22:14:25.008Z] [INFO] GET /css/knowledge.css 304 4ms +[2025-12-30T22:14:26.258Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de +[2025-12-30T22:14:26.259Z] [INFO] POST /api/auth/login 200 470ms +[2025-12-30T22:14:26.333Z] [INFO] GET /api/auth/users 304 4ms +[2025-12-30T22:14:26.372Z] [INFO] GET /api/projects 401 4ms +[2025-12-30T22:14:26.389Z] [INFO] Socket connected: HG (SkSQokf_suCpKbH6AAAJ) +[2025-12-30T22:14:26.413Z] [INFO] GET /api/proposals?sort=date&archived=0 401 1ms +[2025-12-30T22:14:26.423Z] [INFO] Socket disconnected: HG (SkSQokf_suCpKbH6AAAJ) +[2025-12-30T22:14:26.447Z] [INFO] GET /api/notifications 401 2ms +[2025-12-30T22:14:26.483Z] [INFO] GET /api/knowledge/categories 401 2ms +[2025-12-30T22:14:29.131Z] [INFO] Logout: MH +[2025-12-30T22:14:29.132Z] [INFO] POST /api/auth/logout 200 8ms +[2025-12-30T22:14:31.840Z] [INFO] GET /api/health 200 3ms +[2025-12-30T22:15:01.940Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:15:32.066Z] [INFO] GET /api/health 200 1ms +[2025-12-30T22:16:02.194Z] [INFO] GET /api/health 200 4ms +[2025-12-30T22:16:32.342Z] [INFO] GET /api/health 200 3ms +[2025-12-30T22:16:46.405Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen: +[2025-12-30T22:16:46.497Z] [INFO] Server läuft auf Port 3000 +[2025-12-30T22:16:46.499Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden) +[2025-12-30T22:16:46.499Z] [INFO] Automatische Backups aktiviert +[2025-12-30T22:16:46.491Z] [INFO] Datenbank-Tabellen erstellt +[2025-12-30T22:16:46.494Z] [INFO] Datenbank initialisiert +[2025-12-30T22:16:46.497Z] [INFO] Umgebung: production +[2025-12-30T22:16:50.661Z] [INFO] GET /api/health 200 17ms +[2025-12-30T22:17:20.796Z] [INFO] GET /api/health 200 5ms +[2025-12-30T22:17:46.507Z] [INFO] Backup erstellt: backup_2025-12-30T22-17-46-503Z.db +[2025-12-30T22:17:46.511Z] [INFO] Altes Backup gelöscht: backup_2025-12-29T19-30-20-564Z.db +[2025-12-30T22:17:46.514Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet +[2025-12-30T22:17:50.894Z] [INFO] GET /api/health 200 1ms +[2025-12-30T22:18:21.036Z] [INFO] GET /api/health 200 4ms +[2025-12-30T22:18:51.154Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:19:21.271Z] [INFO] GET /api/health 200 3ms +[2025-12-30T22:19:51.389Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:20:21.476Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:20:51.559Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:21:21.664Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:21:51.774Z] [INFO] GET /api/health 200 4ms +[2025-12-30T22:22:04.315Z] [INFO] GET / 200 13ms +[2025-12-30T22:22:04.371Z] [INFO] GET /css/variables.css 200 2ms +[2025-12-30T22:22:04.399Z] [INFO] GET /css/base.css 200 2ms +[2025-12-30T22:22:04.429Z] [INFO] GET /css/components.css 200 4ms +[2025-12-30T22:22:04.432Z] [INFO] GET /css/board.css 200 5ms +[2025-12-30T22:22:04.438Z] [INFO] GET /css/modal.css 200 4ms +[2025-12-30T22:22:04.440Z] [INFO] GET /css/calendar.css 200 4ms +[2025-12-30T22:22:04.448Z] [INFO] GET /css/admin.css 200 3ms +[2025-12-30T22:22:04.450Z] [INFO] GET /css/list.css 200 4ms +[2025-12-30T22:22:04.470Z] [INFO] GET /css/proposals.css 200 3ms +[2025-12-30T22:22:04.481Z] [INFO] GET /css/notifications.css 200 2ms +[2025-12-30T22:22:04.507Z] [INFO] GET /css/gitea.css 200 14ms +[2025-12-30T22:22:04.509Z] [INFO] GET /css/responsive.css 200 14ms +[2025-12-30T22:22:04.513Z] [INFO] GET /css/knowledge.css 200 5ms +[2025-12-30T22:22:04.516Z] [INFO] GET /js/app.js 200 6ms +[2025-12-30T22:22:04.592Z] [INFO] GET /js/offline.js 200 6ms +[2025-12-30T22:22:04.593Z] [INFO] GET /js/store.js 200 6ms +[2025-12-30T22:22:04.595Z] [INFO] GET /js/api.js 200 8ms +[2025-12-30T22:22:04.596Z] [INFO] GET /js/auth.js 200 8ms +[2025-12-30T22:22:04.597Z] [INFO] GET /js/sync.js 200 7ms +[2025-12-30T22:22:04.600Z] [INFO] GET /js/board.js 200 9ms +[2025-12-30T22:22:04.622Z] [INFO] GET /js/calendar.js 200 3ms +[2025-12-30T22:22:04.630Z] [INFO] GET /js/task-modal.js 200 10ms +[2025-12-30T22:22:04.637Z] [INFO] GET /js/list.js 200 13ms +[2025-12-30T22:22:04.641Z] [INFO] GET /js/undo.js 200 8ms +[2025-12-30T22:22:04.643Z] [INFO] GET /js/shortcuts.js 200 4ms +[2025-12-30T22:22:04.657Z] [INFO] GET /js/admin.js 200 4ms +[2025-12-30T22:22:04.666Z] [INFO] GET /js/proposals.js 200 3ms +[2025-12-30T22:22:04.675Z] [INFO] GET /js/notifications.js 200 2ms +[2025-12-30T22:22:04.685Z] [INFO] GET /js/gitea.js 200 4ms +[2025-12-30T22:22:04.690Z] [INFO] GET /js/utils.js 200 3ms +[2025-12-30T22:22:04.697Z] [INFO] GET /js/knowledge.js 200 3ms +[2025-12-30T22:22:04.768Z] [INFO] GET /assets/icons/task.svg 304 6ms +[2025-12-30T22:22:09.846Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de +[2025-12-30T22:22:09.849Z] [INFO] POST /api/auth/login 200 542ms +[2025-12-30T22:22:09.903Z] [INFO] GET /api/auth/users 304 7ms +[2025-12-30T22:22:09.936Z] [INFO] Socket connected: HG (0aBVcD4vWBdq6DpQAAAB) +[2025-12-30T22:22:09.945Z] [INFO] [AUTH] 401 - Token ungültig: GET / (token: eyJhbGciOiJIUzI1NiIs...) +[2025-12-30T22:22:09.946Z] [INFO] GET /api/projects 401 4ms +[2025-12-30T22:22:09.979Z] [INFO] Socket disconnected: HG (0aBVcD4vWBdq6DpQAAAB) +[2025-12-30T22:22:09.988Z] [INFO] [AUTH] 401 - Kein Token: GET / (source: none) +[2025-12-30T22:22:09.989Z] [INFO] GET /api/proposals?sort=date&archived=0 401 1ms +[2025-12-30T22:22:10.028Z] [INFO] [AUTH] 401 - Kein Token: GET / (source: none) +[2025-12-30T22:22:10.032Z] [INFO] GET /api/notifications 401 6ms +[2025-12-30T22:22:10.063Z] [INFO] [AUTH] 401 - Kein Token: GET /categories (source: none) +[2025-12-30T22:22:10.064Z] [INFO] GET /api/knowledge/categories 401 2ms +[2025-12-30T22:22:13.800Z] [INFO] GET /css/variables.css 304 4ms +[2025-12-30T22:22:13.804Z] [INFO] GET /css/modal.css 304 6ms +[2025-12-30T22:22:13.807Z] [INFO] GET /css/calendar.css 304 5ms +[2025-12-30T22:22:13.808Z] [INFO] GET /css/base.css 304 3ms +[2025-12-30T22:22:13.810Z] [INFO] GET /css/components.css 304 1ms +[2025-12-30T22:22:13.813Z] [INFO] GET /css/board.css 304 1ms +[2025-12-30T22:22:13.829Z] [INFO] GET /css/admin.css 304 2ms +[2025-12-30T22:22:13.833Z] [INFO] GET /css/gitea.css 304 1ms +[2025-12-30T22:22:13.835Z] [INFO] GET /css/proposals.css 304 1ms +[2025-12-30T22:22:13.840Z] [INFO] GET /css/knowledge.css 304 2ms +[2025-12-30T22:22:13.841Z] [INFO] GET /css/list.css 304 1ms +[2025-12-30T22:22:13.845Z] [INFO] GET /css/notifications.css 304 2ms +[2025-12-30T22:22:13.864Z] [INFO] GET /css/responsive.css 304 2ms +[2025-12-30T22:22:21.864Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:22:51.965Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:23:22.071Z] [INFO] GET /api/health 200 1ms +[2025-12-30T22:23:52.216Z] [INFO] GET /api/health 200 6ms +[2025-12-30T22:24:15.185Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen: +[2025-12-30T22:24:15.278Z] [INFO] Umgebung: production +[2025-12-30T22:24:15.279Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden) +[2025-12-30T22:24:15.279Z] [INFO] Automatische Backups aktiviert +[2025-12-30T22:24:15.270Z] [INFO] Datenbank-Tabellen erstellt +[2025-12-30T22:24:15.273Z] [INFO] Datenbank initialisiert +[2025-12-30T22:24:15.277Z] [INFO] Server läuft auf Port 3000 +[2025-12-30T22:24:19.602Z] [INFO] GET /api/health 200 12ms +[2025-12-30T22:24:49.698Z] [INFO] GET /api/health 200 3ms +[2025-12-30T22:25:15.293Z] [INFO] Backup erstellt: backup_2025-12-30T22-25-15-289Z.db +[2025-12-30T22:25:15.298Z] [INFO] Altes Backup gelöscht: backup_2025-12-29T19-59-53-354Z.db +[2025-12-30T22:25:15.300Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet +[2025-12-30T22:25:19.786Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:25:49.906Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:26:20.014Z] [INFO] GET /api/health 200 5ms +[2025-12-30T22:26:50.107Z] [INFO] GET /api/health 200 4ms +[2025-12-30T22:27:20.205Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:27:50.326Z] [INFO] GET /api/health 200 5ms +[2025-12-30T22:27:57.919Z] [INFO] [AUTH] JWT_SECRET configured (first 8 chars): 6d50da23... +[2025-12-30T22:27:58.169Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen: +[2025-12-30T22:27:58.219Z] [INFO] Datenbank-Tabellen erstellt +[2025-12-30T22:27:58.221Z] [INFO] Datenbank initialisiert +[2025-12-30T22:27:58.225Z] [INFO] Server läuft auf Port 3000 +[2025-12-30T22:27:58.226Z] [INFO] Umgebung: production +[2025-12-30T22:27:58.227Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden) +[2025-12-30T22:27:58.227Z] [INFO] Automatische Backups aktiviert +[2025-12-30T22:28:02.317Z] [INFO] GET /api/health 200 12ms +[2025-12-30T22:28:32.451Z] [INFO] GET /api/health 200 3ms +[2025-12-30T22:28:43.250Z] [INFO] Login erfolgreich: momohomma@googlemail.com +[2025-12-30T22:28:43.252Z] [INFO] POST /api/auth/login 200 554ms +[2025-12-30T22:28:43.343Z] [INFO] Socket connected: MH (yjwrd2zg0tIEliHWAAAC) +[2025-12-30T22:28:43.353Z] [INFO] [AUTH] Token erhalten für GET /api/auth/users: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid... +[2025-12-30T22:28:43.358Z] [INFO] GET /api/auth/users 304 9ms +[2025-12-30T22:28:43.363Z] [INFO] Socket connected: MH (mQe-VJFasIDCDXuBAAAD) +[2025-12-30T22:28:43.406Z] [INFO] [AUTH] Token erhalten für GET /api/projects: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid... +[2025-12-30T22:28:43.415Z] [INFO] GET /api/projects 200 11ms +[2025-12-30T22:28:43.439Z] [INFO] [AUTH] Token erhalten für GET /api/columns/2: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid... +[2025-12-30T22:28:43.454Z] [INFO] GET /api/columns/2 200 16ms +[2025-12-30T22:28:43.466Z] [INFO] [AUTH] Token erhalten für GET /api/stats/dashboard?projectId=2: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid... +[2025-12-30T22:28:43.473Z] [INFO] GET /api/stats/dashboard?projectId=2 200 9ms +[2025-12-30T22:28:43.493Z] [INFO] GET /api/tasks/project/2 200 19ms +[2025-12-30T22:28:43.475Z] [INFO] [AUTH] Token erhalten für GET /api/tasks/project/2: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid... +[2025-12-30T22:28:43.498Z] [INFO] [AUTH] Token erhalten für GET /api/labels/2: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid... +[2025-12-30T22:28:43.505Z] [INFO] GET /api/labels/2 304 10ms +[2025-12-30T22:28:43.507Z] [INFO] MH joined project:[object Object] +[2025-12-30T22:28:43.533Z] [INFO] [AUTH] Token erhalten für GET /api/proposals?sort=date&archived=0&projectId=2: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid... +[2025-12-30T22:28:43.539Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 8ms +[2025-12-30T22:28:50.888Z] [INFO] [AUTH] Token erhalten für GET /api/tasks/4: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid... +[2025-12-30T22:28:50.897Z] [INFO] GET /api/tasks/4 200 13ms +[2025-12-30T22:28:50.923Z] [INFO] [AUTH] Token erhalten für GET /api/files/4: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid... +[2025-12-30T22:28:50.930Z] [INFO] GET /api/files/4 304 7ms +[2025-12-30T22:28:50.934Z] [INFO] [AUTH] Token erhalten für GET /api/subtasks/4: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid... +[2025-12-30T22:28:50.939Z] [INFO] GET /api/subtasks/4 200 8ms +[2025-12-30T22:28:50.940Z] [INFO] [AUTH] Token erhalten für GET /api/comments/4: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid... +[2025-12-30T22:28:50.944Z] [INFO] GET /api/comments/4 304 11ms +[2025-12-30T22:28:50.946Z] [INFO] [AUTH] Token erhalten für GET /api/links/4: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid... +[2025-12-30T22:28:50.951Z] [INFO] GET /api/links/4 304 6ms +[2025-12-30T22:28:50.953Z] [INFO] [AUTH] Token erhalten für GET /api/tasks/4/history: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid... +[2025-12-30T22:28:50.958Z] [INFO] GET /api/tasks/4/history 404 6ms +[2025-12-30T22:28:51.888Z] [INFO] [AUTH] Token erhalten für POST /api/auth/refresh: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid... +[2025-12-30T22:28:51.897Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T22:28:58.234Z] [INFO] Backup erstellt: backup_2025-12-30T22-28-58-230Z.db +[2025-12-30T22:28:58.239Z] [INFO] Altes Backup gelöscht: backup_2025-12-29T20-11-37-153Z.db +[2025-12-30T22:28:58.242Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet +[2025-12-30T22:29:01.286Z] [INFO] [AUTH] Token erhalten für POST /api/auth/refresh: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid... +[2025-12-30T22:29:01.298Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T22:29:02.556Z] [INFO] GET /api/health 200 3ms +[2025-12-30T22:29:05.127Z] [INFO] [AUTH] Token erhalten für PUT /api/subtasks/4: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid... +[2025-12-30T22:29:05.142Z] [INFO] PUT /api/subtasks/4 200 16ms +[2025-12-30T22:29:05.197Z] [INFO] [AUTH] Token erhalten für PUT /api/tasks/4: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid... +[2025-12-30T22:29:05.202Z] [INFO] Aufgabe aktualisiert: Corporated Design (ID: 4) +[2025-12-30T22:29:05.205Z] [INFO] PUT /api/tasks/4 200 8ms +[2025-12-30T22:29:06.203Z] [INFO] [AUTH] Token erhalten für POST /api/auth/refresh: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwid... +[2025-12-30T22:29:06.210Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T22:29:32.659Z] [INFO] GET /api/health 200 1ms +[2025-12-30T22:29:33.267Z] [INFO] Socket disconnected: MH (mQe-VJFasIDCDXuBAAAD) +[2025-12-30T22:29:33.271Z] [INFO] Socket disconnected: MH (yjwrd2zg0tIEliHWAAAC) +[2025-12-30T22:30:02.752Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:30:21.217Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen: +[2025-12-30T22:30:21.310Z] [INFO] Umgebung: production +[2025-12-30T22:30:21.312Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden) +[2025-12-30T22:30:21.298Z] [INFO] Datenbank-Tabellen erstellt +[2025-12-30T22:30:21.302Z] [INFO] Datenbank initialisiert +[2025-12-30T22:30:21.309Z] [INFO] Server läuft auf Port 3000 +[2025-12-30T22:30:21.312Z] [INFO] Automatische Backups aktiviert +[2025-12-30T22:30:25.499Z] [INFO] GET /api/health 200 17ms +[2025-12-30T22:30:55.639Z] [INFO] GET /api/health 200 4ms +[2025-12-30T22:31:21.335Z] [INFO] Backup erstellt: backup_2025-12-30T22-31-21-332Z.db +[2025-12-30T22:31:21.342Z] [INFO] Altes Backup gelöscht: backup_2025-12-29T20-14-06-429Z.db +[2025-12-30T22:31:21.346Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet +[2025-12-30T22:31:25.754Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:31:55.868Z] [INFO] GET /api/health 200 4ms +[2025-12-30T22:32:16.747Z] [INFO] GET / 200 11ms +[2025-12-30T22:32:16.857Z] [INFO] GET /css/variables.css 200 5ms +[2025-12-30T22:32:16.887Z] [INFO] GET /css/base.css 200 3ms +[2025-12-30T22:32:16.915Z] [INFO] GET /css/components.css 200 4ms +[2025-12-30T22:32:16.923Z] [INFO] GET /css/board.css 200 9ms +[2025-12-30T22:32:16.928Z] [INFO] GET /css/modal.css 200 11ms +[2025-12-30T22:32:16.938Z] [INFO] GET /css/calendar.css 200 5ms +[2025-12-30T22:32:16.939Z] [INFO] GET /css/admin.css 200 5ms +[2025-12-30T22:32:16.942Z] [INFO] GET /css/list.css 200 6ms +[2025-12-30T22:32:16.958Z] [INFO] GET /css/proposals.css 200 3ms +[2025-12-30T22:32:16.966Z] [INFO] GET /css/notifications.css 200 2ms +[2025-12-30T22:32:16.970Z] [INFO] GET /css/gitea.css 200 2ms +[2025-12-30T22:32:16.977Z] [INFO] GET /css/knowledge.css 200 5ms +[2025-12-30T22:32:16.979Z] [INFO] GET /css/responsive.css 200 1ms +[2025-12-30T22:32:16.995Z] [INFO] GET /js/app.js 200 3ms +[2025-12-30T22:32:17.058Z] [INFO] GET /js/api.js 200 9ms +[2025-12-30T22:32:17.062Z] [INFO] GET /js/store.js 200 11ms +[2025-12-30T22:32:17.065Z] [INFO] GET /js/auth.js 200 10ms +[2025-12-30T22:32:17.070Z] [INFO] GET /js/board.js 200 10ms +[2025-12-30T22:32:17.073Z] [INFO] GET /js/sync.js 200 9ms +[2025-12-30T22:32:17.074Z] [INFO] GET /js/offline.js 200 5ms +[2025-12-30T22:32:17.091Z] [INFO] GET /js/list.js 200 2ms +[2025-12-30T22:32:17.093Z] [INFO] GET /js/calendar.js 200 3ms +[2025-12-30T22:32:17.100Z] [INFO] GET /js/task-modal.js 200 2ms +[2025-12-30T22:32:17.104Z] [INFO] GET /js/undo.js 200 2ms +[2025-12-30T22:32:17.107Z] [INFO] GET /js/shortcuts.js 200 4ms +[2025-12-30T22:32:17.126Z] [INFO] GET /js/proposals.js 200 5ms +[2025-12-30T22:32:17.130Z] [INFO] GET /js/notifications.js 200 7ms +[2025-12-30T22:32:17.137Z] [INFO] GET /js/admin.js 200 12ms +[2025-12-30T22:32:17.141Z] [INFO] GET /js/knowledge.js 200 5ms +[2025-12-30T22:32:17.143Z] [INFO] GET /js/utils.js 200 4ms +[2025-12-30T22:32:17.145Z] [INFO] GET /js/gitea.js 200 3ms +[2025-12-30T22:32:17.207Z] [INFO] GET /assets/icons/task.svg 304 5ms +[2025-12-30T22:32:19.229Z] [INFO] GET / 200 4ms +[2025-12-30T22:32:19.312Z] [INFO] GET /css/variables.css 200 9ms +[2025-12-30T22:32:19.313Z] [INFO] GET /css/components.css 200 8ms +[2025-12-30T22:32:19.315Z] [INFO] GET /css/board.css 200 7ms +[2025-12-30T22:32:19.319Z] [INFO] GET /css/base.css 200 9ms +[2025-12-30T22:32:19.321Z] [INFO] GET /css/modal.css 200 7ms +[2025-12-30T22:32:19.322Z] [INFO] GET /css/calendar.css 200 4ms +[2025-12-30T22:32:19.343Z] [INFO] GET /css/list.css 200 1ms +[2025-12-30T22:32:19.353Z] [INFO] GET /css/admin.css 200 2ms +[2025-12-30T22:32:19.370Z] [INFO] GET /css/proposals.css 200 3ms +[2025-12-30T22:32:19.372Z] [INFO] GET /css/gitea.css 200 3ms +[2025-12-30T22:32:19.375Z] [INFO] GET /css/notifications.css 200 6ms +[2025-12-30T22:32:19.377Z] [INFO] GET /css/knowledge.css 200 3ms +[2025-12-30T22:32:19.381Z] [INFO] GET /css/responsive.css 200 5ms +[2025-12-30T22:32:19.403Z] [INFO] GET /js/app.js 200 2ms +[2025-12-30T22:32:19.512Z] [INFO] GET /js/store.js 200 5ms +[2025-12-30T22:32:19.516Z] [INFO] GET /js/board.js 200 7ms +[2025-12-30T22:32:19.518Z] [INFO] GET /js/auth.js 200 7ms +[2025-12-30T22:32:19.524Z] [INFO] GET /js/offline.js 200 10ms +[2025-12-30T22:32:19.528Z] [INFO] GET /js/api.js 200 11ms +[2025-12-30T22:32:19.530Z] [INFO] GET /js/sync.js 200 8ms +[2025-12-30T22:32:19.547Z] [INFO] GET /js/calendar.js 200 3ms +[2025-12-30T22:32:19.555Z] [INFO] GET /js/list.js 200 5ms +[2025-12-30T22:32:19.560Z] [INFO] GET /js/task-modal.js 200 3ms +[2025-12-30T22:32:19.572Z] [INFO] GET /js/shortcuts.js 200 2ms +[2025-12-30T22:32:19.574Z] [INFO] GET /js/undo.js 200 3ms +[2025-12-30T22:32:19.577Z] [INFO] GET /js/admin.js 200 2ms +[2025-12-30T22:32:19.589Z] [INFO] GET /js/proposals.js 200 4ms +[2025-12-30T22:32:19.600Z] [INFO] GET /js/notifications.js 200 2ms +[2025-12-30T22:32:19.606Z] [INFO] GET /js/utils.js 200 3ms +[2025-12-30T22:32:19.607Z] [INFO] GET /js/knowledge.js 200 2ms +[2025-12-30T22:32:19.620Z] [INFO] GET /js/gitea.js 200 2ms +[2025-12-30T22:32:19.703Z] [INFO] GET /assets/icons/task.svg 304 2ms +[2025-12-30T22:32:23.918Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de +[2025-12-30T22:32:23.919Z] [INFO] POST /api/auth/login 200 511ms +[2025-12-30T22:32:23.960Z] [INFO] GET /api/auth/users 304 8ms +[2025-12-30T22:32:24.001Z] [INFO] GET /api/projects 401 10ms +[2025-12-30T22:32:24.018Z] [INFO] Socket connected: HG (_WkGggW9gK-R3p62AAAB) +[2025-12-30T22:32:24.042Z] [INFO] GET /api/proposals?sort=date&archived=0 401 2ms +[2025-12-30T22:32:24.048Z] [INFO] Socket disconnected: HG (_WkGggW9gK-R3p62AAAB) +[2025-12-30T22:32:24.075Z] [INFO] GET /api/notifications 401 2ms +[2025-12-30T22:32:24.108Z] [INFO] GET /api/knowledge/categories 401 1ms +[2025-12-30T22:32:25.961Z] [INFO] GET /api/health 200 3ms +[2025-12-30T22:32:34.139Z] [INFO] GET / 304 2ms +[2025-12-30T22:32:34.195Z] [INFO] GET /css/components.css 304 5ms +[2025-12-30T22:32:34.198Z] [INFO] GET /css/variables.css 304 6ms +[2025-12-30T22:32:34.201Z] [INFO] GET /css/base.css 304 1ms +[2025-12-30T22:32:34.205Z] [INFO] GET /css/calendar.css 304 3ms +[2025-12-30T22:32:34.207Z] [INFO] GET /css/board.css 304 1ms +[2025-12-30T22:32:34.210Z] [INFO] GET /css/modal.css 304 2ms +[2025-12-30T22:32:34.232Z] [INFO] GET /css/admin.css 304 3ms +[2025-12-30T22:32:34.234Z] [INFO] GET /css/list.css 304 4ms +[2025-12-30T22:32:34.241Z] [INFO] GET /css/notifications.css 304 2ms +[2025-12-30T22:32:34.241Z] [INFO] GET /css/proposals.css 304 1ms +[2025-12-30T22:32:34.244Z] [INFO] GET /css/gitea.css 304 1ms +[2025-12-30T22:32:34.252Z] [INFO] GET /css/knowledge.css 304 1ms +[2025-12-30T22:32:34.267Z] [INFO] GET /css/responsive.css 304 2ms +[2025-12-30T22:32:34.271Z] [INFO] GET /js/app.js 304 1ms +[2025-12-30T22:32:34.321Z] [INFO] GET /js/api.js 304 4ms +[2025-12-30T22:32:34.326Z] [INFO] GET /js/board.js 304 2ms +[2025-12-30T22:32:34.331Z] [INFO] GET /js/auth.js 304 3ms +[2025-12-30T22:32:34.334Z] [INFO] GET /js/offline.js 304 2ms +[2025-12-30T22:32:34.335Z] [INFO] GET /js/store.js 304 2ms +[2025-12-30T22:32:34.337Z] [INFO] GET /js/sync.js 304 1ms +[2025-12-30T22:32:34.352Z] [INFO] GET /js/task-modal.js 304 1ms +[2025-12-30T22:32:34.355Z] [INFO] GET /js/calendar.js 304 1ms +[2025-12-30T22:32:34.359Z] [INFO] GET /js/list.js 304 1ms +[2025-12-30T22:32:34.364Z] [INFO] GET /js/shortcuts.js 304 1ms +[2025-12-30T22:32:34.365Z] [INFO] GET /js/admin.js 304 2ms +[2025-12-30T22:32:34.384Z] [INFO] GET /js/undo.js 304 2ms +[2025-12-30T22:32:34.390Z] [INFO] GET /js/proposals.js 304 2ms +[2025-12-30T22:32:34.394Z] [INFO] GET /js/notifications.js 304 2ms +[2025-12-30T22:32:34.397Z] [INFO] GET /js/knowledge.js 304 1ms +[2025-12-30T22:32:34.400Z] [INFO] GET /js/gitea.js 304 2ms +[2025-12-30T22:32:34.402Z] [INFO] GET /js/utils.js 304 0ms +[2025-12-30T22:32:34.450Z] [INFO] GET /assets/icons/task.svg 304 2ms +[2025-12-30T22:32:35.966Z] [INFO] GET /sw.js 200 4ms +[2025-12-30T22:32:36.005Z] [INFO] GET / 304 2ms +[2025-12-30T22:32:36.010Z] [INFO] GET /css/variables.css 304 2ms +[2025-12-30T22:32:36.017Z] [INFO] GET /index.html 304 1ms +[2025-12-30T22:32:36.034Z] [INFO] GET /css/base.css 304 1ms +[2025-12-30T22:32:36.038Z] [INFO] GET /css/components.css 304 1ms +[2025-12-30T22:32:36.052Z] [INFO] GET /css/board.css 304 1ms +[2025-12-30T22:32:36.064Z] [INFO] GET /css/modal.css 304 2ms +[2025-12-30T22:32:36.071Z] [INFO] GET /css/calendar.css 304 2ms +[2025-12-30T22:32:36.084Z] [INFO] GET /css/responsive.css 304 2ms +[2025-12-30T22:32:36.094Z] [INFO] GET /js/app.js 304 1ms +[2025-12-30T22:32:36.097Z] [INFO] GET /js/utils.js 304 1ms +[2025-12-30T22:32:36.116Z] [INFO] GET /js/api.js 304 1ms +[2025-12-30T22:32:36.124Z] [INFO] GET /js/store.js 304 1ms +[2025-12-30T22:32:36.127Z] [INFO] GET /js/auth.js 304 2ms +[2025-12-30T22:32:36.144Z] [INFO] GET /js/sync.js 304 2ms +[2025-12-30T22:32:36.153Z] [INFO] GET /js/offline.js 304 0ms +[2025-12-30T22:32:36.157Z] [INFO] GET /js/board.js 304 1ms +[2025-12-30T22:32:36.177Z] [INFO] GET /js/task-modal.js 304 2ms +[2025-12-30T22:32:36.185Z] [INFO] GET /js/calendar.js 304 2ms +[2025-12-30T22:32:36.189Z] [INFO] GET /js/list.js 304 1ms +[2025-12-30T22:32:36.209Z] [INFO] GET /js/shortcuts.js 304 1ms +[2025-12-30T22:32:36.218Z] [INFO] GET /js/undo.js 304 3ms +[2025-12-30T22:32:36.224Z] [INFO] GET /js/tour.js 304 3ms +[2025-12-30T22:32:36.238Z] [INFO] GET /js/admin.js 304 1ms +[2025-12-30T22:32:36.257Z] [INFO] GET /js/proposals.js 304 2ms +[2025-12-30T22:32:36.260Z] [INFO] GET /js/notifications.js 304 1ms +[2025-12-30T22:32:36.268Z] [INFO] GET /js/gitea.js 304 1ms +[2025-12-30T22:32:36.291Z] [INFO] GET /js/knowledge.js 304 1ms +[2025-12-30T22:32:36.298Z] [INFO] GET /css/list.css 304 1ms +[2025-12-30T22:32:36.311Z] [INFO] GET /css/admin.css 304 1ms +[2025-12-30T22:32:36.325Z] [INFO] GET /css/proposals.css 304 1ms +[2025-12-30T22:32:36.329Z] [INFO] GET /css/notifications.css 304 1ms +[2025-12-30T22:32:36.345Z] [INFO] GET /css/gitea.css 304 2ms +[2025-12-30T22:32:36.357Z] [INFO] GET /css/knowledge.css 304 1ms +[2025-12-30T22:32:38.853Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de +[2025-12-30T22:32:38.854Z] [INFO] POST /api/auth/login 200 461ms +[2025-12-30T22:32:38.904Z] [INFO] GET /api/auth/users 304 10ms +[2025-12-30T22:32:38.932Z] [INFO] Socket connected: HG (QZkBzHBur4jg0lJUAAAD) +[2025-12-30T22:32:38.942Z] [INFO] GET /api/projects 401 6ms +[2025-12-30T22:32:38.976Z] [INFO] Socket disconnected: HG (QZkBzHBur4jg0lJUAAAD) +[2025-12-30T22:32:38.980Z] [INFO] GET /api/proposals?sort=date&archived=0 401 2ms +[2025-12-30T22:32:39.028Z] [INFO] GET /api/notifications 401 1ms +[2025-12-30T22:32:39.060Z] [INFO] GET /api/knowledge/categories 401 1ms +[2025-12-30T22:32:42.844Z] [INFO] GET / 304 2ms +[2025-12-30T22:32:42.845Z] [INFO] GET /css/board.css 304 1ms +[2025-12-30T22:32:42.848Z] [INFO] GET /css/variables.css 304 2ms +[2025-12-30T22:32:42.849Z] [INFO] GET /css/components.css 304 2ms +[2025-12-30T22:32:42.850Z] [INFO] GET /css/modal.css 304 0ms +[2025-12-30T22:32:42.852Z] [INFO] GET /css/base.css 304 1ms +[2025-12-30T22:32:42.878Z] [INFO] GET /css/admin.css 304 1ms +[2025-12-30T22:32:42.884Z] [INFO] GET /css/calendar.css 304 2ms +[2025-12-30T22:32:42.888Z] [INFO] GET /css/notifications.css 304 1ms +[2025-12-30T22:32:42.890Z] [INFO] GET /css/proposals.css 304 1ms +[2025-12-30T22:32:42.892Z] [INFO] GET /css/list.css 304 1ms +[2025-12-30T22:32:42.896Z] [INFO] GET /css/gitea.css 304 0ms +[2025-12-30T22:32:42.909Z] [INFO] GET /css/knowledge.css 304 1ms +[2025-12-30T22:32:42.925Z] [INFO] GET /css/responsive.css 304 1ms +[2025-12-30T22:32:56.087Z] [INFO] GET /api/health 200 3ms +[2025-12-30T22:33:14.279Z] [INFO] GET / 200 6ms +[2025-12-30T22:33:14.343Z] [INFO] GET /css/variables.css 200 2ms +[2025-12-30T22:33:14.377Z] [INFO] GET /css/base.css 200 4ms +[2025-12-30T22:33:14.426Z] [INFO] GET /css/calendar.css 200 7ms +[2025-12-30T22:33:14.427Z] [INFO] GET /css/list.css 200 7ms +[2025-12-30T22:33:14.432Z] [INFO] GET /css/components.css 200 8ms +[2025-12-30T22:33:14.433Z] [INFO] GET /css/modal.css 200 8ms +[2025-12-30T22:33:14.437Z] [INFO] GET /css/board.css 200 12ms +[2025-12-30T22:33:14.443Z] [INFO] GET /css/admin.css 200 15ms +[2025-12-30T22:33:14.459Z] [INFO] GET /css/proposals.css 200 4ms +[2025-12-30T22:33:14.465Z] [INFO] GET /css/notifications.css 200 2ms +[2025-12-30T22:33:14.472Z] [INFO] GET /css/gitea.css 200 2ms +[2025-12-30T22:33:14.477Z] [INFO] GET /css/knowledge.css 200 2ms +[2025-12-30T22:33:14.489Z] [INFO] GET /css/responsive.css 200 5ms +[2025-12-30T22:33:14.496Z] [INFO] GET /js/app.js 200 3ms +[2025-12-30T22:33:14.560Z] [INFO] GET /js/api.js 200 5ms +[2025-12-30T22:33:14.563Z] [INFO] GET /js/store.js 200 6ms +[2025-12-30T22:33:14.573Z] [INFO] GET /js/board.js 200 6ms +[2025-12-30T22:33:14.575Z] [INFO] GET /js/offline.js 200 6ms +[2025-12-30T22:33:14.579Z] [INFO] GET /js/auth.js 200 9ms +[2025-12-30T22:33:14.581Z] [INFO] GET /js/sync.js 200 9ms +[2025-12-30T22:33:14.591Z] [INFO] GET /js/task-modal.js 200 3ms +[2025-12-30T22:33:14.595Z] [INFO] GET /js/calendar.js 200 2ms +[2025-12-30T22:33:14.609Z] [INFO] GET /js/list.js 200 5ms +[2025-12-30T22:33:14.610Z] [INFO] GET /js/undo.js 200 6ms +[2025-12-30T22:33:14.611Z] [INFO] GET /js/shortcuts.js 200 4ms +[2025-12-30T22:33:14.626Z] [INFO] GET /js/admin.js 200 5ms +[2025-12-30T22:33:14.649Z] [INFO] GET /js/proposals.js 200 17ms +[2025-12-30T22:33:14.652Z] [INFO] GET /js/notifications.js 200 13ms +[2025-12-30T22:33:14.655Z] [INFO] GET /js/gitea.js 200 7ms +[2025-12-30T22:33:14.656Z] [INFO] GET /js/knowledge.js 200 5ms +[2025-12-30T22:33:14.659Z] [INFO] GET /js/utils.js 200 5ms +[2025-12-30T22:33:14.724Z] [INFO] GET /assets/icons/task.svg 200 6ms +[2025-12-30T22:33:14.727Z] [INFO] GET /sw.js 200 5ms +[2025-12-30T22:33:14.768Z] [INFO] GET /css/variables.css 304 1ms +[2025-12-30T22:33:14.771Z] [INFO] GET / 304 1ms +[2025-12-30T22:33:14.776Z] [INFO] GET /index.html 200 11ms +[2025-12-30T22:33:14.809Z] [INFO] GET /css/base.css 304 2ms +[2025-12-30T22:33:14.811Z] [INFO] GET /css/components.css 304 2ms +[2025-12-30T22:33:14.816Z] [INFO] GET /css/board.css 304 2ms +[2025-12-30T22:33:14.840Z] [INFO] GET /css/modal.css 304 3ms +[2025-12-30T22:33:14.851Z] [INFO] GET /css/calendar.css 304 3ms +[2025-12-30T22:33:14.852Z] [INFO] GET /css/responsive.css 304 3ms +[2025-12-30T22:33:14.873Z] [INFO] GET /js/app.js 304 1ms +[2025-12-30T22:33:14.882Z] [INFO] GET /js/utils.js 304 2ms +[2025-12-30T22:33:14.884Z] [INFO] GET /js/api.js 304 1ms +[2025-12-30T22:33:14.901Z] [INFO] GET /js/auth.js 304 1ms +[2025-12-30T22:33:14.911Z] [INFO] GET /js/store.js 304 1ms +[2025-12-30T22:33:14.915Z] [INFO] GET /js/sync.js 304 1ms +[2025-12-30T22:33:14.930Z] [INFO] GET /js/offline.js 304 0ms +[2025-12-30T22:33:14.959Z] [INFO] GET /js/board.js 304 3ms +[2025-12-30T22:33:14.965Z] [INFO] GET /js/task-modal.js 304 8ms +[2025-12-30T22:33:14.970Z] [INFO] GET /js/calendar.js 304 2ms +[2025-12-30T22:33:14.995Z] [INFO] GET /js/shortcuts.js 304 2ms +[2025-12-30T22:33:14.996Z] [INFO] GET /js/list.js 304 2ms +[2025-12-30T22:33:14.998Z] [INFO] GET /js/undo.js 304 1ms +[2025-12-30T22:33:15.026Z] [INFO] GET /js/admin.js 304 1ms +[2025-12-30T22:33:15.034Z] [INFO] GET /js/proposals.js 304 4ms +[2025-12-30T22:33:15.036Z] [INFO] GET /js/tour.js 200 7ms +[2025-12-30T22:33:15.059Z] [INFO] GET /js/notifications.js 304 0ms +[2025-12-30T22:33:15.064Z] [INFO] GET /js/knowledge.js 304 2ms +[2025-12-30T22:33:15.065Z] [INFO] GET /js/gitea.js 304 3ms +[2025-12-30T22:33:15.090Z] [INFO] GET /css/list.css 304 1ms +[2025-12-30T22:33:15.094Z] [INFO] GET /css/admin.css 304 1ms +[2025-12-30T22:33:15.097Z] [INFO] GET /css/proposals.css 304 1ms +[2025-12-30T22:33:15.120Z] [INFO] GET /css/notifications.css 304 1ms +[2025-12-30T22:33:15.126Z] [INFO] GET /css/gitea.css 304 3ms +[2025-12-30T22:33:15.131Z] [INFO] GET /css/knowledge.css 304 3ms +[2025-12-30T22:33:19.025Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de +[2025-12-30T22:33:19.027Z] [INFO] POST /api/auth/login 200 497ms +[2025-12-30T22:33:19.070Z] [INFO] GET /api/auth/users 200 8ms +[2025-12-30T22:33:19.115Z] [INFO] Socket connected: HG (GQ78Yme8BH9rMuH4AAAF) +[2025-12-30T22:33:19.122Z] [INFO] GET /api/projects 200 22ms +[2025-12-30T22:33:19.154Z] [INFO] HG joined project:[object Object] +[2025-12-30T22:33:19.179Z] [INFO] GET /api/tasks/project/2 200 20ms +[2025-12-30T22:33:19.182Z] [INFO] GET /api/columns/2 200 22ms +[2025-12-30T22:33:19.188Z] [INFO] GET /api/labels/2 200 4ms +[2025-12-30T22:33:19.198Z] [INFO] GET /api/stats/dashboard?projectId=2 200 7ms +[2025-12-30T22:33:19.256Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 200 10ms +[2025-12-30T22:33:19.307Z] [INFO] GET /api/notifications 200 6ms +[2025-12-30T22:33:19.352Z] [INFO] GET /api/knowledge/categories 200 10ms +[2025-12-30T22:33:26.196Z] [INFO] GET /api/health 200 5ms +[2025-12-30T22:33:31.281Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T22:33:33.850Z] [INFO] GET /api/knowledge/entries?categoryId=1 200 8ms +[2025-12-30T22:33:34.864Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T22:33:37.323Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T22:33:37.841Z] [INFO] GET /api/knowledge/entries?categoryId=2 200 8ms +[2025-12-30T22:33:38.242Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 5ms +[2025-12-30T22:33:39.197Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 7ms +[2025-12-30T22:33:39.617Z] [INFO] GET /api/knowledge/entries?categoryId=2 304 4ms +[2025-12-30T22:33:40.630Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T22:33:42.984Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T22:33:45.197Z] [INFO] Knowledge-Kategorie aktualisiert: AccountForger +[2025-12-30T22:33:45.198Z] [INFO] PUT /api/knowledge/categories/2 200 14ms +[2025-12-30T22:33:45.243Z] [INFO] GET /api/knowledge/categories 200 12ms +[2025-12-30T22:33:46.202Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T22:33:46.741Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 10ms +[2025-12-30T22:33:47.698Z] [INFO] GET /api/knowledge/entries?categoryId=2 304 4ms +[2025-12-30T22:33:48.704Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T22:33:49.959Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T22:33:54.072Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T22:33:56.294Z] [INFO] GET /api/health 200 1ms +[2025-12-30T22:33:57.083Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T22:34:12.725Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T22:34:16.129Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T22:34:18.291Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T22:34:18.503Z] [INFO] Knowledge-Kategorie erstellt: nützliche Links +[2025-12-30T22:34:18.504Z] [INFO] POST /api/knowledge/categories 201 10ms +[2025-12-30T22:34:18.538Z] [INFO] GET /api/knowledge/categories 200 4ms +[2025-12-30T22:34:19.515Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T22:34:19.566Z] [INFO] GET /api/knowledge/entries?categoryId=11 200 7ms +[2025-12-30T22:34:20.578Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T22:34:26.386Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:34:31.400Z] [INFO] GET /api/knowledge/entries?categoryId=11 304 6ms +[2025-12-30T22:34:32.108Z] [INFO] GET /api/knowledge/entries?categoryId=11 304 8ms +[2025-12-30T22:34:32.591Z] [INFO] GET /api/knowledge/entries?categoryId=11 304 9ms +[2025-12-30T22:34:33.601Z] [INFO] POST /api/auth/refresh 200 14ms +[2025-12-30T22:34:56.498Z] [INFO] GET /api/health 200 1ms +[2025-12-30T22:35:11.687Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T22:35:18.675Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T22:35:23.108Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T22:35:26.616Z] [INFO] GET /api/health 200 1ms +[2025-12-30T22:35:48.979Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T22:35:52.687Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T22:35:54.250Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T22:35:55.755Z] [INFO] Knowledge-Eintrag erstellt: Testlink +[2025-12-30T22:35:55.757Z] [INFO] POST /api/knowledge/entries 201 12ms +[2025-12-30T22:35:55.795Z] [INFO] GET /api/knowledge/entries?categoryId=11 200 6ms +[2025-12-30T22:35:55.837Z] [INFO] GET /api/knowledge/categories 200 8ms +[2025-12-30T22:35:56.727Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:35:56.752Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T22:35:58.696Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T22:35:59.848Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T22:36:03.325Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T22:36:04.633Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T22:36:11.261Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T22:36:14.421Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T22:36:16.199Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T22:36:16.775Z] [INFO] Knowledge-Eintrag erstellt: Testlink 2 +[2025-12-30T22:36:16.777Z] [INFO] POST /api/knowledge/entries 201 7ms +[2025-12-30T22:36:16.811Z] [INFO] GET /api/knowledge/entries?categoryId=11 200 4ms +[2025-12-30T22:36:16.844Z] [INFO] GET /api/knowledge/categories 200 4ms +[2025-12-30T22:36:17.775Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T22:36:18.904Z] [INFO] PUT /api/knowledge/entries/3/position 200 5ms +[2025-12-30T22:36:20.759Z] [INFO] PUT /api/knowledge/entries/3/position 200 6ms +[2025-12-30T22:36:23.155Z] [INFO] GET /api/knowledge/entries?categoryId=2 304 8ms +[2025-12-30T22:36:23.492Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 6ms +[2025-12-30T22:36:24.502Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T22:36:25.484Z] [INFO] GET /api/knowledge/entries?categoryId=2 304 7ms +[2025-12-30T22:36:25.811Z] [INFO] GET /api/knowledge/entries?categoryId=11 304 5ms +[2025-12-30T22:36:26.152Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 6ms +[2025-12-30T22:36:26.734Z] [INFO] GET /api/knowledge/entries?categoryId=11 304 4ms +[2025-12-30T22:36:26.825Z] [INFO] GET /api/health 200 1ms +[2025-12-30T22:36:27.053Z] [INFO] GET /api/knowledge/entries?categoryId=2 304 3ms +[2025-12-30T22:36:28.062Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T22:36:56.933Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:37:27.027Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:37:33.749Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T22:37:35.609Z] [INFO] GET /api/knowledge/search?q=you 200 9ms +[2025-12-30T22:37:36.312Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T22:37:38.055Z] [INFO] GET /api/knowledge/search?q=yo 200 5ms +[2025-12-30T22:37:38.297Z] [INFO] GET /api/knowledge/entries?categoryId=2 304 4ms +[2025-12-30T22:37:39.573Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T22:37:41.039Z] [INFO] GET /api/tasks/6 200 15ms +[2025-12-30T22:37:41.084Z] [INFO] GET /api/subtasks/6 200 12ms +[2025-12-30T22:37:41.121Z] [INFO] GET /api/links/6 200 7ms +[2025-12-30T22:37:41.149Z] [INFO] GET /api/files/6 200 10ms +[2025-12-30T22:37:41.156Z] [INFO] GET /api/comments/6 200 5ms +[2025-12-30T22:37:41.161Z] [INFO] GET /api/tasks/6/history 404 4ms +[2025-12-30T22:37:41.195Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJIRyIsImRpc3BsYXlOYW1lIjoiSGVuZHJpayIsImNvbG9yIjoiI0Y1OUUwQiIsInJvbGUiOiJ1c2VyIiwicGVybWlzc2lvbnMiOlsiZ2VuZWhtaWd1bmciXSwiaWF0IjoxNzY3MTM0MjU5LCJleHAiOjE3NjcxMzQ4NTl9.KoNOeSyfa_Hs8yCay3JqbF2QZ5Nv6vB2I4qApEVykuM 200 9ms +[2025-12-30T22:37:41.196Z] [INFO] GET /api/files/preview/7?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwidXNlcm5hbWUiOiJIRyIsImRpc3BsYXlOYW1lIjoiSGVuZHJpayIsImNvbG9yIjoiI0Y1OUUwQiIsInJvbGUiOiJ1c2VyIiwicGVybWlzc2lvbnMiOlsiZ2VuZWhtaWd1bmciXSwiaWF0IjoxNzY3MTM0MjU5LCJleHAiOjE3NjcxMzQ4NTl9.KoNOeSyfa_Hs8yCay3JqbF2QZ5Nv6vB2I4qApEVykuM 200 15ms +[2025-12-30T22:37:42.042Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T22:37:54.307Z] [INFO] GET / 200 5ms +[2025-12-30T22:37:54.374Z] [INFO] GET /css/variables.css 304 1ms +[2025-12-30T22:37:54.376Z] [INFO] GET /css/base.css 304 1ms +[2025-12-30T22:37:54.401Z] [INFO] GET /css/components.css 304 2ms +[2025-12-30T22:37:54.404Z] [INFO] GET /css/board.css 304 1ms +[2025-12-30T22:37:54.412Z] [INFO] GET /css/modal.css 304 1ms +[2025-12-30T22:37:54.416Z] [INFO] GET /css/calendar.css 304 1ms +[2025-12-30T22:37:54.419Z] [INFO] GET /css/list.css 304 1ms +[2025-12-30T22:37:54.423Z] [INFO] GET /css/proposals.css 304 1ms +[2025-12-30T22:37:54.424Z] [INFO] GET /css/notifications.css 304 2ms +[2025-12-30T22:37:54.425Z] [INFO] GET /css/admin.css 304 2ms +[2025-12-30T22:37:54.430Z] [INFO] GET /css/gitea.css 304 1ms +[2025-12-30T22:37:54.434Z] [INFO] GET /css/knowledge.css 200 1ms +[2025-12-30T22:37:54.436Z] [INFO] GET /css/responsive.css 304 0ms +[2025-12-30T22:37:54.443Z] [INFO] GET /js/app.js 200 2ms +[2025-12-30T22:37:54.510Z] [INFO] GET /js/offline.js 304 3ms +[2025-12-30T22:37:54.511Z] [INFO] GET /js/store.js 304 3ms +[2025-12-30T22:37:54.515Z] [INFO] GET /js/api.js 200 9ms +[2025-12-30T22:37:54.517Z] [INFO] GET /js/auth.js 200 5ms +[2025-12-30T22:37:54.518Z] [INFO] GET /js/board.js 304 2ms +[2025-12-30T22:37:54.520Z] [INFO] GET /js/sync.js 200 6ms +[2025-12-30T22:37:54.538Z] [INFO] GET /js/task-modal.js 304 2ms +[2025-12-30T22:37:54.539Z] [INFO] GET /js/calendar.js 304 2ms +[2025-12-30T22:37:54.549Z] [INFO] GET /js/list.js 304 1ms +[2025-12-30T22:37:54.558Z] [INFO] GET /js/undo.js 304 1ms +[2025-12-30T22:37:54.561Z] [INFO] GET /js/shortcuts.js 304 2ms +[2025-12-30T22:37:54.563Z] [INFO] GET /js/admin.js 304 1ms +[2025-12-30T22:37:54.566Z] [INFO] GET /js/proposals.js 304 2ms +[2025-12-30T22:37:54.572Z] [INFO] GET /js/knowledge.js 200 3ms +[2025-12-30T22:37:54.576Z] [INFO] GET /js/notifications.js 304 1ms +[2025-12-30T22:37:54.582Z] [INFO] GET /js/gitea.js 304 1ms +[2025-12-30T22:37:54.588Z] [INFO] GET /js/utils.js 304 1ms +[2025-12-30T22:37:54.631Z] [INFO] POST /api/auth/refresh 200 17ms +[2025-12-30T22:37:54.821Z] [INFO] GET /api/auth/users 304 10ms +[2025-12-30T22:37:54.892Z] [INFO] GET /api/auth/users 304 9ms +[2025-12-30T22:37:54.930Z] [INFO] Socket connected: MH (Oq1cCkzJG02iC_MuAAAH) +[2025-12-30T22:37:54.940Z] [INFO] GET /api/projects 304 5ms +[2025-12-30T22:37:54.944Z] [INFO] GET /assets/icons/task.svg 200 3ms +[2025-12-30T22:37:54.978Z] [INFO] MH joined project:[object Object] +[2025-12-30T22:37:54.987Z] [INFO] GET /api/stats/dashboard?projectId=2 304 8ms +[2025-12-30T22:37:54.995Z] [INFO] GET /api/columns/2 304 15ms +[2025-12-30T22:37:55.009Z] [INFO] GET /api/tasks/project/2 200 13ms +[2025-12-30T22:37:55.015Z] [INFO] GET /api/labels/2 304 5ms +[2025-12-30T22:37:55.085Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 6ms +[2025-12-30T22:37:55.117Z] [INFO] GET /api/notifications 304 11ms +[2025-12-30T22:37:55.146Z] [INFO] GET /api/knowledge/categories 200 4ms +[2025-12-30T22:37:56.622Z] [INFO] GET /sw.js 200 4ms +[2025-12-30T22:37:56.658Z] [INFO] GET / 304 2ms +[2025-12-30T22:37:56.665Z] [INFO] GET /css/variables.css 304 3ms +[2025-12-30T22:37:56.672Z] [INFO] GET /index.html 200 12ms +[2025-12-30T22:37:56.677Z] [INFO] GET /css/base.css 304 1ms +[2025-12-30T22:37:56.686Z] [INFO] GET /css/components.css 304 1ms +[2025-12-30T22:37:56.689Z] [INFO] GET /sw.js 200 2ms +[2025-12-30T22:37:56.700Z] [INFO] GET /css/board.css 304 1ms +[2025-12-30T22:37:56.704Z] [INFO] GET /css/modal.css 304 0ms +[2025-12-30T22:37:56.716Z] [INFO] GET /css/calendar.css 304 2ms +[2025-12-30T22:37:56.722Z] [INFO] GET /css/responsive.css 304 2ms +[2025-12-30T22:37:56.724Z] [INFO] GET /js/app.js 304 0ms +[2025-12-30T22:37:56.737Z] [INFO] GET /js/utils.js 304 2ms +[2025-12-30T22:37:56.743Z] [INFO] GET /js/api.js 304 2ms +[2025-12-30T22:37:56.747Z] [INFO] GET /js/auth.js 304 2ms +[2025-12-30T22:37:56.759Z] [INFO] GET /js/store.js 304 1ms +[2025-12-30T22:37:56.761Z] [INFO] GET /js/sync.js 304 1ms +[2025-12-30T22:37:56.766Z] [INFO] GET /js/offline.js 304 1ms +[2025-12-30T22:37:56.786Z] [INFO] GET /js/task-modal.js 304 1ms +[2025-12-30T22:37:56.787Z] [INFO] GET /js/board.js 304 1ms +[2025-12-30T22:37:56.789Z] [INFO] GET /js/calendar.js 304 1ms +[2025-12-30T22:37:56.837Z] [INFO] GET /js/list.js 304 2ms +[2025-12-30T22:37:56.840Z] [INFO] GET /js/shortcuts.js 304 2ms +[2025-12-30T22:37:56.846Z] [INFO] GET /js/undo.js 304 2ms +[2025-12-30T22:37:56.858Z] [INFO] GET /js/tour.js 304 2ms +[2025-12-30T22:37:56.862Z] [INFO] GET /js/admin.js 304 1ms +[2025-12-30T22:37:56.867Z] [INFO] GET /js/proposals.js 304 1ms +[2025-12-30T22:37:56.877Z] [INFO] GET /js/notifications.js 304 1ms +[2025-12-30T22:37:56.881Z] [INFO] GET /js/gitea.js 304 1ms +[2025-12-30T22:37:56.887Z] [INFO] GET /js/knowledge.js 304 1ms +[2025-12-30T22:37:56.899Z] [INFO] GET /css/list.css 304 1ms +[2025-12-30T22:37:56.904Z] [INFO] GET /css/admin.css 304 1ms +[2025-12-30T22:37:56.910Z] [INFO] GET /css/proposals.css 304 2ms +[2025-12-30T22:37:56.922Z] [INFO] GET /css/notifications.css 304 1ms +[2025-12-30T22:37:56.925Z] [INFO] GET /css/gitea.css 304 1ms +[2025-12-30T22:37:56.930Z] [INFO] GET /css/knowledge.css 304 1ms +[2025-12-30T22:37:57.121Z] [INFO] GET /api/health 200 1ms +[2025-12-30T22:37:58.984Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T22:38:01.332Z] [INFO] GET /api/knowledge/entries?categoryId=1 200 8ms +[2025-12-30T22:38:02.344Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T22:38:03.787Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T22:38:05.047Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T22:38:05.349Z] [INFO] GET /api/knowledge/entries?categoryId=11 200 7ms +[2025-12-30T22:38:06.345Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T22:38:08.981Z] [INFO] PUT /api/subtasks/13 200 11ms +[2025-12-30T22:38:09.025Z] [INFO] PUT /api/subtasks/13/position 200 9ms +[2025-12-30T22:38:09.191Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T22:38:09.967Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T22:38:12.753Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6) +[2025-12-30T22:38:12.755Z] [INFO] PUT /api/tasks/6 200 8ms +[2025-12-30T22:38:13.759Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T22:38:15.583Z] [INFO] POST /api/auth/refresh 200 14ms +[2025-12-30T22:38:17.153Z] [INFO] POST /api/auth/refresh 200 14ms +[2025-12-30T22:38:18.400Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T22:38:27.242Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:38:28.533Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T22:38:30.821Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 9ms +[2025-12-30T22:38:31.230Z] [INFO] GET /api/knowledge/entries?categoryId=2 304 9ms +[2025-12-30T22:38:31.564Z] [INFO] GET /api/knowledge/entries?categoryId=11 304 9ms +[2025-12-30T22:38:32.566Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T22:38:57.368Z] [INFO] GET /api/health 200 1ms +[2025-12-30T22:39:27.466Z] [INFO] GET /api/health 200 1ms +[2025-12-30T22:39:57.596Z] [INFO] GET /api/health 200 7ms +[2025-12-30T22:40:14.246Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T22:40:15.271Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T22:40:17.729Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T22:40:18.915Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T22:40:23.066Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T22:40:27.468Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T22:40:27.692Z] [INFO] GET /api/health 200 1ms +[2025-12-30T22:40:28.584Z] [INFO] Knowledge-Eintrag erstellt: AI Video Kanal +[2025-12-30T22:40:28.585Z] [INFO] POST /api/knowledge/entries 201 7ms +[2025-12-30T22:40:28.611Z] [INFO] GET /api/knowledge/entries?categoryId=11 200 5ms +[2025-12-30T22:40:28.643Z] [INFO] GET /api/knowledge/categories 200 10ms +[2025-12-30T22:40:29.588Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T22:40:33.413Z] [INFO] POST /api/auth/refresh 200 16ms +[2025-12-30T22:40:57.787Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:41:18.069Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T22:41:19.207Z] [INFO] GET /api/knowledge/entries?categoryId=2 200 8ms +[2025-12-30T22:41:20.215Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T22:41:21.920Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 6ms +[2025-12-30T22:41:22.718Z] [INFO] GET /api/knowledge/entries?categoryId=2 304 6ms +[2025-12-30T22:41:23.131Z] [INFO] GET /api/knowledge/entries?categoryId=11 304 5ms +[2025-12-30T22:41:23.576Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 4ms +[2025-12-30T22:41:24.589Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T22:41:25.185Z] [INFO] GET /api/knowledge/entries?categoryId=11 304 9ms +[2025-12-30T22:41:26.189Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T22:41:26.914Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 6ms +[2025-12-30T22:41:27.884Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:41:27.912Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T22:41:29.738Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T22:41:31.711Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T22:41:58.072Z] [INFO] GET /api/health 200 7ms +[2025-12-30T22:42:28.181Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:42:58.284Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:43:15.645Z] [INFO] POST /api/auth/refresh 200 17ms +[2025-12-30T22:43:23.825Z] [INFO] GET /api/git/server/info 200 59ms +[2025-12-30T22:43:23.898Z] [INFO] GET /api/git/server/status 200 51ms +[2025-12-30T22:43:23.914Z] [INFO] GET /api/git/server/branches 200 14ms +[2025-12-30T22:43:23.936Z] [INFO] GET /api/git/server/commits?limit=10 200 35ms +[2025-12-30T22:43:24.785Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T22:43:27.114Z] [INFO] GET /api/gitea/repositories?page=1&limit=50 200 570ms +[2025-12-30T22:43:27.608Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T22:43:28.401Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:43:28.892Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T22:43:31.083Z] [INFO] POST /api/auth/refresh 200 4ms +[2025-12-30T22:43:33.264Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T22:43:58.491Z] [INFO] GET /api/health 200 1ms +[2025-12-30T22:44:28.601Z] [INFO] GET /api/health 200 5ms +[2025-12-30T22:44:31.412Z] [INFO] SIGTERM empfangen, fahre herunter... +[2025-12-30T22:44:53.064Z] [ERROR] Fehler beim Abrufen der Upload-Einstellungen: +[2025-12-30T22:44:53.179Z] [INFO] Umgebung: production +[2025-12-30T22:44:53.181Z] [INFO] Backup-Scheduler gestartet (alle 24 Stunden) +[2025-12-30T22:44:53.181Z] [INFO] Automatische Backups aktiviert +[2025-12-30T22:44:53.171Z] [INFO] Datenbank-Tabellen erstellt +[2025-12-30T22:44:53.179Z] [INFO] Server läuft auf Port 3000 +[2025-12-30T22:44:53.174Z] [INFO] Datenbank initialisiert +[2025-12-30T22:44:53.943Z] [INFO] POST /api/auth/refresh 200 26ms +[2025-12-30T22:44:55.981Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T22:44:56.940Z] [INFO] GET /api/health 200 8ms +[2025-12-30T22:44:57.473Z] [INFO] Socket connected: MH (Gs99TuHJwdY62QpdAAAD) +[2025-12-30T22:44:57.518Z] [INFO] MH joined project:[object Object] +[2025-12-30T22:45:03.960Z] [INFO] GET / 200 21ms +[2025-12-30T22:45:27.057Z] [INFO] GET /api/health 200 4ms +[2025-12-30T22:45:36.173Z] [INFO] GET / 200 8ms +[2025-12-30T22:45:36.256Z] [INFO] GET /css/variables.css 200 7ms +[2025-12-30T22:45:36.289Z] [INFO] GET /css/base.css 200 3ms +[2025-12-30T22:45:36.312Z] [INFO] GET /css/components.css 200 3ms +[2025-12-30T22:45:36.316Z] [INFO] GET /css/board.css 200 5ms +[2025-12-30T22:45:36.332Z] [INFO] GET /css/modal.css 200 8ms +[2025-12-30T22:45:36.338Z] [INFO] GET /css/calendar.css 200 10ms +[2025-12-30T22:45:36.346Z] [INFO] GET /css/list.css 200 6ms +[2025-12-30T22:45:36.348Z] [INFO] GET /css/admin.css 200 4ms +[2025-12-30T22:45:36.369Z] [INFO] GET /css/notifications.css 200 4ms +[2025-12-30T22:45:36.370Z] [INFO] GET /css/proposals.css 200 4ms +[2025-12-30T22:45:36.374Z] [INFO] GET /css/gitea.css 200 3ms +[2025-12-30T22:45:36.393Z] [INFO] GET /css/knowledge.css 200 3ms +[2025-12-30T22:45:36.397Z] [INFO] GET /css/responsive.css 200 3ms +[2025-12-30T22:45:36.408Z] [INFO] GET /js/app.js 200 9ms +[2025-12-30T22:45:36.487Z] [INFO] GET /js/api.js 200 8ms +[2025-12-30T22:45:36.492Z] [INFO] GET /js/store.js 200 10ms +[2025-12-30T22:45:36.496Z] [INFO] GET /js/sync.js 200 11ms +[2025-12-30T22:45:36.499Z] [INFO] GET /js/offline.js 200 9ms +[2025-12-30T22:45:36.502Z] [INFO] GET /js/auth.js 200 8ms +[2025-12-30T22:45:36.507Z] [INFO] GET /js/board.js 200 9ms +[2025-12-30T22:45:36.513Z] [INFO] GET /js/task-modal.js 200 3ms +[2025-12-30T22:45:36.526Z] [INFO] GET /js/calendar.js 200 2ms +[2025-12-30T22:45:36.532Z] [INFO] GET /js/shortcuts.js 200 2ms +[2025-12-30T22:45:36.534Z] [INFO] GET /js/list.js 200 4ms +[2025-12-30T22:45:36.537Z] [INFO] GET /js/undo.js 200 2ms +[2025-12-30T22:45:36.543Z] [INFO] GET /js/proposals.js 200 2ms +[2025-12-30T22:45:36.559Z] [INFO] GET /js/notifications.js 200 3ms +[2025-12-30T22:45:36.561Z] [INFO] GET /js/gitea.js 200 6ms +[2025-12-30T22:45:36.571Z] [INFO] GET /js/utils.js 200 3ms +[2025-12-30T22:45:36.573Z] [INFO] GET /js/knowledge.js 200 4ms +[2025-12-30T22:45:36.583Z] [INFO] GET /js/admin.js 200 3ms +[2025-12-30T22:45:36.636Z] [INFO] GET /sw.js 200 7ms +[2025-12-30T22:45:36.646Z] [INFO] GET /assets/icons/task.svg 200 12ms +[2025-12-30T22:45:36.675Z] [INFO] GET / 304 3ms +[2025-12-30T22:45:36.679Z] [INFO] GET /css/variables.css 304 2ms +[2025-12-30T22:45:36.681Z] [INFO] GET /index.html 200 8ms +[2025-12-30T22:45:36.717Z] [INFO] GET /css/components.css 304 1ms +[2025-12-30T22:45:36.722Z] [INFO] GET /css/base.css 304 1ms +[2025-12-30T22:45:36.731Z] [INFO] GET /css/board.css 304 2ms +[2025-12-30T22:45:36.752Z] [INFO] GET /css/modal.css 304 2ms +[2025-12-30T22:45:36.757Z] [INFO] GET /css/calendar.css 304 2ms +[2025-12-30T22:45:36.789Z] [INFO] GET /css/responsive.css 304 3ms +[2025-12-30T22:45:36.796Z] [INFO] GET /js/app.js 304 2ms +[2025-12-30T22:45:36.800Z] [INFO] GET /js/utils.js 304 2ms +[2025-12-30T22:45:36.822Z] [INFO] GET /js/api.js 304 1ms +[2025-12-30T22:45:36.830Z] [INFO] GET /js/store.js 304 1ms +[2025-12-30T22:45:36.832Z] [INFO] GET /js/auth.js 304 1ms +[2025-12-30T22:45:36.858Z] [INFO] GET /js/sync.js 304 3ms +[2025-12-30T22:45:36.869Z] [INFO] GET /js/offline.js 304 6ms +[2025-12-30T22:45:36.872Z] [INFO] GET /js/board.js 304 2ms +[2025-12-30T22:45:36.892Z] [INFO] GET /js/task-modal.js 304 2ms +[2025-12-30T22:45:36.899Z] [INFO] GET /js/calendar.js 304 1ms +[2025-12-30T22:45:36.902Z] [INFO] GET /js/list.js 304 0ms +[2025-12-30T22:45:36.924Z] [INFO] GET /js/shortcuts.js 304 3ms +[2025-12-30T22:45:36.936Z] [INFO] GET /js/undo.js 304 4ms +[2025-12-30T22:45:36.945Z] [INFO] GET /js/tour.js 200 5ms +[2025-12-30T22:45:36.960Z] [INFO] GET /js/admin.js 304 1ms +[2025-12-30T22:45:36.964Z] [INFO] GET /js/proposals.js 304 1ms +[2025-12-30T22:45:36.977Z] [INFO] GET /js/notifications.js 304 1ms +[2025-12-30T22:45:36.991Z] [INFO] GET /js/gitea.js 304 1ms +[2025-12-30T22:45:36.996Z] [INFO] GET /js/knowledge.js 304 1ms +[2025-12-30T22:45:37.011Z] [INFO] GET /css/list.css 304 2ms +[2025-12-30T22:45:37.022Z] [INFO] GET /css/admin.css 304 1ms +[2025-12-30T22:45:37.029Z] [INFO] GET /css/proposals.css 304 4ms +[2025-12-30T22:45:37.047Z] [INFO] GET /css/notifications.css 304 3ms +[2025-12-30T22:45:37.051Z] [INFO] GET /css/gitea.css 304 1ms +[2025-12-30T22:45:37.059Z] [INFO] GET /css/knowledge.css 304 1ms +[2025-12-30T22:45:40.688Z] [INFO] Login erfolgreich: hendrik_gebhardt@gmx.de +[2025-12-30T22:45:40.692Z] [INFO] POST /api/auth/login 200 510ms +[2025-12-30T22:45:40.740Z] [INFO] GET /api/auth/users 200 11ms +[2025-12-30T22:45:40.766Z] [INFO] Socket connected: HG (5rh4-JpxNWea6gESAAAF) +[2025-12-30T22:45:40.783Z] [INFO] GET /api/projects 200 9ms +[2025-12-30T22:45:40.818Z] [INFO] HG joined project:[object Object] +[2025-12-30T22:45:40.856Z] [INFO] GET /api/tasks/project/2 200 37ms +[2025-12-30T22:45:40.865Z] [INFO] GET /api/columns/2 200 7ms +[2025-12-30T22:45:40.870Z] [INFO] GET /api/stats/dashboard?projectId=2 200 10ms +[2025-12-30T22:45:40.875Z] [INFO] GET /api/labels/2 200 4ms +[2025-12-30T22:45:40.959Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 200 4ms +[2025-12-30T22:45:41.000Z] [INFO] GET /api/notifications 200 9ms +[2025-12-30T22:45:41.048Z] [INFO] GET /api/knowledge/categories 200 9ms +[2025-12-30T22:45:41.471Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T22:45:44.570Z] [INFO] POST /api/auth/refresh 200 15ms +[2025-12-30T22:45:47.323Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T22:45:51.953Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T22:45:53.187Z] [INFO] Backup erstellt: backup_2025-12-30T22-45-53-182Z.db +[2025-12-30T22:45:53.191Z] [INFO] Altes Backup gelöscht: backup_2025-12-29T21-09-27-499Z.db +[2025-12-30T22:45:53.193Z] [INFO] Fälligkeits-Check für Benachrichtigungen gestartet +[2025-12-30T22:45:57.153Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:45:58.024Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T22:45:58.036Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T22:45:59.862Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T22:46:01.070Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T22:46:02.963Z] [INFO] POST /api/auth/refresh 200 15ms +[2025-12-30T22:46:05.025Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T22:46:13.511Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T22:46:18.016Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T22:46:18.404Z] [INFO] Knowledge-Kategorie aktualisiert: nützliche Links +[2025-12-30T22:46:18.405Z] [INFO] PUT /api/knowledge/categories/11 200 9ms +[2025-12-30T22:46:18.441Z] [INFO] GET /api/knowledge/categories 200 4ms +[2025-12-30T22:46:19.406Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T22:46:20.529Z] [INFO] GET /api/knowledge/entries?categoryId=2 200 5ms +[2025-12-30T22:46:21.539Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T22:46:24.669Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T22:46:27.246Z] [INFO] GET /api/health 200 1ms +[2025-12-30T22:46:27.467Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T22:46:38.499Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T22:46:39.424Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T22:46:39.888Z] [INFO] GET /api/tasks/6 200 7ms +[2025-12-30T22:46:39.924Z] [INFO] GET /api/subtasks/6 200 7ms +[2025-12-30T22:46:39.949Z] [INFO] GET /api/links/6 304 4ms +[2025-12-30T22:46:39.957Z] [INFO] GET /api/files/6 304 4ms +[2025-12-30T22:46:39.960Z] [INFO] GET /api/comments/6 304 6ms +[2025-12-30T22:46:39.963Z] [INFO] GET /api/tasks/6/history 404 2ms +[2025-12-30T22:46:39.989Z] [INFO] GET /api/files/preview/2?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMzQ3OTksImV4cCI6MTc2NzEzNTM5OX0.69ToN05ucR02Q5JR8FWbUHpLEPX48ha4OpJJBsFfyLs 200 12ms +[2025-12-30T22:46:39.990Z] [INFO] GET /api/files/preview/7?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NCwidXNlcm5hbWUiOiJNSCIsImRpc3BsYXlOYW1lIjoiTW9uYW1pIiwiY29sb3IiOiIjMDAzYjk5Iiwicm9sZSI6InVzZXIiLCJwZXJtaXNzaW9ucyI6WyJnZW5laG1pZ3VuZyJdLCJpYXQiOjE3NjcxMzQ3OTksImV4cCI6MTc2NzEzNTM5OX0.69ToN05ucR02Q5JR8FWbUHpLEPX48ha4OpJJBsFfyLs 200 13ms +[2025-12-30T22:46:40.892Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T22:46:43.348Z] [INFO] GET /api/knowledge/entries?categoryId=11 200 7ms +[2025-12-30T22:46:43.402Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T22:46:44.349Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T22:46:46.816Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T22:46:48.654Z] [INFO] Knowledge-Kategorie aktualisiert: nützliche Links +[2025-12-30T22:46:48.655Z] [INFO] PUT /api/knowledge/categories/11 200 4ms +[2025-12-30T22:46:48.696Z] [INFO] GET /api/knowledge/categories 200 8ms +[2025-12-30T22:46:49.662Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T22:46:50.075Z] [INFO] GET /api/knowledge/entries?categoryId=2 304 9ms +[2025-12-30T22:46:51.071Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T22:46:53.487Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T22:46:57.373Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:46:58.100Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T22:47:27.485Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:47:30.444Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T22:47:32.676Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T22:47:32.864Z] [INFO] Knowledge-Kategorie aktualisiert: AccountForger +[2025-12-30T22:47:32.866Z] [INFO] PUT /api/knowledge/categories/2 200 13ms +[2025-12-30T22:47:32.909Z] [INFO] GET /api/knowledge/categories 200 3ms +[2025-12-30T22:47:33.864Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T22:47:34.254Z] [INFO] GET /api/knowledge/entries?categoryId=1 200 9ms +[2025-12-30T22:47:35.260Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T22:47:38.586Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T22:47:42.640Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T22:47:47.597Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T22:47:49.275Z] [INFO] POST /api/auth/refresh 200 14ms +[2025-12-30T22:47:50.902Z] [WARN] Abgelehnter Upload: 01.mp4 (video/mp4) +[2025-12-30T22:47:50.904Z] [ERROR] Error: Dateityp nicht erlaubt: video/mp4 {"stack":"Error: Dateityp nicht erlaubt: video/mp4\n at fileFilter (/app/middleware/upload.js:113:8)\n at wrappedFileFilter (/app/node_modules/multer/index.js:44:7)\n at Multipart. (/app/node_modules/multer/lib/make-middleware.js:109:7)\n at Multipart.emit (node:events:524:28)\n at HeaderParser.cb (/app/node_modules/busboy/lib/types/multipart.js:358:14)\n at HeaderParser.push (/app/node_modules/busboy/lib/types/multipart.js:162:20)\n at SBMH.ssCb [as _cb] (/app/node_modules/busboy/lib/types/multipart.js:394:37)\n at feed (/app/node_modules/streamsearch/lib/sbmh.js:248:10)\n at SBMH.push (/app/node_modules/streamsearch/lib/sbmh.js:104:16)\n at Multipart._write (/app/node_modules/busboy/lib/types/multipart.js:567:19)"} +[2025-12-30T22:47:50.907Z] [INFO] POST /api/files/6 500 21ms +[2025-12-30T22:47:50.956Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T22:47:57.611Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:47:58.062Z] [INFO] PUT /api/knowledge/categories/1 200 7ms +[2025-12-30T22:47:58.060Z] [INFO] Knowledge-Kategorie aktualisiert: Router +[2025-12-30T22:47:58.100Z] [INFO] GET /api/knowledge/categories 200 8ms +[2025-12-30T22:47:59.982Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T22:48:03.707Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T22:48:06.925Z] [INFO] GET / 304 1ms +[2025-12-30T22:48:06.964Z] [INFO] Socket disconnected: HG (5rh4-JpxNWea6gESAAAF) +[2025-12-30T22:48:06.969Z] [INFO] GET /css/variables.css 304 1ms +[2025-12-30T22:48:07.003Z] [INFO] GET /css/base.css 304 4ms +[2025-12-30T22:48:07.027Z] [INFO] GET /css/components.css 304 2ms +[2025-12-30T22:48:07.031Z] [INFO] GET /css/board.css 304 1ms +[2025-12-30T22:48:07.036Z] [INFO] GET /css/modal.css 304 1ms +[2025-12-30T22:48:07.041Z] [INFO] GET /css/calendar.css 304 1ms +[2025-12-30T22:48:07.044Z] [INFO] GET /css/list.css 304 1ms +[2025-12-30T22:48:07.047Z] [INFO] GET /css/admin.css 304 1ms +[2025-12-30T22:48:07.054Z] [INFO] GET /css/proposals.css 304 1ms +[2025-12-30T22:48:07.071Z] [INFO] GET /css/knowledge.css 304 2ms +[2025-12-30T22:48:07.072Z] [INFO] GET /css/gitea.css 304 2ms +[2025-12-30T22:48:07.074Z] [INFO] GET /css/responsive.css 304 1ms +[2025-12-30T22:48:07.077Z] [INFO] GET /css/notifications.css 304 1ms +[2025-12-30T22:48:07.081Z] [INFO] GET /js/app.js 304 1ms +[2025-12-30T22:48:07.120Z] [INFO] GET /js/api.js 304 1ms +[2025-12-30T22:48:07.122Z] [INFO] GET /js/board.js 304 1ms +[2025-12-30T22:48:07.126Z] [INFO] GET /js/sync.js 304 3ms +[2025-12-30T22:48:07.127Z] [INFO] GET /js/offline.js 304 2ms +[2025-12-30T22:48:07.128Z] [INFO] GET /js/store.js 304 0ms +[2025-12-30T22:48:07.130Z] [INFO] GET /js/auth.js 304 1ms +[2025-12-30T22:48:07.152Z] [INFO] GET /js/calendar.js 304 2ms +[2025-12-30T22:48:07.153Z] [INFO] GET /js/task-modal.js 304 2ms +[2025-12-30T22:48:07.156Z] [INFO] GET /js/list.js 304 1ms +[2025-12-30T22:48:07.160Z] [INFO] GET /js/shortcuts.js 304 1ms +[2025-12-30T22:48:07.164Z] [INFO] GET /js/undo.js 304 2ms +[2025-12-30T22:48:07.165Z] [INFO] GET /js/admin.js 304 2ms +[2025-12-30T22:48:07.178Z] [INFO] GET /js/proposals.js 304 1ms +[2025-12-30T22:48:07.187Z] [INFO] GET /js/notifications.js 304 1ms +[2025-12-30T22:48:07.189Z] [INFO] GET /js/gitea.js 304 3ms +[2025-12-30T22:48:07.193Z] [INFO] GET /js/utils.js 304 1ms +[2025-12-30T22:48:07.194Z] [INFO] GET /js/knowledge.js 304 2ms +[2025-12-30T22:48:07.236Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T22:48:07.242Z] [INFO] GET /api/auth/users 304 5ms +[2025-12-30T22:48:07.245Z] [INFO] GET /assets/icons/task.svg 304 2ms +[2025-12-30T22:48:07.286Z] [INFO] GET /api/auth/users 304 8ms +[2025-12-30T22:48:07.316Z] [INFO] Socket connected: HG (wYxXqS3-Ze65HrFMAAAH) +[2025-12-30T22:48:07.328Z] [INFO] GET /api/projects 304 6ms +[2025-12-30T22:48:07.373Z] [INFO] GET /api/labels/2 304 8ms +[2025-12-30T22:48:07.381Z] [INFO] GET /api/stats/dashboard?projectId=2 304 7ms +[2025-12-30T22:48:07.387Z] [INFO] GET /api/columns/2 304 5ms +[2025-12-30T22:48:07.404Z] [INFO] GET /api/tasks/project/2 304 14ms +[2025-12-30T22:48:07.406Z] [INFO] HG joined project:[object Object] +[2025-12-30T22:48:07.448Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 3ms +[2025-12-30T22:48:07.502Z] [INFO] GET /api/notifications 304 9ms +[2025-12-30T22:48:07.538Z] [INFO] GET /api/knowledge/categories 304 5ms +[2025-12-30T22:48:08.975Z] [INFO] GET /sw.js 304 1ms +[2025-12-30T22:48:09.525Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T22:48:14.638Z] [INFO] GET /api/knowledge/entries?categoryId=11 304 5ms +[2025-12-30T22:48:15.639Z] [INFO] POST /api/auth/refresh 200 6ms +[2025-12-30T22:48:16.187Z] [INFO] Aufgabe aktualisiert: Taskmate - Wunschliste für künftige Updates (ID: 6) +[2025-12-30T22:48:16.190Z] [INFO] PUT /api/tasks/6 200 16ms +[2025-12-30T22:48:17.193Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T22:48:17.936Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T22:48:19.978Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T22:48:20.420Z] [INFO] POST /api/auth/refresh 200 13ms +[2025-12-30T22:48:21.254Z] [INFO] GET / 200 3ms +[2025-12-30T22:48:21.298Z] [INFO] Socket disconnected: MH (Gs99TuHJwdY62QpdAAAD) +[2025-12-30T22:48:21.322Z] [INFO] GET /css/variables.css 200 3ms +[2025-12-30T22:48:21.323Z] [INFO] GET /css/base.css 200 3ms +[2025-12-30T22:48:21.362Z] [INFO] GET /css/components.css 200 4ms +[2025-12-30T22:48:21.370Z] [INFO] GET /css/board.css 200 6ms +[2025-12-30T22:48:21.372Z] [INFO] GET /css/modal.css 200 7ms +[2025-12-30T22:48:21.375Z] [INFO] GET /css/calendar.css 200 8ms +[2025-12-30T22:48:21.377Z] [INFO] GET /css/list.css 200 9ms +[2025-12-30T22:48:21.378Z] [INFO] GET /css/admin.css 200 4ms +[2025-12-30T22:48:21.396Z] [INFO] GET /css/proposals.css 200 2ms +[2025-12-30T22:48:21.410Z] [INFO] GET /css/notifications.css 200 6ms +[2025-12-30T22:48:21.413Z] [INFO] GET /css/gitea.css 200 7ms +[2025-12-30T22:48:21.422Z] [INFO] GET /css/knowledge.css 200 7ms +[2025-12-30T22:48:21.426Z] [INFO] GET /css/responsive.css 200 10ms +[2025-12-30T22:48:21.430Z] [INFO] GET /js/app.js 200 5ms +[2025-12-30T22:48:21.502Z] [INFO] GET /js/api.js 200 4ms +[2025-12-30T22:48:21.505Z] [INFO] GET /js/store.js 200 6ms +[2025-12-30T22:48:21.508Z] [INFO] GET /js/board.js 200 7ms +[2025-12-30T22:48:21.510Z] [INFO] GET /js/auth.js 200 6ms +[2025-12-30T22:48:21.513Z] [INFO] GET /js/sync.js 200 6ms +[2025-12-30T22:48:21.514Z] [INFO] GET /js/offline.js 200 5ms +[2025-12-30T22:48:21.532Z] [INFO] GET /js/task-modal.js 200 1ms +[2025-12-30T22:48:21.545Z] [INFO] GET /js/calendar.js 200 3ms +[2025-12-30T22:48:21.561Z] [INFO] GET /js/list.js 200 8ms +[2025-12-30T22:48:21.567Z] [INFO] GET /js/app.js 200 4ms +[2025-12-30T22:48:21.570Z] [INFO] GET /js/shortcuts.js 200 3ms +[2025-12-30T22:48:21.570Z] [INFO] GET /js/undo.js 200 2ms +[2025-12-30T22:48:21.576Z] [INFO] GET /js/admin.js 200 3ms +[2025-12-30T22:48:21.579Z] [INFO] GET /js/proposals.js 200 4ms +[2025-12-30T22:48:21.585Z] [INFO] GET /js/notifications.js 200 5ms +[2025-12-30T22:48:21.587Z] [INFO] GET /js/api.js 200 6ms +[2025-12-30T22:48:21.590Z] [INFO] GET /js/store.js 304 6ms +[2025-12-30T22:48:21.595Z] [INFO] GET /js/gitea.js 200 4ms +[2025-12-30T22:48:21.598Z] [INFO] GET /js/knowledge.js 200 5ms +[2025-12-30T22:48:21.602Z] [INFO] GET /js/auth.js 200 6ms +[2025-12-30T22:48:21.605Z] [INFO] GET /js/offline.js 304 1ms +[2025-12-30T22:48:21.607Z] [INFO] GET /js/sync.js 200 7ms +[2025-12-30T22:48:21.610Z] [INFO] GET /js/utils.js 200 4ms +[2025-12-30T22:48:21.619Z] [INFO] GET /js/task-modal.js 304 3ms +[2025-12-30T22:48:21.645Z] [INFO] GET /js/board.js 304 2ms +[2025-12-30T22:48:21.647Z] [INFO] GET /js/calendar.js 304 3ms +[2025-12-30T22:48:21.658Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T22:48:21.827Z] [INFO] GET /api/auth/users 200 9ms +[2025-12-30T22:48:21.915Z] [INFO] GET /api/auth/users 304 12ms +[2025-12-30T22:48:21.923Z] [INFO] GET /assets/icons/task.svg 200 15ms +[2025-12-30T22:48:21.928Z] [INFO] Socket connected: MH (SuKW9DTAmCDgyO90AAAJ) +[2025-12-30T22:48:21.951Z] [INFO] GET /api/projects 304 14ms +[2025-12-30T22:48:21.979Z] [INFO] MH joined project:[object Object] +[2025-12-30T22:48:21.990Z] [INFO] GET /api/labels/2 304 6ms +[2025-12-30T22:48:21.996Z] [INFO] GET /api/stats/dashboard?projectId=2 304 5ms +[2025-12-30T22:48:22.000Z] [INFO] GET /api/columns/2 304 3ms +[2025-12-30T22:48:22.015Z] [INFO] GET /api/tasks/project/2 200 13ms +[2025-12-30T22:48:22.020Z] [INFO] GET /js/list.js 304 4ms +[2025-12-30T22:48:22.022Z] [INFO] GET /js/shortcuts.js 304 2ms +[2025-12-30T22:48:22.023Z] [INFO] GET /js/admin.js 304 1ms +[2025-12-30T22:48:22.025Z] [INFO] GET /js/undo.js 304 1ms +[2025-12-30T22:48:22.027Z] [INFO] GET /js/notifications.js 304 1ms +[2025-12-30T22:48:22.028Z] [INFO] GET /js/proposals.js 304 2ms +[2025-12-30T22:48:22.037Z] [INFO] GET /js/knowledge.js 200 1ms +[2025-12-30T22:48:22.039Z] [INFO] GET /js/utils.js 304 1ms +[2025-12-30T22:48:22.041Z] [INFO] GET /js/gitea.js 304 1ms +[2025-12-30T22:48:22.047Z] [INFO] GET /api/proposals?sort=date&archived=0&projectId=2 304 4ms +[2025-12-30T22:48:22.088Z] [INFO] GET /api/notifications 304 12ms +[2025-12-30T22:48:22.122Z] [INFO] GET /api/knowledge/categories 200 9ms +[2025-12-30T22:48:24.537Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T22:48:27.703Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:48:28.403Z] [INFO] POST /api/auth/refresh 200 12ms +[2025-12-30T22:48:30.565Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T22:48:32.026Z] [INFO] GET /api/knowledge/entries?categoryId=2 304 8ms +[2025-12-30T22:48:32.620Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 5ms +[2025-12-30T22:48:33.288Z] [INFO] GET /api/knowledge/entries?categoryId=2 304 6ms +[2025-12-30T22:48:33.818Z] [INFO] GET /api/knowledge/entries?categoryId=11 304 6ms +[2025-12-30T22:48:34.235Z] [INFO] GET /api/knowledge/entries?categoryId=1 304 8ms +[2025-12-30T22:48:35.240Z] [INFO] POST /api/auth/refresh 200 9ms +[2025-12-30T22:48:37.710Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T22:48:40.705Z] [INFO] Knowledge-Eintrag gelöscht: Testeintrag +[2025-12-30T22:48:40.706Z] [INFO] DELETE /api/knowledge/entries/1 200 10ms +[2025-12-30T22:48:40.762Z] [INFO] GET /api/knowledge/entries?categoryId=1 200 7ms +[2025-12-30T22:48:40.801Z] [INFO] GET /api/knowledge/categories 200 5ms +[2025-12-30T22:48:53.406Z] [INFO] POST /api/auth/refresh 200 8ms +[2025-12-30T22:48:56.641Z] [INFO] POST /api/auth/refresh 200 7ms +[2025-12-30T22:48:57.784Z] [INFO] GET /api/health 200 1ms +[2025-12-30T22:49:27.889Z] [INFO] GET /api/health 200 2ms +[2025-12-30T22:49:39.637Z] [INFO] POST /api/auth/refresh 200 5ms +[2025-12-30T22:49:39.744Z] [INFO] GET /api/git/server/info 200 38ms +[2025-12-30T22:49:39.820Z] [INFO] GET /api/git/server/status 200 43ms +[2025-12-30T22:49:39.849Z] [INFO] GET /api/git/server/branches 200 16ms +[2025-12-30T22:49:39.864Z] [INFO] GET /api/git/server/commits?limit=10 200 13ms +[2025-12-30T22:49:40.731Z] [INFO] POST /api/auth/refresh 200 10ms +[2025-12-30T22:49:44.697Z] [INFO] POST /api/auth/refresh 200 11ms +[2025-12-30T22:49:55.705Z] [INFO] POST /api/auth/refresh 200 11ms