fix: ユーザーマスタ更新時のタイムゾーンをJSTに変更(共通関数を使用)

This commit is contained in:
shimoda.m@nds-tyo.co.jp 2024-04-15 15:29:10 +09:00
parent 166dde4848
commit db0e28db3e
4 changed files with 44 additions and 18 deletions

View File

@ -70,7 +70,9 @@ def login(
jwt_token = login_service.login(request.username, request.password) jwt_token = login_service.login(request.username, request.password)
except NotAuthorizeException as e: except NotAuthorizeException as e:
logger.info(f'ログイン失敗:{e}') logger.info(f'ログイン失敗:{e}')
# ログイン失敗回数をカウント
login_service.increase_login_failed_count(request.username) login_service.increase_login_failed_count(request.username)
# ログイン失敗回数を超過した場合はメッセージを変える
if login_service.is_login_failed_limit_exceeded(request.username): if login_service.is_login_failed_limit_exceeded(request.username):
login_service.on_login_fail_limit_exceeded(request.username) login_service.on_login_fail_limit_exceeded(request.username)
raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_FAILED_LIMIT_EXCEEDED) raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail=constants.LOGOUT_REASON_LOGIN_FAILED_LIMIT_EXCEEDED)

View File

@ -189,7 +189,9 @@ class DatabaseClient:
self.__session = None self.__session = None
def to_jst(self): def to_jst(self):
self.execute('SET time_zone = "+9:00"') # self.session.begin()
self.execute('SET SESSION time_zone = "Asia/Tokyo"')
# self.session.commit()
def __execute_with_transaction(self, query: str, parameters: dict): def __execute_with_transaction(self, query: str, parameters: dict):
# トランザクションを開始してクエリを実行する # トランザクションを開始してクエリを実行する

View File

@ -6,6 +6,19 @@ logger = get_logger('ユーザー取得')
class UserMasterRepository(BaseRepository): class UserMasterRepository(BaseRepository):
def to_jst(self):
self._database.to_jst()
def begin(self):
self._database.begin()
def commit(self):
self._database.commit()
def rollback(self):
self._database.rollback()
FETCH_SQL = """\ FETCH_SQL = """\
SELECT SELECT
* *
@ -30,29 +43,29 @@ class UserMasterRepository(BaseRepository):
def increase_login_failed_count(self, parameter: dict) -> UserMasterModel: def increase_login_failed_count(self, parameter: dict) -> UserMasterModel:
try: try:
query = """\ query = """\
UPDATE UPDATE
src05.user_mst src05.user_mst
SET SET
mntuser_login_failed_cnt = mntuser_login_failed_cnt =
CASE CASE
WHEN WHEN
DATE(mntuser_last_login_failed_datetime) = DATE(CONVERT_TZ(CURRENT_TIMESTAMP() ,'Etc/GMT-0','Asia/Tokyo')) DATE(mntuser_last_login_failed_datetime) = DATE(CURRENT_TIMESTAMP())
THEN THEN
mntuser_login_failed_cnt + 1 mntuser_login_failed_cnt + 1
ELSE ELSE
1 1
END, END,
mntuser_last_login_failed_datetime = CONVERT_TZ(CURRENT_TIMESTAMP() ,'Etc/GMT-0','Asia/Tokyo') mntuser_last_login_failed_datetime = CURRENT_TIMESTAMP()
WHERE WHERE
user_id = :user_id user_id = :user_id
AND AND
mntuser_flg = 1;\ mntuser_flg = 1;\
""" """
self._database.execute(query, parameter) self._database.execute(query, parameter)
except Exception as e: except Exception as e:
logger.exception(f"DB Error : Exception={e}") logger.exception(f"DB Error : Exception={e}")
raise e raise e
def disable_mnt_user(self, parameter: dict) -> UserMasterModel: def disable_mnt_user(self, parameter: dict) -> UserMasterModel:
try: try:
query = """\ query = """\
@ -68,4 +81,4 @@ class UserMasterRepository(BaseRepository):
self._database.execute(query, parameter) self._database.execute(query, parameter)
except Exception as e: except Exception as e:
logger.exception(f"DB Error : Exception={e}") logger.exception(f"DB Error : Exception={e}")
raise e raise e

View File

@ -11,7 +11,7 @@ from src.repositories.base_repository import BaseRepository
from src.repositories.user_master_repository import UserMasterRepository from src.repositories.user_master_repository import UserMasterRepository
from src.services.base_service import BaseService from src.services.base_service import BaseService
from src.system_var import environment from src.system_var import environment
from src.system_var import constants
class LoginService(BaseService): class LoginService(BaseService):
REPOSITORIES = { REPOSITORIES = {
@ -50,7 +50,16 @@ class LoginService(BaseService):
return user_record return user_record
def increase_login_failed_count(self, user_id: str): def increase_login_failed_count(self, user_id: str):
self.user_repository.increase_login_failed_count({'user_id': user_id})
try:
# セッション内のタイムゾーン変更のため、明示的にトランザクションを開始する
self.user_repository.begin()
self.user_repository.to_jst()
self.user_repository.increase_login_failed_count({'user_id': user_id})
self.user_repository.commit()
except Exception as e:
self.user_repository.rollback()
raise e
def on_login_fail_limit_exceeded(self, user_id: str): def on_login_fail_limit_exceeded(self, user_id: str):
self.user_repository.disable_mnt_user({'user_id': user_id}) self.user_repository.disable_mnt_user({'user_id': user_id})