Files
incidentops/migrations/0001_initial_schema.sql
minhtrannhat fbe9fbba6e feat: project skeleton
- infra (k8s, kind, helm, docker) backbone is implemented
- security: implementation + unit tests are done
2026-01-21 03:19:38 -05:00

62 lines
1.9 KiB
SQL

-- Initial schema for IncidentOps
-- Creates core tables: users, orgs, org_members, services, incidents, incident_events
CREATE TABLE users (
id UUID PRIMARY KEY,
email TEXT NOT NULL UNIQUE,
password_hash TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE orgs (
id UUID PRIMARY KEY,
name TEXT NOT NULL,
slug TEXT NOT NULL UNIQUE,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE org_members (
id UUID PRIMARY KEY,
user_id UUID NOT NULL REFERENCES users(id),
org_id UUID NOT NULL REFERENCES orgs(id),
role TEXT NOT NULL CHECK (role IN ('admin', 'member', 'viewer')),
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
UNIQUE (user_id, org_id)
);
CREATE TABLE services (
id UUID PRIMARY KEY,
org_id UUID NOT NULL REFERENCES orgs(id),
name TEXT NOT NULL,
slug TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
UNIQUE (org_id, slug)
);
CREATE TABLE incidents (
id UUID PRIMARY KEY,
org_id UUID NOT NULL REFERENCES orgs(id),
service_id UUID NOT NULL REFERENCES services(id),
title TEXT NOT NULL,
description TEXT,
status TEXT NOT NULL CHECK (status IN ('triggered', 'acknowledged', 'mitigated', 'resolved')),
severity TEXT NOT NULL CHECK (severity IN ('critical', 'high', 'medium', 'low')),
version INTEGER NOT NULL DEFAULT 1,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX idx_incidents_org_status ON incidents(org_id, status);
CREATE INDEX idx_incidents_org_created ON incidents(org_id, created_at DESC);
CREATE TABLE incident_events (
id UUID PRIMARY KEY,
incident_id UUID NOT NULL REFERENCES incidents(id),
event_type TEXT NOT NULL,
actor_user_id UUID REFERENCES users(id),
payload JSONB,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX idx_incident_events_incident ON incident_events(incident_id, created_at);