cosmo/backend/migrations/add_predefined_jobs_support...

56 lines
1.8 KiB
SQL

-- Migration: Add Predefined Task Support to scheduled_jobs
-- Date: 2025-12-11
-- Purpose: Transition from dynamic code execution to predefined task system
-- 1. Create job_type ENUM type
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'jobtype') THEN
CREATE TYPE jobtype AS ENUM ('predefined', 'custom_code');
END IF;
END $$;
-- 2. Add new columns
ALTER TABLE scheduled_jobs
ADD COLUMN IF NOT EXISTS job_type jobtype DEFAULT 'custom_code',
ADD COLUMN IF NOT EXISTS predefined_function VARCHAR(100),
ADD COLUMN IF NOT EXISTS function_params JSONB DEFAULT '{}'::jsonb;
-- 3. Update existing rows to custom_code type (preserve backward compatibility)
UPDATE scheduled_jobs
SET job_type = 'custom_code'
WHERE job_type IS NULL;
-- 4. Make job_type NOT NULL after setting defaults
ALTER TABLE scheduled_jobs
ALTER COLUMN job_type SET NOT NULL;
-- 5. Set default for job_type to 'predefined' for new records
ALTER TABLE scheduled_jobs
ALTER COLUMN job_type SET DEFAULT 'predefined';
-- 6. Add check constraint
ALTER TABLE scheduled_jobs
ADD CONSTRAINT chk_job_type_fields
CHECK (
(job_type = 'predefined' AND predefined_function IS NOT NULL)
OR
(job_type = 'custom_code' AND python_code IS NOT NULL)
);
-- 7. Add comment on columns
COMMENT ON COLUMN scheduled_jobs.job_type IS 'Job type: predefined or custom_code';
COMMENT ON COLUMN scheduled_jobs.predefined_function IS 'Predefined function name (required if job_type=predefined)';
COMMENT ON COLUMN scheduled_jobs.function_params IS 'JSON parameters for predefined function';
COMMENT ON COLUMN scheduled_jobs.python_code IS 'Dynamic Python code (only for custom_code type)';
-- 8. Verify the changes
SELECT
column_name,
data_type,
is_nullable,
column_default
FROM information_schema.columns
WHERE table_name = 'scheduled_jobs'
ORDER BY ordinal_position;