repositories.py 4.2 KB

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