Fixed auth user and user relation #70

This commit is contained in:
2022-10-20 12:57:02 +02:00
parent d778bd2719
commit f35dd0b15d
7 changed files with 190 additions and 75 deletions

View File

@@ -18,26 +18,41 @@ class ApiMigration(MigrationABC):
self._cursor.execute(
str(f"""
CREATE TABLE IF NOT EXISTS `AuthUsers` (
`Id` BIGINT NOT NULL AUTO_INCREMENT,
`FirstName` VARCHAR(255),
`LastName` VARCHAR(255),
`EMail` VARCHAR(255),
`Password` VARCHAR(255),
`PasswordSalt` VARCHAR(255),
`RefreshToken` VARCHAR(255),
`ConfirmationId` VARCHAR(255) DEFAULT NULL,
`ForgotPasswordId` VARCHAR(255) DEFAULT NULL,
`OAuthId` VARCHAR(255) DEFAULT NULL,
`RefreshTokenExpiryTime` DATETIME(6) NOT NULL,
`AuthRole` INT NOT NULL DEFAULT '0',
`UserId` BIGINT DEFAULT NULL,
`CreatedOn` DATETIME(6) NOT NULL,
`LastModifiedOn` DATETIME(6) NOT NULL,
PRIMARY KEY(`Id`),
FOREIGN KEY (`UserId`) REFERENCES `Users`(`UserId`)
)
`Id` BIGINT NOT NULL AUTO_INCREMENT,
`FirstName` VARCHAR(255),
`LastName` VARCHAR(255),
`EMail` VARCHAR(255),
`Password` VARCHAR(255),
`PasswordSalt` VARCHAR(255),
`RefreshToken` VARCHAR(255),
`ConfirmationId` VARCHAR(255) DEFAULT NULL,
`ForgotPasswordId` VARCHAR(255) DEFAULT NULL,
`OAuthId` VARCHAR(255) DEFAULT NULL,
`RefreshTokenExpiryTime` DATETIME(6) NOT NULL,
`AuthRole` INT NOT NULL DEFAULT '0',
`CreatedOn` DATETIME(6) NOT NULL,
`LastModifiedOn` DATETIME(6) NOT NULL,
PRIMARY KEY(`Id`)
);
""")
)
self._cursor.execute(
str(f"""
CREATE TABLE IF NOT EXISTS `AuthUserUsersRelations`(
`Id` BIGINT NOT NULL AUTO_INCREMENT,
`AuthUserId` BIGINT DEFAULT NULL,
`UserId` BIGINT DEFAULT NULL,
`CreatedOn` DATETIME(6) NOT NULL,
`LastModifiedOn` DATETIME(6) NOT NULL,
PRIMARY KEY(`Id`),
FOREIGN KEY (`AuthUserId`) REFERENCES `AuthUsers`(`Id`),
FOREIGN KEY (`UserId`) REFERENCES `Users`(`UserId`)
);
""")
)
def downgrade(self):
self._cursor.execute('DROP TABLE `AuthUsers`;')
self._cursor.execute('DROP TABLE `AuthUserUsersRelations`;')

View File

