updated postgres and mongo updated

This commit is contained in:
2025-04-20 14:21:13 +03:00
parent 71822681f2
commit cc19cb7e6d
85 changed files with 6090 additions and 1986 deletions

View File

@@ -24,10 +24,12 @@ from Schemas import (
Duties,
Departments,
Event2Employee,
Application2Occupant,
Event2Occupant,
Application2Employee,
RelationshipEmployee2Build,
)
from Modules.Token.password_module import PasswordModule
from Schemas.building.build import RelationshipEmployee2Build
from Schemas.event.event import Event2Occupant, Application2Employee
from Controllers.Redis.database import RedisActions
from Controllers.Mongo.database import mongo_handler
@@ -151,7 +153,11 @@ class LoginHandler:
@classmethod
def do_employee_login(
cls, request: Any, data: Any, extra_dict: Optional[Dict[str, Any]] = None
cls,
request: Any,
data: Any,
db_session,
extra_dict: Optional[Dict[str, Any]] = None,
):
"""
Handle employee login.
@@ -161,109 +167,113 @@ class LoginHandler:
timezone = extra_dict.get("tz", None) or "GMT+3"
user_handler = UserHandlers()
with Users.new_session() as db_session:
found_user = user_handler.check_user_exists(
access_key=data.access_key, db_session=db_session
)
found_user = user_handler.check_user_exists(
access_key=data.access_key, db_session=db_session
)
if not user_handler.check_password_valid(
domain=domain or "",
id_=str(found_user.uu_id),
password=data.password,
password_hashed=found_user.hash_password,
):
raise ValueError("EYS_0005")
if not user_handler.check_password_valid(
domain=domain or "",
id_=str(found_user.uu_id),
password=data.password,
password_hashed=found_user.hash_password,
):
raise ValueError("EYS_0005")
list_employee = Employees.filter_all(
Employees.people_id == found_user.person_id, db=db_session
list_employee = Employees.filter_all(
Employees.people_id == found_user.person_id, db=db_session
).data
companies_uu_id_list: list = []
companies_id_list: list = []
companies_list: list = []
duty_uu_id_list: list = []
duty_id_list: list = []
for employee in list_employee:
duty_found = None
staff = Staff.filter_one(Staff.id == employee.staff_id, db=db_session).data
if duties := Duties.filter_one(
Duties.id == staff.duties_id, db=db_session
).data:
if duty_found := Duty.filter_by_one(
id=duties.duties_id, db=db_session
).data:
duty_uu_id_list.append(str(duty_found.uu_id))
duty_id_list.append(duty_found.id)
duty_found = duty_found.duty_name
department = Departments.filter_one(
Departments.id == duties.department_id, db=db_session
).data
companies_uu_id_list: list = []
companies_id_list: list = []
companies_list: list = []
duty_uu_id_list: list = []
duty_id_list: list = []
for employee in list_employee:
staff = Staff.filter_one(
Staff.id == employee.staff_id, db=db_session
if company := Companies.filter_one(
Companies.id == department.company_id, db=db_session
).data:
companies_uu_id_list.append(str(company.uu_id))
companies_id_list.append(company.id)
company_address = Addresses.filter_by_one(
id=company.official_address_id, db=db_session
).data
if duties := Duties.filter_one(
Duties.id == staff.duties_id, db=db_session
).data:
if duty_found := Duty.filter_by_one(
id=duties.duties_id, db=db_session
).data:
duty_uu_id_list.append(str(duty_found.uu_id))
duty_id_list.append(duty_found.id)
companies_list.append(
{
"uu_id": str(company.uu_id),
"public_name": company.public_name,
"company_type": company.company_type,
"company_address": company_address,
"duty": duty_found,
}
)
person = People.filter_one(
People.id == found_user.person_id, db=db_session
).data
model_value = EmployeeTokenObject(
user_type=UserType.employee.value,
user_uu_id=str(found_user.uu_id),
user_id=found_user.id,
person_id=found_user.person_id,
person_uu_id=str(person.uu_id),
request=dict(request.headers),
companies_uu_id_list=companies_uu_id_list,
companies_id_list=companies_id_list,
duty_uu_id_list=duty_uu_id_list,
duty_id_list=duty_id_list,
).model_dump()
department = Departments.filter_one(
Departments.id == duties.department_id, db=db_session
).data
if company := Companies.filter_one(
Companies.id == department.company_id, db=db_session
).data:
companies_uu_id_list.append(str(company.uu_id))
companies_id_list.append(company.id)
company_address = Addresses.filter_by_one(
id=company.official_address_id, db=db_session
).data
companies_list.append(
{
"uu_id": str(company.uu_id),
"public_name": company.public_name,
"company_type": company.company_type,
"company_address": company_address,
}
)
person = People.filter_one(
People.id == found_user.person_id, db=db_session
).data
model_value = EmployeeTokenObject(
user_type=UserType.employee.value,
user_uu_id=str(found_user.uu_id),
user_id=found_user.id,
person_id=found_user.person_id,
person_uu_id=str(person.uu_id),
request=dict(request.headers),
companies_uu_id_list=companies_uu_id_list,
companies_id_list=companies_id_list,
duty_uu_id_list=duty_uu_id_list,
duty_id_list=duty_id_list,
).model_dump()
set_to_redis_dict = dict(
user=found_user,
token=model_value,
header_info=dict(language=language, domain=domain, timezone=timezone),
)
redis_handler = RedisHandlers()
if access_token := redis_handler.set_object_to_redis(**set_to_redis_dict):
return {
"access_token": access_token,
"user_type": UserType.employee.name,
"user": found_user.get_dict(
exclude_list=[
Users.hash_password,
Users.cryp_uu_id,
Users.password_token,
Users.created_credentials_token,
Users.updated_credentials_token,
Users.confirmed_credentials_token,
Users.is_confirmed,
Users.is_notification_send,
Users.is_email_send,
Users.remember_me,
]
),
"selection_list": companies_list,
}
set_to_redis_dict = dict(
user=found_user,
token=model_value,
header_info=dict(language=language, domain=domain, timezone=timezone),
)
redis_handler = RedisHandlers()
if access_token := redis_handler.set_object_to_redis(**set_to_redis_dict):
return {
"access_token": access_token,
"user_type": UserType.employee.name,
"user": found_user.get_dict(
exclude_list=[
Users.hash_password,
Users.cryp_uu_id,
Users.password_token,
Users.created_credentials_token,
Users.updated_credentials_token,
Users.confirmed_credentials_token,
Users.is_confirmed,
Users.is_notification_send,
Users.is_email_send,
Users.remember_me,
]
),
"selection_list": companies_list,
}
raise ValueError("Something went wrong")
@classmethod
def do_employee_occupant(
cls, request: Any, data: Any, extra_dict: Optional[Dict[str, Any]] = None
def do_occupant_login(
cls,
request: Any,
data: Any,
db_session,
extra_dict: Optional[Dict[str, Any]] = None,
):
"""
Handle occupant login.
@@ -273,63 +283,58 @@ class LoginHandler:
timezone = extra_dict.get("tz", None) or "GMT+3"
user_handler = UserHandlers()
with Users.new_session() as db_session:
found_user = user_handler.check_user_exists(
access_key=data.access_key, db_session=db_session
)
if not user_handler.check_password_valid(
domain=data.domain,
id_=str(found_user.uu_id),
password=data.password,
password_hashed=found_user.hash_password,
):
raise ValueError("EYS_0005")
found_user = user_handler.check_user_exists(
access_key=data.access_key, db_session=db_session
)
if not user_handler.check_password_valid(
domain=domain,
id_=str(found_user.uu_id),
password=data.password,
password_hashed=found_user.hash_password,
):
raise ValueError("EYS_0005")
occupants_selection_dict: Dict[str, Any] = {}
living_spaces: list[BuildLivingSpace] = BuildLivingSpace.filter_all(
BuildLivingSpace.person_id == found_user.person_id, db=db_session
occupants_selection_dict: Dict[str, Any] = {}
living_spaces: list[BuildLivingSpace] = BuildLivingSpace.filter_all(
BuildLivingSpace.person_id == found_user.person_id, db=db_session
).data
if not living_spaces:
raise ValueError("EYS_0006")
for living_space in living_spaces:
build_part = BuildParts.filter_one(
BuildParts.id == living_space.build_parts_id,
db=db_session,
).data
if not build_part:
raise ValueError("EYS_0007")
if not living_spaces:
raise ValueError("EYS_0006")
for living_space in living_spaces:
build_parts_selection = BuildParts.filter_all(
BuildParts.id == living_space.build_parts_id,
db=db_session,
).data
if not build_parts_selection:
raise ValueError("EYS_0007")
build = build_part.buildings
occupant_type = OccupantTypes.filter_by_one(
id=living_space.occupant_type_id,
db=db_session,
system=True,
).data
occupant_data = {
"build_living_space_uu_id": str(living_space.uu_id),
"part_uu_id": str(build_part.uu_id),
"part_name": build_part.part_name(db=db_session),
"part_level": build_part.part_level,
"occupant_uu_id": str(occupant_type.uu_id),
"description": occupant_type.occupant_description,
"code": occupant_type.occupant_code,
}
build_part = build_parts_selection[0]
build = build_part.buildings
occupant_type = OccupantTypes.filter_by_one(
id=living_space.occupant_type,
db=db_session,
system=True,
).data
occupant_data = {
"part_uu_id": str(build_part.uu_id),
"part_name": build_part.part_name,
"part_level": build_part.part_level,
"uu_id": str(occupant_type.uu_id),
"description": occupant_type.occupant_description,
"code": occupant_type.occupant_code,
build_key = str(build.uu_id)
if build_key not in occupants_selection_dict:
occupants_selection_dict[build_key] = {
"build_uu_id": build_key,
"build_name": build.build_name,
"build_no": build.build_no,
"occupants": [occupant_data],
}
build_key = str(build.uu_id)
if build_key not in occupants_selection_dict:
occupants_selection_dict[build_key] = {
"build_uu_id": build_key,
"build_name": build.build_name,
"build_no": build.build_no,
"occupants": [occupant_data],
}
else:
occupants_selection_dict[build_key]["occupants"].append(
occupant_data
)
else:
occupants_selection_dict[build_key]["occupants"].append(occupant_data)
person = found_user.person
model_value = OccupantTokenObject(
@@ -363,7 +368,6 @@ class LoginHandler:
request: FastAPI request object
data: Request body containing login credentials
{
"domain": "evyos.com.tr",
"access_key": "karatay.berkay.sup@evyos.com.tr",
"password": "string",
"remember_me": false
@@ -374,29 +378,31 @@ class LoginHandler:
language = request.headers.get("language", "tr")
domain = request.headers.get("domain", None)
timezone = request.headers.get("tz", None) or "GMT+3"
if cls.is_employee(data.access_key):
return cls.do_employee_login(
request=request,
data=data,
extra_dict=dict(
language=language,
domain=domain,
timezone=timezone,
),
)
elif cls.is_occupant(data.access_key):
return cls.do_employee_login(
request=request,
data=data,
extra_dict=dict(
language=language,
domain=domain,
timezone=timezone,
),
)
else:
raise ValueError("Invalid email format")
with Users.new_session() as db_session:
if cls.is_employee(data.access_key):
return cls.do_employee_login(
request=request,
data=data,
extra_dict=dict(
language=language,
domain=domain,
timezone=timezone,
),
db_session=db_session,
)
elif cls.is_occupant(data.access_key):
return cls.do_occupant_login(
request=request,
data=data,
extra_dict=dict(
language=language,
domain=domain,
timezone=timezone,
),
db_session=db_session,
)
else:
raise ValueError("Invalid email format")
@classmethod
def raise_error_if_request_has_no_token(cls, request: Any) -> None:
@@ -525,23 +531,23 @@ class LoginHandler:
BuildParts.id == selected_build_living_space.build_parts_id,
db=db,
).data
build = BuildParts.filter_one(
BuildParts.id == build_part.build_id,
db=db,
).data
responsible_employee = Employees.filter_one(
Employees.id == build_part.responsible_employee_id,
db=db,
).data
related_company = RelationshipEmployee2Build.filter_one(
RelationshipEmployee2Build.member_id == build.id,
db=db,
).data
build = build_part.buildings
reachable_app_codes = Application2Occupant.get_application_codes(
build_living_space_id=selected_build_living_space.id, db=db
)
# responsible_employee = Employees.filter_one(
# Employees.id == build_part.responsible_employee_id,
# db=db,
# ).data
# related_company = RelationshipEmployee2Build.filter_one(
# RelationshipEmployee2Build.member_id == build.id,
# db=db,
# ).data
# Get company
company_related = Companies.filter_one(
Companies.id == related_company.company_id,
db=db,
).data
# company_related = Companies.filter_one(
# Companies.id == related_company.company_id,
# db=db,
# ).data
# Create occupant token
occupant_token = OccupantToken(
@@ -554,18 +560,19 @@ class LoginHandler:
build_uuid=build.uu_id.__str__(),
build_part_id=build_part.id,
build_part_uuid=build_part.uu_id.__str__(),
responsible_employee_id=responsible_employee.id,
responsible_employee_uuid=responsible_employee.uu_id.__str__(),
responsible_company_id=company_related.id,
responsible_company_uuid=company_related.uu_id.__str__(),
# responsible_employee_id=responsible_employee.id,
# responsible_employee_uuid=responsible_employee.uu_id.__str__(),
# responsible_company_id=company_related.id,
# responsible_company_uuid=company_related.uu_id.__str__(),
reachable_event_codes=reachable_event_codes,
reachable_app_codes=reachable_app_codes,
)
redis_handler = RedisHandlers()
redis_handler.update_token_at_redis(
token=access_token, add_payload=occupant_token
)
return {
"selected_uu_id": data.company_uu_id,
"selected_uu_id": occupant_token.living_space_uu_id,
}
@classmethod # Requires auth context
@@ -715,15 +722,23 @@ class PageHandlers:
"""
if result := RedisHandlers.get_object_from_redis(access_token=access_token):
if result.is_employee:
if application := result.selected_company.reachable_app_codes.get(
page_url, None
if (
result.selected_company
and result.selected_company.reachable_app_codes
):
return application
if application := result.selected_company.reachable_app_codes.get(
page_url, None
):
return application
elif result.is_occupant:
if application := result.selected_company.reachable_app_codes.get(
page_url, None
if (
result.selected_occupant
and result.selected_occupant.reachable_app_codes
):
return application
if application := result.selected_occupant.reachable_app_codes.get(
page_url, None
):
return application
raise ValueError("EYS_0013")
@classmethod
@@ -737,9 +752,17 @@ class PageHandlers:
"""
if result := RedisHandlers.get_object_from_redis(access_token=access_token):
if result.is_employee:
return result.selected_company.reachable_app_codes.keys()
if (
result.selected_company
and result.selected_company.reachable_app_codes
):
return result.selected_company.reachable_app_codes.keys()
elif result.is_occupant:
return result.selected_company.reachable_app_codes.keys()
if (
result.selected_occupant
and result.selected_occupant.reachable_app_codes
):
return result.selected_occupant.reachable_app_codes.keys()
raise ValueError("EYS_0013")