users
Base user table for local accounts; password stored as a bcrypt hash
Design Notes
============================================================
@table-comment users Base user table for local accounts; password stored as a bcrypt hash
Source: auth.yaml → register, login, change_password
============================================================
Fields
| Name | Type | Constraints | Nullable | Default | Comment |
|---|
| PKAI |
id |
INTEGER |
- |
NO |
- |
|
username |
TEXT |
- |
NO |
- |
|
password |
TEXT |
- |
NO |
- |
|
created_at |
TEXT |
- |
NO |
(datetime('now')) |
|
updated_at |
TEXT |
- |
NO |
(datetime('now')) |
Indexes
| Name | Type | Fields |
|---|
| - | UNIQUE | username |
categories
Task categories; user-defined; name unique per user
Design Notes
Unique index on username (S02.1 Step 9: look up user by username; created automatically by UNIQUE constraint)
============================================================
@table-comment categories Task categories; user-defined; name unique per user
Source: categories.yaml → create_category, delete_category
============================================================
Fields
| Name | Type | Constraints | Nullable | Default | Comment |
|---|
| PKAI |
id |
INTEGER |
- |
NO |
- |
|
user_id |
INTEGER |
FK → users(id) ON DELETE CASCADE |
NO |
- |
|
name |
TEXT |
CHECK length(name) >= 1 AND length(name) <= 20 |
NO |
- |
|
created_at |
TEXT |
- |
NO |
(datetime('now')) |
Indexes
| Name | Type | Fields |
|---|
| idx_categories_user_id | INDEX | user_id |
| - | UNIQUE | user_id, name |
tasks
Tasks; completion status and optional category link
Design Notes
============================================================
@table-comment tasks Tasks; completion status and optional category link
Source: tasks.yaml → create_task, update_task, update_task_status, delete_task
============================================================
Fields
| Name | Type | Constraints | Nullable | Default | Comment |
|---|
| PKAI |
id |
INTEGER |
- |
NO |
- |
|
user_id |
INTEGER |
FK → users(id) ON DELETE CASCADE |
NO |
- |
|
category_id |
INTEGER |
FK → categories(id) |
YES |
- |
|
name |
TEXT |
CHECK length(name) >= 1 AND length(name) <= 100 |
NO |
- |
|
note |
TEXT |
CHECK note IS OR length(note) <= 500 |
YES |
- |
|
done |
INTEGER |
CHECK done IN (0, 1) |
NO |
0 |
|
created_at |
TEXT |
- |
NO |
(datetime('now')) |
|
updated_at |
TEXT |
- |
NO |
(datetime('now')) |
Indexes
| Name | Type | Fields |
|---|
| idx_tasks_user_id | INDEX | user_id |
| idx_tasks_user_done | INDEX | user_id, done |