From 5d6f3f114f2675d7ed7a6f16410d26c4fe287e6f Mon Sep 17 00:00:00 2001 From: Carlos Quintana Date: Thu, 4 Sep 2025 10:04:39 +0200 Subject: [PATCH] feat: add alias id when deleting alias --- app/alias_delete.py | 3 +- app/models.py | 11 ++++++ ...25_090409_3ffdea52697d_deleted_alias_id.py | 34 +++++++++++++++++++ tests/test_alias_delete.py | 2 ++ 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 migrations/versions/2025_090409_3ffdea52697d_deleted_alias_id.py diff --git a/app/alias_delete.py b/app/alias_delete.py index 7298e3ef..ac7b5871 100644 --- a/app/alias_delete.py +++ b/app/alias_delete.py @@ -51,6 +51,7 @@ def __delete_if_custom_domain( email=alias.email, domain_id=alias.custom_domain_id, reason=reason, + alias_id=alias.id, ) Session.add(domain_deleted_alias) LOG.i( @@ -99,7 +100,7 @@ def perform_alias_deletion( if not DeletedAlias.get_by(email=alias.email): deleted_alias = DeletedAlias( - email=alias.email, reason=alias.delete_reason or reason + email=alias.email, reason=alias.delete_reason or reason, alias_id=alias.id ) Session.add(deleted_alias) LOG.i(f"Moving {alias} to global trash {deleted_alias}") diff --git a/app/models.py b/app/models.py index dec342c8..990179a1 100644 --- a/app/models.py +++ b/app/models.py @@ -2462,6 +2462,9 @@ class DeletedAlias(Base, ModelMixin): default=AliasDeleteReason.Unspecified, server_default=str(AliasDeleteReason.Unspecified.value), ) + alias_id = sa.Column( + sa.Integer, nullable=True, server_default=None, default=None, index=True + ) @classmethod def create(cls, **kw): @@ -2736,6 +2739,7 @@ class DomainDeletedAlias(Base, ModelMixin): __table_args__ = ( sa.UniqueConstraint("domain_id", "email", name="uq_domain_trash"), sa.Index("ix_domain_deleted_alias_user_id", "user_id"), + sa.Index("ix_domain_deleted_alias_alias_id", "alias_id"), ) email = sa.Column(sa.String(256), nullable=False) @@ -2753,6 +2757,13 @@ class DomainDeletedAlias(Base, ModelMixin): server_default=str(AliasDeleteReason.Unspecified.value), ) + alias_id = sa.Column( + sa.Integer, + nullable=True, + server_default=None, + default=None, + ) + @classmethod def create(cls, **kw): raise Exception("should use delete_alias(alias,user) instead") diff --git a/migrations/versions/2025_090409_3ffdea52697d_deleted_alias_id.py b/migrations/versions/2025_090409_3ffdea52697d_deleted_alias_id.py new file mode 100644 index 00000000..71449e08 --- /dev/null +++ b/migrations/versions/2025_090409_3ffdea52697d_deleted_alias_id.py @@ -0,0 +1,34 @@ +"""deleted alias id + +Revision ID: 3ffdea52697d +Revises: 9e80159405af +Create Date: 2025-09-04 09:57:23.255112 + +""" +import sqlalchemy_utils +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '3ffdea52697d' +down_revision = '9e80159405af' +branch_labels = None +depends_on = None + + +def upgrade(): + with op.get_context().autocommit_block(): + op.add_column('deleted_alias', sa.Column('alias_id', sa.Integer(), nullable=True)) + op.create_index(op.f('ix_deleted_alias_alias_id'), 'deleted_alias', ['alias_id'], unique=False, postgresql_concurrently=True) + op.add_column('domain_deleted_alias', sa.Column('alias_id', sa.Integer(), nullable=True)) + op.create_index('ix_domain_deleted_alias_alias_id', 'domain_deleted_alias', ['alias_id'], unique=False, postgresql_concurrently=True) + + +def downgrade(): + with op.get_context().autocommit_block(): + op.drop_index('ix_domain_deleted_alias_alias_id', table_name='domain_deleted_alias', postgresql_concurrently=True) + op.drop_column('domain_deleted_alias', 'alias_id') + op.drop_index(op.f('ix_deleted_alias_alias_id'), table_name='deleted_alias', postgresql_concurrently=True) + op.drop_column('deleted_alias', 'alias_id') + diff --git a/tests/test_alias_delete.py b/tests/test_alias_delete.py index 5114ce04..1784ef3d 100644 --- a/tests/test_alias_delete.py +++ b/tests/test_alias_delete.py @@ -93,6 +93,7 @@ def ensure_alias_is_deleted( deleted_alias: Optional[DeletedAlias] = DeletedAlias.get_by(email=alias_email) assert deleted_alias is not None assert deleted_alias.reason == reason + assert deleted_alias.alias_id == alias_id # Delete alias @@ -158,6 +159,7 @@ def test_alias_custom_domain_perform_deletion_moves_to_domain_deleted_alias(): deleted_custom_alias = DomainDeletedAlias.get_by(email=alias_email) assert deleted_custom_alias is not None + assert deleted_custom_alias.alias_id == alias_id # move_alias_to_trash