repositories.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. from datetime import datetime
  2. from sqlalchemy import select
  3. from sqlalchemy.orm import Session
  4. from core_domain import RoleAssignmentStatus, RoleStatus, UserStatus
  5. from core_shared import JSONValue
  6. from app.db.models import Role, RoleAssignment, User
  7. class UserRepository:
  8. def __init__(self, db: Session) -> None:
  9. self.db = db
  10. def create(
  11. self,
  12. *,
  13. tenant_id: str,
  14. username: str,
  15. display_name: str | None,
  16. email: str | None,
  17. metadata_json: dict[str, JSONValue],
  18. ) -> User:
  19. entity = User(
  20. tenant_id=tenant_id,
  21. username=username,
  22. display_name=display_name,
  23. email=email,
  24. metadata_json=metadata_json,
  25. )
  26. self.db.add(entity)
  27. self.db.commit()
  28. self.db.refresh(entity)
  29. return entity
  30. def list_by_tenant(self, *, tenant_id: str) -> list[User]:
  31. stmt = select(User).where(User.tenant_id == tenant_id).order_by(User.created_time.desc())
  32. return list(self.db.scalars(stmt))
  33. def get_by_id(self, *, tenant_id: str, user_id: str) -> User | None:
  34. stmt = select(User).where(User.tenant_id == tenant_id).where(User.id == user_id)
  35. return self.db.scalar(stmt)
  36. def update_status(self, *, tenant_id: str, user_id: str, status: UserStatus) -> User | None:
  37. entity = self.get_by_id(tenant_id=tenant_id, user_id=user_id)
  38. if entity is None:
  39. return None
  40. entity.status = status
  41. self.db.commit()
  42. self.db.refresh(entity)
  43. return entity
  44. class RoleRepository:
  45. def __init__(self, db: Session) -> None:
  46. self.db = db
  47. def create(
  48. self,
  49. *,
  50. tenant_id: str,
  51. code: str,
  52. name: str,
  53. description: str | None,
  54. permissions_json: list[str],
  55. ) -> Role:
  56. entity = Role(
  57. tenant_id=tenant_id,
  58. code=code,
  59. name=name,
  60. description=description,
  61. permissions_json=permissions_json,
  62. )
  63. self.db.add(entity)
  64. self.db.commit()
  65. self.db.refresh(entity)
  66. return entity
  67. def list_by_tenant(self, *, tenant_id: str) -> list[Role]:
  68. stmt = select(Role).where(Role.tenant_id == tenant_id).order_by(Role.created_time.desc())
  69. return list(self.db.scalars(stmt))
  70. def get_by_id(self, *, tenant_id: str, role_id: str) -> Role | None:
  71. stmt = select(Role).where(Role.tenant_id == tenant_id).where(Role.id == role_id)
  72. return self.db.scalar(stmt)
  73. def update_status(self, *, tenant_id: str, role_id: str, status: RoleStatus) -> Role | None:
  74. entity = self.get_by_id(tenant_id=tenant_id, role_id=role_id)
  75. if entity is None:
  76. return None
  77. entity.status = status
  78. self.db.commit()
  79. self.db.refresh(entity)
  80. return entity
  81. class RoleAssignmentRepository:
  82. def __init__(self, db: Session) -> None:
  83. self.db = db
  84. def create(
  85. self,
  86. *,
  87. tenant_id: str,
  88. user_id: str,
  89. role_id: str,
  90. scope_type: str | None,
  91. scope_id: str | None,
  92. expires_time: datetime | None,
  93. ) -> RoleAssignment:
  94. entity = RoleAssignment(
  95. tenant_id=tenant_id,
  96. user_id=user_id,
  97. role_id=role_id,
  98. scope_type=scope_type,
  99. scope_id=scope_id,
  100. expires_time=expires_time,
  101. )
  102. self.db.add(entity)
  103. self.db.commit()
  104. self.db.refresh(entity)
  105. return entity
  106. def list_by_user(self, *, tenant_id: str, user_id: str) -> list[RoleAssignment]:
  107. stmt = (
  108. select(RoleAssignment)
  109. .where(RoleAssignment.tenant_id == tenant_id)
  110. .where(RoleAssignment.user_id == user_id)
  111. .order_by(RoleAssignment.created_time.desc())
  112. )
  113. return list(self.db.scalars(stmt))
  114. def get_by_id(
  115. self,
  116. *,
  117. tenant_id: str,
  118. assignment_id: str,
  119. ) -> RoleAssignment | None:
  120. stmt = (
  121. select(RoleAssignment)
  122. .where(RoleAssignment.tenant_id == tenant_id)
  123. .where(RoleAssignment.id == assignment_id)
  124. )
  125. return self.db.scalar(stmt)
  126. def update_status(
  127. self,
  128. *,
  129. tenant_id: str,
  130. assignment_id: str,
  131. status: RoleAssignmentStatus,
  132. ) -> RoleAssignment | None:
  133. entity = self.get_by_id(tenant_id=tenant_id, assignment_id=assignment_id)
  134. if entity is None:
  135. return None
  136. entity.status = status
  137. self.db.commit()
  138. self.db.refresh(entity)
  139. return entity