fix(migrations): also resolve issue in the new generic source scan failure migration

This commit is contained in:
perf3ct 2025-08-18 15:59:22 +00:00
parent 7616691939
commit d323aa53c3
No known key found for this signature in database
GPG Key ID: 569C4EEC436F5232
1 changed files with 35 additions and 21 deletions

View File

@ -2,17 +2,23 @@
-- This migration creates a comprehensive failure tracking system for all source types (WebDAV, S3, Local Filesystem) -- This migration creates a comprehensive failure tracking system for all source types (WebDAV, S3, Local Filesystem)
-- Create enum for generic source types -- Create enum for generic source types
CREATE TYPE source_type AS ENUM ( -- Use DO block to handle existing type gracefully
DO $$ BEGIN
CREATE TYPE source_error_source_type AS ENUM (
'webdav', -- WebDAV/CalDAV servers 'webdav', -- WebDAV/CalDAV servers
's3', -- S3-compatible object storage 's3', -- S3-compatible object storage
'local', -- Local filesystem folders 'local', -- Local filesystem folders
'dropbox', -- Future: Dropbox integration 'dropbox', -- Future: Dropbox integration
'gdrive', -- Future: Google Drive integration 'gdrive', -- Future: Google Drive integration
'onedrive' -- Future: OneDrive integration 'onedrive' -- Future: OneDrive integration
); );
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
-- Create enum for generic error types -- Create enum for generic error types
CREATE TYPE source_error_type AS ENUM ( DO $$ BEGIN
CREATE TYPE source_error_type AS ENUM (
'timeout', -- Request or operation took too long 'timeout', -- Request or operation took too long
'permission_denied', -- Access denied or authentication failure 'permission_denied', -- Access denied or authentication failure
'network_error', -- Network connectivity issues 'network_error', -- Network connectivity issues
@ -30,21 +36,28 @@ CREATE TYPE source_error_type AS ENUM (
'conflict', -- Conflict with existing resource 'conflict', -- Conflict with existing resource
'unsupported_operation', -- Operation not supported by source 'unsupported_operation', -- Operation not supported by source
'unknown' -- Unknown error type 'unknown' -- Unknown error type
); );
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
-- Create enum for error severity levels -- Create enum for error severity levels
CREATE TYPE source_error_severity AS ENUM ( DO $$ BEGIN
CREATE TYPE source_error_severity AS ENUM (
'low', -- Can be retried, likely temporary (network issues) 'low', -- Can be retried, likely temporary (network issues)
'medium', -- May succeed with adjustments (timeouts, server errors) 'medium', -- May succeed with adjustments (timeouts, server errors)
'high', -- Unlikely to succeed without intervention (permissions, too many items) 'high', -- Unlikely to succeed without intervention (permissions, too many items)
'critical' -- Will never succeed, permanent issue (path too long, invalid characters) 'critical' -- Will never succeed, permanent issue (path too long, invalid characters)
); );
EXCEPTION
WHEN duplicate_object THEN null;
END $$;
-- Main table for tracking scan failures across all source types -- Main table for tracking scan failures across all source types
CREATE TABLE IF NOT EXISTS source_scan_failures ( CREATE TABLE IF NOT EXISTS source_scan_failures (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(), id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
source_type source_type NOT NULL, source_type source_error_source_type NOT NULL,
source_id UUID REFERENCES sources(id) ON DELETE CASCADE, -- Links to specific source configuration source_id UUID REFERENCES sources(id) ON DELETE CASCADE, -- Links to specific source configuration
resource_path TEXT NOT NULL, -- Path/key/identifier within the source resource_path TEXT NOT NULL, -- Path/key/identifier within the source
@ -100,18 +113,18 @@ CREATE TABLE IF NOT EXISTS source_scan_failures (
); );
-- Create indexes for efficient querying -- Create indexes for efficient querying
CREATE INDEX idx_source_scan_failures_user_id ON source_scan_failures(user_id); CREATE INDEX IF NOT EXISTS idx_source_scan_failures_user_id ON source_scan_failures(user_id);
CREATE INDEX idx_source_scan_failures_source_type ON source_scan_failures(source_type); CREATE INDEX IF NOT EXISTS idx_source_scan_failures_source_type ON source_scan_failures(source_type);
CREATE INDEX idx_source_scan_failures_source_id ON source_scan_failures(source_id); CREATE INDEX IF NOT EXISTS idx_source_scan_failures_source_id ON source_scan_failures(source_id);
CREATE INDEX idx_source_scan_failures_error_type ON source_scan_failures(error_type); CREATE INDEX IF NOT EXISTS idx_source_scan_failures_error_type ON source_scan_failures(error_type);
CREATE INDEX idx_source_scan_failures_error_severity ON source_scan_failures(error_severity); CREATE INDEX IF NOT EXISTS idx_source_scan_failures_error_severity ON source_scan_failures(error_severity);
CREATE INDEX idx_source_scan_failures_resolved ON source_scan_failures(resolved); CREATE INDEX IF NOT EXISTS idx_source_scan_failures_resolved ON source_scan_failures(resolved);
CREATE INDEX idx_source_scan_failures_next_retry ON source_scan_failures(next_retry_at) WHERE NOT resolved AND NOT user_excluded; CREATE INDEX IF NOT EXISTS idx_source_scan_failures_next_retry ON source_scan_failures(next_retry_at) WHERE NOT resolved AND NOT user_excluded;
CREATE INDEX idx_source_scan_failures_resource_path ON source_scan_failures(resource_path); CREATE INDEX IF NOT EXISTS idx_source_scan_failures_resource_path ON source_scan_failures(resource_path);
CREATE INDEX idx_source_scan_failures_composite_active ON source_scan_failures(user_id, source_type, resolved, user_excluded) WHERE NOT resolved; CREATE INDEX IF NOT EXISTS idx_source_scan_failures_composite_active ON source_scan_failures(user_id, source_type, resolved, user_excluded) WHERE NOT resolved;
-- GIN index for flexible JSON diagnostic data queries -- GIN index for flexible JSON diagnostic data queries
CREATE INDEX idx_source_scan_failures_diagnostic_data ON source_scan_failures USING GIN (diagnostic_data); CREATE INDEX IF NOT EXISTS idx_source_scan_failures_diagnostic_data ON source_scan_failures USING GIN (diagnostic_data);
-- Function to calculate next retry time with configurable backoff strategies -- Function to calculate next retry time with configurable backoff strategies
CREATE OR REPLACE FUNCTION calculate_source_retry_time( CREATE OR REPLACE FUNCTION calculate_source_retry_time(
@ -203,7 +216,7 @@ $$ LANGUAGE plpgsql IMMUTABLE;
-- Function to record or update a source scan failure -- Function to record or update a source scan failure
CREATE OR REPLACE FUNCTION record_source_scan_failure( CREATE OR REPLACE FUNCTION record_source_scan_failure(
p_user_id UUID, p_user_id UUID,
p_source_type source_type, p_source_type source_error_source_type,
p_source_id UUID, p_source_id UUID,
p_resource_path TEXT, p_resource_path TEXT,
p_error_type source_error_type, p_error_type source_error_type,
@ -315,7 +328,7 @@ $$ LANGUAGE plpgsql;
-- Function to reset a failure for retry -- Function to reset a failure for retry
CREATE OR REPLACE FUNCTION reset_source_scan_failure( CREATE OR REPLACE FUNCTION reset_source_scan_failure(
p_user_id UUID, p_user_id UUID,
p_source_type source_type, p_source_type source_error_source_type,
p_source_id UUID, p_source_id UUID,
p_resource_path TEXT p_resource_path TEXT
) RETURNS BOOLEAN AS $$ ) RETURNS BOOLEAN AS $$
@ -344,7 +357,7 @@ $$ LANGUAGE plpgsql;
-- Function to mark a failure as resolved -- Function to mark a failure as resolved
CREATE OR REPLACE FUNCTION resolve_source_scan_failure( CREATE OR REPLACE FUNCTION resolve_source_scan_failure(
p_user_id UUID, p_user_id UUID,
p_source_type source_type, p_source_type source_error_source_type,
p_source_id UUID, p_source_id UUID,
p_resource_path TEXT, p_resource_path TEXT,
p_resolution_method TEXT DEFAULT 'automatic' p_resolution_method TEXT DEFAULT 'automatic'
@ -371,7 +384,7 @@ END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
-- View for active failures that need attention across all source types -- View for active failures that need attention across all source types
CREATE VIEW active_source_scan_failures AS CREATE OR REPLACE VIEW active_source_scan_failures AS
SELECT SELECT
ssf.*, ssf.*,
u.username, u.username,
@ -405,6 +418,7 @@ BEGIN
END; END;
$$ LANGUAGE plpgsql; $$ LANGUAGE plpgsql;
DROP TRIGGER IF EXISTS update_source_scan_failures_updated_at ON source_scan_failures;
CREATE TRIGGER update_source_scan_failures_updated_at CREATE TRIGGER update_source_scan_failures_updated_at
BEFORE UPDATE ON source_scan_failures BEFORE UPDATE ON source_scan_failures
FOR EACH ROW FOR EACH ROW