user_loader.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import sqlmodel
  2. from .user import user
  3. from .user import user_builder
  4. from .password import password
  5. class user_loader(sqlmodel.Session):
  6. def login(self, nick: str, secret: str) -> user | None:
  7. """
  8. This get new user by nick and password. If user does not exists,
  9. then return None. It also return None when user password is not
  10. correct.
  11. nick: str - Nick of the user
  12. secret: str - Password of the user
  13. return: user | None - Logged user, or None when not exists
  14. """
  15. result = self.get_by_nick(nick)
  16. if result is None:
  17. return None
  18. if not password(secret).validate(result.password):
  19. return None
  20. return result
  21. def register(self, target: user) -> bool:
  22. """
  23. This function register new user. It also check that user with given
  24. apikey or nick not exists. If user had been created, then return True.
  25. When something went wront, return False.
  26. target: user - User to register in database
  27. return: bool - True when registered new user, False when failed
  28. """
  29. if target.id is not None:
  30. return False
  31. if target.apikey is None or target.nick is None:
  32. return False
  33. if target.password is None:
  34. return False
  35. if self.nick_in_use(target.nick):
  36. return False
  37. if self.apikey_in_use(target.apikey):
  38. return False
  39. self.add(target)
  40. self.commit()
  41. self.refresh(target)
  42. return True
  43. def unregister(self, target: user) -> bool:
  44. """
  45. This function remove user from database.
  46. target: user - User to remove from database
  47. return: bool - True when removed, Falsd when something failed
  48. """
  49. if not self.is_registered(target):
  50. return False
  51. self.delete(target)
  52. self.commit()
  53. return True
  54. def save(self, target: user) -> bool:
  55. """
  56. This function save already registered user to database, after changes.
  57. target: user - User to save
  58. return: bool - True when saved successfull, False when failed
  59. """
  60. if not self.is_registered(user):
  61. return False
  62. self.add(target)
  63. self.commit()
  64. self.refresh(target)
  65. return True
  66. def nick_in_use(self, nick: str) -> bool:
  67. """
  68. This function check that nick is already in use.
  69. nick: str - Nick to check
  70. return: bool - True when nick in use, False if not
  71. """
  72. return self.get_by_nick(nick) is not None
  73. def get_by_apikey(self, apikey: str) -> user | None:
  74. """
  75. This get user from database by apikey, or return None when not exists.
  76. apikey: str - Apikey of the user to load
  77. return: user | None - User with given apikey, or none when not exists
  78. """
  79. query = sqlmodel.select(user).where(user.apikey == apikey).limit(1)
  80. result = self.exec(query)
  81. return result.first()
  82. def apikey_in_use(self, apikey: str) -> bool:
  83. """
  84. This function check that apikey is already in use.
  85. apikey: str - Apikey to check
  86. return: bool - True when apikey is in use or False when not
  87. """
  88. return self.get_by_apikey(apikey) is not None
  89. def get_by_nick(self, nick: str) -> user | None:
  90. """
  91. This get user from database by nick.
  92. nick: str - Nick of the user to load
  93. return: user | None - Loaded user or None when not exists.
  94. """
  95. query = sqlmodel.select(user).where(user.nick == nick).limit(1)
  96. result = self.exec(query)
  97. return result.first()
  98. def get_by_id(self, id: int) -> user | None:
  99. """
  100. This function select user from database by ID.
  101. id: int - ID of the user to select
  102. return: user | None - Selected user or None when not exists
  103. """
  104. query = sqlmodel.select(user).where(user.id == id).limit(1)
  105. result = self.exec(query)
  106. return result.first()
  107. def is_registered(self, target: user) -> bool:
  108. """
  109. This function check that user is registered.
  110. target: user - User to check
  111. return: bool - True when user is registered, False when not
  112. """
  113. if target.id is None:
  114. return False
  115. return self.get_by_id(target.id) is not None