|
|
@@ -0,0 +1,124 @@
|
|
|
+import sqlmodel
|
|
|
+import sqlalchemy
|
|
|
+
|
|
|
+from .user import user
|
|
|
+from .user_validator import user_validator
|
|
|
+from .user_validator import user_validation_result
|
|
|
+from .user_validator import user_validation_exception
|
|
|
+
|
|
|
+class users_manager:
|
|
|
+ def __init__(self, engine: sqlalchemy.engine.base.Engine):
|
|
|
+ self.__engine = engine
|
|
|
+
|
|
|
+ @property
|
|
|
+ def session(self) -> sqlmodel.Session:
|
|
|
+ return sqlmodel.Session(self.__engine)
|
|
|
+
|
|
|
+ def register(self, target: user) -> user:
|
|
|
+ validation_result = self.__validate_user(target)
|
|
|
+
|
|
|
+ if validation_result != user_validation_result.VALID:
|
|
|
+ raise user_validation_exception(validation_result)
|
|
|
+
|
|
|
+ if self.nick_taken(target.nick):
|
|
|
+ raise user_validation_exception(
|
|
|
+ user_validation_result.NICK_ALREADY_TAKEN
|
|
|
+ )
|
|
|
+
|
|
|
+ if validator.has_id:
|
|
|
+ raise Exception("Can not register user which already exists.")
|
|
|
+
|
|
|
+ with self.session as session:
|
|
|
+ session.add(target)
|
|
|
+ session.commit()
|
|
|
+ session.refresh(target)
|
|
|
+
|
|
|
+ return target
|
|
|
+
|
|
|
+ def load(self, target: int) -> user | None:
|
|
|
+ query = sqlmodel
|
|
|
+ query = query.select(user)
|
|
|
+ query = query.where(user.id == target)
|
|
|
+
|
|
|
+ result = None
|
|
|
+
|
|
|
+ with self.session as session:
|
|
|
+ result = session.exec(query).first()
|
|
|
+
|
|
|
+ return result
|
|
|
+
|
|
|
+ def who_take_nick(self, target: str) -> int | None:
|
|
|
+ query = sqlmodel
|
|
|
+ query = query.select(user)
|
|
|
+ query = query.where(user.nick == target)
|
|
|
+
|
|
|
+ with self.session as session:
|
|
|
+ result = session.exec(query).first()
|
|
|
+
|
|
|
+ if result is None:
|
|
|
+ return None
|
|
|
+
|
|
|
+ return result.id
|
|
|
+
|
|
|
+ def nick_taken(self, target: str) -> bool:
|
|
|
+ return self.who_take_nick(target) != None
|
|
|
+
|
|
|
+ def __validate_user(self, target: user) -> user_validation_result:
|
|
|
+ validator = user_validator(target)
|
|
|
+
|
|
|
+ if not validator.has_valid_nick:
|
|
|
+ return validator.nick_validation_result
|
|
|
+
|
|
|
+ if not validator.has_valid_secret:
|
|
|
+ return validator.secret_validation_result
|
|
|
+
|
|
|
+ return user_validation_result.VALID
|
|
|
+
|
|
|
+ def save(self, target: user) -> user:
|
|
|
+ validation_result = self.__validate_user(target)
|
|
|
+
|
|
|
+ if validation_result != user_validation_result.VALID:
|
|
|
+ raise user_validation_exception(validation_result)
|
|
|
+
|
|
|
+ if self.who_take_nick(target.nick) != target.id:
|
|
|
+ raise user_validation_exception(
|
|
|
+ user_validation_result.NICK_ALREADY_TAKEN
|
|
|
+ )
|
|
|
+
|
|
|
+ if not target.has_id:
|
|
|
+ raise Exception("Register user before save it.")
|
|
|
+
|
|
|
+ with self.session as session:
|
|
|
+ session.add(target)
|
|
|
+ session.commit()
|
|
|
+ session.refresh(target)
|
|
|
+
|
|
|
+ def login(self, nick: str, secret: str) -> user | None:
|
|
|
+ nick_validation = user_validator.validate_nick(nick)
|
|
|
+
|
|
|
+ if nick_validation != user_validation_result.VALID:
|
|
|
+ raise user_validation_exception(nick_validation)
|
|
|
+
|
|
|
+ secret_validation = user_validator.validate_secret(secret)
|
|
|
+
|
|
|
+ if secret_validation != user_validation_result.VALID:
|
|
|
+ raise user_validation_exception(secret_validation)
|
|
|
+
|
|
|
+ result = None
|
|
|
+
|
|
|
+ with self.session as session:
|
|
|
+ query = sqlmodel
|
|
|
+ query = query.select(user)
|
|
|
+ query = query.where(user.nick == nick)
|
|
|
+ query = query.where(user.secret == secret)
|
|
|
+
|
|
|
+ result = session.exec(query).first()
|
|
|
+
|
|
|
+ return result
|
|
|
+
|
|
|
+ def remove(self, target: user) -> None:
|
|
|
+ with self.session as session:
|
|
|
+ session.delete(target)
|
|
|
+ session.commit()
|
|
|
+
|
|
|
+
|