auth response and error codes imp

This commit is contained in:
2025-01-28 21:35:52 +03:00
parent 8550c2af71
commit a0b1b1bef9
16 changed files with 639 additions and 314 deletions

View File

@@ -51,7 +51,6 @@ class RedisCategoryKeys:
PAGE_MAPPER: str = "PAGE_MAPPER"
MENU_MAPPER: str = "MENU_MAPPER"
class RedisValidationKeysAction:
# LANGUAGE_MODELS:DYNAMIC:VALIDATIONS:
dynamic_validation_key: str = f"{RedisValidationKeys.LANGUAGE_MODELS}:{RedisValidationKeys.DYNAMIC}:{RedisValidationKeys.VALIDATIONS}"

View File

@@ -0,0 +1,243 @@
import datetime
def change_your_password_template(**kwargs):
user_name, forgot_link, current_year = (
kwargs["user_name"],
kwargs["forgot_link"],
str(datetime.datetime.now().year),
)
template = """<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Bootstrap demo</title>
<style>
body {
font-family: Arial, sans-serif;
background-color: #f4f4f4;
margin: 0;
padding: 0;
}
.email-container {
max-width: 600px;
margin: 0 auto;
background-color: #ffffff;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
.header {
text-align: center;
padding-bottom: 20px;
border-bottom: 1px solid #dddddd;
}
.header img {
max-width: 100px;
}
.content {
padding: 20px 0;
}
.footer {
text-align: center;
padding: 10px;
font-size: 12px;
color: #777777;
}
.btn-success {
color: #fff;
background-color: #198754;
border-color: #198754;
text-align: center;
text-decoration: none;
vertical-align: middle;
width: 150px;
height: 40px;
border-radius: 5px;
font-weight: 400;
padding: .375rem .75rem;
}
</style>
</head>
<body>
<div class="email-container">
<div class="header">
<img src="" alt="Company Logo">
<h2>Reset Password</h2>
</div>
<div class="content">
<p>Dear %s,</p>
<p>We have received a request to reset your password for your account with Let's Program Blog. To complete the password reset process, please click on the button below:</p>
<p>Please note that this link is only valid for a day only. If you did not request a password reset, please disregard this message.</p>
<a href="%s"><button type="button" class="btn-success">Reset Password</button></a>
</div>
<div class="footer">
<p>&copy; %s Evyos Ltd Şti. All rights reserved.</p>
</div>
</div>
</body>
</html>
""" % (
user_name,
forgot_link,
current_year,
)
return template
def password_is_changed_template(**kwargs):
user_name, current_year = kwargs["user_name"], str(datetime.datetime.now().year)
template = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Thank You for Changing Your Password</title>
<style>
body {
font-family: Arial, sans-serif;
background-color: #f4f4f4;
margin: 0;
padding: 0;
}
.email-container {
max-width: 600px;
margin: 0 auto;
background-color: #ffffff;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
.header {
text-align: center;
padding-bottom: 20px;
border-bottom: 1px solid #dddddd;
}
.header img {
max-width: 100px;
}
.content {
padding: 20px 0;
}
.footer {
text-align: center;
padding: 10px;
font-size: 12px;
color: #777777;
}
</style>
</head>
<body>
<div class="email-container">
<div class="header">
<img src="" alt="Company Logo">
<h2>Your Password has changed</h2>
</div>
<div class="content">
<p>Dear %s,</p>
<p>We wanted to let you know that your password has been successfully updated.
If you did not make this change or if you believe an unauthorized person has accessed your account,
please contact our support team immediately.</p>
<p>Thank you for helping us keep your account secure.</p>
</div>
<div class="footer">
<p>&copy; %s Evyos Ltd Şti. All rights reserved.</p>
</div>
</div>
</body>
</html>
""" % (
user_name,
current_year,
)
return template
def invalid_ip_or_address_found(**kwargs):
user_name, current_year, address = (
kwargs["user_name"],
str(datetime.datetime.now().year),
kwargs.get("address"),
)
template = """
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Thank You for Changing Your Password</title>
<style>
body {
font-family: Arial, sans-serif;
background-color: #f4f4f4;
margin: 0;
padding: 0;
}
.email-container {
max-width: 600px;
margin: 0 auto;
background-color: #ffffff;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
.header {
text-align: center;
padding-bottom: 20px;
border-bottom: 1px solid #dddddd;
}
.header img {
max-width: 100px;
}
.content {
padding: 20px 0;
}
.footer {
text-align: center;
padding: 10px;
font-size: 12px;
color: #777777;
}
</style>
</head>
<body>
<div class="email-container">
<div class="header">
<img src="" alt="Company Logo">
<h2>An Unknown login has been attempted</h2>
</div>
<div class="content">
<p>Dear %s,</p>
<p>We wanted to let you know that an unusual login attempt has been tried from address below.
If you have login from address below please ignore this message</p>
<p>Thank you for helping us keep your account secure.</p>
<h1>Address of ip attempt</h1>
<p>City : %s</p>
<p>Zip Code : %s</p>
<p>Country : %s</p>
<p>Region : %s</p>
<p>Region Name : %s</p>
<p>If you are not login from this address lets us now by clicking link below</p>
<a href="%s"><button type="button" class="btn-success">Reset Password</button></a>
</div>
<div class="footer">
<p>&copy; %s Evyos Ltd Şti. All rights reserved.</p>
</div>
</div>
</body>
</html>
""" % (
user_name,
address["city"],
address["zip"],
address["country"],
address["region"],
address["regionName"],
kwargs["notice_link"],
current_year,
)
return template

View File

@@ -2,24 +2,11 @@ from typing import Optional
from fastapi import status
from fastapi.responses import JSONResponse
from ApiLayers.LanguageModels.set_defaults.static_validation_retriever import StaticValidationRetriever
class BaseEndpointResponse:
def __init__(self, lang: str, code: str):
self.lang = lang
self.code = code
@property
def response(self) -> Optional[dict]:
from Services.Redis import RedisActions
from ApiLayers.AllConfigs.Redis.configs import RedisValidationKeysAction
language_model = RedisActions.get_json(
list_keys=[RedisValidationKeysAction.static_response_key, self.code, self.lang]
)
if language_model.status:
return language_model.first
return {"message": f"{self.code} -> Language model not found"}
class BaseEndpointResponse(StaticValidationRetriever):
pass
class EndpointSuccessResponse(BaseEndpointResponse): # 200 OK
@@ -105,10 +92,10 @@ class EndpointMethodNotAllowedResponse(BaseEndpointResponse): # 405 Method Not
class EndpointNotAcceptableResponse(BaseEndpointResponse): # 406 Not Acceptable
def as_dict(self):
def as_dict(self, data: Optional[dict] = None):
return JSONResponse(
status_code=status.HTTP_406_NOT_ACCEPTABLE,
content=dict(completed=False, **self.response, lang=self.lang),
content=dict(completed=False, data=data, **self.response, lang=self.lang),
)

View File

@@ -15,3 +15,15 @@ LoginRequestLanguageModel: Dict[str, Dict[str, str]] = {
"remember_me": "Remember Me",
},
}
SelectRequestLanguageModel: Dict[str, Dict[str, str]] = {
"tr": {
"company_uu_id": "Şirket UU ID",
"build_living_space_uu_id": "Bina Konut UU ID",
},
"en": {
"company_uu_id": "Company UU ID",
"build_living_space_uu_id": "Build Living Space UU ID",
},
}

View File

@@ -1,3 +1,9 @@
from .Auth.login import LoginRequestLanguageModel
from .Auth.login import (
LoginRequestLanguageModel,
SelectRequestLanguageModel,
)
__all__ = ["LoginRequestLanguageModel"]
__all__ = [
"LoginRequestLanguageModel",
"SelectRequestLanguageModel",
]

View File

@@ -1,3 +1,5 @@
authResponses = {
"LOGIN_SELECT": {
"tr": {
@@ -15,4 +17,60 @@ authResponses = {
"message": "Login successful. Please select an company/duty to continue.",
},
},
"TOKEN_VALID": {
"tr": {
"message": "Header'da belirtilen token geçerli.",
},
"en": {
"message": "The token specified in the header is valid.",
},
},
"USER_INFO_REFRESHED": {
"tr": {
"message": "Token aracılığıyla kullanıcı bilgileri başarılı bir şekilde güncellendi.",
},
"en": {
"message": "User information updated successfully via token.",
},
},
"CREATED_PASSWORD": {
"tr": {
"message": "Şifre başarılı bir şekilde oluşturuldu.",
},
"en": {
"message": "Password created successfully.",
},
},
"PASSWORD_CHANGED": {
"tr": {
"message": "Şifre başarılı bir şekilde değiştirildi.",
},
"en": {
"message": "Password changed successfully.",
},
},
"DISCONNECTED_USER": {
"tr": {
"message": "Kullanıcı başarılı bir şekilde çıkış yaptı.",
},
"en": {
"message": "User logged out successfully.",
},
},
"USER_NOT_FOUND": {
"tr": {
"message": "Kullanıcı bulunamadı. Lütfen tekrar deneyiniz.",
},
"en": {
"message": "User not found. Please try again.",
},
},
"FORGOT_PASSWORD": {
"tr": {
"message": "Şifre sıfırlama talebi başarılı bir şekilde oluşturuldu.",
},
"en": {
"message": "Password reset request created successfully.",
},
}
}

View File

@@ -1,4 +1,4 @@
from ApiLayers.AllConfigs.Redis.configs import RedisValidationKeys
from ApiLayers.AllConfigs.Redis.configs import RedisValidationKeysAction, RedisValidationKeys
from ApiLayers.AllConfigs.main import LanguageConfig
from Events.Engine.set_defaults.category_cluster_models import CategoryClusterController
from Services.Redis.Actions.actions import RedisActions
@@ -28,10 +28,7 @@ class SetDefaultLanguageModelsRedis:
for lang in list(LanguageConfig.SUPPORTED_LANGUAGES):
for code, dict_to_set in response.items():
# [SAVE]REDIS => LANGUAGE_MODELS:STATIC:RESPONSES:{ResponseCode}:tr = {...}
redis_key = f"{RedisValidationKeys.LANGUAGE_MODELS}:{RedisValidationKeys.STATIC}"
set_key = (
f"{redis_key}:{RedisValidationKeys.RESPONSES}:{code}:{lang}"
)
set_key = f"{RedisValidationKeysAction.static_response_key}:{code}:{lang}"
RedisActions.set_json(list_keys=[set_key], value=dict_to_set[lang])
self.std_out += f"Language Response Models are set to Redis\n"
@@ -39,8 +36,7 @@ class SetDefaultLanguageModelsRedis:
for lang in list(LanguageConfig.SUPPORTED_LANGUAGES):
for code, dict_to_set in response.items():
# [SAVE]REDIS => LANGUAGE_MODELS:STATIC:ERRORCODES:{ErrorCode}:en = {...}
redis_key = f"{RedisValidationKeys.LANGUAGE_MODELS}:{RedisValidationKeys.STATIC}"
set_key = f"{redis_key}:{code}:{lang}"
set_key = f"{RedisValidationKeysAction.static_error_code_key}:{code}:{lang}"
RedisActions.set_json(list_keys=[set_key], value=dict_to_set[lang])
self.std_out += f"Language Error Models are set to Redis\n"
@@ -80,26 +76,15 @@ class SetClusterLanguageModelsRedis:
def set_models_from_cluster(self):
"""
iterate(ClusterToMethod) to set all models by pairing function codes
"""
for cluster_control in self.cluster_controller_group.imports:
self.std_out += f"Setting models from cluster : {cluster_control.name}\n"
for endpoint in cluster_control.category_cluster.ENDPOINTS.values():
for key_event, event in endpoint.EVENTS.items():
merged_language_dict = self.merge_language_dicts(
event.LANGUAGE_MODELS
)
request_validation = getattr(
event.REQUEST_VALIDATOR, "model_fields", None
)
response_validation = getattr(
event.RESPONSE_VALIDATOR, "model_fields", None
)
objects_missing = (
bool(request_validation)
and bool(response_validation)
and bool(merged_language_dict)
)
merged_language_dict = self.merge_language_dicts(event.LANGUAGE_MODELS)
request_validation = getattr(event.REQUEST_VALIDATOR, "model_fields", None)
response_validation = getattr(event.RESPONSE_VALIDATOR, "model_fields", None)
objects_missing = bool(request_validation) and bool(merged_language_dict)
if not objects_missing:
continue
if merged_language_dict:
@@ -113,7 +98,6 @@ class SetClusterLanguageModelsRedis:
def set_all(self):
"""
Set all language models from cluster list by pairing event code and models
"""
self.set_models_from_cluster()
if self.events_lm_dict and self.events_rq_dict:
@@ -121,28 +105,21 @@ class SetClusterLanguageModelsRedis:
[SAVE]REDIS => LANGUAGE_MODELS:DYNAMIC:HEADERS:REQUEST:{FunctionCode}:tr = {...}
Get Request BaseModel pydantic model_fields of each event and set headers which are included in model_fields
"""
for lang in list(
LanguageConfig.SUPPORTED_LANGUAGES
): # Iterate(languages ["tr", "en"])
for lang in list(LanguageConfig.SUPPORTED_LANGUAGES): # Iterate(languages ["tr", "en"])
for key_field in self.events_rq_dict.keys(): # Iterate(function_code)
request_model = self.events_rq_dict[key_field]
if not request_model:
self.std_out += (
f"Request validation model not found for {key_field}\n"
)
self.std_out += f"Request validation model not found for {key_field}\n"
continue
if (
key_field not in self.events_rq_dict
or key_field not in self.events_lm_dict
):
self.std_out += (
f"Request language model not found for {key_field}\n"
)
self.std_out += f"Request language model are missing {key_field}\n"
continue
value_to_set = {}
redis_key = f"{RedisValidationKeys.LANGUAGE_MODELS}:{RedisValidationKeys.DYNAMIC}"
set_key = f"{redis_key}:{key_field}:{lang}"
set_key = f"{RedisValidationKeysAction.dynamic_header_request_key}:{key_field}:{lang}"
for key in request_model.keys():
value_to_set[key] = self.events_lm_dict[key_field][lang][key]
RedisActions.set_json(list_keys=[set_key], value=value_to_set)
@@ -153,28 +130,21 @@ class SetClusterLanguageModelsRedis:
[SAVE]REDIS => LANGUAGE_MODELS:DYNAMIC:HEADERS:RESPONSE:{FunctionCode}:en = {...}
Get Response BaseModel pydantic model_fields of each event and set headers which are included in model_fields
"""
for lang in list(
LanguageConfig.SUPPORTED_LANGUAGES
): # Iterate(languages ["tr", "en"])
for lang in list(LanguageConfig.SUPPORTED_LANGUAGES): # Iterate(languages ["tr", "en"])
for key_field in self.events_rs_dict.keys(): # Iterate(function_code)
response_model = self.events_rs_dict[key_field]
if not response_model:
self.std_out += (
f"Response validation model not found for {key_field}\n"
)
self.std_out += f"Response validation model not found for {key_field}\n"
continue
if (
key_field not in self.events_rs_dict
or key_field not in self.events_lm_dict
):
self.std_out += (
f"Response language model not found for {key_field}\n"
)
self.std_out += f"Response language model are missing {key_field}\n"
continue
value_to_set = {}
redis_key = f"{RedisValidationKeys.LANGUAGE_MODELS}:{RedisValidationKeys.DYNAMIC}"
set_key = f"{redis_key}:{key_field}:{lang}"
set_key = f"{RedisValidationKeysAction.dynamic_header_response_key}:{key_field}:{lang}"
for key in response_model.keys():
value_to_set[key] = self.events_lm_dict[key_field][lang][key]
RedisActions.set_json(list_keys=[set_key], value=value_to_set)

View File

@@ -0,0 +1,23 @@
from typing import Optional
from Services.Redis import RedisActions
from ApiLayers.AllConfigs.Redis.configs import RedisValidationKeysAction
class StaticValidationRetriever:
lang: str = "tr"
code: str = ""
def __init__(self, lang: str, code: str):
self.lang = lang
self.code = code
@property
def response(self) -> Optional[dict]:
language_model = RedisActions.get_json(
list_keys=[RedisValidationKeysAction.static_response_key, self.code, self.lang]
)
if language_model.status:
return language_model.first
return {"message": f"{self.code} -> Language model not found"}

0
ApiLayers/__init__.py Normal file
View File