121 lines
3.2 KiB
TypeScript
121 lines
3.2 KiB
TypeScript
|
|
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;
|
||
|
|
}
|
||
|
|
}
|