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)] print("already_token", already_token) 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")