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

135 lines
3.7 KiB
MySQL
Raw Normal View History

2024-07-14 17:39:03 -04:00
CREATE TABLE IF NOT EXISTS users(
id SERIAL PRIMARY KEY,
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-07-15 19:03:48 -04:00
id SERIAL PRIMARY KEY,
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,
api_key UUID 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
);
CREATE TABLE IF NOT EXISTS talkgroups(
2024-07-17 19:51:29 -04:00
system_id INTEGER REFERENCES systems(id) NOT NULL,
2024-07-17 19:45:46 -04:00
tgid INTEGER,
2024-07-15 19:03:48 -04:00
name 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-07-21 10:46:51 -04:00
PRIMARY KEY (system_id, tgid)
2024-07-15 19:03:48 -04:00
);
2024-07-27 19:25:16 -04:00
CREATE TABLE IF NOT EXISTS talkgroups_learned(
id SERIAL PRIMARY KEY,
system_id INTEGER REFERENCES systems(id) NOT NULL,
tgid INTEGER NOT NULL,
group_name TEXT NOT NULL,
group_tag TEXT,
2024-07-28 01:08:08 -04:00
ignored BOOLEAN,
UNIQUE (system_id, tgid, group_name)
2024-07-27 19:25:16 -04:00
);
CREATE OR REPLACE FUNCTION learn_talkgroup()
RETURNS TRIGGER AS $$
BEGIN
IF NOT EXISTS (SELECT *
FROM talkgroups
2024-07-28 01:08:08 -04:00
LEFT JOIN talkgroups_tags
2024-07-27 19:25:16 -04:00
ON talkgroups_tags.system_id = talkgroups.system_id AND talkgroups_tags.talkgroup_id = talkgroups.tgid
2024-07-28 01:08:08 -04:00
LEFT JOIN talkgroups_learned
ON talkgroups_learned.system_id = talkgroups.system_id AND talkgroups_learned.tgid = talkgroups.tgid
2024-07-27 19:25:16 -04:00
WHERE
talkgroups.system_id = NEW.system AND talkgroups.tgid = NEW.talkgroup AND
(
talkgroups.name != NEW.tg_label
OR NOT (talkgroups_tags.tags @> ARRAY[NEW.tg_tag])
2024-07-28 01:08:08 -04:00
OR talkgroups.tg_group != NEW.tg_group
2024-07-27 19:25:16 -04:00
)
2024-07-28 01:08:08 -04:00
AND talkgroups_learned.ignored IS NOT TRUE
2024-07-27 19:25:16 -04:00
) THEN
INSERT INTO talkgroups_learned(system_id, tgid, group_name, group_tag) VALUES(
NEW.system, NEW.talkgroup, NEW.tg_label, NEW.tg_tag
2024-07-28 01:08:08 -04:00
) ON CONFLICT (system_id, tgid, group_name) DO UPDATE SET group_tag = EXCLUDED.group_tag;
2024-07-27 19:25:16 -04:00
END IF;
RETURN NEW;
END
$$ LANGUAGE plpgsql;
2024-07-17 19:30:16 -04:00
CREATE TABLE IF NOT EXISTS talkgroups_tags(
2024-07-17 19:49:50 -04:00
system_id INTEGER NOT NULL,
talkgroup_id INTEGER NOT NULL,
tags TEXT[] NOT NULL DEFAULT '{}',
2024-07-17 19:51:29 -04:00
FOREIGN KEY (system_id, talkgroup_id) REFERENCES talkgroups (system_id, tgid),
PRIMARY KEY (system_id, talkgroup_id)
2024-07-17 19:30:16 -04:00
);
CREATE INDEX IF NOT EXISTS talkgroup_tags_id_tags ON talkgroups_tags USING GIN (tags);
2024-07-15 19:03:48 -04:00
CREATE TABLE IF NOT EXISTS calls(
id UUID PRIMARY KEY,
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,
2024-07-16 19:35:16 -04:00
call_date TIMESTAMP NOT NULL,
2024-07-15 19:03:48 -04:00
audio_name TEXT,
audio_blob BYTEA,
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-07-27 19:25:16 -04:00
tg_tag TEXT,
tg_group TEXT,
source INTEGER NOT NULL,
2024-07-16 19:31:30 -04:00
transcript TEXT
2024-07-15 19:03:48 -04:00
);
2024-07-16 19:31:30 -04:00
2024-07-27 19:25:16 -04:00
CREATE OR REPLACE TRIGGER learn_tg AFTER INSERT ON calls
FOR EACH ROW EXECUTE FUNCTION learn_talkgroup();
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 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 REFERENCES incidents(id) ON UPDATE CASCADE ON DELETE CASCADE,
call_id UUID REFERENCES calls(id) ON UPDATE CASCADE,
notes JSONB,
PRIMARY KEY (incident_id, call_id)
);