modules.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. """模块登记路由:登记或查询子系统服务地址与启用状态。"""
  2. from datetime import datetime
  3. from fastapi import APIRouter, Depends, HTTPException
  4. from sqlmodel import Session, select
  5. from app.db import get_session
  6. from app.deps import require_role
  7. from app.models import ModuleService, UserRole
  8. from app.schemas import ModulePublic, ModuleRegisterRequest
  9. router = APIRouter(prefix="/modules", tags=["modules"])
  10. @router.get("", response_model=list[ModulePublic])
  11. def list_modules(session: Session = Depends(get_session)):
  12. return list(session.exec(select(ModuleService)).all())
  13. @router.post("/register", response_model=ModulePublic)
  14. def register_module(
  15. payload: ModuleRegisterRequest,
  16. session: Session = Depends(get_session),
  17. _=Depends(require_role(UserRole.teacher)),
  18. ):
  19. existing = session.exec(select(ModuleService).where(ModuleService.name == payload.name)).first()
  20. if existing:
  21. existing.base_url = payload.base_url
  22. existing.is_enabled = payload.is_enabled
  23. existing.updated_at = datetime.utcnow()
  24. session.add(existing)
  25. session.commit()
  26. session.refresh(existing)
  27. return existing
  28. module = ModuleService(name=payload.name, base_url=payload.base_url, is_enabled=payload.is_enabled)
  29. session.add(module)
  30. session.commit()
  31. session.refresh(module)
  32. return module
  33. @router.delete("/{name}")
  34. def disable_module(
  35. name: str,
  36. session: Session = Depends(get_session),
  37. _=Depends(require_role(UserRole.teacher)),
  38. ):
  39. module = session.exec(select(ModuleService).where(ModuleService.name == name)).first()
  40. if not module:
  41. raise HTTPException(status_code=404, detail="Module not found")
  42. module.is_enabled = False
  43. module.updated_at = datetime.utcnow()
  44. session.add(module)
  45. session.commit()
  46. return {"status": "disabled", "name": name}