From 56569f09dbccc3c310018fa1a28b5df1222fe0d1 Mon Sep 17 00:00:00 2001 From: luxferre Date: Tue, 9 Jun 2026 15:52:38 +0100 Subject: [PATCH] feat: get user self orgs endpoint --- src/user/router.py | 37 +++++++++++++++++++++++++++++++++++++ src/user/schemas.py | 22 ++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/src/user/router.py b/src/user/router.py index 6139cdc..f5ec0a7 100644 --- a/src/user/router.py +++ b/src/user/router.py @@ -17,6 +17,7 @@ from src.user.schemas import ( OIDCClaims, UserPostInvitationRequest, UserPostInvitationAcceptRequest, + UserGetSelfOrgsResponse, ) from src.user.dependencies import ( user_model_claims_dependency, @@ -113,6 +114,42 @@ async def delete_user_by_id( db.commit() +@router.get( + "/self/orgs", + summary="Get all orgs the current user is a member of", + status_code=status.HTTP_200_OK, + response_model=UserGetSelfOrgsResponse, + responses={}, +) +async def get_user_orgs(user_model: user_model_claims_dependency): + user_orgs = user_model.organisation_rel + response = [] + for org in user_orgs: + response.append( + { + "organisation_id": org.id, + "name": org.name, + "status": org.status, + "intake_questionnaire": org.intake_questionnaire, + "root_user_email": org.root_user_email, + "billing_contact": { + "id": org.billing_contact_id, + "email": org.owner_contact_rel.email, + }, + "owner_contact": { + "id": org.owner_contact_id, + "email": org.owner_contact_rel.email, + }, + "security_contact": { + "id": org.security_contact_id, + "email": org.security_contact_rel.email, + }, + } + ) + + return {"organisations": response} + + @router.post( "/invitation", summary="Send an email invitation for a user to join an org", diff --git a/src/user/schemas.py b/src/user/schemas.py index 114239f..210ee8a 100644 --- a/src/user/schemas.py +++ b/src/user/schemas.py @@ -5,9 +5,27 @@ Pydantic models for the user module from typing import Optional from pydantic import EmailStr +from src.organisation.constants import Status +from src.organisation.schemas import Questionnaire from src.schemas import CustomBaseModel, OrgIDMixin +class ContactModel(CustomBaseModel): + id: int + email: Optional[EmailStr] = None + + +class OrgSchema(OrgIDMixin): + name: str + status: Status + root_user_email: EmailStr + intake_questionnaire: Questionnaire + + billing_contact: ContactModel + owner_contact: ContactModel + security_contact: ContactModel + + class OIDCClaims(CustomBaseModel): exp: int iat: int @@ -54,3 +72,7 @@ class UserPostInvitationRequest(OrgIDMixin): class UserPostInvitationAcceptRequest(CustomBaseModel): jwt: str + + +class UserGetSelfOrgsResponse(CustomBaseModel): + organisations: list[OrgSchema]