stillbox/sql/postgres/migrations/001_initial.up.sql

166 lines
4.4 KiB
MySQL
Raw Normal View History

2024-07-14 17:39:03 -04:00
CREATE TABLE IF NOT EXISTS users(
2024-11-19 08:50:01 -05:00
id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
2024-07-14 17:39:03 -04:00
username VARCHAR (255) UNIQUE NOT NULL,
2024-07-15 19:03:48 -04:00
password TEXT NOT NULL,
email TEXT NOT NULL,
2024-07-27 19:25:16 -04:00
is_admin BOOLEAN NOT NULL,
2024-07-15 19:03:48 -04:00
prefs JSONB
2024-07-14 17:39:03 -04:00
);
2024-07-16 19:31:30 -04:00
CREATE INDEX IF NOT EXISTS users_username_idx ON users(username);
2024-07-15 19:03:48 -04:00
2024-07-16 19:31:30 -04:00
CREATE TABLE IF NOT EXISTS api_keys(
2024-11-19 08:50:01 -05:00
id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
2024-07-27 19:25:16 -04:00
owner INTEGER REFERENCES users(id) NOT NULL,
2024-07-16 19:31:30 -04:00
created_at TIMESTAMP NOT NULL,
expires TIMESTAMP,
disabled BOOLEAN,
2024-08-03 00:05:02 -04:00
api_key TEXT UNIQUE NOT NULL
2024-07-15 19:03:48 -04:00
);
CREATE TABLE IF NOT EXISTS systems(
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
-- NB: if the column defaults are updated here, they must also be updated in the UpsertTalkgroup query
2024-07-15 19:03:48 -04:00
CREATE TABLE IF NOT EXISTS talkgroups(
2024-11-19 08:50:01 -05:00
id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
2024-11-15 10:37:58 -05:00
system_id INT4 REFERENCES systems(id) NOT NULL,
tgid INT4 NOT NULL,
2024-07-15 19:03:48 -04:00
name TEXT,
2024-08-23 14:28:47 -04:00
alpha_tag TEXT,
2024-07-28 01:08:08 -04:00
tg_group TEXT,
2024-07-15 19:03:48 -04:00
frequency INTEGER,
2024-07-16 19:31:30 -04:00
metadata JSONB,
2024-10-25 16:02:08 -04:00
tags TEXT[] NOT NULL DEFAULT '{}',
2024-11-01 09:15:39 -04:00
alert BOOLEAN NOT NULL DEFAULT 'true',
alert_config JSONB,
2024-11-15 10:37:58 -05:00
weight REAL NOT NULL DEFAULT 1.0,
2024-11-19 09:10:55 -05:00
learned BOOLEAN NOT NULL DEFAULT FALSE,
2024-11-21 07:13:18 -05:00
ignored BOOLEAN NOT NULL DEFAULT FALSE,
UNIQUE (system_id, tgid, learned)
2024-07-15 19:03:48 -04:00
);
2024-11-15 10:37:58 -05:00
CREATE INDEX talkgroups_system_tgid_idx ON talkgroups (system_id, tgid);
2024-07-28 23:07:04 -04:00
CREATE INDEX IF NOT EXISTS talkgroup_id_tags ON talkgroups USING GIN (tags);
2024-11-21 07:13:18 -05:00
CREATE TABLE IF NOT EXISTS talkgroup_versions(
-- version metadata
2024-11-17 21:46:10 -05:00
id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
2024-11-21 07:13:18 -05:00
time TIMESTAMPTZ NOT NULL,
created_by INTEGER REFERENCES users(id),
deleted BOOLEAN,
2024-11-21 07:13:18 -05:00
-- talkgroup snapshot
system_id INT4,
2024-11-21 07:13:18 -05:00
tgid INT4,
name TEXT,
2024-08-23 14:28:47 -04:00
alpha_tag TEXT,
2024-11-17 21:46:10 -05:00
tg_group TEXT,
2024-11-21 07:13:18 -05:00
frequency INTEGER,
metadata JSONB,
tags TEXT[],
alert BOOLEAN,
alert_config JSONB,
weight REAL,
learned BOOLEAN,
ignored BOOLEAN
2024-07-27 19:25:16 -04:00
);
2024-10-25 16:02:08 -04:00
CREATE TABLE IF NOT EXISTS alerts(
2024-11-17 21:46:10 -05:00
id INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
2024-10-25 16:02:08 -04:00
time TIMESTAMPTZ NOT NULL,
tgid INTEGER NOT NULL,
system_id INTEGER REFERENCES systems(id) NOT NULL,
2024-10-25 16:02:08 -04:00
weight REAL,
score REAL,
2024-11-02 09:41:48 -04:00
orig_score REAL,
2024-11-02 14:26:58 -04:00
notified BOOLEAN NOT NULL DEFAULT 'false',
2024-10-25 16:02:08 -04:00
metadata JSONB
);
2024-12-01 17:29:26 -05:00
CREATE TABLE IF NOT EXISTS calls(
id UUID,
2024-07-16 19:31:30 -04:00
submitter INTEGER REFERENCES api_keys(id) ON DELETE SET NULL,
2024-07-15 19:03:48 -04:00
system INTEGER NOT NULL,
talkgroup INTEGER NOT NULL,
call_date TIMESTAMPTZ NOT NULL,
2024-07-15 19:03:48 -04:00
audio_name TEXT,
audio_blob BYTEA,
2024-08-11 13:46:43 -04:00
duration INTEGER,
2024-07-15 19:03:48 -04:00
audio_type TEXT,
audio_url TEXT,
2024-07-27 19:25:16 -04:00
frequency INTEGER NOT NULL,
frequencies INTEGER[],
patches INTEGER[],
2024-07-15 19:03:48 -04:00
tg_label TEXT,
2024-08-23 14:28:47 -04:00
tg_alpha_tag TEXT,
2024-07-27 19:25:16 -04:00
tg_group TEXT,
source INTEGER NOT NULL,
2024-11-19 08:50:01 -05:00
transcript TEXT,
PRIMARY KEY (id, call_date),
2024-11-19 08:50:01 -05:00
FOREIGN KEY (system, talkgroup) REFERENCES talkgroups(system_id, tgid)
) PARTITION BY RANGE (call_date);
2024-07-15 19:03:48 -04:00
2024-07-16 19:31:30 -04:00
CREATE INDEX IF NOT EXISTS calls_transcript_idx ON calls USING GIN (to_tsvector('english', transcript));
2024-07-21 10:55:49 -04:00
CREATE INDEX IF NOT EXISTS calls_call_date_tg_idx ON calls(system, talkgroup, call_date);
2024-07-15 19:03:48 -04:00
CREATE TABLE swept_calls (
id UUID PRIMARY KEY,
submitter INTEGER REFERENCES api_keys(id) ON DELETE SET NULL,
system INTEGER NOT NULL,
talkgroup INTEGER NOT NULL,
call_date TIMESTAMPTZ NOT NULL,
audio_name TEXT,
audio_blob BYTEA,
duration INTEGER,
audio_type TEXT,
audio_url TEXT,
frequency INTEGER NOT NULL,
frequencies INTEGER[],
patches INTEGER[],
tg_label TEXT,
tg_alpha_tag TEXT,
tg_group TEXT,
source INTEGER NOT NULL,
transcript TEXT,
FOREIGN KEY (system, talkgroup) REFERENCES talkgroups(system_id, tgid)
);
CREATE INDEX IF NOT EXISTS swept_calls_transcript_idx ON swept_calls USING GIN (to_tsvector('english', transcript));
CREATE INDEX IF NOT EXISTS swept_calls_call_date_tg_idx ON swept_calls(system, talkgroup, call_date);
2024-07-15 19:03:48 -04:00
CREATE TABLE IF NOT EXISTS settings(
name TEXT PRIMARY KEY,
updated_by INTEGER REFERENCES users(id),
value JSONB
);
2024-07-16 19:31:30 -04:00
CREATE TABLE IF NOT EXISTS incidents(
id UUID PRIMARY KEY,
name TEXT NOT NULL,
description TEXT,
start_time TIMESTAMP,
end_time TIMESTAMP,
location JSONB,
metadata JSONB
);
2024-07-21 10:46:51 -04:00
CREATE INDEX IF NOT EXISTS incidents_name_description_idx ON incidents USING GIN (
2024-07-16 19:31:30 -04:00
(to_tsvector('english', name) || to_tsvector('english', coalesce(description, ''))
)
);
CREATE TABLE IF NOT EXISTS incidents_calls(
incident_id UUID NOT NULL REFERENCES incidents(id) ON UPDATE CASCADE ON DELETE CASCADE,
call_id UUID NOT NULL,
calls_tbl_id UUID NULL,
swept_call_id UUID NULL REFERENCES swept_calls(id),
call_date TIMESTAMPTZ NULL,
2024-07-16 19:31:30 -04:00
notes JSONB,
FOREIGN KEY (calls_tbl_id, call_date) REFERENCES calls(id, call_date),
2024-07-16 19:31:30 -04:00
PRIMARY KEY (incident_id, call_id)
);