Database schema creation/data access layer/overdue calculation

This commit is contained in:
mahlatseclayton
2026-07-29 22:10:49 +02:00
parent 88616446e9
commit 8fd2c0b5cf
3 changed files with 88 additions and 1 deletions

View File

@@ -11,7 +11,7 @@ db.exec(
title TEXT NOT NULL,
due_date TEXT NOT NULL,
topic TEXT NOT NULL,
status TEXT CHECK(status IN ('To-Do','In-Progress','Completed')) NOT NULL DEFAULT 'to-do',
status TEXT CHECK(status IN ('To-Do','In-Progress','Complete')) NOT NULL DEFAULT 'to-do',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
is_Archived BOOLEAN NOT NULL DEFAULT 0
)

68
src/lib/tasks.ts Normal file
View File

@@ -0,0 +1,68 @@
import db from './db';
import { Task, TaskStatus, computeIsOverdue } from './types';
export function getTasks(sortBy: 'due_date' | 'topic' | 'status' = 'due_date'): Task[] {
const validSortColumns = ['due_date', 'topic', 'status'];
const sortColumn = validSortColumns.includes(sortBy) ? sortBy : 'due_date';
const sql = `SELECT * FROM tasks WHERE is_archived = 0 ORDER BY ${sortColumn} ASC`;
const tasks = db.prepare(sql).all() as Task[];
return tasks.map(task => ({
...task,
is_overdue: computeIsOverdue(task.due_date, task.status)
}));
}
export function createTask(task: {
title: string;
description?: string;
due_date: string;
topic: string;
status?: TaskStatus;
}) {
const stmt = db.prepare(`
INSERT INTO tasks (title, description, due_date, topic, status)
VALUES (?, ?, ?, ?, ?)
`);
return stmt.run(
task.title,
task.description || '',
task.due_date,
task.topic,
task.status || 'Todo'
);
}
export function updateTask(
id: number,
task: {
title: string;
description?: string;
due_date: string;
topic: string;
status: TaskStatus;
}
) {
const stmt = db.prepare(`
UPDATE tasks
SET title = ?, description = ?, due_date = ?, topic = ?, status = ?
WHERE id = ?
`);
return stmt.run(
task.title,
task.description || '',
task.due_date,
task.topic,
task.status,
id
);
}
export function archiveTask(id: number) {
return db.prepare(`UPDATE tasks SET is_archived = 1 WHERE id = ?`).run(id);
}

19
src/lib/types.ts Normal file
View File

@@ -0,0 +1,19 @@
export type TaskStatus = 'Todo' | 'In-Progress' | 'Complete';
export interface Task {
id: number;
title: string;
description: string;
due_date: string; // ISO Format YYYY-MM-DD
topic: string;
status: TaskStatus;
is_archived: number; // 0 or 1
created_at: string;
is_overdue?: boolean; // Derived field
}
export function computeIsOverdue(dueDateStr: string, status: TaskStatus): boolean {
if (status === 'Complete') return false;
const today = new Date().toISOString().split('T')[0];
return dueDateStr < today;
}