"""User based helpers methods.""" from contextvars import ContextVar from fastapi import Request from moneyhub.constants.constants import APPLICATION_PROFILE_TYPE from moneyhub.constants.constants import DEFAULT_USER_ID from moneyhub.constants.constants import DEFAULT_USER_TYPE from moneyhub.constants.constants import IDENTITY_HEADER from moneyhub.constants.constants import USER_HEADER_DELIMITER from moneyhub.constants.constants import USER_HEADER_LENGTH from moneyhub.constants.constants import USER_HEADER_NAME request_header = ContextVar('request_header', default=None) def get_user_details_from_headers(request: Request) -> dict: """Parse user information in the headers. Args: request (Request): Request object Returns: dict: dict of user id and user type """ orchard_identity_id = request.headers.get(IDENTITY_HEADER, None) grass_user_details = request.headers.get(USER_HEADER_NAME, None) user_type = DEFAULT_USER_TYPE user_id = DEFAULT_USER_ID if orchard_identity_id: user_type = APPLICATION_PROFILE_TYPE user_id = orchard_identity_id elif grass_user_details: user_type, user_id = get_user_details_from_string(grass_user_details) return {'type': user_type, 'id': user_id} def get_user_details_from_string(grass_user_details: str) -> tuple: """Parse the pattern 'user_type:user_id' into a tuple. Args: grass_user_details (str): header parameter having user_type and user_id Returns: tuple: tuple of user id and user type """ user_type = DEFAULT_USER_TYPE user_id = DEFAULT_USER_ID if grass_user_details: header_pieces = grass_user_details.split(USER_HEADER_DELIMITER) if len(header_pieces) == USER_HEADER_LENGTH: user_id = header_pieces.pop() or user_id user_type = header_pieces.pop() or user_type return user_type, user_id def get_user_id() -> str: """Return application level user id.""" if request_header and (user := request_header.get()): return user['id'] return DEFAULT_USER_ID