2026-05-06 17:43:47 +08:00
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
from typing import Annotated
|
|
|
|
|
|
2026-05-07 11:50:10 +08:00
|
|
|
from fastapi import APIRouter, Depends, HTTPException, Query, status
|
2026-05-06 17:43:47 +08:00
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
|
|
|
|
|
|
from app.api.deps import get_db
|
2026-05-07 11:50:10 +08:00
|
|
|
from app.schemas.employee import EmployeeCreate, EmployeeMetaRead, EmployeeRead
|
2026-05-06 17:43:47 +08:00
|
|
|
from app.services.employee import EmployeeService
|
|
|
|
|
|
|
|
|
|
router = APIRouter()
|
|
|
|
|
DbSession = Annotated[Session, Depends(get_db)]
|
|
|
|
|
|
|
|
|
|
|
2026-05-07 11:50:10 +08:00
|
|
|
@router.get("/meta", response_model=EmployeeMetaRead)
|
|
|
|
|
def get_employee_meta(db: DbSession) -> EmployeeMetaRead:
|
|
|
|
|
return EmployeeService(db).get_employee_meta()
|
|
|
|
|
|
|
|
|
|
|
2026-05-06 17:43:47 +08:00
|
|
|
@router.get("", response_model=list[EmployeeRead])
|
2026-05-07 11:50:10 +08:00
|
|
|
def list_employees(
|
|
|
|
|
db: DbSession,
|
|
|
|
|
status_filter: Annotated[str | None, Query(alias="status")] = None,
|
|
|
|
|
keyword: str | None = None,
|
|
|
|
|
) -> list[EmployeeRead]:
|
|
|
|
|
return EmployeeService(db).list_employees(status=status_filter, keyword=keyword)
|
2026-05-06 17:43:47 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.post("", response_model=EmployeeRead, status_code=status.HTTP_201_CREATED)
|
|
|
|
|
def create_employee(payload: EmployeeCreate, db: DbSession) -> EmployeeRead:
|
2026-05-07 11:50:10 +08:00
|
|
|
try:
|
|
|
|
|
return EmployeeService(db).create_employee(payload)
|
|
|
|
|
except ValueError as exc:
|
|
|
|
|
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(exc)) from exc
|
2026-05-06 17:43:47 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.get("/{employee_id}", response_model=EmployeeRead)
|
|
|
|
|
def get_employee(employee_id: str, db: DbSession) -> EmployeeRead:
|
|
|
|
|
employee = EmployeeService(db).get_employee(employee_id)
|
|
|
|
|
if employee is None:
|
|
|
|
|
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Employee not found")
|
|
|
|
|
return employee
|