auth response and error codes imp
This commit is contained in:
@@ -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}"
|
||||
|
||||
243
ApiLayers/AllConfigs/Templates/password_templates.py
Normal file
243
ApiLayers/AllConfigs/Templates/password_templates.py
Normal 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>© %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>© %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>© %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
|
||||
@@ -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),
|
||||
)
|
||||
|
||||
|
||||
|
||||
@@ -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",
|
||||
},
|
||||
}
|
||||
@@ -1,3 +1,9 @@
|
||||
from .Auth.login import LoginRequestLanguageModel
|
||||
from .Auth.login import (
|
||||
LoginRequestLanguageModel,
|
||||
SelectRequestLanguageModel,
|
||||
)
|
||||
|
||||
__all__ = ["LoginRequestLanguageModel"]
|
||||
__all__ = [
|
||||
"LoginRequestLanguageModel",
|
||||
"SelectRequestLanguageModel",
|
||||
]
|
||||
|
||||
@@ -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.",
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
0
ApiLayers/__init__.py
Normal file
Reference in New Issue
Block a user