@@ -2,9 +2,11 @@ import uuid
from datetime import datetime
from typing import Optional
from cpl_core.database import TableABC
from cpl_query.extension import List
from bot_data.model.auth_role_enum import AuthRoleEnum
from bot_data.model.server import Server
from bot_data.model.user import User
class AuthUser(TableABC):
@@ -22,12 +24,12 @@ class AuthUser(TableABC):
oauth_id: Optional[str],
refresh_token_expire_time: datetime,
auth_role: AuthRoleEnum,
user_id: Optional[int],
created_at: datetime = None,
modified_at: datetime = None,
id=0
auth_user_id=0,
users: List[User] = None
):
self._auth_user_id = id
self._auth_user_id = auth_user_id
self._first_name = first_name
self._last_name = last_name
self._email = email
@@ -39,8 +41,10 @@ class AuthUser(TableABC):
self._forgot_password_id = forgot_password_id
self._refresh_token_expire_time = refresh_token_expire_time
if users is None:
self._users = List(User)
self._auth_role_id = auth_role
self._user_id = user_id
TableABC.__init__(self)
self._created_at = created_at if created_at is not None else self._created_at
@@ -139,12 +143,12 @@ class AuthUser(TableABC):
self._auth_role_id = value
@property
def user_id(self) -> Optional[int]:
return self._user_id
def users(self) -> List[User]:
return self._users
@user_id.setter
def user_id(self, value: Optional[int]):
self._user_id = value
@users.setter
def users(self, value: List[User]):
self._users = value
@staticmethod
def get_select_all_string() -> str:
@@ -180,6 +184,13 @@ class AuthUser(TableABC):
WHERE `ForgotPasswordId` = '{id}';
""")
def get_select_user_id_from_relations(self) -> str:
return str(f"""
SELECT `UserId`
FROM `AuthUserUsersRelations`
WHERE `AuthUserId` = {self._auth_user_id};
""")
@property
def insert_string(self) -> str:
return str(f"""
@@ -196,7 +207,6 @@ class AuthUser(TableABC):
`OAuthId`,
`RefreshTokenExpiryTime`,
`AuthRole`,
`UserId`,
`CreatedOn`,
`LastModifiedOn`
) VALUES (
@@ -212,7 +222,6 @@ class AuthUser(TableABC):
'{"NULL" if self._oauth_id is None else self._oauth_id}',
'{self._refresh_token_expire_time}',
{self._auth_role_id.value},
{"NULL" if self._user_id is None else self._user_id},
'{self._created_at}',
'{self._modified_at}'
)
@@ -233,7 +242,6 @@ class AuthUser(TableABC):
`OAuthId` = '{"NULL" if self._oauth_id is None else self._oauth_id}',
`RefreshTokenExpiryTime` = '{self._refresh_token_expire_time}',
`AuthRole` = {self._auth_role_id.value},
`UserId` = {"NULL" if self._user_id is None else self._user_id},
`LastModifiedOn` = '{self._modified_at}'
WHERE `AuthUsers`.`Id` = {self._auth_user_id};
""")

View File

@@ -0,0 +1,87 @@
from datetime import datetime
from typing import Optional
from cpl_core.database import TableABC
from bot_data.model.auth_user import AuthUser
from bot_data.model.user import User
from bot_data.model.server import Server
class AuthUserUsersRelation(TableABC):
def __init__(self, auth_user: AuthUser, user: User, created_at: datetime = None, modified_at: datetime = None):
self._auth_user = auth_user
self._user = user
TableABC.__init__(self)
self._created_at = created_at if created_at is not None else self._created_at
self._modified_at = modified_at if modified_at is not None else self._modified_at
@property
def auth_user(self) -> AuthUser:
return self._auth_user
@auth_user.setter
def auth_user(self, value: AuthUser):
self._auth_user = value
@property
def user(self) -> User:
return self._user
@user.setter
def user(self, value: User):
self._user = value
@staticmethod
def get_select_all_string() -> str:
return str(f"""
SELECT * FROM `AuthUserUsersRelations`;
""")
@staticmethod
def get_select_by_auth_user_id_string(id: int) -> str:
return str(f"""
SELECT * FROM `AuthUserUsersRelations`
WHERE `AuthUserId` = {id};
""")
@staticmethod
def get_select_by_user_id_string(id: int) -> str:
return str(f"""
SELECT * FROM `AuthUserUsersRelations`
WHERE `UserId` = {id};
""")
@property
def insert_string(self) -> str:
return str(f"""
INSERT INTO `AuthUserUsersRelations` (
`AuthUserId`, `UserId`, `CreatedAt`, `LastModifiedAt`
) VALUES (
{self._auth_user.id},
{self._user.user_id},
'{self._created_at}',
'{self._modified_at}'
);
""")
@property
def udpate_string(self) -> str:
return str(f"""
UPDATE `AuthUserUsersRelations`
SET `AuthUserId` = '{self._auth_user.id}',,
`UserId` = '{self._user.user_id}'
`LastModifiedAt` = '{self._modified_at}'
WHERE `AuthUserId` = {self._auth_user.id}
AND `UserId` = {self._user.user_id};
""")
@property
def delete_string(self) -> str:
return str(f"""
DELETE FROM `AuthUserUsersRelations`
WHERE `AuthUserId` = {self._auth_user.id}
AND `UserId` = {self._user.user_id};
""")

View File

@@ -6,16 +6,19 @@ from cpl_query.extension import List
from bot_api.filter.auth_user_select_criteria import AuthUserSelectCriteria
from bot_core.logging.database_logger import DatabaseLogger
from bot_data.abc.auth_user_repository_abc import AuthUserRepositoryABC
from bot_data.abc.user_repository_abc import UserRepositoryABC
from bot_data.filtered_result import FilteredResult
from bot_data.model.auth_role_enum import AuthRoleEnum
from bot_data.model.auth_user import AuthUser
from bot_data.model.user import User
class AuthUserRepositoryService(AuthUserRepositoryABC):
def __init__(self, logger: DatabaseLogger, db_context: DatabaseContextABC):
def __init__(self, logger: DatabaseLogger, db_context: DatabaseContextABC, users: UserRepositoryABC):
self._logger = logger
self._context = db_context
self._users = users
AuthUserRepositoryABC.__init__(self)
@@ -26,23 +29,34 @@ class AuthUserRepositoryService(AuthUserRepositoryABC):
return value
def _user_from_result(self, result: tuple) -> AuthUser:
return AuthUser(
self._get_value_from_result(result[1]),
self._get_value_from_result(result[2]),
self._get_value_from_result(result[3]),
self._get_value_from_result(result[4]),
self._get_value_from_result(result[5]),
self._get_value_from_result(result[6]),
self._get_value_from_result(result[7]),
self._get_value_from_result(result[8]),
self._get_value_from_result(result[9]),
self._get_value_from_result(result[10]),
AuthRoleEnum(self._get_value_from_result(result[11])),
self._get_value_from_result(result[12]),
id=self._get_value_from_result(result[0])
def _user_from_result(self, au_result: tuple) -> AuthUser:
auth_user = AuthUser(
self._get_value_from_result(au_result[1]),
self._get_value_from_result(au_result[2]),
self._get_value_from_result(au_result[3]),
self._get_value_from_result(au_result[4]),
self._get_value_from_result(au_result[5]),
self._get_value_from_result(au_result[6]),
self._get_value_from_result(au_result[7]),
self._get_value_from_result(au_result[8]),
self._get_value_from_result(au_result[9]),
self._get_value_from_result(au_result[10]),
AuthRoleEnum(self._get_value_from_result(au_result[11])),
auth_user_id=self._get_value_from_result(au_result[0])
)
self._logger.trace(__name__, f'Send SQL command: {auth_user.get_select_user_id_from_relations()}')
results = self._context.select(auth_user.get_select_user_id_from_relations())
for result in results:
user_id = self._get_value_from_result(result[0])
if user_id is None:
continue
user = self._users.get_user_by_id(user_id)
auth_user.users.append(user)
return auth_user
def get_all_auth_users(self) -> List[AuthUser]:
users = List(AuthUser)
self._logger.trace(__name__, f'Send SQL command: {AuthUser.get_select_all_string()}')