routes.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. from fastapi import APIRouter, Depends, HTTPException, Query
  2. from sqlalchemy import text
  3. from sqlalchemy.orm import Session
  4. from core_domain import ServiceHealth
  5. from app.application.services import AuthApplicationService
  6. from app.db.session import get_db
  7. from app.domain.repositories import RoleAssignmentRepository, RoleRepository, UserRepository
  8. from app.schemas.auth import (
  9. PermissionCheckRequest,
  10. PermissionCheckResponse,
  11. RoleAssignmentCreateRequest,
  12. RoleAssignmentResponse,
  13. RoleAssignmentStatusUpdateRequest,
  14. RoleCreateRequest,
  15. RoleResponse,
  16. RoleStatusUpdateRequest,
  17. UserCreateRequest,
  18. UserResponse,
  19. UserStatusUpdateRequest,
  20. )
  21. router = APIRouter()
  22. def get_auth_application_service(db: Session = Depends(get_db)) -> AuthApplicationService:
  23. return AuthApplicationService(
  24. user_repository=UserRepository(db),
  25. role_repository=RoleRepository(db),
  26. assignment_repository=RoleAssignmentRepository(db),
  27. )
  28. @router.get("/health", response_model=ServiceHealth)
  29. def health_check(db: Session = Depends(get_db)) -> ServiceHealth:
  30. db.execute(text("SELECT 1"))
  31. return ServiceHealth(service="auth-service", status="ok", database="ok")
  32. @router.post("/users", response_model=UserResponse)
  33. def create_user(
  34. payload: UserCreateRequest,
  35. service: AuthApplicationService = Depends(get_auth_application_service),
  36. ) -> UserResponse:
  37. return UserResponse.from_entity(service.create_user(payload))
  38. @router.get("/users", response_model=list[UserResponse])
  39. def list_users(
  40. tenant_id: str = Query(...),
  41. service: AuthApplicationService = Depends(get_auth_application_service),
  42. ) -> list[UserResponse]:
  43. return [UserResponse.from_entity(item) for item in service.list_users(tenant_id=tenant_id)]
  44. @router.patch("/users/{user_id}/status", response_model=UserResponse)
  45. def update_user_status(
  46. user_id: str,
  47. payload: UserStatusUpdateRequest,
  48. service: AuthApplicationService = Depends(get_auth_application_service),
  49. ) -> UserResponse:
  50. entity = service.update_user_status(user_id=user_id, payload=payload)
  51. if entity is None:
  52. raise HTTPException(status_code=404, detail=f"user not found: {user_id}")
  53. return UserResponse.from_entity(entity)
  54. @router.post("/roles", response_model=RoleResponse)
  55. def create_role(
  56. payload: RoleCreateRequest,
  57. service: AuthApplicationService = Depends(get_auth_application_service),
  58. ) -> RoleResponse:
  59. return RoleResponse.from_entity(service.create_role(payload))
  60. @router.get("/roles", response_model=list[RoleResponse])
  61. def list_roles(
  62. tenant_id: str = Query(...),
  63. service: AuthApplicationService = Depends(get_auth_application_service),
  64. ) -> list[RoleResponse]:
  65. return [RoleResponse.from_entity(item) for item in service.list_roles(tenant_id=tenant_id)]
  66. @router.patch("/roles/{role_id}/status", response_model=RoleResponse)
  67. def update_role_status(
  68. role_id: str,
  69. payload: RoleStatusUpdateRequest,
  70. service: AuthApplicationService = Depends(get_auth_application_service),
  71. ) -> RoleResponse:
  72. entity = service.update_role_status(role_id=role_id, payload=payload)
  73. if entity is None:
  74. raise HTTPException(status_code=404, detail=f"role not found: {role_id}")
  75. return RoleResponse.from_entity(entity)
  76. @router.post("/assignments", response_model=RoleAssignmentResponse)
  77. def create_assignment(
  78. payload: RoleAssignmentCreateRequest,
  79. service: AuthApplicationService = Depends(get_auth_application_service),
  80. ) -> RoleAssignmentResponse:
  81. return RoleAssignmentResponse.from_entity(service.create_assignment(payload))
  82. @router.get("/assignments", response_model=list[RoleAssignmentResponse])
  83. def list_assignments(
  84. tenant_id: str = Query(...),
  85. user_id: str = Query(...),
  86. service: AuthApplicationService = Depends(get_auth_application_service),
  87. ) -> list[RoleAssignmentResponse]:
  88. return [
  89. RoleAssignmentResponse.from_entity(item)
  90. for item in service.list_assignments(tenant_id=tenant_id, user_id=user_id)
  91. ]
  92. @router.patch("/assignments/{assignment_id}/status", response_model=RoleAssignmentResponse)
  93. def update_assignment_status(
  94. assignment_id: str,
  95. payload: RoleAssignmentStatusUpdateRequest,
  96. service: AuthApplicationService = Depends(get_auth_application_service),
  97. ) -> RoleAssignmentResponse:
  98. entity = service.update_assignment_status(assignment_id=assignment_id, payload=payload)
  99. if entity is None:
  100. raise HTTPException(status_code=404, detail=f"assignment not found: {assignment_id}")
  101. return RoleAssignmentResponse.from_entity(entity)
  102. @router.post("/permissions/check", response_model=PermissionCheckResponse)
  103. def check_permission(
  104. payload: PermissionCheckRequest,
  105. service: AuthApplicationService = Depends(get_auth_application_service),
  106. ) -> PermissionCheckResponse:
  107. return service.check_permission(payload)