production-evyos-systems-an.../ServicesApi/Extensions/OnMemory/redis_handlers.py

67 lines
2.8 KiB
Python

from typing import Any, Union
from Validations.token.validations import (
TokenDictType,
EmployeeTokenObject,
OccupantTokenObject,
CompanyToken,
OccupantToken,
UserType
)
from Controllers.Redis.database import RedisActions
from Extensions.Token.password_module import PasswordModule
from Schemas import Users
class RedisHandlers:
AUTH_TOKEN: str = "AUTH_TOKEN"
@classmethod
def process_redis_object(cls, redis_object: dict[str, Any]) -> TokenDictType:
"""Process Redis object and return appropriate token object."""
if not redis_object.get("selected_company"):
redis_object["selected_company"] = None
if not redis_object.get("selected_occupant"):
redis_object["selected_occupant"] = None
if redis_object.get("user_type") == UserType.employee.value:
return EmployeeTokenObject(**redis_object)
elif redis_object.get("user_type") == UserType.occupant.value:
return OccupantTokenObject(**redis_object)
raise ValueError("Invalid user type")
@classmethod
def get_object_from_redis(cls, access_token: str) -> TokenDictType:
redis_response = RedisActions.get_json(list_keys=[cls.AUTH_TOKEN, access_token, "*"])
if not redis_response.status:
raise ValueError("EYS_0001")
if redis_object := redis_response.first:
return cls.process_redis_object(redis_object)
raise ValueError("EYS_0002")
@classmethod
def set_object_to_redis(cls, user: Users, token, header_info):
result_delete = RedisActions.delete(list_keys=[cls.AUTH_TOKEN, "*", str(user.uu_id)])
generated_access_token = PasswordModule.generate_access_token()
keys = [cls.AUTH_TOKEN, generated_access_token, str(user.uu_id)]
RedisActions.set_json(list_keys=keys, value={**token, **header_info}, expires={"hours": 1, "minutes": 30})
return generated_access_token
@classmethod
def update_token_at_redis(cls, token: str, add_payload: Union[dict], user_uuid: str):
list_keys = [cls.AUTH_TOKEN, token, "*"]
print("user_uuid", user_uuid, "add_payload", add_payload)
if not user_uuid:
raise ValueError("User UUID not found")
if already_token_data := RedisActions.get_json(list_keys=list_keys).first:
already_token = cls.process_redis_object(already_token_data)
if already_token.is_employee:
already_token.selected_company = add_payload
elif already_token.is_occupant:
already_token.selected_occupant = add_payload
list_keys = [cls.AUTH_TOKEN, token, str(user_uuid)]
result = RedisActions.set_json(list_keys=list_keys, value=already_token.model_dump(), expires={"hours": 1, "minutes": 30})
return result.first
raise ValueError("Something went wrong")