nidus-sync/db/migrations/00018_nidus_notes.sql

170 lines
4.5 KiB
MySQL
Raw Normal View History

-- +goose Up
CREATE TABLE note_audio (
created TIMESTAMP WITHOUT TIME ZONE NOT NULL,
creator_id INTEGER REFERENCES user_ (id) NOT NULL,
deleted TIMESTAMP WITHOUT TIME ZONE,
deletor_id INTEGER REFERENCES user_ (id),
duration REAL NOT NULL,
organization_id INTEGER REFERENCES organization (id) NOT NULL,
transcription TEXT,
transcription_user_edited BOOLEAN NOT NULL,
version INTEGER NOT NULL,
uuid UUID NOT NULL,
PRIMARY KEY(version, uuid)
);
CREATE TABLE note_audio_breadcrumb (
cell h3index NOT NULL,
created TIMESTAMP WITHOUT TIME ZONE NOT NULL,
manually_selected BOOLEAN NOT NULL,
note_audio_version INTEGER NOT NULL,
note_audio_uuid UUID NOT NULL,
position INTEGER NOT NULL,
FOREIGN KEY (note_audio_version, note_audio_uuid) REFERENCES note_audio (version, uuid),
PRIMARY KEY (note_audio_version, note_audio_uuid, position)
);
CREATE TYPE AudioDataType AS ENUM (
'raw',
'raw_normalized',
'ogg');
CREATE TABLE note_audio_data (
created TIMESTAMP WITHOUT TIME ZONE NOT NULL,
note_audio_version INTEGER NOT NULL,
note_audio_uuid UUID NOT NULL,
type_ AudioDataType NOT NULL,
FOREIGN KEY (note_audio_version, note_audio_uuid) REFERENCES note_audio (version, uuid),
PRIMARY KEY (note_audio_version, note_audio_uuid, type_)
);
CREATE TABLE note_image (
created TIMESTAMP WITHOUT TIME ZONE NOT NULL,
creator_id INTEGER REFERENCES user_ (id) NOT NULL,
deleted TIMESTAMP WITHOUT TIME ZONE,
deletor_id INTEGER REFERENCES user_ (id),
organization_id INTEGER REFERENCES organization (id) NOT NULL,
version INTEGER NOT NULL,
uuid UUID NOT NULL,
PRIMARY KEY(version, uuid)
);
CREATE TYPE ImageDataType AS ENUM (
'raw',
'png');
CREATE TABLE note_image_data (
created TIMESTAMP WITHOUT TIME ZONE NOT NULL,
note_image_version INTEGER NOT NULL,
note_image_uuid UUID NOT NULL,
type_ AudioDataType NOT NULL,
FOREIGN KEY (note_image_version, note_image_uuid) REFERENCES note_image (version, uuid),
PRIMARY KEY (note_image_version, note_image_uuid, type_)
);
CREATE TABLE note_image_breadcrumb (
cell h3index NOT NULL,
created TIMESTAMP WITHOUT TIME ZONE NOT NULL,
manually_selected BOOLEAN NOT NULL,
note_image_version INTEGER NOT NULL,
note_image_uuid UUID NOT NULL,
position INTEGER NOT NULL,
FOREIGN KEY (note_image_version, note_image_uuid) REFERENCES note_image (version, uuid),
PRIMARY KEY (note_image_version, note_image_uuid, position)
);
-- +goose StatementBegin
CREATE OR REPLACE FUNCTION insert_note_audio(
p_uuid UUID,
p_created TIMESTAMP WITHOUT TIME ZONE,
p_creator_id INTEGER,
p_deleted TIMESTAMP WITHOUT TIME ZONE,
p_deletor_id INTEGER,
p_duration REAL,
p_organization_id INTEGER,
p_transcription TEXT,
p_transcription_user_edited BOOLEAN
) RETURNS TABLE(row_inserted BOOLEAN, version_num INTEGER) AS $$
DECLARE
v_next_version INTEGER;
v_changes_exist BOOLEAN;
BEGIN
-- Check if changes exist
SELECT NOT EXISTS (
SELECT 1 FROM note_audio lv
WHERE lv.uuid = p_uuid
AND lv.created IS NOT DISTINCT FROM p_created
AND lv.creator_id IS NOT DISTINCT FROM p_creator_id
AND lv.deleted IS NOT DISTINCT FROM p_deleted
AND lv.deletor_id IS NOT DISTINCT FROM p_deletor_id
AND lv.duration IS NOT DISTINCT FROM p_duration
AND lv.organization_id IS NOT DISTINCT FROM p_organization_id
AND lv.transcription IS NOT DISTINCT FROM p_transcription
AND lv.transcription_user_edited IS NOT DISTINCT FROM p_transcription_user_edited
ORDER BY VERSION DESC LIMIT 1
) INTO v_changes_exist;
-- If no changes, return false with current version
IF NOT v_changes_exist THEN
RETURN QUERY
SELECT
FALSE AS row_inserted,
(SELECT VERSION FROM note_audio
WHERE uuid = p_uuid ORDER BY VERSION DESC LIMIT 1) AS version_num;
RETURN;
END IF;
-- Calculate next version
SELECT COALESCE(MAX(VERSION) + 1, 1) INTO v_next_version
FROM note_audio
WHERE uuid = p_uuid;
-- Insert new version
INSERT INTO note_audio (
uuid,
created,
creator_id,
deleted,
deletor_id,
duration,
organization_id,
transcription,
transcription_user_edited
) VALUES (
p_uuid,
p_created,
p_creator_id,
p_deleted,
p_deletor_id,
p_duration,
p_organization_id,
p_transcription,
p_transcription_user_edited
);
-- Return success with new version
RETURN QUERY SELECT TRUE AS row_inserted, v_next_version AS version_num;
END;
$$ LANGUAGE plpgsql;
-- +goose StatementEnd
-- +goose Down
DROP TABLE note_image_breadcrumb;
DROP TABLE note_image_data;
DROP TABLE note_image;
DROP TYPE ImageDataType;
DROP TABLE note_audio_breadcrumb;
DROP TABLE note_audio_data;
DROP TABLE note_audio;
DROP TYPE AudioDataType;