from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession from app.core.deps import get_current_user from app.db.database import get_db from app.db.models import User from app.schemas.user import UserPublic from app.schemas.common import PageResponse from app.services.directory_service import search_directory, user_to_public from app.services.user_service import get_user_by_id router = APIRouter(prefix="/api/directory", tags=["directory"]) @router.get("/", response_model=PageResponse[UserPublic]) async def search_members( search: str | None = None, industry: str | None = None, company: str | None = None, class_id: int | None = None, page: int = 1, page_size: int = 20, user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), ): # Determine effective class_id: super_admin can specify one, others use their own effective_class_id = class_id if user.role == "super_admin" and class_id else user.class_id if effective_class_id is None: return PageResponse(items=[], total=0, page=page, page_size=page_size, total_pages=0) users, total = await search_directory( db, effective_class_id, search, industry, company, page, page_size ) total_pages = (total + page_size - 1) // page_size include_contact = True # Same class, approved users can see contact return PageResponse( items=[user_to_public(u, include_contact=include_contact) for u in users], total=total, page=page, page_size=page_size, total_pages=total_pages, ) @router.get("/{user_id}", response_model=UserPublic) async def get_member_detail( user_id: int, user: User = Depends(get_current_user), db: AsyncSession = Depends(get_db), ): target = await get_user_by_id(db, user_id) if target is None or target.status != "approved": raise HTTPException(status_code=404, detail="User not found") # Privacy: only show contact info to same-class members include_contact = user.class_id == target.class_id return user_to_public(target, include_contact=include_contact)