-- Migration 001: Initial Schema -- Creates core tables: projects, tasks, users -- Establishes multi-tenant architecture with permissions -- Projects table DEFINE TABLE projects SCHEMAFULL PERMISSIONS FOR select WHERE tenant_id = $auth.tenant_id FOR create, update, delete WHERE tenant_id = $auth.tenant_id; DEFINE FIELD id ON TABLE projects TYPE record; DEFINE FIELD tenant_id ON TABLE projects TYPE string ASSERT $value != NONE; DEFINE FIELD title ON TABLE projects TYPE string ASSERT $value != NONE AND string::len($value) > 0; DEFINE FIELD description ON TABLE projects TYPE option; DEFINE FIELD status ON TABLE projects TYPE string ASSERT $value INSIDE ["active", "archived", "completed"] DEFAULT "active"; DEFINE FIELD features ON TABLE projects TYPE array DEFAULT []; DEFINE FIELD created_at ON TABLE projects TYPE datetime DEFAULT time::now(); DEFINE FIELD updated_at ON TABLE projects TYPE datetime DEFAULT time::now() VALUE time::now(); DEFINE INDEX idx_projects_tenant ON TABLE projects COLUMNS tenant_id; DEFINE INDEX idx_projects_status ON TABLE projects COLUMNS status; DEFINE INDEX idx_projects_tenant_status ON TABLE projects COLUMNS tenant_id, status; -- Tasks table DEFINE TABLE tasks SCHEMAFULL PERMISSIONS FOR select WHERE tenant_id = $auth.tenant_id FOR create, update, delete WHERE tenant_id = $auth.tenant_id; DEFINE FIELD id ON TABLE tasks TYPE record; DEFINE FIELD tenant_id ON TABLE tasks TYPE string ASSERT $value != NONE; DEFINE FIELD project_id ON TABLE tasks TYPE string ASSERT $value != NONE; DEFINE FIELD title ON TABLE tasks TYPE string ASSERT $value != NONE AND string::len($value) > 0; DEFINE FIELD description ON TABLE tasks TYPE option; DEFINE FIELD status ON TABLE tasks TYPE string ASSERT $value INSIDE ["todo", "doing", "review", "done"] DEFAULT "todo"; DEFINE FIELD assignee ON TABLE tasks TYPE string DEFAULT "unassigned"; DEFINE FIELD priority ON TABLE tasks TYPE string ASSERT $value INSIDE ["low", "medium", "high", "critical"] DEFAULT "medium"; DEFINE FIELD task_order ON TABLE tasks TYPE int DEFAULT 0; DEFINE FIELD feature ON TABLE tasks TYPE option; DEFINE FIELD created_at ON TABLE tasks TYPE datetime DEFAULT time::now(); DEFINE FIELD updated_at ON TABLE tasks TYPE datetime DEFAULT time::now() VALUE time::now(); DEFINE INDEX idx_tasks_tenant ON TABLE tasks COLUMNS tenant_id; DEFINE INDEX idx_tasks_project ON TABLE tasks COLUMNS project_id; DEFINE INDEX idx_tasks_status ON TABLE tasks COLUMNS status; DEFINE INDEX idx_tasks_assignee ON TABLE tasks COLUMNS assignee; DEFINE INDEX idx_tasks_tenant_project ON TABLE tasks COLUMNS tenant_id, project_id; DEFINE INDEX idx_tasks_project_status ON TABLE tasks COLUMNS project_id, status; DEFINE INDEX idx_tasks_project_order ON TABLE tasks COLUMNS project_id, task_order; -- Users table DEFINE TABLE users SCHEMAFULL PERMISSIONS FOR select WHERE id = $auth.id OR "admin" IN $auth.roles FOR create WHERE "admin" IN $auth.roles FOR update WHERE id = $auth.id OR "admin" IN $auth.roles FOR delete WHERE "admin" IN $auth.roles; DEFINE FIELD id ON TABLE users TYPE record; DEFINE FIELD email ON TABLE users TYPE string ASSERT $value != NONE AND string::is::email($value); DEFINE FIELD username ON TABLE users TYPE string ASSERT $value != NONE AND string::len($value) >= 3; DEFINE FIELD password_hash ON TABLE users TYPE string ASSERT $value != NONE; DEFINE FIELD roles ON TABLE users TYPE array DEFAULT ["user"]; DEFINE FIELD created_at ON TABLE users TYPE datetime DEFAULT time::now(); DEFINE FIELD updated_at ON TABLE users TYPE datetime DEFAULT time::now() VALUE time::now(); DEFINE INDEX idx_users_email ON TABLE users COLUMNS email UNIQUE; DEFINE INDEX idx_users_username ON TABLE users COLUMNS username UNIQUE;