Wire production domain, CORS for tenant subdomains, celery volume mounts, and nginx reverse proxy configs for apex, API, identity, auth, and wildcard tenants. Co-authored-by: Cursor <cursoragent@cursor.com>
73 lines
2.7 KiB
Python
73 lines
2.7 KiB
Python
from uuid import UUID
|
|
|
|
from sqlalchemy import select
|
|
|
|
from app.models.membership import TenantMembership
|
|
from app.models.user import UserProfile
|
|
|
|
|
|
class UserRepository:
|
|
def __init__(self, session) -> None:
|
|
self.session = session
|
|
|
|
async def get(self, user_id: UUID) -> UserProfile | None:
|
|
return await self.session.get(UserProfile, user_id)
|
|
|
|
async def get_by_sub(self, keycloak_sub: str) -> UserProfile | None:
|
|
stmt = select(UserProfile).where(UserProfile.keycloak_sub == keycloak_sub)
|
|
result = await self.session.execute(stmt)
|
|
return result.scalar_one_or_none()
|
|
|
|
async def get_by_mobile(self, mobile: str) -> UserProfile | None:
|
|
stmt = select(UserProfile).where(UserProfile.mobile == mobile)
|
|
result = await self.session.execute(stmt)
|
|
return result.scalar_one_or_none()
|
|
|
|
async def get_by_username(self, username: str) -> UserProfile | None:
|
|
stmt = select(UserProfile).where(UserProfile.username == username)
|
|
result = await self.session.execute(stmt)
|
|
return result.scalar_one_or_none()
|
|
|
|
async def add(self, user: UserProfile) -> UserProfile:
|
|
self.session.add(user)
|
|
await self.session.flush()
|
|
return user
|
|
|
|
async def list(self, offset: int = 0, limit: int = 20) -> list[UserProfile]:
|
|
stmt = (
|
|
select(UserProfile)
|
|
.order_by(UserProfile.created_at.desc())
|
|
.offset(offset)
|
|
.limit(limit)
|
|
)
|
|
result = await self.session.execute(stmt)
|
|
return list(result.scalars().all())
|
|
|
|
|
|
class MembershipRepository:
|
|
def __init__(self, session) -> None:
|
|
self.session = session
|
|
|
|
async def get(self, tenant_id: UUID, user_id: UUID) -> TenantMembership | None:
|
|
stmt = select(TenantMembership).where(
|
|
TenantMembership.tenant_id == tenant_id,
|
|
TenantMembership.user_id == user_id,
|
|
)
|
|
result = await self.session.execute(stmt)
|
|
return result.scalar_one_or_none()
|
|
|
|
async def list_by_tenant(self, tenant_id: UUID) -> list[TenantMembership]:
|
|
stmt = select(TenantMembership).where(TenantMembership.tenant_id == tenant_id)
|
|
result = await self.session.execute(stmt)
|
|
return list(result.scalars().all())
|
|
|
|
async def list_by_user(self, user_id: UUID) -> list[TenantMembership]:
|
|
stmt = select(TenantMembership).where(TenantMembership.user_id == user_id)
|
|
result = await self.session.execute(stmt)
|
|
return list(result.scalars().all())
|
|
|
|
async def add(self, membership: TenantMembership) -> TenantMembership:
|
|
self.session.add(membership)
|
|
await self.session.flush()
|
|
return membership
|