Database schema creation/data access layer/overdue calculation
This commit is contained in:
@@ -11,7 +11,7 @@ db.exec(
|
|||||||
title TEXT NOT NULL,
|
title TEXT NOT NULL,
|
||||||
due_date TEXT NOT NULL,
|
due_date TEXT NOT NULL,
|
||||||
topic 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,
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||||
is_Archived BOOLEAN NOT NULL DEFAULT 0
|
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