easyai-ai-gateway/apps/api/migrations/0045_request_assets_conversation_dedupe.sql

69 lines
2.6 KiB
SQL

CREATE TABLE IF NOT EXISTS gateway_request_assets (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
sha256 text NOT NULL,
content_type text NOT NULL,
byte_size bigint NOT NULL,
url text NOT NULL,
storage_provider text NOT NULL,
local_path text,
expires_at timestamptz,
expired_at timestamptz,
ref_count integer NOT NULL DEFAULT 0,
created_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz NOT NULL DEFAULT now(),
UNIQUE (sha256, content_type)
);
CREATE INDEX IF NOT EXISTS idx_gateway_request_assets_expires
ON gateway_request_assets(storage_provider, expires_at)
WHERE expires_at IS NOT NULL AND expired_at IS NULL;
CREATE INDEX IF NOT EXISTS idx_gateway_request_assets_local_path
ON gateway_request_assets(local_path)
WHERE local_path IS NOT NULL;
CREATE TABLE IF NOT EXISTS gateway_conversations (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
user_id text NOT NULL,
gateway_user_id uuid REFERENCES gateway_users(id) ON DELETE SET NULL,
conversation_key text NOT NULL,
metadata jsonb NOT NULL DEFAULT '{}'::jsonb,
created_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz NOT NULL DEFAULT now(),
UNIQUE (user_id, conversation_key)
);
CREATE TABLE IF NOT EXISTS gateway_conversation_messages (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
conversation_id uuid NOT NULL REFERENCES gateway_conversations(id) ON DELETE CASCADE,
message_hash text NOT NULL,
role text,
message_snapshot jsonb NOT NULL,
asset_sha256s text[] NOT NULL DEFAULT '{}',
created_at timestamptz NOT NULL DEFAULT now(),
updated_at timestamptz NOT NULL DEFAULT now(),
UNIQUE (conversation_id, message_hash)
);
CREATE INDEX IF NOT EXISTS idx_gateway_conversation_messages_conversation
ON gateway_conversation_messages(conversation_id, created_at);
CREATE TABLE IF NOT EXISTS gateway_task_message_refs (
task_id uuid NOT NULL REFERENCES gateway_tasks(id) ON DELETE CASCADE,
message_id uuid NOT NULL REFERENCES gateway_conversation_messages(id) ON DELETE CASCADE,
position integer NOT NULL,
created_at timestamptz NOT NULL DEFAULT now(),
PRIMARY KEY (task_id, position)
);
CREATE INDEX IF NOT EXISTS idx_gateway_task_message_refs_message
ON gateway_task_message_refs(message_id);
ALTER TABLE gateway_tasks
ADD COLUMN IF NOT EXISTS conversation_id uuid REFERENCES gateway_conversations(id) ON DELETE SET NULL,
ADD COLUMN IF NOT EXISTS new_message_count integer NOT NULL DEFAULT 0;
CREATE INDEX IF NOT EXISTS idx_gateway_tasks_conversation_created
ON gateway_tasks(conversation_id, created_at DESC)
WHERE conversation_id IS NOT NULL;