Tabla D1: directions — Agenda de contactos del workspace
Tabla D1: directions
Tabla SQLite/D1 que persiste la agenda compartida de personas y empresas del staff de CreaRack. Sin foreign keys (FK-less by design) para permitir crear contactos sin forzar la existencia previa de la empresa. Soft-delete mediante archived_at.
Migración: migrations/0020_create_directions.sql
Seed inicial: migrations/0021_seed_directions.sql
Esquema
CREATE TABLE IF NOT EXISTS directions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
type TEXT NOT NULL CHECK(type IN ('person','company')),
name TEXT NOT NULL,
nif TEXT,
company TEXT,
role TEXT,
email TEXT,
phone TEXT,
linkedin TEXT,
street TEXT,
zip TEXT,
city TEXT,
province TEXT,
country TEXT DEFAULT 'España',
tags TEXT,
notes TEXT,
archived_at TEXT,
owner_id TEXT,
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
Índices
| Índice | Columna | Justificación |
|---|---|---|
idx_directions_type | type | Filtro persona/empresa es el más frecuente |
idx_directions_archived | archived_at | Excluir archivados en todas las queries de lista |
idx_directions_city | city | Filtro geográfico futuro |
idx_directions_owner | owner_id | Filtro por creador (auditoría) |
Campos destacados
| Campo | Tipo | Notas |
|---|---|---|
type | TEXT | Constraint CHECK(type IN ('person','company')). Obligatorio. |
name | TEXT | Obligatorio. Máx 200 chars (validado en API). |
tags | TEXT | CSV libre: "cliente,proveedor,infra". Sin tabla auxiliar ni FK. |
company | TEXT | Para type='person': empresa donde trabaja (free-form, no FK). |
archived_at | TEXT | ISO 8601. NULL = activo. Soft-delete reversible. |
owner_id | TEXT | Email del creador extraído de CF Access (cf-access-authenticated-user-email). |
country | TEXT | Default 'España'. |
linkedin | TEXT | URL completa o solo el username (la UI normaliza al renderizar). |
Seed inicial (migración 0021)
Staff CreaRack
| Nombre | Rol | |
|---|---|---|
| Edu Esquembri | CEO · Dev | edudomo2@gmail.com |
| Dani | Dev | dani@crearack.com |
| Txell | COO | txell@crearack.com |
Proveedores
| Empresa | Tags |
|---|---|
| Hetzner Online GmbH | proveedor, infra, hosting |
| Cloudflare Inc. | proveedor, infra, cdn |
| Resend Inc. | proveedor, email |
| Holded SL | proveedor, erp |
| GitHub Inc. | proveedor, code |
Acceso desde la API
Los endpoints que escriben esta tabla son CF Pages Functions:
GET /api/directions— lista, con filtros?type=y?archived=1POST /api/directions— crear; validatypeynameGET /api/directions/:id— obtener por IDPUT /api/directions/:id— actualización parcial (whitelistEDITABLE_FIELDS)DELETE /api/directions/:id— borrado permanente (no hay papelera)
Para archivar/desarchivar sin borrar: PUT /api/directions/:id con { "archived": true|false }.
Decisiones de diseño
- FK-less: la relación empresa↔persona es free-form (
companyTEXT) para no obligar flujos de creación en orden. Aceptado porque el volumen es pequeño (agenda de staff, no ERP). - Tags como CSV: simplicidad sobre normalización. Sin tabla de etiquetas auxiliar. Suficiente para el caso de uso actual.
updated_atmanual: se actualiza condatetime('now')en cada PUT. No hay trigger SQLite porque D1 no los soporta de forma fiable en todos los entornos.- Soft-delete unidireccional desde la UI: la UI solo muestra
archived_at IS NULLpor defecto. El borrado hard (DELETE) sí existe en la API para limpieza.
Véase también
- [[feature—workspace—directions]]
- [[concept—workspace—d1-migrations]]
- [[feature—workspace—activity-log]]
- [[feature—workspace—navigation]]