users_manager.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import sqlmodel
  2. import sqlalchemy
  3. from .user import user
  4. from .user_validator import user_validator
  5. from .user_validator import user_validation_result
  6. from .user_validator import user_validation_exception
  7. class users_manager:
  8. def __init__(self, engine: sqlalchemy.engine.base.Engine):
  9. self.__engine = engine
  10. @property
  11. def session(self) -> sqlmodel.Session:
  12. return sqlmodel.Session(self.__engine)
  13. def register(self, target: user) -> user:
  14. validation_result = self.__validate_user(target)
  15. if validation_result != user_validation_result.VALID:
  16. raise user_validation_exception(validation_result)
  17. if self.nick_taken(target.nick):
  18. raise user_validation_exception(
  19. user_validation_result.NICK_ALREADY_TAKEN
  20. )
  21. if validator.has_id:
  22. raise Exception("Can not register user which already exists.")
  23. with self.session as session:
  24. session.add(target)
  25. session.commit()
  26. session.refresh(target)
  27. return target
  28. def load(self, target: int) -> user | None:
  29. query = sqlmodel
  30. query = query.select(user)
  31. query = query.where(user.id == target)
  32. result = None
  33. with self.session as session:
  34. result = session.exec(query).first()
  35. return result
  36. def who_take_nick(self, target: str) -> int | None:
  37. query = sqlmodel
  38. query = query.select(user)
  39. query = query.where(user.nick == target)
  40. with self.session as session:
  41. result = session.exec(query).first()
  42. if result is None:
  43. return None
  44. return result.id
  45. def nick_taken(self, target: str) -> bool:
  46. return self.who_take_nick(target) != None
  47. def __validate_user(self, target: user) -> user_validation_result:
  48. validator = user_validator(target)
  49. if not validator.has_valid_nick:
  50. return validator.nick_validation_result
  51. if not validator.has_valid_secret:
  52. return validator.secret_validation_result
  53. return user_validation_result.VALID
  54. def save(self, target: user) -> user:
  55. validation_result = self.__validate_user(target)
  56. if validation_result != user_validation_result.VALID:
  57. raise user_validation_exception(validation_result)
  58. if self.who_take_nick(target.nick) != target.id:
  59. raise user_validation_exception(
  60. user_validation_result.NICK_ALREADY_TAKEN
  61. )
  62. if not target.has_id:
  63. raise Exception("Register user before save it.")
  64. with self.session as session:
  65. session.add(target)
  66. session.commit()
  67. session.refresh(target)
  68. def login(self, nick: str, secret: str) -> user | None:
  69. nick_validation = user_validator.validate_nick(nick)
  70. if nick_validation != user_validation_result.VALID:
  71. raise user_validation_exception(nick_validation)
  72. secret_validation = user_validator.validate_secret(secret)
  73. if secret_validation != user_validation_result.VALID:
  74. raise user_validation_exception(secret_validation)
  75. result = None
  76. with self.session as session:
  77. query = sqlmodel
  78. query = query.select(user)
  79. query = query.where(user.nick == nick)
  80. query = query.where(user.secret == secret)
  81. result = session.exec(query).first()
  82. return result
  83. def remove(self, target: user) -> None:
  84. with self.session as session:
  85. session.delete(target)
  86. session.commit()