Sfoglia il codice sorgente

Support mailbox_ids in PUT /api/aliases/:alias_id

Son NK 5 anni fa
parent
commit
90dae2e3c8
3 ha cambiato i file con 69 aggiunte e 0 eliminazioni
  1. 1 0
      README.md
  2. 31 0
      app/api/views/alias.py
  3. 37 0
      tests/api/test_alias.py

+ 1 - 0
README.md

@@ -1042,6 +1042,7 @@ Input:
 - (optional) `note` in request body
 - (optional) `note` in request body
 - (optional) `mailbox_id` in request body
 - (optional) `mailbox_id` in request body
 - (optional) `name` in request body
 - (optional) `name` in request body
+- (optional) `mailbox_ids` in request body: array of mailbox_id
 
 
 Output:
 Output:
 If success, return 200
 If success, return 200

+ 31 - 0
app/api/views/alias.py

@@ -285,6 +285,37 @@ def update_alias(alias_id):
         alias.mailbox_id = mailbox_id
         alias.mailbox_id = mailbox_id
         changed = True
         changed = True
 
 
+    if "mailbox_ids" in data:
+        mailbox_ids = [int(m_id) for m_id in data.get("mailbox_ids")]
+        mailboxes: [Mailbox] = []
+
+        # check if all mailboxes belong to user
+        for mailbox_id in mailbox_ids:
+            mailbox = Mailbox.get(mailbox_id)
+            if not mailbox or mailbox.user_id != user.id or not mailbox.verified:
+                return jsonify(error="Forbidden"), 400
+            mailboxes.append(mailbox)
+
+        if not mailboxes:
+            return jsonify(error="Must choose at least one mailbox"), 400
+
+        # <<< update alias mailboxes >>>
+        # first remove all existing alias-mailboxes links
+        AliasMailbox.query.filter_by(alias_id=alias.id).delete()
+        db.session.flush()
+
+        # then add all new mailboxes
+        for i, mailbox in enumerate(mailboxes):
+            if i == 0:
+                alias.mailbox_id = mailboxes[0].id
+            else:
+                AliasMailbox.create(
+                    user_id=alias.user_id, alias_id=alias.id, mailbox_id=mailbox.id
+                )
+        # <<< END update alias mailboxes >>>
+
+        changed = True
+
     if "name" in data:
     if "name" in data:
         new_name = data.get("name")
         new_name = data.get("name")
         alias.name = new_name
         alias.name = new_name

+ 37 - 0
tests/api/test_alias.py

@@ -362,6 +362,43 @@ def test_update_alias_name(flask_client):
     assert alias.name == "Test Name"
     assert alias.name == "Test Name"
 
 
 
 
+def test_update_alias_mailboxes(flask_client):
+    user = User.create(
+        email="a@b.c", password="password", name="Test User", activated=True
+    )
+    db.session.commit()
+
+    mb1 = Mailbox.create(user_id=user.id, email="ab1@cd.com", verified=True)
+    mb2 = Mailbox.create(user_id=user.id, email="ab2@cd.com", verified=True)
+
+    # create api_key
+    api_key = ApiKey.create(user.id, "for test")
+    db.session.commit()
+
+    alias = Alias.create_new_random(user)
+    db.session.commit()
+
+    r = flask_client.put(
+        url_for("api.update_alias", alias_id=alias.id),
+        headers={"Authentication": api_key.code},
+        json={"mailbox_ids": [mb1.id, mb2.id]},
+    )
+
+    assert r.status_code == 200
+    alias = Alias.get(alias.id)
+
+    assert alias.mailbox
+    assert len(alias._mailboxes) == 1
+
+    # fail when update with empty mailboxes
+    r = flask_client.put(
+        url_for("api.update_alias", alias_id=alias.id),
+        headers={"Authentication": api_key.code},
+        json={"mailbox_ids": []},
+    )
+    assert r.status_code == 400
+
+
 def test_alias_contacts(flask_client):
 def test_alias_contacts(flask_client):
     user = User.create(
     user = User.create(
         email="a@b.c", password="password", name="Test User", activated=True
         email="a@b.c", password="password", name="Test User", activated=True