Tabla D1: quick_links — atajos a servicios externos
Creada en migración
0017_create_quick_links.sql· workspace · 2026-05-07
Descripción
Tabla SQLite en Cloudflare D1 que almacena los atajos del staff a paneles y servicios externos. Es la fuente de datos de la tool /tools/quicklinks del workspace.
Esquema
CREATE TABLE IF NOT EXISTS quick_links (
id INTEGER PRIMARY KEY AUTOINCREMENT,
label TEXT NOT NULL, -- Nombre visible (máx 80 chars)
url TEXT NOT NULL, -- URL destino (máx 500 chars)
description TEXT, -- Comentario opcional
category TEXT NOT NULL DEFAULT 'general', -- Ver enum QuickLinkCategory
icon_url TEXT, -- Icono personalizado (opcional)
position INTEGER NOT NULL DEFAULT 0, -- Orden dentro de la categoría
is_shared INTEGER NOT NULL DEFAULT 1, -- 1 = visible para todo el staff
owner_id TEXT, -- Email CF Access del creador ('seed' para los del seed)
archived_at TEXT, -- ISO-8601; NULL = activo (soft-delete)
created_at TEXT NOT NULL DEFAULT (datetime('now')),
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
);
Índices
| Nombre | Columnas | Propósito |
|---|---|---|
idx_quick_links_category | (category, position) | Orden canónico dentro de cada categoría |
idx_quick_links_archived | (archived_at) | Filtrar activos/archivados eficientemente |
idx_quick_links_owner | (owner_id) | Futuros filtros por propietario / mis links |
Tipo TypeScript
// src/lib/types.ts
export type QuickLinkCategory =
| 'infrastructure' | 'code' | 'ai' | 'monitoring'
| 'product' | 'selfhosted' | 'admin' | 'general';
export interface QuickLink {
id: number;
label: string;
url: string;
description: string | null;
category: QuickLinkCategory;
icon_url: string | null;
position: number;
is_shared: number; // SQLite: 0 | 1
owner_id: string | null;
archived_at: string | null;
created_at: string;
updated_at: string;
}
Soft-delete
El borrado lógico se implementa escribiendo un timestamp ISO-8601 en archived_at. El endpoint GET /api/quicklinks excluye registros archivados por defecto (archived_at IS NULL). Para incluirlos: ?archived=1.
Para restaurar un registro: PUT /api/quicklinks/:id con { "archived": false } → escribe archived_at = NULL.
Seed (migración 0018)
Se pre-cargan ~25 servicios del equipo con INSERT OR IGNORE (idempotente). El campo owner_id = 'seed' identifica estos registros. Fuentes del seed: CLAUDE.md, memoria/reference_*, infra_*.
API asociada
| Endpoint | Método | Acción |
|---|---|---|
/api/quicklinks | GET | Listar (filtros: category, archived) |
/api/quicklinks | POST | Crear nuevo atajo |
/api/quicklinks/:id | GET | Obtener por id |
/api/quicklinks/:id | PUT | Actualizar parcial (SET dinámico) |
/api/quicklinks/:id | DELETE | Eliminar físicamente |
Todas las operaciones de escritura registran actividad via logActivity (actor extraído del header cf-access-authenticated-user-email).
Véase también
- [[feature—workspace—quick-links]]
- [[workspace—que-es-workspace]]