Datavision / backend /database /workspace_ops.py
DataVision CI/CD Bot
release: clean production build for HuggingFace Space
09801ca
Raw
History Blame Contribute Delete
2.43 kB
"""
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