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>
71 lines
2.3 KiB
Python
71 lines
2.3 KiB
Python
from uuid import UUID
|
|
|
|
from fastapi import APIRouter, Depends, Header, Query, status
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.core.database import get_db
|
|
from app.core.security import require_platform_admin
|
|
from app.schemas.user import MembershipCreate, MembershipRead, UserCreate, UserRead
|
|
from app.services.user_service import UserService
|
|
|
|
router = APIRouter(tags=["users"])
|
|
|
|
|
|
@router.get("/users", response_model=list[UserRead])
|
|
async def list_users(
|
|
offset: int = Query(default=0, ge=0),
|
|
limit: int = Query(default=50, ge=1, le=100),
|
|
db: AsyncSession = Depends(get_db),
|
|
_user=Depends(require_platform_admin),
|
|
) -> list[UserRead]:
|
|
users = await UserService(db).list_users(offset=offset, limit=limit)
|
|
return [UserRead.model_validate(user) for user in users]
|
|
|
|
|
|
@router.post("/users", response_model=UserRead, status_code=status.HTTP_201_CREATED)
|
|
async def register_user(
|
|
payload: UserCreate,
|
|
db: AsyncSession = Depends(get_db),
|
|
_user=Depends(require_platform_admin),
|
|
) -> UserRead:
|
|
user = await UserService(db).register(payload)
|
|
return UserRead.model_validate(user)
|
|
|
|
|
|
@router.get("/users/{user_id}", response_model=UserRead)
|
|
async def get_user(
|
|
user_id: UUID,
|
|
db: AsyncSession = Depends(get_db),
|
|
_user=Depends(require_platform_admin),
|
|
) -> UserRead:
|
|
user = await UserService(db).get(user_id)
|
|
return UserRead.model_validate(user)
|
|
|
|
|
|
@router.post(
|
|
"/tenants/{tenant_id}/members",
|
|
response_model=MembershipRead,
|
|
status_code=status.HTTP_201_CREATED,
|
|
)
|
|
async def add_tenant_member(
|
|
tenant_id: UUID,
|
|
payload: MembershipCreate,
|
|
db: AsyncSession = Depends(get_db),
|
|
_user=Depends(require_platform_admin),
|
|
authorization: str | None = Header(default=None),
|
|
) -> MembershipRead:
|
|
membership = await UserService(db).add_member(
|
|
tenant_id, payload, authorization=authorization
|
|
)
|
|
return MembershipRead.model_validate(membership)
|
|
|
|
|
|
@router.get("/tenants/{tenant_id}/members", response_model=list[MembershipRead])
|
|
async def list_tenant_members(
|
|
tenant_id: UUID,
|
|
db: AsyncSession = Depends(get_db),
|
|
_user=Depends(require_platform_admin),
|
|
) -> list[MembershipRead]:
|
|
rows = await UserService(db).list_members(tenant_id)
|
|
return [MembershipRead.model_validate(m) for m in rows]
|