chore: consolidate migrations 6.1.1-6.1.3 into 6.1.0_enterprise_suite
- Integrate config ID type fixes (TEXT → UUID) - Integrate connected_accounts, session_account_associations, account_sync_items - Integrate bot hierarchy (parent_bot_id, enabled_tabs_json, inherit_parent_config) - Integrate email_monitors, folder_monitors, folder_change_events, email_received_events - Integrate user_organizations table - Remove separate 6.1.1, 6.1.2, 6.1.3 migration folders - Maximum version remains 6.1.0 per project standards
This commit is contained in:
parent
ff6f332763
commit
26d7dcceb7
8 changed files with 491 additions and 467 deletions
|
|
@ -1,6 +1,181 @@
|
||||||
-- Rollback Migration: 6.1.0 Enterprise Features
|
-- Rollback Migration: 6.1.0 Enterprise Features
|
||||||
-- WARNING: This will delete all enterprise feature data!
|
-- WARNING: This will delete all enterprise feature data!
|
||||||
-- NOTE: TABLES AND INDEXES ONLY - No views, triggers, or functions per project standards
|
-- NOTE: TABLES AND INDEXES ONLY - No views, triggers, or functions per project standards
|
||||||
|
-- Includes rollback for: config ID fixes, connected accounts, bot hierarchy, monitors
|
||||||
|
|
||||||
|
-- ============================================================================
|
||||||
|
-- ROLLBACK: Bot Hierarchy and Monitors (from 6.1.3)
|
||||||
|
-- ============================================================================
|
||||||
|
|
||||||
|
-- Drop comments first
|
||||||
|
COMMENT ON TABLE public.user_organizations IS NULL;
|
||||||
|
COMMENT ON TABLE public.email_received_events IS NULL;
|
||||||
|
COMMENT ON TABLE public.folder_change_events IS NULL;
|
||||||
|
COMMENT ON TABLE public.folder_monitors IS NULL;
|
||||||
|
COMMENT ON TABLE public.email_monitors IS NULL;
|
||||||
|
COMMENT ON COLUMN public.bots.inherit_parent_config IS NULL;
|
||||||
|
COMMENT ON COLUMN public.bots.enabled_tabs_json IS NULL;
|
||||||
|
COMMENT ON COLUMN public.bots.parent_bot_id IS NULL;
|
||||||
|
COMMENT ON TABLE public.system_automations IS NULL;
|
||||||
|
|
||||||
|
-- Drop user organizations table
|
||||||
|
DROP INDEX IF EXISTS idx_user_orgs_default;
|
||||||
|
DROP INDEX IF EXISTS idx_user_orgs_org;
|
||||||
|
DROP INDEX IF EXISTS idx_user_orgs_user;
|
||||||
|
DROP TABLE IF EXISTS public.user_organizations;
|
||||||
|
|
||||||
|
-- Drop email received events table
|
||||||
|
DROP INDEX IF EXISTS idx_email_events_received;
|
||||||
|
DROP INDEX IF EXISTS idx_email_events_processed;
|
||||||
|
DROP INDEX IF EXISTS idx_email_events_monitor;
|
||||||
|
DROP TABLE IF EXISTS public.email_received_events;
|
||||||
|
|
||||||
|
-- Drop folder change events table
|
||||||
|
DROP INDEX IF EXISTS idx_folder_events_created;
|
||||||
|
DROP INDEX IF EXISTS idx_folder_events_processed;
|
||||||
|
DROP INDEX IF EXISTS idx_folder_events_monitor;
|
||||||
|
DROP TABLE IF EXISTS public.folder_change_events;
|
||||||
|
|
||||||
|
-- Drop folder monitors table
|
||||||
|
DROP INDEX IF EXISTS idx_folder_monitors_account_email;
|
||||||
|
DROP INDEX IF EXISTS idx_folder_monitors_active;
|
||||||
|
DROP INDEX IF EXISTS idx_folder_monitors_provider;
|
||||||
|
DROP INDEX IF EXISTS idx_folder_monitors_bot_id;
|
||||||
|
DROP TABLE IF EXISTS public.folder_monitors;
|
||||||
|
|
||||||
|
-- Drop email monitors table
|
||||||
|
DROP INDEX IF EXISTS idx_email_monitors_active;
|
||||||
|
DROP INDEX IF EXISTS idx_email_monitors_email;
|
||||||
|
DROP INDEX IF EXISTS idx_email_monitors_bot_id;
|
||||||
|
DROP TABLE IF EXISTS public.email_monitors;
|
||||||
|
|
||||||
|
-- Remove bot hierarchy columns
|
||||||
|
DROP INDEX IF EXISTS idx_bots_parent_bot_id;
|
||||||
|
ALTER TABLE public.bots DROP COLUMN IF EXISTS inherit_parent_config;
|
||||||
|
ALTER TABLE public.bots DROP COLUMN IF EXISTS enabled_tabs_json;
|
||||||
|
ALTER TABLE public.bots DROP COLUMN IF EXISTS parent_bot_id;
|
||||||
|
|
||||||
|
-- ============================================================================
|
||||||
|
-- ROLLBACK: Connected Accounts (from 6.1.2)
|
||||||
|
-- ============================================================================
|
||||||
|
|
||||||
|
DROP INDEX IF EXISTS idx_account_sync_items_unique;
|
||||||
|
DROP INDEX IF EXISTS idx_account_sync_items_embedding;
|
||||||
|
DROP INDEX IF EXISTS idx_account_sync_items_date;
|
||||||
|
DROP INDEX IF EXISTS idx_account_sync_items_type;
|
||||||
|
DROP INDEX IF EXISTS idx_account_sync_items_account;
|
||||||
|
DROP TABLE IF EXISTS account_sync_items;
|
||||||
|
|
||||||
|
DROP INDEX IF EXISTS idx_session_account_assoc_unique;
|
||||||
|
DROP INDEX IF EXISTS idx_session_account_assoc_active;
|
||||||
|
DROP INDEX IF EXISTS idx_session_account_assoc_account;
|
||||||
|
DROP INDEX IF EXISTS idx_session_account_assoc_session;
|
||||||
|
DROP TABLE IF EXISTS session_account_associations;
|
||||||
|
|
||||||
|
DROP INDEX IF EXISTS idx_connected_accounts_bot_email;
|
||||||
|
DROP INDEX IF EXISTS idx_connected_accounts_status;
|
||||||
|
DROP INDEX IF EXISTS idx_connected_accounts_provider;
|
||||||
|
DROP INDEX IF EXISTS idx_connected_accounts_email;
|
||||||
|
DROP INDEX IF EXISTS idx_connected_accounts_user_id;
|
||||||
|
DROP INDEX IF EXISTS idx_connected_accounts_bot_id;
|
||||||
|
DROP TABLE IF EXISTS connected_accounts;
|
||||||
|
|
||||||
|
-- ============================================================================
|
||||||
|
-- ROLLBACK: Config ID Type Fixes (from 6.1.1)
|
||||||
|
-- Revert UUID columns back to TEXT
|
||||||
|
-- ============================================================================
|
||||||
|
|
||||||
|
DO $$
|
||||||
|
BEGIN
|
||||||
|
IF EXISTS (SELECT 1 FROM information_schema.columns
|
||||||
|
WHERE table_name = 'bot_configuration'
|
||||||
|
AND column_name = 'id'
|
||||||
|
AND data_type = 'uuid') THEN
|
||||||
|
ALTER TABLE bot_configuration
|
||||||
|
ALTER COLUMN id TYPE TEXT USING id::text;
|
||||||
|
END IF;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$
|
||||||
|
BEGIN
|
||||||
|
IF EXISTS (SELECT 1 FROM information_schema.columns
|
||||||
|
WHERE table_name = 'server_configuration'
|
||||||
|
AND column_name = 'id'
|
||||||
|
AND data_type = 'uuid') THEN
|
||||||
|
ALTER TABLE server_configuration
|
||||||
|
ALTER COLUMN id TYPE TEXT USING id::text;
|
||||||
|
END IF;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$
|
||||||
|
BEGIN
|
||||||
|
IF EXISTS (SELECT 1 FROM information_schema.columns
|
||||||
|
WHERE table_name = 'tenant_configuration'
|
||||||
|
AND column_name = 'id'
|
||||||
|
AND data_type = 'uuid') THEN
|
||||||
|
ALTER TABLE tenant_configuration
|
||||||
|
ALTER COLUMN id TYPE TEXT USING id::text;
|
||||||
|
END IF;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$
|
||||||
|
BEGIN
|
||||||
|
IF EXISTS (SELECT 1 FROM information_schema.columns
|
||||||
|
WHERE table_name = 'model_configurations'
|
||||||
|
AND column_name = 'id'
|
||||||
|
AND data_type = 'uuid') THEN
|
||||||
|
ALTER TABLE model_configurations
|
||||||
|
ALTER COLUMN id TYPE TEXT USING id::text;
|
||||||
|
END IF;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$
|
||||||
|
BEGIN
|
||||||
|
IF EXISTS (SELECT 1 FROM information_schema.columns
|
||||||
|
WHERE table_name = 'connection_configurations'
|
||||||
|
AND column_name = 'id'
|
||||||
|
AND data_type = 'uuid') THEN
|
||||||
|
ALTER TABLE connection_configurations
|
||||||
|
ALTER COLUMN id TYPE TEXT USING id::text;
|
||||||
|
END IF;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$
|
||||||
|
BEGIN
|
||||||
|
IF EXISTS (SELECT 1 FROM information_schema.columns
|
||||||
|
WHERE table_name = 'component_installations'
|
||||||
|
AND column_name = 'id'
|
||||||
|
AND data_type = 'uuid') THEN
|
||||||
|
ALTER TABLE component_installations
|
||||||
|
ALTER COLUMN id TYPE TEXT USING id::text;
|
||||||
|
END IF;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$
|
||||||
|
BEGIN
|
||||||
|
IF EXISTS (SELECT 1 FROM information_schema.columns
|
||||||
|
WHERE table_name = 'component_logs'
|
||||||
|
AND column_name = 'id'
|
||||||
|
AND data_type = 'uuid') THEN
|
||||||
|
ALTER TABLE component_logs
|
||||||
|
ALTER COLUMN id TYPE TEXT USING id::text;
|
||||||
|
END IF;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
DO $$
|
||||||
|
BEGIN
|
||||||
|
IF EXISTS (SELECT 1 FROM information_schema.columns
|
||||||
|
WHERE table_name = 'gbot_config_sync'
|
||||||
|
AND column_name = 'id'
|
||||||
|
AND data_type = 'uuid') THEN
|
||||||
|
ALTER TABLE gbot_config_sync
|
||||||
|
ALTER COLUMN id TYPE TEXT USING id::text;
|
||||||
|
END IF;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
-- ============================================================================
|
||||||
|
-- ROLLBACK: Original 6.1.0 Enterprise Features
|
||||||
|
-- ============================================================================
|
||||||
|
|
||||||
-- Drop test support tables
|
-- Drop test support tables
|
||||||
DROP TABLE IF EXISTS test_execution_logs;
|
DROP TABLE IF EXISTS test_execution_logs;
|
||||||
|
|
|
||||||
|
|
@ -1726,3 +1726,319 @@ CREATE TRIGGER external_connections_updated_at_trigger
|
||||||
BEFORE UPDATE ON external_connections
|
BEFORE UPDATE ON external_connections
|
||||||
FOR EACH ROW
|
FOR EACH ROW
|
||||||
EXECUTE FUNCTION update_external_connections_updated_at();
|
EXECUTE FUNCTION update_external_connections_updated_at();
|
||||||
|
|
||||||
|
-- ============================================================================
|
||||||
|
-- CONFIG ID TYPE FIXES (from 6.1.1)
|
||||||
|
-- Fix columns that were created as TEXT but should be UUID
|
||||||
|
-- ============================================================================
|
||||||
|
|
||||||
|
-- For bot_configuration
|
||||||
|
DO $$
|
||||||
|
BEGIN
|
||||||
|
IF EXISTS (SELECT 1 FROM information_schema.columns
|
||||||
|
WHERE table_name = 'bot_configuration'
|
||||||
|
AND column_name = 'id'
|
||||||
|
AND data_type = 'text') THEN
|
||||||
|
ALTER TABLE bot_configuration
|
||||||
|
ALTER COLUMN id TYPE UUID USING id::uuid;
|
||||||
|
END IF;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
-- For server_configuration
|
||||||
|
DO $$
|
||||||
|
BEGIN
|
||||||
|
IF EXISTS (SELECT 1 FROM information_schema.columns
|
||||||
|
WHERE table_name = 'server_configuration'
|
||||||
|
AND column_name = 'id'
|
||||||
|
AND data_type = 'text') THEN
|
||||||
|
ALTER TABLE server_configuration
|
||||||
|
ALTER COLUMN id TYPE UUID USING id::uuid;
|
||||||
|
END IF;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
-- For tenant_configuration
|
||||||
|
DO $$
|
||||||
|
BEGIN
|
||||||
|
IF EXISTS (SELECT 1 FROM information_schema.columns
|
||||||
|
WHERE table_name = 'tenant_configuration'
|
||||||
|
AND column_name = 'id'
|
||||||
|
AND data_type = 'text') THEN
|
||||||
|
ALTER TABLE tenant_configuration
|
||||||
|
ALTER COLUMN id TYPE UUID USING id::uuid;
|
||||||
|
END IF;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
-- For model_configurations
|
||||||
|
DO $$
|
||||||
|
BEGIN
|
||||||
|
IF EXISTS (SELECT 1 FROM information_schema.columns
|
||||||
|
WHERE table_name = 'model_configurations'
|
||||||
|
AND column_name = 'id'
|
||||||
|
AND data_type = 'text') THEN
|
||||||
|
ALTER TABLE model_configurations
|
||||||
|
ALTER COLUMN id TYPE UUID USING id::uuid;
|
||||||
|
END IF;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
-- For connection_configurations
|
||||||
|
DO $$
|
||||||
|
BEGIN
|
||||||
|
IF EXISTS (SELECT 1 FROM information_schema.columns
|
||||||
|
WHERE table_name = 'connection_configurations'
|
||||||
|
AND column_name = 'id'
|
||||||
|
AND data_type = 'text') THEN
|
||||||
|
ALTER TABLE connection_configurations
|
||||||
|
ALTER COLUMN id TYPE UUID USING id::uuid;
|
||||||
|
END IF;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
-- For component_installations
|
||||||
|
DO $$
|
||||||
|
BEGIN
|
||||||
|
IF EXISTS (SELECT 1 FROM information_schema.columns
|
||||||
|
WHERE table_name = 'component_installations'
|
||||||
|
AND column_name = 'id'
|
||||||
|
AND data_type = 'text') THEN
|
||||||
|
ALTER TABLE component_installations
|
||||||
|
ALTER COLUMN id TYPE UUID USING id::uuid;
|
||||||
|
END IF;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
-- For component_logs
|
||||||
|
DO $$
|
||||||
|
BEGIN
|
||||||
|
IF EXISTS (SELECT 1 FROM information_schema.columns
|
||||||
|
WHERE table_name = 'component_logs'
|
||||||
|
AND column_name = 'id'
|
||||||
|
AND data_type = 'text') THEN
|
||||||
|
ALTER TABLE component_logs
|
||||||
|
ALTER COLUMN id TYPE UUID USING id::uuid;
|
||||||
|
END IF;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
-- For gbot_config_sync
|
||||||
|
DO $$
|
||||||
|
BEGIN
|
||||||
|
IF EXISTS (SELECT 1 FROM information_schema.columns
|
||||||
|
WHERE table_name = 'gbot_config_sync'
|
||||||
|
AND column_name = 'id'
|
||||||
|
AND data_type = 'text') THEN
|
||||||
|
ALTER TABLE gbot_config_sync
|
||||||
|
ALTER COLUMN id TYPE UUID USING id::uuid;
|
||||||
|
END IF;
|
||||||
|
END $$;
|
||||||
|
|
||||||
|
-- ============================================================================
|
||||||
|
-- CONNECTED ACCOUNTS (from 6.1.2)
|
||||||
|
-- OAuth connected accounts for email providers
|
||||||
|
-- ============================================================================
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS connected_accounts (
|
||||||
|
id UUID PRIMARY KEY,
|
||||||
|
bot_id UUID NOT NULL REFERENCES bots(id) ON DELETE CASCADE,
|
||||||
|
user_id UUID,
|
||||||
|
email TEXT NOT NULL,
|
||||||
|
provider TEXT NOT NULL,
|
||||||
|
account_type TEXT NOT NULL DEFAULT 'email',
|
||||||
|
access_token TEXT NOT NULL,
|
||||||
|
refresh_token TEXT,
|
||||||
|
token_expires_at TIMESTAMPTZ,
|
||||||
|
scopes TEXT,
|
||||||
|
status TEXT NOT NULL DEFAULT 'active',
|
||||||
|
sync_enabled BOOLEAN NOT NULL DEFAULT true,
|
||||||
|
sync_interval_seconds INTEGER NOT NULL DEFAULT 300,
|
||||||
|
last_sync_at TIMESTAMPTZ,
|
||||||
|
last_sync_status TEXT,
|
||||||
|
last_sync_error TEXT,
|
||||||
|
metadata_json TEXT DEFAULT '{}',
|
||||||
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||||
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_connected_accounts_bot_id ON connected_accounts(bot_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_connected_accounts_user_id ON connected_accounts(user_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_connected_accounts_email ON connected_accounts(email);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_connected_accounts_provider ON connected_accounts(provider);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_connected_accounts_status ON connected_accounts(status);
|
||||||
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_connected_accounts_bot_email ON connected_accounts(bot_id, email);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS session_account_associations (
|
||||||
|
id UUID PRIMARY KEY,
|
||||||
|
session_id UUID NOT NULL,
|
||||||
|
bot_id UUID NOT NULL REFERENCES bots(id) ON DELETE CASCADE,
|
||||||
|
account_id UUID NOT NULL REFERENCES connected_accounts(id) ON DELETE CASCADE,
|
||||||
|
email TEXT NOT NULL,
|
||||||
|
provider TEXT NOT NULL,
|
||||||
|
qdrant_collection TEXT NOT NULL,
|
||||||
|
is_active BOOLEAN NOT NULL DEFAULT true,
|
||||||
|
added_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||||
|
added_by_tool TEXT
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_session_account_assoc_session ON session_account_associations(session_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_session_account_assoc_account ON session_account_associations(account_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_session_account_assoc_active ON session_account_associations(session_id, is_active);
|
||||||
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_session_account_assoc_unique ON session_account_associations(session_id, account_id);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS account_sync_items (
|
||||||
|
id UUID PRIMARY KEY,
|
||||||
|
account_id UUID NOT NULL REFERENCES connected_accounts(id) ON DELETE CASCADE,
|
||||||
|
item_type TEXT NOT NULL,
|
||||||
|
item_id TEXT NOT NULL,
|
||||||
|
subject TEXT,
|
||||||
|
content_preview TEXT,
|
||||||
|
sender TEXT,
|
||||||
|
recipients TEXT,
|
||||||
|
item_date TIMESTAMPTZ,
|
||||||
|
folder TEXT,
|
||||||
|
labels TEXT,
|
||||||
|
has_attachments BOOLEAN DEFAULT false,
|
||||||
|
qdrant_point_id TEXT,
|
||||||
|
embedding_status TEXT DEFAULT 'pending',
|
||||||
|
metadata_json TEXT DEFAULT '{}',
|
||||||
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||||
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_account_sync_items_account ON account_sync_items(account_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_account_sync_items_type ON account_sync_items(item_type);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_account_sync_items_date ON account_sync_items(item_date);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_account_sync_items_embedding ON account_sync_items(embedding_status);
|
||||||
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_account_sync_items_unique ON account_sync_items(account_id, item_type, item_id);
|
||||||
|
|
||||||
|
-- ============================================================================
|
||||||
|
-- BOT HIERARCHY AND MONITORS (from 6.1.3)
|
||||||
|
-- Sub-bots, ON EMAIL triggers, ON CHANGE triggers
|
||||||
|
-- ============================================================================
|
||||||
|
|
||||||
|
-- Bot Hierarchy: Add parent_bot_id to support sub-bots
|
||||||
|
ALTER TABLE public.bots
|
||||||
|
ADD COLUMN IF NOT EXISTS parent_bot_id UUID REFERENCES public.bots(id) ON DELETE SET NULL;
|
||||||
|
|
||||||
|
-- Index for efficient hierarchy queries
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_bots_parent_bot_id ON public.bots(parent_bot_id);
|
||||||
|
|
||||||
|
-- Bot enabled tabs configuration (which UI tabs are enabled for this bot)
|
||||||
|
ALTER TABLE public.bots
|
||||||
|
ADD COLUMN IF NOT EXISTS enabled_tabs_json TEXT DEFAULT '["chat"]';
|
||||||
|
|
||||||
|
-- Bot configuration inheritance flag
|
||||||
|
ALTER TABLE public.bots
|
||||||
|
ADD COLUMN IF NOT EXISTS inherit_parent_config BOOLEAN DEFAULT true;
|
||||||
|
|
||||||
|
-- Email monitoring table for ON EMAIL triggers
|
||||||
|
CREATE TABLE IF NOT EXISTS public.email_monitors (
|
||||||
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||||
|
bot_id UUID NOT NULL REFERENCES public.bots(id) ON DELETE CASCADE,
|
||||||
|
email_address VARCHAR(500) NOT NULL,
|
||||||
|
script_path VARCHAR(1000) NOT NULL,
|
||||||
|
is_active BOOLEAN DEFAULT true,
|
||||||
|
last_check_at TIMESTAMPTZ,
|
||||||
|
last_uid BIGINT DEFAULT 0,
|
||||||
|
filter_from VARCHAR(500),
|
||||||
|
filter_subject VARCHAR(500),
|
||||||
|
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
||||||
|
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
||||||
|
CONSTRAINT unique_bot_email UNIQUE (bot_id, email_address)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_email_monitors_bot_id ON public.email_monitors(bot_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_email_monitors_email ON public.email_monitors(email_address);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_email_monitors_active ON public.email_monitors(is_active) WHERE is_active = true;
|
||||||
|
|
||||||
|
-- Folder monitoring table for ON CHANGE triggers (GDrive, OneDrive, Dropbox)
|
||||||
|
-- Uses account:// syntax: account://user@gmail.com/path or gdrive:///path
|
||||||
|
CREATE TABLE IF NOT EXISTS public.folder_monitors (
|
||||||
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||||
|
bot_id UUID NOT NULL REFERENCES public.bots(id) ON DELETE CASCADE,
|
||||||
|
provider VARCHAR(50) NOT NULL, -- 'gdrive', 'onedrive', 'dropbox', 'local'
|
||||||
|
account_email VARCHAR(500), -- Email from account:// path (e.g., user@gmail.com)
|
||||||
|
folder_path VARCHAR(2000) NOT NULL,
|
||||||
|
folder_id VARCHAR(500), -- Provider-specific folder ID
|
||||||
|
script_path VARCHAR(1000) NOT NULL,
|
||||||
|
is_active BOOLEAN DEFAULT true,
|
||||||
|
watch_subfolders BOOLEAN DEFAULT true,
|
||||||
|
last_check_at TIMESTAMPTZ,
|
||||||
|
last_change_token VARCHAR(500), -- Provider-specific change token/page token
|
||||||
|
event_types_json TEXT DEFAULT '["create", "modify", "delete"]',
|
||||||
|
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
||||||
|
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
||||||
|
CONSTRAINT unique_bot_folder UNIQUE (bot_id, provider, folder_path)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_folder_monitors_bot_id ON public.folder_monitors(bot_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_folder_monitors_provider ON public.folder_monitors(provider);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_folder_monitors_active ON public.folder_monitors(is_active) WHERE is_active = true;
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_folder_monitors_account_email ON public.folder_monitors(account_email);
|
||||||
|
|
||||||
|
-- Folder change events log
|
||||||
|
CREATE TABLE IF NOT EXISTS public.folder_change_events (
|
||||||
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||||
|
monitor_id UUID NOT NULL REFERENCES public.folder_monitors(id) ON DELETE CASCADE,
|
||||||
|
event_type VARCHAR(50) NOT NULL, -- 'create', 'modify', 'delete', 'rename', 'move'
|
||||||
|
file_path VARCHAR(2000) NOT NULL,
|
||||||
|
file_id VARCHAR(500),
|
||||||
|
file_name VARCHAR(500),
|
||||||
|
file_size BIGINT,
|
||||||
|
mime_type VARCHAR(255),
|
||||||
|
old_path VARCHAR(2000), -- For rename/move events
|
||||||
|
processed BOOLEAN DEFAULT false,
|
||||||
|
processed_at TIMESTAMPTZ,
|
||||||
|
error_message TEXT,
|
||||||
|
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_folder_events_monitor ON public.folder_change_events(monitor_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_folder_events_processed ON public.folder_change_events(processed) WHERE processed = false;
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_folder_events_created ON public.folder_change_events(created_at);
|
||||||
|
|
||||||
|
-- Email received events log
|
||||||
|
CREATE TABLE IF NOT EXISTS public.email_received_events (
|
||||||
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||||
|
monitor_id UUID NOT NULL REFERENCES public.email_monitors(id) ON DELETE CASCADE,
|
||||||
|
message_uid BIGINT NOT NULL,
|
||||||
|
message_id VARCHAR(500),
|
||||||
|
from_address VARCHAR(500) NOT NULL,
|
||||||
|
to_addresses_json TEXT,
|
||||||
|
subject VARCHAR(1000),
|
||||||
|
received_at TIMESTAMPTZ,
|
||||||
|
has_attachments BOOLEAN DEFAULT false,
|
||||||
|
attachments_json TEXT,
|
||||||
|
processed BOOLEAN DEFAULT false,
|
||||||
|
processed_at TIMESTAMPTZ,
|
||||||
|
error_message TEXT,
|
||||||
|
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_email_events_monitor ON public.email_received_events(monitor_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_email_events_processed ON public.email_received_events(processed) WHERE processed = false;
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_email_events_received ON public.email_received_events(received_at);
|
||||||
|
|
||||||
|
-- Add new trigger kinds to system_automations
|
||||||
|
-- TriggerKind enum: 0=Scheduled, 1=TableUpdate, 2=TableInsert, 3=TableDelete, 4=Webhook, 5=EmailReceived, 6=FolderChange
|
||||||
|
COMMENT ON TABLE public.system_automations IS 'System automations with TriggerKind: 0=Scheduled, 1=TableUpdate, 2=TableInsert, 3=TableDelete, 4=Webhook, 5=EmailReceived, 6=FolderChange';
|
||||||
|
|
||||||
|
-- User organization memberships (users can belong to multiple orgs)
|
||||||
|
CREATE TABLE IF NOT EXISTS public.user_organizations (
|
||||||
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||||
|
user_id UUID NOT NULL REFERENCES public.users(user_id) ON DELETE CASCADE,
|
||||||
|
org_id UUID NOT NULL REFERENCES public.organizations(org_id) ON DELETE CASCADE,
|
||||||
|
role VARCHAR(50) DEFAULT 'member', -- 'owner', 'admin', 'member', 'viewer'
|
||||||
|
is_default BOOLEAN DEFAULT false,
|
||||||
|
joined_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
||||||
|
CONSTRAINT unique_user_org UNIQUE (user_id, org_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_user_orgs_user ON public.user_organizations(user_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_user_orgs_org ON public.user_organizations(org_id);
|
||||||
|
CREATE INDEX IF NOT EXISTS idx_user_orgs_default ON public.user_organizations(user_id, is_default) WHERE is_default = true;
|
||||||
|
|
||||||
|
-- Comments for documentation
|
||||||
|
COMMENT ON COLUMN public.bots.parent_bot_id IS 'Parent bot ID for hierarchical bot structure. NULL means root bot.';
|
||||||
|
COMMENT ON COLUMN public.bots.enabled_tabs_json IS 'JSON array of enabled UI tabs for this bot. Root bots have all tabs.';
|
||||||
|
COMMENT ON COLUMN public.bots.inherit_parent_config IS 'If true, inherits config from parent bot for missing values.';
|
||||||
|
COMMENT ON TABLE public.email_monitors IS 'Email monitoring configuration for ON EMAIL triggers.';
|
||||||
|
COMMENT ON TABLE public.folder_monitors IS 'Folder monitoring configuration for ON CHANGE triggers (GDrive, OneDrive, Dropbox).';
|
||||||
|
COMMENT ON TABLE public.folder_change_events IS 'Log of detected folder changes to be processed by scripts.';
|
||||||
|
COMMENT ON TABLE public.email_received_events IS 'Log of received emails to be processed by scripts.';
|
||||||
|
COMMENT ON TABLE public.user_organizations IS 'User membership in organizations with roles.';
|
||||||
|
|
|
||||||
|
|
@ -1,98 +0,0 @@
|
||||||
-- Rollback Migration 6.1.1: Revert UUID columns back to TEXT
|
|
||||||
-- This reverts the id columns from UUID back to TEXT
|
|
||||||
|
|
||||||
-- For bot_configuration
|
|
||||||
DO $$
|
|
||||||
BEGIN
|
|
||||||
IF EXISTS (SELECT 1 FROM information_schema.columns
|
|
||||||
WHERE table_name = 'bot_configuration'
|
|
||||||
AND column_name = 'id'
|
|
||||||
AND data_type = 'uuid') THEN
|
|
||||||
ALTER TABLE bot_configuration
|
|
||||||
ALTER COLUMN id TYPE TEXT USING id::text;
|
|
||||||
END IF;
|
|
||||||
END $$;
|
|
||||||
|
|
||||||
-- For server_configuration
|
|
||||||
DO $$
|
|
||||||
BEGIN
|
|
||||||
IF EXISTS (SELECT 1 FROM information_schema.columns
|
|
||||||
WHERE table_name = 'server_configuration'
|
|
||||||
AND column_name = 'id'
|
|
||||||
AND data_type = 'uuid') THEN
|
|
||||||
ALTER TABLE server_configuration
|
|
||||||
ALTER COLUMN id TYPE TEXT USING id::text;
|
|
||||||
END IF;
|
|
||||||
END $$;
|
|
||||||
|
|
||||||
-- For tenant_configuration
|
|
||||||
DO $$
|
|
||||||
BEGIN
|
|
||||||
IF EXISTS (SELECT 1 FROM information_schema.columns
|
|
||||||
WHERE table_name = 'tenant_configuration'
|
|
||||||
AND column_name = 'id'
|
|
||||||
AND data_type = 'uuid') THEN
|
|
||||||
ALTER TABLE tenant_configuration
|
|
||||||
ALTER COLUMN id TYPE TEXT USING id::text;
|
|
||||||
END IF;
|
|
||||||
END $$;
|
|
||||||
|
|
||||||
-- For model_configurations
|
|
||||||
DO $$
|
|
||||||
BEGIN
|
|
||||||
IF EXISTS (SELECT 1 FROM information_schema.columns
|
|
||||||
WHERE table_name = 'model_configurations'
|
|
||||||
AND column_name = 'id'
|
|
||||||
AND data_type = 'uuid') THEN
|
|
||||||
ALTER TABLE model_configurations
|
|
||||||
ALTER COLUMN id TYPE TEXT USING id::text;
|
|
||||||
END IF;
|
|
||||||
END $$;
|
|
||||||
|
|
||||||
-- For connection_configurations
|
|
||||||
DO $$
|
|
||||||
BEGIN
|
|
||||||
IF EXISTS (SELECT 1 FROM information_schema.columns
|
|
||||||
WHERE table_name = 'connection_configurations'
|
|
||||||
AND column_name = 'id'
|
|
||||||
AND data_type = 'uuid') THEN
|
|
||||||
ALTER TABLE connection_configurations
|
|
||||||
ALTER COLUMN id TYPE TEXT USING id::text;
|
|
||||||
END IF;
|
|
||||||
END $$;
|
|
||||||
|
|
||||||
-- For component_installations
|
|
||||||
DO $$
|
|
||||||
BEGIN
|
|
||||||
IF EXISTS (SELECT 1 FROM information_schema.columns
|
|
||||||
WHERE table_name = 'component_installations'
|
|
||||||
AND column_name = 'id'
|
|
||||||
AND data_type = 'uuid') THEN
|
|
||||||
ALTER TABLE component_installations
|
|
||||||
ALTER COLUMN id TYPE TEXT USING id::text;
|
|
||||||
END IF;
|
|
||||||
END $$;
|
|
||||||
|
|
||||||
-- For component_logs
|
|
||||||
DO $$
|
|
||||||
BEGIN
|
|
||||||
IF EXISTS (SELECT 1 FROM information_schema.columns
|
|
||||||
WHERE table_name = 'component_logs'
|
|
||||||
AND column_name = 'id'
|
|
||||||
AND data_type = 'uuid') THEN
|
|
||||||
ALTER TABLE component_logs
|
|
||||||
ALTER COLUMN id TYPE TEXT USING id::text;
|
|
||||||
END IF;
|
|
||||||
END $$;
|
|
||||||
|
|
||||||
-- For gbot_config_sync
|
|
||||||
DO $$
|
|
||||||
BEGIN
|
|
||||||
IF EXISTS (SELECT 1 FROM information_schema.columns
|
|
||||||
WHERE table_name = 'gbot_config_sync'
|
|
||||||
AND column_name = 'id'
|
|
||||||
AND data_type = 'uuid') THEN
|
|
||||||
ALTER TABLE gbot_config_sync
|
|
||||||
ALTER COLUMN id TYPE TEXT USING id::text;
|
|
||||||
END IF;
|
|
||||||
END $$;
|
|
||||||
|
|
@ -1,99 +0,0 @@
|
||||||
-- Migration 6.1.1: Fix bot_configuration id column type
|
|
||||||
-- The Diesel schema expects UUID but migration 6.0.4 created it as TEXT
|
|
||||||
-- This migration converts the id column from TEXT to UUID
|
|
||||||
|
|
||||||
-- For bot_configuration (main table that needs fixing)
|
|
||||||
DO $$
|
|
||||||
BEGIN
|
|
||||||
IF EXISTS (SELECT 1 FROM information_schema.columns
|
|
||||||
WHERE table_name = 'bot_configuration'
|
|
||||||
AND column_name = 'id'
|
|
||||||
AND data_type = 'text') THEN
|
|
||||||
ALTER TABLE bot_configuration
|
|
||||||
ALTER COLUMN id TYPE UUID USING id::uuid;
|
|
||||||
END IF;
|
|
||||||
END $$;
|
|
||||||
|
|
||||||
-- Also fix server_configuration which has the same issue
|
|
||||||
DO $$
|
|
||||||
BEGIN
|
|
||||||
IF EXISTS (SELECT 1 FROM information_schema.columns
|
|
||||||
WHERE table_name = 'server_configuration'
|
|
||||||
AND column_name = 'id'
|
|
||||||
AND data_type = 'text') THEN
|
|
||||||
ALTER TABLE server_configuration
|
|
||||||
ALTER COLUMN id TYPE UUID USING id::uuid;
|
|
||||||
END IF;
|
|
||||||
END $$;
|
|
||||||
|
|
||||||
-- Also fix tenant_configuration which has the same issue
|
|
||||||
DO $$
|
|
||||||
BEGIN
|
|
||||||
IF EXISTS (SELECT 1 FROM information_schema.columns
|
|
||||||
WHERE table_name = 'tenant_configuration'
|
|
||||||
AND column_name = 'id'
|
|
||||||
AND data_type = 'text') THEN
|
|
||||||
ALTER TABLE tenant_configuration
|
|
||||||
ALTER COLUMN id TYPE UUID USING id::uuid;
|
|
||||||
END IF;
|
|
||||||
END $$;
|
|
||||||
|
|
||||||
-- Fix model_configurations
|
|
||||||
DO $$
|
|
||||||
BEGIN
|
|
||||||
IF EXISTS (SELECT 1 FROM information_schema.columns
|
|
||||||
WHERE table_name = 'model_configurations'
|
|
||||||
AND column_name = 'id'
|
|
||||||
AND data_type = 'text') THEN
|
|
||||||
ALTER TABLE model_configurations
|
|
||||||
ALTER COLUMN id TYPE UUID USING id::uuid;
|
|
||||||
END IF;
|
|
||||||
END $$;
|
|
||||||
|
|
||||||
-- Fix connection_configurations
|
|
||||||
DO $$
|
|
||||||
BEGIN
|
|
||||||
IF EXISTS (SELECT 1 FROM information_schema.columns
|
|
||||||
WHERE table_name = 'connection_configurations'
|
|
||||||
AND column_name = 'id'
|
|
||||||
AND data_type = 'text') THEN
|
|
||||||
ALTER TABLE connection_configurations
|
|
||||||
ALTER COLUMN id TYPE UUID USING id::uuid;
|
|
||||||
END IF;
|
|
||||||
END $$;
|
|
||||||
|
|
||||||
-- Fix component_installations
|
|
||||||
DO $$
|
|
||||||
BEGIN
|
|
||||||
IF EXISTS (SELECT 1 FROM information_schema.columns
|
|
||||||
WHERE table_name = 'component_installations'
|
|
||||||
AND column_name = 'id'
|
|
||||||
AND data_type = 'text') THEN
|
|
||||||
ALTER TABLE component_installations
|
|
||||||
ALTER COLUMN id TYPE UUID USING id::uuid;
|
|
||||||
END IF;
|
|
||||||
END $$;
|
|
||||||
|
|
||||||
-- Fix component_logs
|
|
||||||
DO $$
|
|
||||||
BEGIN
|
|
||||||
IF EXISTS (SELECT 1 FROM information_schema.columns
|
|
||||||
WHERE table_name = 'component_logs'
|
|
||||||
AND column_name = 'id'
|
|
||||||
AND data_type = 'text') THEN
|
|
||||||
ALTER TABLE component_logs
|
|
||||||
ALTER COLUMN id TYPE UUID USING id::uuid;
|
|
||||||
END IF;
|
|
||||||
END $$;
|
|
||||||
|
|
||||||
-- Fix gbot_config_sync
|
|
||||||
DO $$
|
|
||||||
BEGIN
|
|
||||||
IF EXISTS (SELECT 1 FROM information_schema.columns
|
|
||||||
WHERE table_name = 'gbot_config_sync'
|
|
||||||
AND column_name = 'id'
|
|
||||||
AND data_type = 'text') THEN
|
|
||||||
ALTER TABLE gbot_config_sync
|
|
||||||
ALTER COLUMN id TYPE UUID USING id::uuid;
|
|
||||||
END IF;
|
|
||||||
END $$;
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
DROP INDEX IF EXISTS idx_account_sync_items_unique;
|
|
||||||
DROP INDEX IF EXISTS idx_account_sync_items_embedding;
|
|
||||||
DROP INDEX IF EXISTS idx_account_sync_items_date;
|
|
||||||
DROP INDEX IF EXISTS idx_account_sync_items_type;
|
|
||||||
DROP INDEX IF EXISTS idx_account_sync_items_account;
|
|
||||||
DROP TABLE IF EXISTS account_sync_items;
|
|
||||||
|
|
||||||
DROP INDEX IF EXISTS idx_session_account_assoc_unique;
|
|
||||||
DROP INDEX IF EXISTS idx_session_account_assoc_active;
|
|
||||||
DROP INDEX IF EXISTS idx_session_account_assoc_account;
|
|
||||||
DROP INDEX IF EXISTS idx_session_account_assoc_session;
|
|
||||||
DROP TABLE IF EXISTS session_account_associations;
|
|
||||||
|
|
||||||
DROP INDEX IF EXISTS idx_connected_accounts_bot_email;
|
|
||||||
DROP INDEX IF EXISTS idx_connected_accounts_status;
|
|
||||||
DROP INDEX IF EXISTS idx_connected_accounts_provider;
|
|
||||||
DROP INDEX IF EXISTS idx_connected_accounts_email;
|
|
||||||
DROP INDEX IF EXISTS idx_connected_accounts_user_id;
|
|
||||||
DROP INDEX IF EXISTS idx_connected_accounts_bot_id;
|
|
||||||
DROP TABLE IF EXISTS connected_accounts;
|
|
||||||
|
|
@ -1,72 +0,0 @@
|
||||||
CREATE TABLE IF NOT EXISTS connected_accounts (
|
|
||||||
id UUID PRIMARY KEY,
|
|
||||||
bot_id UUID NOT NULL REFERENCES bots(id) ON DELETE CASCADE,
|
|
||||||
user_id UUID,
|
|
||||||
email TEXT NOT NULL,
|
|
||||||
provider TEXT NOT NULL,
|
|
||||||
account_type TEXT NOT NULL DEFAULT 'email',
|
|
||||||
access_token TEXT NOT NULL,
|
|
||||||
refresh_token TEXT,
|
|
||||||
token_expires_at TIMESTAMPTZ,
|
|
||||||
scopes TEXT,
|
|
||||||
status TEXT NOT NULL DEFAULT 'active',
|
|
||||||
sync_enabled BOOLEAN NOT NULL DEFAULT true,
|
|
||||||
sync_interval_seconds INTEGER NOT NULL DEFAULT 300,
|
|
||||||
last_sync_at TIMESTAMPTZ,
|
|
||||||
last_sync_status TEXT,
|
|
||||||
last_sync_error TEXT,
|
|
||||||
metadata_json TEXT DEFAULT '{}',
|
|
||||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
||||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_connected_accounts_bot_id ON connected_accounts(bot_id);
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_connected_accounts_user_id ON connected_accounts(user_id);
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_connected_accounts_email ON connected_accounts(email);
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_connected_accounts_provider ON connected_accounts(provider);
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_connected_accounts_status ON connected_accounts(status);
|
|
||||||
CREATE UNIQUE INDEX IF NOT EXISTS idx_connected_accounts_bot_email ON connected_accounts(bot_id, email);
|
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS session_account_associations (
|
|
||||||
id UUID PRIMARY KEY,
|
|
||||||
session_id UUID NOT NULL,
|
|
||||||
bot_id UUID NOT NULL REFERENCES bots(id) ON DELETE CASCADE,
|
|
||||||
account_id UUID NOT NULL REFERENCES connected_accounts(id) ON DELETE CASCADE,
|
|
||||||
email TEXT NOT NULL,
|
|
||||||
provider TEXT NOT NULL,
|
|
||||||
qdrant_collection TEXT NOT NULL,
|
|
||||||
is_active BOOLEAN NOT NULL DEFAULT true,
|
|
||||||
added_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
||||||
added_by_tool TEXT
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_session_account_assoc_session ON session_account_associations(session_id);
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_session_account_assoc_account ON session_account_associations(account_id);
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_session_account_assoc_active ON session_account_associations(session_id, is_active);
|
|
||||||
CREATE UNIQUE INDEX IF NOT EXISTS idx_session_account_assoc_unique ON session_account_associations(session_id, account_id);
|
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS account_sync_items (
|
|
||||||
id UUID PRIMARY KEY,
|
|
||||||
account_id UUID NOT NULL REFERENCES connected_accounts(id) ON DELETE CASCADE,
|
|
||||||
item_type TEXT NOT NULL,
|
|
||||||
item_id TEXT NOT NULL,
|
|
||||||
subject TEXT,
|
|
||||||
content_preview TEXT,
|
|
||||||
sender TEXT,
|
|
||||||
recipients TEXT,
|
|
||||||
item_date TIMESTAMPTZ,
|
|
||||||
folder TEXT,
|
|
||||||
labels TEXT,
|
|
||||||
has_attachments BOOLEAN DEFAULT false,
|
|
||||||
qdrant_point_id TEXT,
|
|
||||||
embedding_status TEXT DEFAULT 'pending',
|
|
||||||
metadata_json TEXT DEFAULT '{}',
|
|
||||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
||||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_account_sync_items_account ON account_sync_items(account_id);
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_account_sync_items_type ON account_sync_items(item_type);
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_account_sync_items_date ON account_sync_items(item_date);
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_account_sync_items_embedding ON account_sync_items(embedding_status);
|
|
||||||
CREATE UNIQUE INDEX IF NOT EXISTS idx_account_sync_items_unique ON account_sync_items(account_id, item_type, item_id);
|
|
||||||
|
|
@ -1,47 +0,0 @@
|
||||||
-- Drop comments first
|
|
||||||
COMMENT ON TABLE public.user_organizations IS NULL;
|
|
||||||
COMMENT ON TABLE public.email_received_events IS NULL;
|
|
||||||
COMMENT ON TABLE public.folder_change_events IS NULL;
|
|
||||||
COMMENT ON TABLE public.folder_monitors IS NULL;
|
|
||||||
COMMENT ON TABLE public.email_monitors IS NULL;
|
|
||||||
COMMENT ON COLUMN public.bots.inherit_parent_config IS NULL;
|
|
||||||
COMMENT ON COLUMN public.bots.enabled_tabs_json IS NULL;
|
|
||||||
COMMENT ON COLUMN public.bots.parent_bot_id IS NULL;
|
|
||||||
COMMENT ON TABLE public.system_automations IS NULL;
|
|
||||||
|
|
||||||
-- Drop user organizations table
|
|
||||||
DROP INDEX IF EXISTS idx_user_orgs_default;
|
|
||||||
DROP INDEX IF EXISTS idx_user_orgs_org;
|
|
||||||
DROP INDEX IF EXISTS idx_user_orgs_user;
|
|
||||||
DROP TABLE IF EXISTS public.user_organizations;
|
|
||||||
|
|
||||||
-- Drop email received events table
|
|
||||||
DROP INDEX IF EXISTS idx_email_events_received;
|
|
||||||
DROP INDEX IF EXISTS idx_email_events_processed;
|
|
||||||
DROP INDEX IF EXISTS idx_email_events_monitor;
|
|
||||||
DROP TABLE IF EXISTS public.email_received_events;
|
|
||||||
|
|
||||||
-- Drop folder change events table
|
|
||||||
DROP INDEX IF EXISTS idx_folder_events_created;
|
|
||||||
DROP INDEX IF EXISTS idx_folder_events_processed;
|
|
||||||
DROP INDEX IF EXISTS idx_folder_events_monitor;
|
|
||||||
DROP TABLE IF EXISTS public.folder_change_events;
|
|
||||||
|
|
||||||
-- Drop folder monitors table
|
|
||||||
DROP INDEX IF EXISTS idx_folder_monitors_account_email;
|
|
||||||
DROP INDEX IF EXISTS idx_folder_monitors_active;
|
|
||||||
DROP INDEX IF EXISTS idx_folder_monitors_provider;
|
|
||||||
DROP INDEX IF EXISTS idx_folder_monitors_bot_id;
|
|
||||||
DROP TABLE IF EXISTS public.folder_monitors;
|
|
||||||
|
|
||||||
-- Drop email monitors table
|
|
||||||
DROP INDEX IF EXISTS idx_email_monitors_active;
|
|
||||||
DROP INDEX IF EXISTS idx_email_monitors_email;
|
|
||||||
DROP INDEX IF EXISTS idx_email_monitors_bot_id;
|
|
||||||
DROP TABLE IF EXISTS public.email_monitors;
|
|
||||||
|
|
||||||
-- Remove bot hierarchy columns
|
|
||||||
DROP INDEX IF EXISTS idx_bots_parent_bot_id;
|
|
||||||
ALTER TABLE public.bots DROP COLUMN IF EXISTS inherit_parent_config;
|
|
||||||
ALTER TABLE public.bots DROP COLUMN IF EXISTS enabled_tabs_json;
|
|
||||||
ALTER TABLE public.bots DROP COLUMN IF EXISTS parent_bot_id;
|
|
||||||
|
|
@ -1,131 +0,0 @@
|
||||||
-- Bot Hierarchy: Add parent_bot_id to support sub-bots
|
|
||||||
ALTER TABLE public.bots
|
|
||||||
ADD COLUMN IF NOT EXISTS parent_bot_id UUID REFERENCES public.bots(id) ON DELETE SET NULL;
|
|
||||||
|
|
||||||
-- Index for efficient hierarchy queries
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_bots_parent_bot_id ON public.bots(parent_bot_id);
|
|
||||||
|
|
||||||
-- Bot enabled tabs configuration (which UI tabs are enabled for this bot)
|
|
||||||
ALTER TABLE public.bots
|
|
||||||
ADD COLUMN IF NOT EXISTS enabled_tabs_json TEXT DEFAULT '["chat"]';
|
|
||||||
|
|
||||||
-- Bot configuration inheritance flag
|
|
||||||
ALTER TABLE public.bots
|
|
||||||
ADD COLUMN IF NOT EXISTS inherit_parent_config BOOLEAN DEFAULT true;
|
|
||||||
|
|
||||||
-- Email monitoring table for ON EMAIL triggers
|
|
||||||
CREATE TABLE IF NOT EXISTS public.email_monitors (
|
|
||||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
||||||
bot_id UUID NOT NULL REFERENCES public.bots(id) ON DELETE CASCADE,
|
|
||||||
email_address VARCHAR(500) NOT NULL,
|
|
||||||
script_path VARCHAR(1000) NOT NULL,
|
|
||||||
is_active BOOLEAN DEFAULT true,
|
|
||||||
last_check_at TIMESTAMPTZ,
|
|
||||||
last_uid BIGINT DEFAULT 0,
|
|
||||||
filter_from VARCHAR(500),
|
|
||||||
filter_subject VARCHAR(500),
|
|
||||||
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
||||||
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
||||||
CONSTRAINT unique_bot_email UNIQUE (bot_id, email_address)
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_email_monitors_bot_id ON public.email_monitors(bot_id);
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_email_monitors_email ON public.email_monitors(email_address);
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_email_monitors_active ON public.email_monitors(is_active) WHERE is_active = true;
|
|
||||||
|
|
||||||
-- Folder monitoring table for ON CHANGE triggers (GDrive, OneDrive, Dropbox)
|
|
||||||
-- Uses account:// syntax: account://user@gmail.com/path or gdrive:///path
|
|
||||||
CREATE TABLE IF NOT EXISTS public.folder_monitors (
|
|
||||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
||||||
bot_id UUID NOT NULL REFERENCES public.bots(id) ON DELETE CASCADE,
|
|
||||||
provider VARCHAR(50) NOT NULL, -- 'gdrive', 'onedrive', 'dropbox', 'local'
|
|
||||||
account_email VARCHAR(500), -- Email from account:// path (e.g., user@gmail.com)
|
|
||||||
folder_path VARCHAR(2000) NOT NULL,
|
|
||||||
folder_id VARCHAR(500), -- Provider-specific folder ID
|
|
||||||
script_path VARCHAR(1000) NOT NULL,
|
|
||||||
is_active BOOLEAN DEFAULT true,
|
|
||||||
watch_subfolders BOOLEAN DEFAULT true,
|
|
||||||
last_check_at TIMESTAMPTZ,
|
|
||||||
last_change_token VARCHAR(500), -- Provider-specific change token/page token
|
|
||||||
event_types_json TEXT DEFAULT '["create", "modify", "delete"]',
|
|
||||||
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
||||||
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
||||||
CONSTRAINT unique_bot_folder UNIQUE (bot_id, provider, folder_path)
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_folder_monitors_bot_id ON public.folder_monitors(bot_id);
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_folder_monitors_provider ON public.folder_monitors(provider);
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_folder_monitors_active ON public.folder_monitors(is_active) WHERE is_active = true;
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_folder_monitors_account_email ON public.folder_monitors(account_email);
|
|
||||||
|
|
||||||
-- Folder change events log
|
|
||||||
CREATE TABLE IF NOT EXISTS public.folder_change_events (
|
|
||||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
||||||
monitor_id UUID NOT NULL REFERENCES public.folder_monitors(id) ON DELETE CASCADE,
|
|
||||||
event_type VARCHAR(50) NOT NULL, -- 'create', 'modify', 'delete', 'rename', 'move'
|
|
||||||
file_path VARCHAR(2000) NOT NULL,
|
|
||||||
file_id VARCHAR(500),
|
|
||||||
file_name VARCHAR(500),
|
|
||||||
file_size BIGINT,
|
|
||||||
mime_type VARCHAR(255),
|
|
||||||
old_path VARCHAR(2000), -- For rename/move events
|
|
||||||
processed BOOLEAN DEFAULT false,
|
|
||||||
processed_at TIMESTAMPTZ,
|
|
||||||
error_message TEXT,
|
|
||||||
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_folder_events_monitor ON public.folder_change_events(monitor_id);
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_folder_events_processed ON public.folder_change_events(processed) WHERE processed = false;
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_folder_events_created ON public.folder_change_events(created_at);
|
|
||||||
|
|
||||||
-- Email received events log
|
|
||||||
CREATE TABLE IF NOT EXISTS public.email_received_events (
|
|
||||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
||||||
monitor_id UUID NOT NULL REFERENCES public.email_monitors(id) ON DELETE CASCADE,
|
|
||||||
message_uid BIGINT NOT NULL,
|
|
||||||
message_id VARCHAR(500),
|
|
||||||
from_address VARCHAR(500) NOT NULL,
|
|
||||||
to_addresses_json TEXT,
|
|
||||||
subject VARCHAR(1000),
|
|
||||||
received_at TIMESTAMPTZ,
|
|
||||||
has_attachments BOOLEAN DEFAULT false,
|
|
||||||
attachments_json TEXT,
|
|
||||||
processed BOOLEAN DEFAULT false,
|
|
||||||
processed_at TIMESTAMPTZ,
|
|
||||||
error_message TEXT,
|
|
||||||
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_email_events_monitor ON public.email_received_events(monitor_id);
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_email_events_processed ON public.email_received_events(processed) WHERE processed = false;
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_email_events_received ON public.email_received_events(received_at);
|
|
||||||
|
|
||||||
-- Add new trigger kinds to system_automations
|
|
||||||
-- TriggerKind enum: 0=Scheduled, 1=TableUpdate, 2=TableInsert, 3=TableDelete, 4=Webhook, 5=EmailReceived, 6=FolderChange
|
|
||||||
COMMENT ON TABLE public.system_automations IS 'System automations with TriggerKind: 0=Scheduled, 1=TableUpdate, 2=TableInsert, 3=TableDelete, 4=Webhook, 5=EmailReceived, 6=FolderChange';
|
|
||||||
|
|
||||||
-- User organization memberships (users can belong to multiple orgs)
|
|
||||||
CREATE TABLE IF NOT EXISTS public.user_organizations (
|
|
||||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
||||||
user_id UUID NOT NULL REFERENCES public.users(user_id) ON DELETE CASCADE,
|
|
||||||
org_id UUID NOT NULL REFERENCES public.organizations(org_id) ON DELETE CASCADE,
|
|
||||||
role VARCHAR(50) DEFAULT 'member', -- 'owner', 'admin', 'member', 'viewer'
|
|
||||||
is_default BOOLEAN DEFAULT false,
|
|
||||||
joined_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
||||||
CONSTRAINT unique_user_org UNIQUE (user_id, org_id)
|
|
||||||
);
|
|
||||||
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_user_orgs_user ON public.user_organizations(user_id);
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_user_orgs_org ON public.user_organizations(org_id);
|
|
||||||
CREATE INDEX IF NOT EXISTS idx_user_orgs_default ON public.user_organizations(user_id, is_default) WHERE is_default = true;
|
|
||||||
|
|
||||||
-- Comments for documentation
|
|
||||||
COMMENT ON COLUMN public.bots.parent_bot_id IS 'Parent bot ID for hierarchical bot structure. NULL means root bot.';
|
|
||||||
COMMENT ON COLUMN public.bots.enabled_tabs_json IS 'JSON array of enabled UI tabs for this bot. Root bots have all tabs.';
|
|
||||||
COMMENT ON COLUMN public.bots.inherit_parent_config IS 'If true, inherits config from parent bot for missing values.';
|
|
||||||
COMMENT ON TABLE public.email_monitors IS 'Email monitoring configuration for ON EMAIL triggers.';
|
|
||||||
COMMENT ON TABLE public.folder_monitors IS 'Folder monitoring configuration for ON CHANGE triggers (GDrive, OneDrive, Dropbox).';
|
|
||||||
COMMENT ON TABLE public.folder_change_events IS 'Log of detected folder changes to be processed by scripts.';
|
|
||||||
COMMENT ON TABLE public.email_received_events IS 'Log of received emails to be processed by scripts.';
|
|
||||||
COMMENT ON TABLE public.user_organizations IS 'User membership in organizations with roles.';
|
|
||||||
Loading…
Add table
Reference in a new issue