auth.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. from datetime import datetime
  2. from typing import TYPE_CHECKING
  3. from core_domain import (
  4. PermissionCheckContract,
  5. PermissionCheckResultContract,
  6. RoleAssignmentContract,
  7. RoleAssignmentStatus,
  8. RoleContract,
  9. RoleStatus,
  10. UserContract,
  11. UserStatus,
  12. )
  13. from core_shared import JSONValue
  14. from pydantic import BaseModel, Field
  15. if TYPE_CHECKING:
  16. from app.db.models import Role, RoleAssignment, User
  17. class UserCreateRequest(BaseModel):
  18. username: str
  19. password: str | None = Field(default=None, min_length=8)
  20. display_name: str | None = None
  21. email: str | None = None
  22. metadata_json: dict[str, JSONValue] = Field(default_factory=dict)
  23. class UserStatusUpdateRequest(BaseModel):
  24. status: UserStatus
  25. class UserResponse(UserContract):
  26. @classmethod
  27. def from_entity(cls, entity: "User") -> "UserResponse":
  28. return cls.model_validate(entity, from_attributes=True)
  29. class LoginUserResponse(BaseModel):
  30. id: str
  31. username: str
  32. display_name: str | None = None
  33. email: str | None = None
  34. status: UserStatus
  35. metadata_json: dict[str, JSONValue] = Field(default_factory=dict)
  36. last_login_time: datetime | None = None
  37. created_time: datetime
  38. @classmethod
  39. def from_entity(cls, entity: "User") -> "LoginUserResponse":
  40. return cls.model_validate(entity, from_attributes=True)
  41. class LoginRequest(BaseModel):
  42. username: str
  43. password: str
  44. class LoginResponse(BaseModel):
  45. access_token: str
  46. token_type: str = "bearer"
  47. expires_time: datetime
  48. user: LoginUserResponse
  49. class TokenVerifyRequest(BaseModel):
  50. access_token: str
  51. class TokenVerifyResponse(BaseModel):
  52. active: bool
  53. user_id: str | None = None
  54. username: str | None = None
  55. expires_time: datetime | None = None
  56. reason: str | None = None
  57. class RoleCreateRequest(BaseModel):
  58. code: str
  59. name: str
  60. description: str | None = None
  61. permissions_json: list[str] = Field(default_factory=list)
  62. class RoleStatusUpdateRequest(BaseModel):
  63. status: RoleStatus
  64. class RoleResponse(RoleContract):
  65. @classmethod
  66. def from_entity(cls, entity: "Role") -> "RoleResponse":
  67. return cls.model_validate(entity, from_attributes=True)
  68. class RoleAssignmentCreateRequest(BaseModel):
  69. user_id: str
  70. role_id: str
  71. scope_type: str | None = None
  72. scope_id: str | None = None
  73. expires_time: datetime | None = None
  74. class RoleAssignmentStatusUpdateRequest(BaseModel):
  75. status: RoleAssignmentStatus
  76. class RoleAssignmentResponse(RoleAssignmentContract):
  77. @classmethod
  78. def from_entity(cls, entity: "RoleAssignment") -> "RoleAssignmentResponse":
  79. return cls.model_validate(entity, from_attributes=True)
  80. class PermissionCheckRequest(PermissionCheckContract):
  81. pass
  82. class PermissionCheckResponse(PermissionCheckResultContract):
  83. pass