user.py 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. import uuid
  2. import logging
  3. import hashlib
  4. from typing import Optional
  5. def hash_pwd(password):
  6. return hashlib.sha256(password.encode()).hexdigest()
  7. logger = logging.getLogger(__name__)
  8. from datetime import datetime,timedelta
  9. from agent.models.db.user import User,Session,Role,Permission, user_roles, role_permissions
  10. class UserBusiness:
  11. def __init__(self, db):
  12. self.db = db
  13. def get_user(self, user_id):
  14. return self.db.query(User).filter(User.id == user_id).first()
  15. def get_user_by_username(self, username):
  16. return self.db.query(User).filter(User.username == username).first()
  17. def get_all_users(self):
  18. return self.db.query(User).all()
  19. def get_users_paginated(self, username: Optional[str], page_no: int, page_size: int):
  20. query = self.db.query(User)
  21. if username:
  22. query = query.filter(User.username.ilike(f"%{username}%"))
  23. total_count = query.count()
  24. users = query.offset((page_no - 1) * page_size).limit(page_size).all()
  25. return users, total_count
  26. def create_user(self, username, password, fullname, email=""):
  27. password = hash_pwd(password)
  28. user = User(username=username, hashed_password=password, full_name=fullname, email=email)
  29. self.db.add(user)
  30. self.db.commit()
  31. self.db.refresh(user)
  32. return user
  33. def update_user(self, user_id, username=None, password=None):
  34. user = self.get_user(user_id)
  35. if user:
  36. if username:
  37. user.username = username
  38. if password:
  39. password = hash_pwd(password)
  40. user.password = password
  41. self.db.commit()
  42. self.db.refresh(user)
  43. return user
  44. def delete_user(self, user_id):
  45. user = self.get_user(user_id)
  46. if user:
  47. self.db.delete(user)
  48. self.db.commit()
  49. return user
  50. def verify_password(self, request_password, user_hashed_password):
  51. hashed_password = hash_pwd(request_password)
  52. logger.info(f"verify password: {hashed_password} == {user_hashed_password}")
  53. return hashed_password == user_hashed_password
  54. class SessionBusiness:
  55. def __init__(self, db):
  56. self.db = db
  57. def create_session(self, user:User):
  58. session_id = str(uuid.uuid4())
  59. session = Session(session_id=session_id, user_id=user.id, username=user.username, full_name=user.full_name)
  60. self.db.add(session)
  61. self.db.commit()
  62. self.db.refresh(session)
  63. return session
  64. def get_session(self, session_id):
  65. return self.db.query(Session).filter(Session.session_id == session_id).first()
  66. def delete_session(self, session_id):
  67. session = self.get_session(session_id)
  68. if session:
  69. self.db.delete(session)
  70. self.db.commit()
  71. return True
  72. def update_session(self, session_id):
  73. session = self.get_session(session_id)
  74. if session:
  75. session.updated = datetime.now()
  76. self.db.commit()
  77. self.db.refresh(session)
  78. def get_session_by_user_id(self, user_id):
  79. return self.db.query(Session).filter(Session.user_id == user_id).first()
  80. def validate_session(self, username, session_id):
  81. session = self.get_session(session_id)
  82. if session:
  83. if session.username != username:
  84. return None
  85. expired:timedelta = datetime.now() - session.updated
  86. if expired.seconds > 1800 : # 30 minutes
  87. logger.info(f"session expired: {session_id}")
  88. #self.delete_session(session_id)
  89. return None
  90. else:
  91. self.update_session(session_id)
  92. return session
  93. class RoleBusiness:
  94. def __init__(self, db):
  95. self.db = db
  96. def create_role(self, name, description=""):
  97. role = Role(name=name, description=description)
  98. self.db.add(role)
  99. self.db.commit()
  100. self.db.refresh(role)
  101. return role
  102. def get_role_by_name(self, name):
  103. return self.db.query(Role).filter(Role.name == name).first()
  104. def get_role(self, role_id):
  105. return self.db.query(Role).filter(Role.id == role_id).first()
  106. def get_all_roles(self):
  107. return self.db.query(Role).all()
  108. def delete_role(self, role_id):
  109. role = self.get_role(role_id)
  110. if role:
  111. self.db.delete(role)
  112. self.db.commit()
  113. return role
  114. def update_role(self, role_id, name=None, description=None):
  115. role = self.get_role(role_id)
  116. if role:
  117. if name:
  118. role.name = name
  119. if description:
  120. role.description = description
  121. self.db.commit()
  122. self.db.refresh(role)
  123. return role
  124. def assign_permission_to_role(self, role_id, permission_id):
  125. role = self.get_role(role_id)
  126. permission = self.db.query(Permission).filter(Permission.id == permission_id).first()
  127. if role and permission:
  128. role.permissions.append(permission)
  129. self.db.commit()
  130. return True
  131. return False
  132. def revoke_permission_from_role(self, role_id, permission_id):
  133. role = self.get_role(role_id)
  134. permission = self.db.query(Permission).filter(Permission.id == permission_id).first()
  135. if role and permission and permission in role.permissions:
  136. role.permissions.remove(permission)
  137. self.db.commit()
  138. return True
  139. return False
  140. def revoke_all_permissions_from_role(self, role_id):
  141. role = self.get_role(role_id)
  142. if role:
  143. role.permissions.clear()
  144. self.db.commit()
  145. return True
  146. return False
  147. def get_role_permissions(self, role_id):
  148. role = self.get_role(role_id)
  149. if role:
  150. return role.permissions
  151. return []
  152. class PermissionBusiness:
  153. def __init__(self, db):
  154. self.db = db
  155. def create_permission(self, name, description="", menu_name=None, menu_route=None, menu_icon=None, parent_id=None):
  156. permission = Permission(
  157. name=name,
  158. description=description,
  159. menu_name=menu_name,
  160. menu_route=menu_route,
  161. menu_icon=menu_icon,
  162. parent_id=parent_id
  163. )
  164. self.db.add(permission)
  165. self.db.commit()
  166. self.db.refresh(permission)
  167. return permission
  168. def get_permission_by_name(self, name):
  169. return self.db.query(Permission).filter(Permission.name == name).first()
  170. def get_permission(self, permission_id):
  171. return self.db.query(Permission).filter(Permission.id == permission_id).first()
  172. def get_all_permissions(self):
  173. return self.db.query(Permission).all()
  174. def delete_permission(self, permission_id):
  175. permission = self.get_permission(permission_id)
  176. if permission:
  177. self.db.delete(permission)
  178. self.db.commit()
  179. return permission
  180. class UserRoleBusiness:
  181. def __init__(self, db):
  182. self.db = db
  183. self.user_biz = UserBusiness(db)
  184. self.role_biz = RoleBusiness(db)
  185. def assign_role_to_user(self, user_id, role_id):
  186. user = self.user_biz.get_user(user_id)
  187. role = self.role_biz.get_role(role_id)
  188. if user and role:
  189. user.roles.append(role)
  190. self.db.commit()
  191. return True
  192. return False
  193. def revoke_role_from_user(self, user_id, role_id):
  194. user = self.user_biz.get_user(user_id)
  195. role = self.role_biz.get_role(role_id)
  196. if user and role and role in user.roles:
  197. user.roles.remove(role)
  198. self.db.commit()
  199. return True
  200. return False
  201. def get_user_roles(self, user_id):
  202. user = self.user_biz.get_user(user_id)
  203. if user:
  204. return user.roles
  205. return []
  206. def get_user_permissions(self, user_id):
  207. user = self.user_biz.get_user(user_id)
  208. if not user:
  209. return []
  210. permissions = set()
  211. for role in user.roles:
  212. for perm in role.permissions:
  213. permissions.add(perm)
  214. return list(permissions)
  215. def get_user_menu_permissions(self, user_id):
  216. user_permissions = self.get_user_permissions(user_id)
  217. menu_permissions = [p for p in user_permissions if p.menu_name is not None]
  218. # You might want to structure this hierarchically if you have parent_id relationships
  219. return menu_permissions
  220. if __name__ == "__main__":
  221. print("hello world")