Spaces:
Running
Running
| """ | |
| Workspace Operations Module — PostgreSQL workspace membership queries. | |
| Provides: get_workspace_members, get_user_email, is_workspace_member | |
| """ | |
| import uuid | |
| from typing import Optional, List, Dict | |
| from sqlalchemy.ext.asyncio import AsyncSession | |
| from sqlalchemy.future import select | |
| from sqlalchemy import func | |
| from database.orm import WorkspaceMember, UserProfile | |
| async def get_workspace_members(db: AsyncSession, workspace_id: str) -> List[Dict]: | |
| """ | |
| Get all members of a workspace with their roles. | |
| """ | |
| try: | |
| ws_id = uuid.UUID(workspace_id) | |
| except (ValueError, AttributeError): | |
| return [] | |
| stmt = ( | |
| select(WorkspaceMember.user_id, WorkspaceMember.role) | |
| .where(WorkspaceMember.workspace_id == ws_id) | |
| ) | |
| result = await db.execute(stmt) | |
| rows = result.all() | |
| return [{"user_id": str(row.user_id), "role": row.role} for row in rows] | |
| async def get_user_email(db: AsyncSession, user_id: str) -> Optional[str]: | |
| """ | |
| Get a user's email address by their ID. | |
| """ | |
| try: | |
| uid = uuid.UUID(user_id) | |
| except (ValueError, AttributeError): | |
| return None | |
| stmt = select(UserProfile.email).where(UserProfile.id == uid) | |
| result = await db.execute(stmt) | |
| row = result.scalar_one_or_none() | |
| return row | |
| async def is_workspace_member(db: AsyncSession, workspace_id: str, user_id: str) -> bool: | |
| """ | |
| Check if a user is a member of a workspace. | |
| """ | |
| try: | |
| ws_id = uuid.UUID(workspace_id) | |
| uid = uuid.UUID(user_id) | |
| except (ValueError, AttributeError): | |
| return False | |
| stmt = ( | |
| select(func.count()) | |
| .select_from(WorkspaceMember) | |
| .where( | |
| WorkspaceMember.workspace_id == ws_id, | |
| WorkspaceMember.user_id == uid | |
| ) | |
| ) | |
| result = await db.execute(stmt) | |
| count = result.scalar() | |
| return count > 0 | |
| async def add_workspace_member( | |
| db: AsyncSession, | |
| workspace_id: str, | |
| user_id: str, | |
| role: str = "member" | |
| ) -> Optional[WorkspaceMember]: | |
| """Add a user to a workspace.""" | |
| try: | |
| member = WorkspaceMember( | |
| workspace_id=uuid.UUID(workspace_id), | |
| user_id=uuid.UUID(user_id), | |
| role=role | |
| ) | |
| db.add(member) | |
| await db.commit() | |
| await db.refresh(member) | |
| return member | |
| except Exception: | |
| await db.rollback() | |
| return None | |