Переглянути джерело

make sure to add alias into global trash when deleting it

Son NK 5 роки тому
батько
коміт
2f5a03dcad

+ 19 - 1
app/alias_utils.py

@@ -1,5 +1,7 @@
 from typing import Optional
 
+from sqlalchemy.exc import IntegrityError
+
 from app.email_utils import (
     get_email_domain_part,
     send_cannot_create_directory_alias,
@@ -76,6 +78,7 @@ def try_auto_create_directory(address: str) -> Optional[Alias]:
             directory_id=directory.id,
             mailbox_id=dir_user.default_mailbox_id,
         )
+
         db.session.commit()
         return alias
 
@@ -103,7 +106,7 @@ def try_auto_create_catch_all_domain(address: str) -> Optional[Alias]:
         return None
 
     # if alias has been deleted before, do not auto-create it
-    if DeletedAlias.get_by(email=address, user_id=custom_domain.user_id):
+    if DeletedAlias.get_by(email=address):
         LOG.warning(
             "Alias %s was deleted before, cannot auto-create using domain catch-all %s, user %s",
             address,
@@ -124,3 +127,18 @@ def try_auto_create_catch_all_domain(address: str) -> Optional[Alias]:
 
     db.session.commit()
     return alias
+
+
+def delete_alias(alias: Alias, user: User):
+    email = alias.email
+    Alias.delete(alias.id)
+    db.session.commit()
+
+    # try to save deleted alias
+    try:
+        DeletedAlias.create(user_id=user.id, email=email)
+        db.session.commit()
+    # this can happen when a previously deleted alias is re-created via catch-all or directory feature
+    except IntegrityError:
+        LOG.error("alias %s has been added before to DeletedAlias", email)
+        db.session.rollback()

+ 2 - 2
app/api/views/alias.py

@@ -3,6 +3,7 @@ from flask import jsonify
 from flask import request
 from flask_cors import cross_origin
 
+from app import alias_utils
 from app.api.base import api_bp, require_api_auth
 from app.api.serializer import (
     AliasInfo,
@@ -156,8 +157,7 @@ def delete_alias(alias_id):
     if alias.user_id != user.id:
         return jsonify(error="Forbidden"), 403
 
-    Alias.delete(alias_id)
-    db.session.commit()
+    alias_utils.delete_alias(alias, user)
 
     return jsonify(deleted=True), 200
 

+ 3 - 3
app/api/views/new_custom_alias.py

@@ -9,7 +9,7 @@ from app.config import MAX_NB_EMAIL_FREE_PLAN, ALIAS_DOMAINS
 from app.dashboard.views.custom_alias import verify_prefix_suffix, signer
 from app.extensions import db
 from app.log import LOG
-from app.models import Alias, AliasUsedOn, User, CustomDomain
+from app.models import Alias, AliasUsedOn, User, CustomDomain, DeletedAlias
 from app.utils import convert_to_id
 
 
@@ -56,7 +56,7 @@ def new_custom_alias():
         return jsonify(error="wrong alias prefix or suffix"), 400
 
     full_alias = alias_prefix + alias_suffix
-    if Alias.get_by(email=full_alias):
+    if Alias.get_by(email=full_alias) or DeletedAlias.get_by(email=full_alias):
         LOG.d("full alias already used %s", full_alias)
         return jsonify(error=f"alias {full_alias} already exists"), 409
 
@@ -133,7 +133,7 @@ def new_custom_alias_v2():
         return jsonify(error="wrong alias prefix or suffix"), 400
 
     full_alias = alias_prefix + alias_suffix
-    if Alias.get_by(email=full_alias):
+    if Alias.get_by(email=full_alias) or DeletedAlias.get_by(email=full_alias):
         LOG.d("full alias already used %s", full_alias)
         return jsonify(error=f"alias {full_alias} already exists"), 409
 

+ 2 - 11
app/dashboard/views/index.py

@@ -5,6 +5,7 @@ from flask_login import login_required, current_user
 from sqlalchemy.exc import IntegrityError
 from sqlalchemy.orm import joinedload
 
+from app import alias_utils
 from app.api.serializer import get_alias_infos_with_pagination_v2
 from app.dashboard.base import dashboard_bp
 from app.extensions import db
@@ -112,19 +113,9 @@ def index():
 
             LOG.d("delete gen email %s", alias)
             email = alias.email
-            Alias.delete(alias.id)
-            db.session.commit()
+            alias_utils.delete_alias(alias, current_user)
             flash(f"Alias {email} has been deleted", "success")
 
-            # try to save deleted alias
-            try:
-                DeletedAlias.create(user_id=current_user.id, email=email)
-                db.session.commit()
-            # this can happen when a previously deleted alias is re-created via catch-all or directory feature
-            except IntegrityError:
-                LOG.error("alias %s has been added before to DeletedAlias", email)
-                db.session.rollback()
-
         return redirect(
             url_for("dashboard.index", query=query, sort=sort, filter=alias_filter)
         )

+ 2 - 1
app/models.py

@@ -24,6 +24,7 @@ from app.config import (
     LANDING_PAGE_URL,
     FIRST_ALIAS_DOMAIN,
 )
+from app.errors import AliasInTrashError
 from app.extensions import db
 from app.log import LOG
 from app.oauth_models import Scope
@@ -652,7 +653,7 @@ class Alias(db.Model, ModelMixin):
             suffix = random_word()
             email = f"{prefix}.{suffix}@{FIRST_ALIAS_DOMAIN}"
 
-            if not cls.get_by(email=email):
+            if not cls.get_by(email=email) and not DeletedAlias.get_by(email=email):
                 break
 
         return Alias.create(