todo_app/lib/db.ts

121 lines
3.2 KiB
TypeScript
Raw Permalink Normal View History

2026-06-04 17:18:27 +00:00
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<Database> {
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<Aufgabe[]> {
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<number> {
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<Aufgabe> {
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<Aufgabe | null> {
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<Aufgabe | null> {
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<boolean> {
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;
}
}