All checks were successful
Co-authored-by: Jeffrey Smith <jasafpro@gmail.com> Co-committed-by: Jeffrey Smith <jasafpro@gmail.com>
86 lines
3.4 KiB
SQL
86 lines
3.4 KiB
SQL
-- ==========================================
|
|
-- Armature — 011 Triggers & Scheduled Tasks
|
|
-- ==========================================
|
|
|
|
-- ── Extension Triggers (event + webhook) ──────
|
|
|
|
CREATE TABLE IF NOT EXISTS triggers (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
package_id TEXT NOT NULL REFERENCES packages(id) ON DELETE CASCADE,
|
|
type TEXT NOT NULL CHECK (type IN ('webhook', 'event')),
|
|
enabled BOOLEAN NOT NULL DEFAULT true,
|
|
|
|
-- Webhook triggers
|
|
slug TEXT,
|
|
secret TEXT,
|
|
|
|
-- Event triggers
|
|
event_pattern TEXT,
|
|
|
|
-- Common
|
|
entry_point TEXT NOT NULL,
|
|
config JSONB NOT NULL DEFAULT '{}',
|
|
fire_count INTEGER NOT NULL DEFAULT 0,
|
|
last_fire_at TIMESTAMPTZ,
|
|
last_error TEXT,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
|
|
UNIQUE(package_id, type, slug),
|
|
UNIQUE(package_id, type, event_pattern)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_triggers_package ON triggers(package_id);
|
|
CREATE INDEX IF NOT EXISTS idx_triggers_type ON triggers(type);
|
|
CREATE INDEX IF NOT EXISTS idx_triggers_enabled ON triggers(enabled) WHERE enabled = true;
|
|
CREATE INDEX IF NOT EXISTS idx_triggers_webhook ON triggers(package_id, slug) WHERE type = 'webhook';
|
|
|
|
-- ── Scheduled Tasks (user-created cron) ───────
|
|
|
|
CREATE TABLE IF NOT EXISTS scheduled_tasks (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name TEXT NOT NULL,
|
|
description TEXT NOT NULL DEFAULT '',
|
|
creator_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
run_as TEXT NOT NULL DEFAULT 'creator'
|
|
CHECK (run_as IN ('creator', 'system')),
|
|
cron_expr TEXT NOT NULL,
|
|
next_fire_at TIMESTAMPTZ,
|
|
last_fire_at TIMESTAMPTZ,
|
|
enabled BOOLEAN NOT NULL DEFAULT true,
|
|
script TEXT NOT NULL DEFAULT '',
|
|
template_id TEXT,
|
|
template_params JSONB NOT NULL DEFAULT '{}',
|
|
fire_count INTEGER NOT NULL DEFAULT 0,
|
|
last_error TEXT,
|
|
last_duration_ms INTEGER,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_sched_tasks_creator ON scheduled_tasks(creator_id);
|
|
CREATE INDEX IF NOT EXISTS idx_sched_tasks_enabled ON scheduled_tasks(enabled) WHERE enabled = true;
|
|
CREATE INDEX IF NOT EXISTS idx_sched_tasks_next_fire ON scheduled_tasks(next_fire_at) WHERE enabled = true;
|
|
|
|
-- ── Trigger Logs (unified execution log) ──────
|
|
|
|
CREATE TABLE IF NOT EXISTS trigger_logs (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
trigger_id UUID REFERENCES triggers(id) ON DELETE CASCADE,
|
|
scheduled_task_id UUID REFERENCES scheduled_tasks(id) ON DELETE CASCADE,
|
|
fired_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
duration_ms INTEGER,
|
|
success BOOLEAN NOT NULL DEFAULT true,
|
|
error TEXT,
|
|
output TEXT,
|
|
|
|
CHECK (
|
|
(trigger_id IS NOT NULL AND scheduled_task_id IS NULL) OR
|
|
(trigger_id IS NULL AND scheduled_task_id IS NOT NULL)
|
|
)
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_trigger_logs_trigger ON trigger_logs(trigger_id);
|
|
CREATE INDEX IF NOT EXISTS idx_trigger_logs_sched ON trigger_logs(scheduled_task_id);
|
|
CREATE INDEX IF NOT EXISTS idx_trigger_logs_fired ON trigger_logs(fired_at);
|