62 lines
1.9 KiB
MySQL
62 lines
1.9 KiB
MySQL
|
|
-- 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);
|