events updated

This commit is contained in:
2024-12-02 13:07:22 +03:00
parent aaeb7f4d00
commit a038a1b8ee
7 changed files with 318 additions and 240 deletions

View File

@@ -1,12 +1,12 @@
import json
import typing
from typing import Union
from fastapi import status
from fastapi.requests import Request
from fastapi.exceptions import HTTPException
from fastapi.responses import JSONResponse
from api_objects import UserType
from databases import (
Companies,
Staff,
@@ -22,6 +22,7 @@ from databases import (
Users,
UsersTokens,
OccupantTypes,
RelationshipEmployee2Build,
)
from api_services import (
@@ -35,10 +36,11 @@ from api_services import (
change_your_password_template,
)
from api_configs import ApiStatic, Auth
from api_events.events.abstract_class import MethodToEvent, ActionsSchema
from api_objects.auth.token_objects import EmployeeTokenObject, OccupantTokenObject
from api_library.date_time_actions.date_functions import system_arrow
from api_configs import ApiStatic, Auth
from databases.no_sql_models.login_handlers import load_user_with_erp_details
from api_validations.validations_request import (
@@ -51,12 +53,14 @@ from api_validations.validations_request import (
OccupantSelection,
EmployeeSelection,
)
from databases.sql_models.building.build import RelationshipEmployee2Build
class AuthenticationLoginEventMethods(MethodToEvent):
event_type = "LOGIN"
event_description = "Login via domain and access key : [email] | [phone]"
event_category = "AUTHENTICATION"
__event_keys__ = {
"e672846d-cc45-4d97-85d5-6f96747fac67": "authentication_login_with_domain_and_creds",
}
@@ -66,7 +70,6 @@ class AuthenticationLoginEventMethods(MethodToEvent):
cls,
data: Login,
request,
token_dict: typing.Union[EmployeeTokenObject, OccupantTokenObject],
):
access_dict = Users.login_user_with_credentials(data=data, request=request)
found_user = access_dict.get("user", None)
@@ -90,7 +93,10 @@ class AuthenticationLoginEventMethods(MethodToEvent):
class AuthenticationSelectEventMethods(MethodToEvent):
event_type = "SELECT"
event_type = "LOGIN"
event_description = "Select Employee Duty or Occupant Type"
event_category = "AUTHENTICATION"
__event_keys__ = {
"cee96b9b-8487-4e9f-aaed-2e8c79687bf9": "authentication_select_company_or_occupant_type",
}
@@ -100,13 +106,12 @@ class AuthenticationSelectEventMethods(MethodToEvent):
cls,
request: Request,
data,
token_dict: typing.Union[EmployeeSelection, OccupantSelection],
token_dict: typing.Union[EmployeeTokenObject, OccupantTokenObject],
):
from api_objects import OccupantToken, CompanyToken
token_user = get_object_via_access_key(request=request)
if token_user.user_type == 1:
if data.company_uu_id not in token_user.companies_uu_id_list:
if isinstance(token_dict, EmployeeTokenObject):
if data.company_uu_id not in token_dict.companies_uu_id_list:
return JSONResponse(
content={
"completed": False,
@@ -137,7 +142,7 @@ class AuthenticationSelectEventMethods(MethodToEvent):
).data
]
employee = Employees.filter_one(
Employees.people_id == token_user.person_id,
Employees.people_id == token_dict.person_id,
Employees.staff_id.in_(staff_ids),
).data
@@ -185,7 +190,7 @@ class AuthenticationSelectEventMethods(MethodToEvent):
},
status_code=status.HTTP_200_OK,
)
elif token_user.user_type == 2:
elif isinstance(token_dict, OccupantTokenObject):
occupant_type = OccupantTypes.filter_one(
OccupantTypes.uu_id == data.occupant_uu_id
).data
@@ -214,7 +219,7 @@ class AuthenticationSelectEventMethods(MethodToEvent):
).data
if selected_occupant_type := BuildLivingSpace.filter_one(
BuildLivingSpace.occupant_type == occupant_type.id,
BuildLivingSpace.person_id == token_user.person_id,
BuildLivingSpace.person_id == token_dict.person_id,
BuildLivingSpace.build_parts_id == build_part.id,
).data:
reachable_event_list_id, reachable_event_list_uu_id = (
@@ -258,7 +263,10 @@ class AuthenticationSelectEventMethods(MethodToEvent):
class AuthenticationCheckTokenEventMethods(MethodToEvent):
event_type = "CHECK"
event_type = "LOGIN"
event_description = "Check Token is valid for user"
event_category = "AUTHENTICATION"
__event_keys__ = {
"73d77e45-a33f-4f12-909e-3b56f00d8a12": "authentication_check_token_is_valid",
}
@@ -282,7 +290,12 @@ class AuthenticationCheckTokenEventMethods(MethodToEvent):
class AuthenticationRefreshEventMethods(MethodToEvent):
event_type = "REFRESH"
event_type = "LOGIN"
event_description = (
"Refresher Token for refreshing access token without credentials"
)
event_category = "AUTHENTICATION"
__event_keys__ = {
"48379bb2-ba81-4d8e-a9dd-58837cfcbf67": "authentication_refresh_user_info",
}
@@ -323,7 +336,10 @@ class AuthenticationRefreshEventMethods(MethodToEvent):
class AuthenticationChangePasswordEventMethods(MethodToEvent):
event_type = "UPDATE"
event_type = "LOGIN"
event_description = "Change password with access token implemented on request headers without password reset token"
event_category = "AUTHENTICATION"
__event_keys__ = {
"f09f7c1a-bee6-4e32-8444-962ec8f39091": "authentication_change_password",
}
@@ -331,13 +347,11 @@ class AuthenticationChangePasswordEventMethods(MethodToEvent):
@classmethod
def authentication_change_password(
cls,
request,
data: ChangePassword,
token_dict: typing.Union[EmployeeSelection, OccupantSelection],
token_dict: typing.Union[EmployeeTokenObject, OccupantTokenObject],
):
token_user = get_object_via_access_key(request=request)
if token_user.user_type == 1:
if found_user := Users.filter_one(Users.uu_id == token_user.uu_id).data:
if isinstance(token_dict, EmployeeTokenObject):
if found_user := Users.filter_one(Users.uu_id == token_dict.uu_id).data:
if found_user.check_password(data.old_password):
found_user.set_password(data.new_password)
return JSONResponse(
@@ -362,15 +376,16 @@ class AuthenticationChangePasswordEventMethods(MethodToEvent):
class AuthenticationCreatePasswordEventMethods(MethodToEvent):
event_type = "CREATE"
event_type = "LOGIN"
event_description = "Create password with password reset token requested via email"
event_category = "AUTHENTICATION"
__event_keys__ = {
"c519f9af-92e1-47b2-abf7-5a3316d075f7": "authentication_create_password",
}
@classmethod
def authentication_create_password(
cls, request, data: CreatePassword, token_dict: dict = None
):
def authentication_create_password(cls, data: CreatePassword):
if not data.re_password == data.password:
raise HTTPException(
@@ -411,56 +426,44 @@ class AuthenticationCreatePasswordEventMethods(MethodToEvent):
class AuthenticationDisconnectUserEventMethods(MethodToEvent):
event_type = "UPDATE"
event_type = "LOGIN"
event_description = "Disconnect all sessions of user in access token"
event_category = "AUTHENTICATION"
__event_keys__ = {
"8b586848-2fb3-4161-abbe-642157eec7ce": "authentication_disconnect_user",
}
@classmethod
def authentication_disconnect_user(
cls, request: Request, data: Logout, token_dict: dict = None
cls,
data: Logout,
token_dict: Union[EmployeeTokenObject, OccupantTokenObject]
):
if token_user := get_object_via_access_key(request=request):
found_user = Users.filter_one(Users.uu_id == token_user.get("uu_id")).data
if not found_user:
return JSONResponse(
content={
"completed": False,
"message": "Invalid data",
"data": None,
},
status_code=status.HTTP_202_ACCEPTED,
found_user = Users.filter_one(Users.uu_id == token_dict.user_uu_id).data
if not found_user:
return JSONResponse(
content={
"completed": False,
"message": "Invalid data",
"data": None,
},
status_code=status.HTTP_202_ACCEPTED,
)
if already_tokens := get_object_via_user_uu_id(user_id=str(found_user.uu_id)):
for key, token_user in already_tokens.items():
redis_cli.delete(key)
selected_user = Users.filter_one(
Users.uu_id == token_user.get("uu_id"),
).data
selected_user.remove_refresher_token(
domain=data.domain, disconnect=True
)
if already_tokens := get_object_via_user_uu_id(user_id=found_user.uu_id):
for key, token_user in already_tokens.items():
redis_cli.delete(key)
selected_user = Users.filter_one(
Users.uu_id == token_user.get("uu_id"),
).data
selected_user.remove_refresher_token(
domain=data.domain, disconnect=True
)
# UserLogger.log_error(
# str(
# dict(
# user_id=found_user.id,
# domain=data.domain,
# access_key=token_user.get("access_input"),
# agent=request.headers.get("User-Agent", None),
# ip=getattr(request, "remote_addr", None)
# or request.headers.get("X-Forwarded-For", None),
# platform=request.headers.get("Origin", None),
# login_date=datetime.datetime.utcnow().__str__(),
# is_login=False,
# )
# )
# )
return JSONResponse(
content={
"completed": True,
"message": "All sessions are disconnected",
"data": token_user,
"data": selected_user.get_dict(),
},
status_code=status.HTTP_200_OK,
)
@@ -471,7 +474,11 @@ class AuthenticationDisconnectUserEventMethods(MethodToEvent):
class AuthenticationLogoutEventMethods(MethodToEvent):
event_type = "UPDATE"
event_type = "LOGIN"
event_description = "Logout only single session of user which domain is provided"
event_category = "AUTHENTICATION"
__event_keys__ = {
"5cc22e4e-a0f7-4077-be41-1871feb3dfd1": "authentication_logout_user",
}
@@ -490,21 +497,7 @@ class AuthenticationLogoutEventMethods(MethodToEvent):
Users.uu_id == token_user.get("uu_id"),
).data
selected_user.remove_refresher_token(domain=data.domain)
# UserLogger.log_error(
# str(
# dict(
# user_id=selected_user.id,
# domain=data.domain,
# access_key=token_user.get("access_input"),
# agent=request.headers.get("User-Agent", None),
# ip=getattr(request, "remote_addr", None)
# or request.headers.get("X-Forwarded-For", None),
# platform=request.headers.get("Origin", None),
# login_date=datetime.datetime.utcnow().__str__(),
# is_login=False,
# )
# )
# )
return JSONResponse(
content={
"completed": True,
@@ -525,7 +518,10 @@ class AuthenticationLogoutEventMethods(MethodToEvent):
class AuthenticationRefreshTokenEventMethods(MethodToEvent):
event_type = "UPDATE"
event_type = "LOGIN"
event_description = "Refresh access token with refresher token"
event_category = "AUTHENTICATION"
__event_keys__ = {
"c90f3334-10c9-4181-b5ff-90d98a0287b2": "authentication_refresher_token",
}
@@ -557,21 +553,6 @@ class AuthenticationRefreshTokenEventMethods(MethodToEvent):
request, "remote_addr", None
) or request.headers.get("X-Forwarded-For", None)
found_user.last_seen = str(system_arrow.now())
# UserLogger.log_error(
# str(
# dict(
# user_id=found_user.id,
# domain=data.domain,
# access_key="via_refresher",
# agent=request.headers.get("User-Agent", None),
# ip=getattr(request, "remote_addr", None)
# or request.headers.get("X-Forwarded-For", None),
# platform=request.headers.get("Origin", None),
# login_date=datetime.datetime.utcnow().__str__(),
# is_login=False,
# )
# )
# )
return JSONResponse(
content={
"completed": True,
@@ -594,14 +575,19 @@ class AuthenticationRefreshTokenEventMethods(MethodToEvent):
class AuthenticationForgotPasswordEventMethods(MethodToEvent):
event_type = "SELECT"
event_type = "LOGIN"
event_description = "Send an email to user for a valid password reset token"
event_category = "AUTHENTICATION"
__event_keys__ = {
"e3ca6e24-b9f8-4127-949c-3bfa364e3513": "authentication_forgot_password",
}
@classmethod
def authentication_forgot_password(
cls, request: Request, data: Forgot, token_dict: dict = None
cls,
request: Request,
data: Forgot,
):
found_user: Users = Users.check_user_exits(
access_key=data.access_key, domain=data.domain
@@ -609,21 +595,6 @@ class AuthenticationForgotPasswordEventMethods(MethodToEvent):
forgot_key = save_access_token_to_redis(
request=request, found_user=found_user, domain=data.domain
)
# UserLogger.log_error(
# str(
# dict(
# user_id=found_user.id,
# domain=data.domain,
# access_key=data.access_key,
# agent=request.headers.get("User-Agent", None),
# ip=getattr(request, "remote_addr", None)
# or request.headers.get("X-Forwarded-For", None),
# platform=request.headers.get("Origin", None),
# login_date=str(DateTimeLocal.now()),
# is_login=False,
# )
# )
# )
forgot_link = ApiStatic.forgot_link(forgot_key=forgot_key)
send_email_completed = send_email(
subject=f"Dear {found_user.user_tag}, your forgot password link has been sent.",
@@ -636,7 +607,6 @@ class AuthenticationForgotPasswordEventMethods(MethodToEvent):
raise HTTPException(
status_code=400, detail="Email can not be sent. Try again later"
)
found_user.password_token = forgot_key
found_user.password_token_is_valid = str(system_arrow.shift(days=1))
found_user.save()
@@ -653,40 +623,41 @@ class AuthenticationForgotPasswordEventMethods(MethodToEvent):
class AuthenticationDownloadAvatarEventMethods(MethodToEvent):
event_type = "SELECT"
event_type = "LOGIN"
event_description = "Download avatar icon and profile info of user"
event_category = "AUTHENTICATION"
__event_keys__ = {
"c140cd5f-307f-4046-a93e-3ade032a57a7": "authentication_download_avatar",
}
@classmethod
def authentication_download_avatar(
cls, request: Request, data: Forgot, token_dict: dict = None
cls, data: Forgot
):
found_user = Users.check_user_exits(
if found_user := Users.check_user_exits(
access_key=data.access_key, domain=data.domain
)
return JSONResponse(
content={
"completed": True,
"message": "Avatar and profile is shared via user credentials",
"data": {
"last_seen": str(found_user.last_seen),
"avatar": found_user.avatar,
"remember_me": found_user.remember_me,
"expiry_ends": str(found_user.expiry_ends),
"expired_str": str(
system_arrow.now()
- system_arrow.get(str(found_user.expiry_ends))
),
"expired_int": int(
(
system_arrow.now()
- system_arrow.get(str(found_user.expiry_ends))
).days
),
):
expired_starts = str(system_arrow.now() - system_arrow.get(str(found_user.expiry_ends)))
expired_int = int(system_arrow.now() - system_arrow.get(str(found_user.expiry_ends)).days)
return JSONResponse(
content={
"completed": True,
"message": "Avatar and profile is shared via user credentials",
"data": {
"last_seen": str(found_user.last_seen),
"avatar": found_user.avatar,
"remember_me": found_user.remember_me,
"expiry_ends": str(found_user.expiry_ends),
"expired_str": expired_starts,
"expired_int": expired_int,
},
},
},
status_code=status.HTTP_200_OK,
status_code=status.HTTP_200_OK,
)
return JSONResponse(
content={"completed": False, "message": "Invalid data", "data": {}},
status_code=status.HTTP_202_ACCEPTED,
)
@@ -723,3 +694,65 @@ AuthenticationForgotPasswordEventMethod = AuthenticationForgotPasswordEventMetho
AuthenticationDownloadAvatarEventMethod = AuthenticationDownloadAvatarEventMethods(
action=ActionsSchema(endpoint="/authentication/avatar")
)
# UserLogger.log_error(
# str(
# dict(
# user_id=found_user.id,
# domain=data.domain,
# access_key=token_user.get("access_input"),
# agent=request.headers.get("User-Agent", None),
# ip=getattr(request, "remote_addr", None)
# or request.headers.get("X-Forwarded-For", None),
# platform=request.headers.get("Origin", None),
# login_date=datetime.datetime.utcnow().__str__(),
# is_login=False,
# )
# )
# )
# UserLogger.log_error(
# str(
# dict(
# user_id=found_user.id,
# domain=data.domain,
# access_key=data.access_key,
# agent=request.headers.get("User-Agent", None),
# ip=getattr(request, "remote_addr", None)
# or request.headers.get("X-Forwarded-For", None),
# platform=request.headers.get("Origin", None),
# login_date=str(DateTimeLocal.now()),
# is_login=False,
# )
# )
# )
# UserLogger.log_error(
# str(
# dict(
# user_id=found_user.id,
# domain=data.domain,
# access_key="via_refresher",
# agent=request.headers.get("User-Agent", None),
# ip=getattr(request, "remote_addr", None)
# or request.headers.get("X-Forwarded-For", None),
# platform=request.headers.get("Origin", None),
# login_date=datetime.datetime.utcnow().__str__(),
# is_login=False,
# )
# )
# )
# UserLogger.log_error(
# str(
# dict(
# user_id=selected_user.id,
# domain=data.domain,
# access_key=token_user.get("access_input"),
# agent=request.headers.get("User-Agent", None),
# ip=getattr(request, "remote_addr", None)
# or request.headers.get("X-Forwarded-For", None),
# platform=request.headers.get("Origin", None),
# login_date=datetime.datetime.utcnow().__str__(),
# is_login=False,
# )
# )
# )