Database schema creation/data access layer/overdue calculation
This commit is contained in:
@@ -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
68
src/lib/tasks.ts
Normal 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
19
src/lib/types.ts
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user