浏览代码

Moved all unsub logic to the encoder

Adrià Casajús 3 年之前
父节点
当前提交
ffd1bdc20c
共有 3 个文件被更改,包括 16 次插入22 次删除
  1. 6 3
      app/handler/unsubscribe_encoder.py
  2. 3 17
      app/models.py
  3. 7 2
      tests/handler/test_unsubscribe_encoder.py

+ 6 - 3
app/handler/unsubscribe_encoder.py

@@ -27,9 +27,7 @@ class UnsubscribeEncoder:
     @staticmethod
     def encode(action: UnsubscribeAction, data: int) -> UnsubscribeLink:
         if config.UNSUBSCRIBER:
-            return UnsubscribeLink(
-                UnsubscribeEncoder.encode_subject(action, data), True
-            )
+            return UnsubscribeLink(UnsubscribeEncoder.encode_mailto(action, data), True)
         return UnsubscribeLink(UnsubscribeEncoder.encode_url(action, data), False)
 
     @staticmethod
@@ -41,6 +39,11 @@ class UnsubscribeEncoder:
         if action == UnsubscribeAction.UnsubscribeNewsletter:
             return f"{data}*"
 
+    @staticmethod
+    def encode_mailto(action: UnsubscribeAction, data: int) -> str:
+        subject = UnsubscribeEncoder.encode_subject(action, data)
+        return f"mailto:{config.UNSUBSCRIBER}?subject={subject}"
+
     @staticmethod
     def encode_url(action: UnsubscribeAction, data: int) -> str:
         if action == UnsubscribeAction.DisableAlias:

+ 3 - 17
app/models.py

@@ -892,7 +892,9 @@ class User(Base, ModelMixin, UserMixin, PasswordOracle):
                     # use * as suffix instead of = as for alias unsubscribe
                     return (
                         self.email,
-                        f"mailto:{config.UNSUBSCRIBER}?subject={self.id}*",
+                        UnsubscribeEncoder.encode_mailto(
+                            UnsubscribeAction.UnsubscribeNewsletter, self.id
+                        ),
                         True,
                     )
 
@@ -1480,22 +1482,6 @@ class Alias(Base, ModelMixin):
         else:
             return self.user.email
 
-    def unsubscribe_link(self, contact: Optional["Contact"] = None) -> (str, bool):
-        """
-        return the unsubscribe link along with whether this is via email (mailto:) or Http POST
-        The mailto: method is preferred
-        """
-        if contact:
-            if config.UNSUBSCRIBER:
-                return f"mailto:{config.UNSUBSCRIBER}?subject={contact.id}_", True
-            else:
-                return f"{config.URL}/dashboard/block_contact/{contact.id}", False
-        else:
-            if config.UNSUBSCRIBER:
-                return f"mailto:{config.UNSUBSCRIBER}?subject={self.id}=", True
-            else:
-                return f"{config.URL}/dashboard/unsubscribe/{self.id}", False
-
     def __repr__(self):
         return f"<Alias {self.id} {self.email}>"
 

+ 7 - 2
tests/handler/test_unsubscribe_encoder.py

@@ -49,7 +49,7 @@ legacy_mail_or_link_test_data = [
         UnsubscribeData(UnsubscribeAction.DisableAlias, 3),
     ),
     (
-        "9=",
+        "mailto:me@nowhere.net?subject=9=",
         True,
         UnsubscribeData(UnsubscribeAction.DisableAlias, 9),
     ),
@@ -59,10 +59,15 @@ legacy_mail_or_link_test_data = [
         UnsubscribeData(UnsubscribeAction.DisableContact, 8),
     ),
     (
-        "8_",
+        "mailto:me@nowhere.net?subject=8_",
         True,
         UnsubscribeData(UnsubscribeAction.DisableContact, 8),
     ),
+    (
+        "mailto:me@nowhere.net?subject=83*",
+        True,
+        UnsubscribeData(UnsubscribeAction.UnsubscribeNewsletter, 83),
+    ),
 ]