forget-cancellare-vecchi-toot/migrations/versions/7b0e9b8e0887_remove_fetch_b...

65 lines
2.3 KiB
Python

"""remove fetch batch fk
things are real bad if the associated post is deleted and this is nulled
keeping an opaque ID and associated date should work fine
see GH-584
Revision ID: 7b0e9b8e0887
Revises: 740fe24a7712
Create Date: 2022-02-27 11:48:55.107299
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '7b0e9b8e0887'
down_revision = '740fe24a7712'
branch_labels = None
depends_on = None
def upgrade():
op.drop_constraint('fk_accounts_fetch_current_batch_end_id_posts', 'accounts', type_='foreignkey')
op.add_column('accounts', sa.Column('fetch_current_batch_end_date', sa.DateTime(timezone=True), nullable=True))
op.execute('''
UPDATE accounts SET fetch_current_batch_end_date = posts.created_at
FROM posts WHERE accounts.fetch_current_batch_end_id = posts.id;
''')
# update ids from "mastodon:69420@chitter.xyz" format to just "69420"
op.execute('''
UPDATE accounts SET fetch_current_batch_end_id =
split_part(
split_part(fetch_current_batch_end_id, ':', 2),
'@', 1);
''')
def downgrade():
# converts ids like "69420" back to "mastodon:69420@chitter.xyz"
# i sure hope there isn't a mastodon-compatible out there that can have
# : or @ in its post ids
op.execute('''
WITH accounts_exploded_ids AS (
SELECT
id,
split_part(id, ':', 1) || ':' AS service,
CASE WHEN position('@' IN id) != 0
THEN '@' || split_part(id, @, 2)
ELSE ''
END as instance
FROM accounts
)
UPDATE accounts SET fetch_current_batch_end_id = e.service || fetch_current_batch_end_id || e.instance
FROM accounts_exploded_ids AS e WHERE e.id = accounts.id AND fetch_current_batch_end_id IS NOT NULL;
''')
op.execute('''
UPDATE accounts SET fetch_current_batch_end_id = NULL
WHERE NOT EXISTS (SELECT 1 FROM posts WHERE fetch_current_batch_end_id = posts.id);
''')
op.create_foreign_key('fk_accounts_fetch_current_batch_end_id_posts', 'accounts', 'posts', ['fetch_current_batch_end_id'], ['id'], ondelete='SET NULL')
op.drop_column('accounts', 'fetch_current_batch_end_date')