feat: group invitation response model
All checks were successful
ci / lint_and_test (push) Successful in 14s

This commit is contained in:
Chris Milne 2026-06-12 10:02:35 +01:00
parent 1a29da73c2
commit 8b89595531
2 changed files with 42 additions and 14 deletions

View file

@ -60,7 +60,6 @@ from src.iam.dependencies import (
perm_model_query_dependency, perm_model_query_dependency,
) )
from src.iam.schemas import ( from src.iam.schemas import (
GroupSchema,
IAMCAoRRequest, IAMCAoRRequest,
IAMGetGroupPermissionsResponse, IAMGetGroupPermissionsResponse,
IAMGetGroupUsersResponse, IAMGetGroupUsersResponse,
@ -80,6 +79,8 @@ from src.iam.schemas import (
IAMPutGroupInvitationRequest, IAMPutGroupInvitationRequest,
IAMPutGroupInvitationAcceptRequest, IAMPutGroupInvitationAcceptRequest,
IAMCAoRResponse, IAMCAoRResponse,
IAMPutGroupInvitationAcceptResponse,
IAMPutGroupInvitationResponse,
) )
from src.utils import verify_email_token from src.utils import verify_email_token
@ -286,7 +287,7 @@ async def create_group(
or "UNIQUE constraint failed" in str(e.orig) # SQLite unique violation or "UNIQUE constraint failed" in str(e.orig) # SQLite unique violation
): ):
raise ConflictException("Group with this name already exists") raise ConflictException("Group with this name already exists")
group_response = GroupSchema(**group_model.__dict__) group_response = GroupSummary(**group_model.__dict__)
org_response = OrgSummary(**org_model.__dict__) org_response = OrgSummary(**org_model.__dict__)
db.commit() db.commit()
return {"group": group_response, "organisation": org_response} return {"group": group_response, "organisation": org_response}
@ -375,7 +376,7 @@ async def add_group_user(
group_model.user_rel.append(user_model) group_model.user_rel.append(user_model)
db.flush() db.flush()
response = IAMPutGroupUserResponse( response = IAMPutGroupUserResponse(
group=GroupSchema(**group_model.__dict__), users=group_model.user_rel group=GroupSummary(**group_model.__dict__), users=group_model.user_rel
) )
db.commit() db.commit()
return response return response
@ -410,7 +411,7 @@ async def remove_group_permission(
group_model.permission_rel.remove(perm_model) group_model.permission_rel.remove(perm_model)
db.flush() db.flush()
response = IAMDeleteGroupPermissionResponse( response = IAMDeleteGroupPermissionResponse(
group=GroupSchema(**group_model.__dict__), group=GroupSummary(**group_model.__dict__),
permissions=group_model.permission_rel, permissions=group_model.permission_rel,
) )
db.commit() db.commit()
@ -444,7 +445,7 @@ async def remove_group_user(
user_model.group_rel.remove(group_model) user_model.group_rel.remove(group_model)
db.flush() db.flush()
response = IAMDeleteGroupUserResponse( response = IAMDeleteGroupUserResponse(
group=GroupSchema(**group_model.__dict__), users=group_model.user_rel group=GroupSummary(**group_model.__dict__), users=group_model.user_rel
) )
db.commit() db.commit()
@ -571,6 +572,7 @@ async def post_permissions(
path="/group/user/invitation", path="/group/user/invitation",
summary="Send an email invitation for non-org member to join a group", summary="Send an email invitation for non-org member to join a group",
status_code=status.HTTP_200_OK, status_code=status.HTTP_200_OK,
response_model=IAMPutGroupInvitationResponse,
responses={}, responses={},
) )
async def invitation( async def invitation(
@ -600,13 +602,20 @@ async def invitation(
group_name=group_name, group_name=group_name,
) )
return "Invitation sent" response = {
"organisation": org_model,
"group": group_model,
"invited_email": user_email,
}
return response
@router.put( @router.put(
path="/group/user//invitation/accept", path="/group/user//invitation/accept",
summary="Accept email invitation to join an org's group", summary="Accept email invitation to join an org's group",
status_code=status.HTTP_200_OK, status_code=status.HTTP_200_OK,
response_model=IAMPutGroupInvitationAcceptResponse,
responses={ responses={
status.HTTP_404_NOT_FOUND: {"description": "User|Org|Group not found"}, status.HTTP_404_NOT_FOUND: {"description": "User|Org|Group not found"},
status.HTTP_403_FORBIDDEN: { status.HTTP_403_FORBIDDEN: {
@ -642,6 +651,13 @@ async def accept_invitation(
raise ConflictException("User already in group.") raise ConflictException("User already in group.")
group_model.user_rel.append(user_model) group_model.user_rel.append(user_model)
db.flush()
response = {
"organisation": org_model,
"user": user_model,
"group": {"details": group_model, "permissions": group_model.permission_rel},
}
db.commit() db.commit()
return "Invitation accepted" return response

View file

@ -42,9 +42,9 @@ class PermissionSchema(CustomBaseModel):
action: str action: str
class GroupSchema(CustomBaseModel): class GroupDetails(CustomBaseModel):
id: int details: GroupSummary
name: str permissions: list[PermissionSchema]
class IAMCAoRRequest(CustomBaseModel): class IAMCAoRRequest(CustomBaseModel):
@ -77,7 +77,7 @@ class IAMPostGroupRequest(OrgIDMixin):
class IAMPostGroupResponse(CustomBaseModel): class IAMPostGroupResponse(CustomBaseModel):
organisation: OrgSummary organisation: OrgSummary
group: GroupSchema group: GroupSummary
class IAMPutGroupPermissionRequest(GroupIDMixin, PermIDMixin, OrgIDMixin): class IAMPutGroupPermissionRequest(GroupIDMixin, PermIDMixin, OrgIDMixin):
@ -95,17 +95,17 @@ class IAMPutGroupUserRequest(GroupIDMixin, UserIDMixin, OrgIDMixin):
class IAMPutGroupUserResponse(CustomBaseModel): class IAMPutGroupUserResponse(CustomBaseModel):
group: GroupSchema group: GroupSummary
users: list[UserSchema] users: list[UserSchema]
class IAMDeleteGroupPermissionResponse(CustomBaseModel): class IAMDeleteGroupPermissionResponse(CustomBaseModel):
group: GroupSchema group: GroupSummary
permissions: list[PermissionSchema] permissions: list[PermissionSchema]
class IAMDeleteGroupUserResponse(CustomBaseModel): class IAMDeleteGroupUserResponse(CustomBaseModel):
group: GroupSchema group: GroupSummary
users: list[UserSchema] users: list[UserSchema]
@ -136,5 +136,17 @@ class IAMPutGroupInvitationRequest(OrgIDMixin, GroupIDMixin):
user_email: EmailStr user_email: EmailStr
class IAMPutGroupInvitationResponse(CustomBaseModel):
organisation: OrgSummary
group: GroupSummary
invited_email: EmailStr
class IAMPutGroupInvitationAcceptRequest(CustomBaseModel): class IAMPutGroupInvitationAcceptRequest(CustomBaseModel):
jwt: str jwt: str
class IAMPutGroupInvitationAcceptResponse(CustomBaseModel):
organisation: OrgSummary
user: UserSummary
group: GroupDetails