Skip to content

Commit 40b4383

Browse files
authored
32396 - Add in tweak for delete (#3610)
1 parent 5264f47 commit 40b4383

File tree

3 files changed

+40
-11
lines changed

3 files changed

+40
-11
lines changed

auth-api/src/auth_api/services/affiliation_invitation.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
from auth_api.utils.account_mailer import publish_to_mailer
5050
from auth_api.utils.enums import (
5151
AccessType,
52+
AffiliationInvitationAction,
5253
AffiliationInvitationType,
5354
InvitationStatus,
5455
LoginSource,
@@ -316,6 +317,7 @@ def create_affiliation_invitation(
316317
AffiliationInvitation.check_auth_for_invitation(
317318
invitation_type=affiliation_invitation_type,
318319
from_org_id=from_org_id,
320+
action=AffiliationInvitationAction.CREATE,
319321
)
320322

321323
entity, from_org, business = AffiliationInvitation._validate_prerequisites(
@@ -411,7 +413,9 @@ def update_affiliation_invitation(self, user, affiliation_invitation_info: dict)
411413
"""Update the specified affiliation invitation with new data."""
412414
invitation: AffiliationInvitationModel = self._model
413415

414-
AffiliationInvitation.check_auth_for_invitation(invitation=self._model)
416+
AffiliationInvitation.check_auth_for_invitation(
417+
invitation=self._model, action=AffiliationInvitationAction.UPDATE
418+
)
415419

416420
# Don't do any updates if the invitation is not in PENDING state
417421
if invitation.invitation_status_code != InvitationStatus.PENDING.value:
@@ -457,7 +461,9 @@ def delete_affiliation_invitation(invitation_id):
457461
if not (invitation := AffiliationInvitationModel.find_invitation_by_id(invitation_id)):
458462
raise BusinessException(Error.DATA_NOT_FOUND, None)
459463

460-
AffiliationInvitation.check_auth_for_invitation(invitation=invitation)
464+
AffiliationInvitation.check_auth_for_invitation(
465+
invitation=invitation, action=AffiliationInvitationAction.DELETE
466+
)
461467

462468
if invitation.status == InvitationStatus.ACCEPTED.value:
463469
invitation.is_deleted = True
@@ -811,13 +817,18 @@ def check_auth_for_invitation(
811817
invitation: AffiliationInvitationModel = None,
812818
invitation_type: AffiliationInvitationType = None,
813819
from_org_id: int = None,
820+
action: AffiliationInvitationAction = None,
814821
):
815822
"""Check if the user has the right to perform the action on the invitation."""
816823
invitation_type = invitation_type or AffiliationInvitationType.from_value(invitation.type)
817824
from_org_id = from_org_id or invitation.from_org_id
818825
match invitation_type:
819826
case AffiliationInvitationType.REQUEST | AffiliationInvitationType.EMAIL:
820827
check_auth(org_id=from_org_id, one_of_roles=(ADMIN, COORDINATOR, USER, STAFF))
828+
case AffiliationInvitationType.UNAFFILIATED_EMAIL:
829+
if action != AffiliationInvitationAction.DELETE:
830+
raise BusinessException(Error.INVALID_AFFILIATION_INVITATION_TYPE, None)
831+
check_auth(org_id=from_org_id, one_of_roles=(ADMIN, COORDINATOR, USER, STAFF))
821832
case _:
822833
raise BusinessException(Error.INVALID_AFFILIATION_INVITATION_TYPE, None)
823834

auth-api/src/auth_api/utils/enums.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,14 @@ class InvitationType(Enum):
213213
STANDARD = "STANDARD" # Used to indicate the standard email invite with admin approval
214214

215215

216+
class AffiliationInvitationAction(Enum):
217+
"""Action being performed on an affiliation invitation."""
218+
219+
CREATE = "CREATE"
220+
UPDATE = "UPDATE"
221+
DELETE = "DELETE"
222+
223+
216224
class AffiliationInvitationType(Enum):
217225
"""Affiliation Invitation type."""
218226

auth-api/tests/unit/services/test_affiliation_invitation.py

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,12 @@
4040
from auth_api.services import Org as OrgService
4141
from auth_api.services import User
4242
from auth_api.utils import roles
43-
from auth_api.utils.enums import AffiliationInvitationType, InvitationStatus, LoginSource, QueueMessageType
43+
from auth_api.utils.enums import (
44+
AffiliationInvitationType,
45+
InvitationStatus,
46+
LoginSource,
47+
QueueMessageType,
48+
)
4449
from tests.utilities.factory_scenarios import TestContactInfo, TestEntityInfo, TestJwtClaims, TestOrgInfo, TestUserInfo
4550
from tests.utilities.factory_utils import (
4651
factory_affiliation_invitation,
@@ -986,10 +991,11 @@ def test_get_all_invitations_with_details_related_to_org(
986991
@pytest.mark.parametrize(
987992
"operation,login_source,expected_error",
988993
[
989-
# UNAFFILIATED_EMAIL blocked by check_auth_for_invitation for create/update/delete
990-
("create", None, Error.INVALID_AFFILIATION_INVITATION_TYPE),
991-
("update", None, Error.INVALID_AFFILIATION_INVITATION_TYPE),
992-
("delete", None, Error.INVALID_AFFILIATION_INVITATION_TYPE),
994+
# UNAFFILIATED_EMAIL blocked by check_auth_for_invitation for create/update
995+
("create", LoginSource.BCSC.value, Error.INVALID_AFFILIATION_INVITATION_TYPE),
996+
("update", LoginSource.BCSC.value, Error.INVALID_AFFILIATION_INVITATION_TYPE),
997+
# UNAFFILIATED_EMAIL delete is allowed
998+
("delete", LoginSource.BCSC.value, None),
993999
# UNAFFILIATED_EMAIL accept checks login_source
9941000
("accept", LoginSource.BCSC.value, None),
9951001
("accept", LoginSource.BCEID.value, Error.INVALID_USER_CREDENTIALS),
@@ -1041,16 +1047,20 @@ def test_unaffiliated_email_invitation_auth(
10411047
elif operation == "update":
10421048
invitation = AffiliationInvitationService.send_unaffiliated_email_invitation(entity)
10431049
invitation.update_affiliation_invitation(User(user), {})
1044-
elif operation == "delete":
1045-
invitation = AffiliationInvitationService.send_unaffiliated_email_invitation(entity)
1046-
AffiliationInvitationService.delete_affiliation_invitation(invitation.as_dict()["id"])
10471050
elif operation == "accept":
10481051
invitation = AffiliationInvitationService.send_unaffiliated_email_invitation(entity)
10491052
AffiliationInvitationService.accept_affiliation_invitation(
10501053
invitation.as_dict()["id"], User(user), ""
10511054
)
10521055
assert exception.value.code == expected_error.name
1053-
else:
1056+
elif operation == "delete":
1057+
invitation = AffiliationInvitationService.send_unaffiliated_email_invitation(entity)
1058+
invitation_id = invitation.as_dict()["id"]
1059+
AffiliationInvitationService.accept_affiliation_invitation(invitation_id, User(user), "")
1060+
AffiliationInvitationService.delete_affiliation_invitation(invitation_id)
1061+
updated = AffiliationInvitationModel.find_invitation_by_id(invitation_id)
1062+
assert updated.is_deleted is True
1063+
elif operation == "accept":
10541064
invitation = AffiliationInvitationService.send_unaffiliated_email_invitation(entity)
10551065
result = AffiliationInvitationService.accept_affiliation_invitation(
10561066
invitation.as_dict()["id"], User(user), ""

0 commit comments

Comments
 (0)