from typing import Optional from fastapi import APIRouter, Depends, Query from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.auth import get_current_admin_user from app.database import get_session from app.models import TeamMember from app.schemas import TeamMemberCreate, TeamMemberUpdate, TeamMemberResponse from app.user_models import User router = APIRouter() @router.get("/", response_model=list[TeamMemberResponse]) async def list_team_members( active: Optional[bool] = Query(None, description="Filter by active status"), session: AsyncSession = Depends(get_session), ): query = select(TeamMember).order_by(TeamMember.display_order) if active is not None: query = query.where(TeamMember.active == active) result = await session.execute(query) return list(result.scalars().all()) @router.get("/{member_id}", response_model=TeamMemberResponse) async def get_team_member(member_id: int, session: AsyncSession = Depends(get_session)): result = await session.execute(select(TeamMember).where(TeamMember.id == member_id)) member = result.scalar_one_or_none() if not member: return {"error": "Team member not found"} return member @router.post("/", response_model=TeamMemberResponse, status_code=201) async def create_team_member( payload: TeamMemberCreate, session: AsyncSession = Depends(get_session), _: User = Depends(get_current_admin_user), ): member = TeamMember(**payload.model_dump(), active=True) session.add(member) await session.commit() await session.refresh(member) return member @router.put("/{member_id}", response_model=TeamMemberResponse) async def update_team_member( member_id: int, payload: TeamMemberUpdate, session: AsyncSession = Depends(get_session), _: User = Depends(get_current_admin_user), ): result = await session.execute(select(TeamMember).where(TeamMember.id == member_id)) member = result.scalar_one_or_none() if not member: return {"error": "Team member not found"} for key, value in payload.model_dump(exclude_unset=True).items(): setattr(member, key, value) await session.commit() await session.refresh(member) return member @router.delete("/{member_id}", status_code=204) async def delete_team_member( member_id: int, session: AsyncSession = Depends(get_session), _: User = Depends(get_current_admin_user), ): result = await session.execute(select(TeamMember).where(TeamMember.id == member_id)) member = result.scalar_one_or_none() if not member: return {"error": "Team member not found"} await session.delete(member) await session.commit()