-- ============================================================================= -- AURGANIZE V6.2 - INITIAL SCHEMA ROLLBACK -- ============================================================================= -- Migration: 000001_initial_schema (DOWN) -- Description: Safely removes all tables, functions, triggers, and types -- Author: Aurganize Team -- Date: 2025-12-11 -- Version: 2.0 (Marketplace Edition) -- ============================================================================= -- This rollback migration removes the entire Aurganize V6.2 schema in the -- correct order to avoid foreign key constraint violations. -- -- CRITICAL SAFETY NOTES: -- 1. This will DESTROY ALL DATA in the database -- 2. Always backup before running this migration -- 3. Cannot be undone - data recovery requires restoring from backup -- 4. Runs in reverse dependency order (child tables before parent tables) -- -- Order of operations: -- 1. Drop all RLS policies -- 2. Drop all triggers -- 3. Drop all tables (child → parent order) -- 4. Drop all functions -- 5. Drop all custom types -- 6. Drop all extensions (optional - usually kept for other schemas) -- ============================================================================= -- ============================================================================= -- SECTION 1: DISABLE ROW-LEVEL SECURITY -- ============================================================================= -- Must disable RLS before dropping policies -- ============================================================================= -- Disable RLS on all tables (if they exist) ALTER TABLE IF EXISTS notifications DISABLE ROW LEVEL SECURITY; ALTER TABLE IF EXISTS analytics_events DISABLE ROW LEVEL SECURITY; ALTER TABLE IF EXISTS audit_logs DISABLE ROW LEVEL SECURITY; ALTER TABLE IF EXISTS attachments DISABLE ROW LEVEL SECURITY; ALTER TABLE IF EXISTS comments DISABLE ROW LEVEL SECURITY; ALTER TABLE IF EXISTS milestones DISABLE ROW LEVEL SECURITY; ALTER TABLE IF EXISTS deliverables DISABLE ROW LEVEL SECURITY; ALTER TABLE IF EXISTS contracts DISABLE ROW LEVEL SECURITY; ALTER TABLE IF EXISTS users DISABLE ROW LEVEL SECURITY; ALTER TABLE IF EXISTS tenants DISABLE ROW LEVEL SECURITY; -- ============================================================================= -- SECTION 2: DROP ROW-LEVEL SECURITY POLICIES -- ============================================================================= -- Drop policies before dropping tables -- Using IF EXISTS to prevent errors if policies don't exist -- ============================================================================= -- Notifications policies DROP POLICY IF EXISTS notifications_tenant_isolation ON notifications; -- Analytics policies DROP POLICY IF EXISTS analytics_events_access ON analytics_events; -- Audit logs policies DROP POLICY IF EXISTS audit_logs_tenant_isolation ON audit_logs; -- Attachments policies DROP POLICY IF EXISTS attachments_collaboration_access ON attachments; -- Comments policies DROP POLICY IF EXISTS comments_collaboration_access ON comments; -- Milestones policies DROP POLICY IF EXISTS milestones_collaboration_access ON milestones; -- Deliverables policies DROP POLICY IF EXISTS deliverables_collaboration_access ON deliverables; -- Contracts policies DROP POLICY IF EXISTS contracts_collaboration_access ON contracts; -- Users policies DROP POLICY IF EXISTS users_marketplace_access ON users; -- Tenants policies DROP POLICY IF EXISTS tenants_marketplace_access ON tenants; -- ============================================================================= -- SECTION 3: DROP ALL TRIGGERS -- ============================================================================= -- Triggers must be dropped before functions they reference -- Drop in any order (triggers are independent) -- ============================================================================= -- Updated_at triggers (applied to multiple tables) DROP TRIGGER IF EXISTS update_tenants_updated_at ON tenants; DROP TRIGGER IF EXISTS update_users_updated_at ON users; DROP TRIGGER IF EXISTS update_contracts_updated_at ON contracts; DROP TRIGGER IF EXISTS update_deliverables_updated_at ON deliverables; DROP TRIGGER IF EXISTS update_milestones_updated_at ON milestones; DROP TRIGGER IF EXISTS update_comments_updated_at ON comments; DROP TRIGGER IF EXISTS update_attachments_updated_at ON attachments; -- Full name generation trigger (users table) DROP TRIGGER IF EXISTS update_user_full_name ON users; -- ============================================================================= -- SECTION 4: DROP ALL TABLES -- ============================================================================= -- CRITICAL ORDER: Drop child tables BEFORE parent tables -- Foreign key constraints prevent dropping parent tables first -- -- Dependency tree: -- notifications → tenants, users -- analytics_events → tenants, users -- audit_logs → tenants, users -- attachments → tenants, users -- comments → tenants, users -- milestones → tenants, deliverables -- deliverables → tenants, contracts -- contracts → tenants, users -- users → tenants -- tenants (root) -- ============================================================================= -- Level 4: Supporting tables (no dependencies) DROP TABLE IF EXISTS notifications CASCADE; DROP TABLE IF EXISTS analytics_events CASCADE; DROP TABLE IF EXISTS audit_logs CASCADE; -- Level 3: Polymorphic relationship tables (depend on multiple entities) DROP TABLE IF EXISTS attachments CASCADE; DROP TABLE IF EXISTS comments CASCADE; -- Level 2: Milestones → Deliverables DROP TABLE IF EXISTS milestones CASCADE; -- Level 1: Deliverables → Contracts DROP TABLE IF EXISTS deliverables CASCADE; -- Level 0: Core business tables DROP TABLE IF EXISTS contracts CASCADE; DROP TABLE IF EXISTS users CASCADE; DROP TABLE IF EXISTS tenants CASCADE; -- ============================================================================= -- SECTION 5: DROP ALL FUNCTIONS -- ============================================================================= -- Functions can be dropped after triggers that use them -- Order doesn't matter for functions -- ============================================================================= -- Trigger function for updating updated_at timestamps DROP FUNCTION IF EXISTS update_updated_at_column() CASCADE; -- Trigger function for generating full_name from first_name + last_name DROP FUNCTION IF EXISTS generate_full_name() CASCADE; -- ============================================================================= -- SECTION 6: DROP ALL CUSTOM TYPES -- ============================================================================= -- Types must be dropped after all tables/functions that use them -- Order doesn't matter for types (no dependencies between types) -- ============================================================================= -- Drop all ENUM types DROP TYPE IF EXISTS milestone_status CASCADE; DROP TYPE IF EXISTS milestone_type CASCADE; DROP TYPE IF EXISTS deliverable_status CASCADE; DROP TYPE IF EXISTS contract_status CASCADE; DROP TYPE IF EXISTS user_role CASCADE; -- ============================================================================= -- SECTION 7: DROP EXTENSIONS (OPTIONAL) -- ============================================================================= -- WARNING: Only drop extensions if you're certain no other schemas use them -- Usually extensions are shared across the entire database -- Commented out by default for safety -- ============================================================================= -- Uncomment only if you're certain these extensions are not used elsewhere: -- DROP EXTENSION IF EXISTS "unaccent" CASCADE; -- DROP EXTENSION IF EXISTS "btree_gin" CASCADE; -- DROP EXTENSION IF EXISTS "pg_trgm" CASCADE; -- DROP EXTENSION IF EXISTS "uuid-ossp" CASCADE; -- ============================================================================= -- SECTION 8: VERIFICATION QUERIES (OPTIONAL) -- ============================================================================= -- Run these after rollback to verify complete removal -- These queries should return 0 rows if rollback was successful -- ============================================================================= -- Verify no tables remain from our schema DO $$ DECLARE remaining_tables INTEGER; BEGIN SELECT COUNT(*) INTO remaining_tables FROM information_schema.tables WHERE table_schema = 'public' AND table_name IN ( 'tenants', 'users', 'contracts', 'deliverables', 'milestones', 'comments', 'attachments', 'audit_logs', 'analytics_events', 'notifications' ); IF remaining_tables > 0 THEN RAISE WARNING 'WARNING: % tables still exist after rollback', remaining_tables; ELSE RAISE NOTICE 'SUCCESS: All Aurganize tables removed'; END IF; END $$; -- Verify no custom types remain DO $$ DECLARE remaining_types INTEGER; BEGIN SELECT COUNT(*) INTO remaining_types FROM pg_type WHERE typname IN ( 'user_role', 'contract_status', 'deliverable_status', 'milestone_type', 'milestone_status' ); IF remaining_types > 0 THEN RAISE WARNING 'WARNING: % custom types still exist after rollback', remaining_types; ELSE RAISE NOTICE 'SUCCESS: All Aurganize custom types removed'; END IF; END $$; -- Verify no functions remain DO $$ DECLARE remaining_functions INTEGER; BEGIN SELECT COUNT(*) INTO remaining_functions FROM pg_proc WHERE proname IN ('update_updated_at_column', 'generate_full_name'); IF remaining_functions > 0 THEN RAISE WARNING 'WARNING: % functions still exist after rollback', remaining_functions; ELSE RAISE NOTICE 'SUCCESS: All Aurganize functions removed'; END IF; END $$; -- ============================================================================= -- END OF ROLLBACK MIGRATION 000001_initial_schema.down.sql -- =============================================================================