diff --git a/README.md b/README.md index f2ec9b24..7525cac3 100644 --- a/README.md +++ b/README.md @@ -1042,6 +1042,7 @@ Input: - (optional) `note` in request body - (optional) `mailbox_id` in request body - (optional) `name` in request body +- (optional) `mailbox_ids` in request body: array of mailbox_id Output: If success, return 200 diff --git a/app/api/views/alias.py b/app/api/views/alias.py index 70e70655..7c73646f 100644 --- a/app/api/views/alias.py +++ b/app/api/views/alias.py @@ -285,6 +285,37 @@ def update_alias(alias_id): alias.mailbox_id = mailbox_id 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: new_name = data.get("name") alias.name = new_name diff --git a/tests/api/test_alias.py b/tests/api/test_alias.py index 7ab13556..9ee1217f 100644 --- a/tests/api/test_alias.py +++ b/tests/api/test_alias.py @@ -362,6 +362,43 @@ def test_update_alias_name(flask_client): 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): user = User.create( email="a@b.c", password="password", name="Test User", activated=True