|
| 1 | +-- +goose Up |
| 2 | +-- +goose StatementBegin |
| 3 | + |
| 4 | +-- Migration: Rename ssf_content to external_content and add source column |
| 5 | +-- Generalizes the SSF-specific tables to support multiple external content sources |
| 6 | + |
| 7 | +-- Rename tables |
| 8 | +ALTER TABLE ssf_content RENAME TO external_content; |
| 9 | +ALTER TABLE ssf_content_translations RENAME TO external_content_translations; |
| 10 | + |
| 11 | +-- Add source column with default 'ssf' |
| 12 | +ALTER TABLE external_content ADD COLUMN source TEXT NOT NULL DEFAULT 'ssf'; |
| 13 | + |
| 14 | +-- Update ID check constraint |
| 15 | +ALTER TABLE external_content DROP CONSTRAINT ssf_content_id_check; |
| 16 | +ALTER TABLE external_content ADD CONSTRAINT external_content_id_check CHECK (id ~ '^EC[0-9A-Z]{26}$'); |
| 17 | + |
| 18 | +-- Update foreign key constraint name |
| 19 | +ALTER TABLE external_content_translations |
| 20 | + DROP CONSTRAINT ssf_content_translations_ssf_content_id_fkey; |
| 21 | +ALTER TABLE external_content_translations |
| 22 | + ADD CONSTRAINT external_content_translations_external_content_id_fkey |
| 23 | + FOREIGN KEY (ssf_content_id) REFERENCES external_content(id) ON DELETE CASCADE; |
| 24 | + |
| 25 | +-- Rename column in translations table |
| 26 | +ALTER TABLE external_content_translations |
| 27 | + RENAME COLUMN ssf_content_id TO external_content_id; |
| 28 | + |
| 29 | +-- Drop old indexes |
| 30 | +DROP INDEX IF EXISTS idx_ssf_content_plan; |
| 31 | +DROP INDEX IF EXISTS idx_ssf_content_task; |
| 32 | +DROP INDEX IF EXISTS idx_ssf_content_content; |
| 33 | +DROP INDEX IF EXISTS idx_ssf_content_type; |
| 34 | +DROP INDEX IF EXISTS idx_ssf_content_published; |
| 35 | + |
| 36 | +-- Create new indexes |
| 37 | +CREATE INDEX idx_external_content_plan ON external_content(plan_id); |
| 38 | +CREATE INDEX idx_external_content_task ON external_content(task_id); |
| 39 | +CREATE INDEX idx_external_content_content ON external_content(content_id) WHERE content_id IS NOT NULL; |
| 40 | +CREATE INDEX idx_external_content_type ON external_content(content_type); |
| 41 | +CREATE INDEX idx_external_content_published ON external_content(published_at) WHERE published_at IS NOT NULL; |
| 42 | +CREATE INDEX idx_external_content_source ON external_content(source); |
| 43 | + |
| 44 | +-- Drop old triggers |
| 45 | +DROP TRIGGER IF EXISTS ssf_content_updated_at ON external_content; |
| 46 | +DROP TRIGGER IF EXISTS ssf_content_translations_updated_at ON external_content_translations; |
| 47 | + |
| 48 | +-- Create new triggers |
| 49 | +CREATE TRIGGER external_content_updated_at |
| 50 | + BEFORE UPDATE ON external_content |
| 51 | + FOR EACH ROW |
| 52 | + EXECUTE FUNCTION update_updated_at_column(); |
| 53 | + |
| 54 | +CREATE TRIGGER external_content_translations_updated_at |
| 55 | + BEFORE UPDATE ON external_content_translations |
| 56 | + FOR EACH ROW |
| 57 | + EXECUTE FUNCTION update_updated_at_column(); |
| 58 | + |
| 59 | +-- Update comments |
| 60 | +COMMENT ON TABLE external_content IS 'Stores content items synced from external sources (SSF, etc.)'; |
| 61 | +COMMENT ON COLUMN external_content.source IS 'Content source identifier (e.g., ssf)'; |
| 62 | +COMMENT ON COLUMN external_content.plan_id IS 'External plan identifier'; |
| 63 | +COMMENT ON COLUMN external_content.task_id IS 'External item ID (unique within plan)'; |
| 64 | +COMMENT ON COLUMN external_content.content_id IS 'Nested content ID (MediaEpisode, Song, BookChapter, etc.)'; |
| 65 | +COMMENT ON COLUMN external_content.content_type IS 'Type of content: media_episode, song, book_chapter, periodical_article, bible_chapter, bible_verses'; |
| 66 | +COMMENT ON COLUMN external_content.published_at IS 'Content publication date'; |
| 67 | + |
| 68 | +-- +goose StatementEnd |
| 69 | + |
| 70 | +-- +goose Down |
| 71 | +-- +goose StatementBegin |
| 72 | + |
| 73 | +-- Drop new triggers |
| 74 | +DROP TRIGGER IF EXISTS external_content_updated_at ON external_content; |
| 75 | +DROP TRIGGER IF EXISTS external_content_translations_updated_at ON external_content_translations; |
| 76 | + |
| 77 | +-- Recreate old triggers |
| 78 | +CREATE TRIGGER ssf_content_updated_at |
| 79 | + BEFORE UPDATE ON external_content |
| 80 | + FOR EACH ROW |
| 81 | + EXECUTE FUNCTION update_updated_at_column(); |
| 82 | + |
| 83 | +CREATE TRIGGER ssf_content_translations_updated_at |
| 84 | + BEFORE UPDATE ON external_content_translations |
| 85 | + FOR EACH ROW |
| 86 | + EXECUTE FUNCTION update_updated_at_column(); |
| 87 | + |
| 88 | +-- Drop new indexes |
| 89 | +DROP INDEX IF EXISTS idx_external_content_plan; |
| 90 | +DROP INDEX IF EXISTS idx_external_content_task; |
| 91 | +DROP INDEX IF EXISTS idx_external_content_content; |
| 92 | +DROP INDEX IF EXISTS idx_external_content_type; |
| 93 | +DROP INDEX IF EXISTS idx_external_content_published; |
| 94 | +DROP INDEX IF EXISTS idx_external_content_source; |
| 95 | + |
| 96 | +-- Recreate old indexes |
| 97 | +CREATE INDEX idx_ssf_content_plan ON external_content(plan_id); |
| 98 | +CREATE INDEX idx_ssf_content_task ON external_content(task_id); |
| 99 | +CREATE INDEX idx_ssf_content_content ON external_content(content_id) WHERE content_id IS NOT NULL; |
| 100 | +CREATE INDEX idx_ssf_content_type ON external_content(content_type); |
| 101 | +CREATE INDEX idx_ssf_content_published ON external_content(published_at) WHERE published_at IS NOT NULL; |
| 102 | + |
| 103 | +-- Rename column back in translations table |
| 104 | +ALTER TABLE external_content_translations |
| 105 | + RENAME COLUMN external_content_id TO ssf_content_id; |
| 106 | + |
| 107 | +-- Update foreign key constraint name back |
| 108 | +ALTER TABLE external_content_translations |
| 109 | + DROP CONSTRAINT external_content_translations_external_content_id_fkey; |
| 110 | +ALTER TABLE external_content_translations |
| 111 | + ADD CONSTRAINT ssf_content_translations_ssf_content_id_fkey |
| 112 | + FOREIGN KEY (ssf_content_id) REFERENCES external_content(id) ON DELETE CASCADE; |
| 113 | + |
| 114 | +-- Update ID check constraint back |
| 115 | +ALTER TABLE external_content DROP CONSTRAINT external_content_id_check; |
| 116 | +ALTER TABLE external_content ADD CONSTRAINT ssf_content_id_check CHECK (id ~ '^SC[0-9A-Z]{26}$'); |
| 117 | + |
| 118 | +-- Drop source column |
| 119 | +ALTER TABLE external_content DROP COLUMN source; |
| 120 | + |
| 121 | +-- Rename tables back |
| 122 | +ALTER TABLE external_content RENAME TO ssf_content; |
| 123 | +ALTER TABLE external_content_translations RENAME TO ssf_content_translations; |
| 124 | + |
| 125 | +-- +goose StatementEnd |
0 commit comments