user_loader.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  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.in_database:
  30. return False
  31. if not target.ready:
  32. return False
  33. if self.nick_in_use(target.nick):
  34. return False
  35. if self.apikey_in_use(target.apikey):
  36. return False
  37. self.add(target)
  38. self.commit()
  39. self.refresh(target)
  40. return True
  41. def unregister(self, target: user) -> bool:
  42. """
  43. This function remove user from database.
  44. target: user - User to remove from database
  45. return: bool - True when removed, Falsd when something failed
  46. """
  47. if not self.is_registered(target):
  48. return False
  49. self.delete(target)
  50. self.commit()
  51. return True
  52. def save(self, target: user) -> bool:
  53. """
  54. This function save already registered user to database, after changes.
  55. target: user - User to save
  56. return: bool - True when saved successfull, False when failed
  57. """
  58. if not self.is_registered(user):
  59. return False
  60. self.add(target)
  61. self.commit()
  62. self.refresh(target)
  63. return True
  64. def nick_in_use(self, nick: str) -> bool:
  65. """
  66. This function check that nick is already in use.
  67. nick: str - Nick to check
  68. return: bool - True when nick in use, False if not
  69. """
  70. return self.get_by_nick(nick) is not None
  71. def get_by_apikey(self, apikey: str) -> user | None:
  72. """
  73. This get user from database by apikey, or return None when not exists.
  74. apikey: str - Apikey of the user to load
  75. return: user | None - User with given apikey, or none when not exists
  76. """
  77. query = sqlmodel.select(user).where(user.apikey == apikey).limit(1)
  78. result = self.exec(query)
  79. return result.first()
  80. def apikey_in_use(self, apikey: str) -> bool:
  81. """
  82. This function check that apikey is already in use.
  83. apikey: str - Apikey to check
  84. return: bool - True when apikey is in use or False when not
  85. """
  86. return self.get_by_apikey(apikey) is not None
  87. def get_by_nick(self, nick: str) -> user | None:
  88. """
  89. This get user from database by nick.
  90. nick: str - Nick of the user to load
  91. return: user | None - Loaded user or None when not exists.
  92. """
  93. query = sqlmodel.select(user).where(user.nick == nick).limit(1)
  94. result = self.exec(query)
  95. return result.first()
  96. def get_by_id(self, id: int) -> user | None:
  97. """
  98. This function select user from database by ID.
  99. id: int - ID of the user to select
  100. return: user | None - Selected user or None when not exists
  101. """
  102. query = sqlmodel.select(user).where(user.id == id).limit(1)
  103. result = self.exec(query)
  104. return result.first()
  105. def is_registered(self, target: user) -> bool:
  106. """
  107. This function check that user is registered.
  108. target: user - User to check
  109. return: bool - True when user is registered, False when not
  110. """
  111. if target.id is None:
  112. return False
  113. return self.get_by_id(target.id) is not None