from typing import Union from AllConfigs.Token.config import Auth from ErrorHandlers import HTTPExceptionApi from Services.Redis import RedisActions, AccessToken from fastapi import Request from ApiValidations.Custom.token_objects import EmployeeTokenObject, OccupantTokenObject class TokenService: @classmethod def raise_error_if_request_has_no_token(cls, request: Request) -> None: """Get access token from request headers.""" if not hasattr(request, "headers"): raise HTTPExceptionApi( error_code="", lang="en", ) if not request.headers.get(Auth.ACCESS_TOKEN_TAG): raise HTTPExceptionApi( error_code="", lang="en", ) @classmethod def get_access_token_from_request(cls, request: Request) -> str: """Get access token from request headers.""" cls.raise_error_if_request_has_no_token(request=request) return request.headers.get(Auth.ACCESS_TOKEN_TAG) @classmethod def get_object_via_access_key(cls, access_token: str) -> Union[EmployeeTokenObject, OccupantTokenObject]: """Get access token from request headers.""" access_token = AccessToken( accessToken=access_token, userUUID="", ) if redis_object := RedisActions.get_json( list_keys=access_token.to_list() ).first.data: access_token.userUUID = redis_object.get("user_uu_id") if redis_object.get("user_type") == 1: if not redis_object.get("selected_company", None): redis_object["selected_company"] = None return EmployeeTokenObject(**redis_object) elif redis_object.get("user_type") == 2: if not redis_object.get("selected_occupant", None): redis_object["selected_occupant"] = None return OccupantTokenObject(**redis_object) raise HTTPExceptionApi( error_code="", lang="en", ) @classmethod def get_object_via_user_uu_id(cls, user_id: str) -> Union[EmployeeTokenObject, OccupantTokenObject]: """Get access token from user uuid.""" access_token = AccessToken( accessToken="", userUUID=user_id, ) if redis_object := RedisActions.get_json( list_keys=access_token.to_list() ).first.data: access_token.userUUID = redis_object.get("user_uu_id") if redis_object.get("user_type") == 1: if not redis_object.get("selected_company", None): redis_object["selected_company"] = None return EmployeeTokenObject(**redis_object) elif redis_object.get("user_type") == 2: if not redis_object.get("selected_occupant", None): redis_object["selected_occupant"] = None return OccupantTokenObject(**redis_object) raise HTTPExceptionApi( error_code="", lang="en", )