import sqlite3 from 'sqlite3'; import { open, Database } from 'sqlite'; import path from 'path'; // Datenbank-Datei-Pfad const dbPath = path.join(process.cwd(), 'todo.db'); // Datenbank-Instanz (wird asynchron initialisiert) let db: Database | null = null; // Datenbank öffnen export async function initDb(): Promise { if (db) return db; db = await open({ filename: dbPath, driver: sqlite3.Database }); // Tabelle erstellen, falls nicht vorhanden await db.exec(` CREATE TABLE IF NOT EXISTS aufgaben ( id INTEGER PRIMARY KEY AUTOINCREMENT, beschreibung TEXT NOT NULL, erledigt INTEGER DEFAULT 0, erstellt TEXT NOT NULL ) `); return db; } // Typdefinition export interface Aufgabe { id: number; beschreibung: string; erledigt: boolean; erstellt: string; } type SortOption = 'text_asc' | 'text_desc' | 'datum_asc' | 'datum_desc'; // Sortier-Order für SQLite function getOrderBy(sort: SortOption): string { switch (sort) { case 'text_asc': return 'beschreibung ASC'; case 'text_desc': return 'beschreibung DESC'; case 'datum_asc': return 'erstellt ASC'; case 'datum_desc': default: return 'erstellt DESC'; } } // Alle Aufgaben abrufen (mit Paginierung und Sortierung) export async function getAufgaben(limit: number = 1000, offset: number = 0, sort: SortOption = 'datum_desc'): Promise { const database = await initDb(); const orderBy = getOrderBy(sort); const rows = await database.all( `SELECT * FROM aufgaben ORDER BY ${orderBy} LIMIT ? OFFSET ?`, [limit, offset] ) as any[]; return rows.map(row => ({ ...row, erledigt: Boolean(row.erledigt) })); } // Anzahl aller Aufgaben abrufen export async function getAufgabenCount(): Promise { const database = await initDb(); const result = await database.get('SELECT COUNT(*) as count FROM aufgaben') as { count: number }; return result.count; } // Aufgabe hinzufügen export async function addAufgabe(beschreibung: string): Promise { const database = await initDb(); const result = await database.run( 'INSERT INTO aufgaben (beschreibung, erledigt, erstellt) VALUES (?, 0, datetime("now"))', [beschreibung] ); const newId = result.lastID as number; return getAufgabeById(newId)!; } // Aufgabe nach ID abrufen export async function getAufgabeById(id: number): Promise { const database = await initDb(); const row = await database.get('SELECT * FROM aufgaben WHERE id = ?', id) as any; if (!row) return null; return { ...row, erledigt: Boolean(row.erledigt) }; } // Aufgabe als erledigt/rückgängig markieren export async function toggleAufgabe(id: number): Promise { const database = await initDb(); await database.run('UPDATE aufgaben SET erledigt = 1 - erledigt WHERE id = ?', id); return getAufgabeById(id); } // Aufgabe löschen export async function deleteAufgabe(id: number): Promise { const database = await initDb(); const result = await database.run('DELETE FROM aufgaben WHERE id = ?', id); return result.changes > 0; } // Datenbank schließen export async function closeDatabase() { if (db) { await db.close(); db = null; } }