""" Validation function handlers """ from typing import Dict, Any from fastapi import Request from ApiLayers.AllConfigs.Redis.configs import RedisValidationKeysAction, RedisCategoryKeys from Services.Redis.Actions.actions import RedisActions from Events.base_request_model import BaseRouteModel from config import ValidationsConfig class ValidateBase: redis_key: str = f"{RedisCategoryKeys.METHOD_FUNCTION_CODES}:*:" def __init__(self, url: str, reachable_codes: list): self.url = url self.reachable_codes = reachable_codes @property def function_codes(self): redis_function_codes= RedisActions.get_json( list_keys=[f"{self.redis_key}{self.url}"] ) if redis_function_codes.status: return redis_function_codes.first raise ValueError("Function code not found") @property def intersection(self): intersection = list(set(self.function_codes).intersection(set(self.reachable_codes))) if not len(intersection) == 1: raise ValueError("Users reachable function codes does not match or match more than one.") return intersection[0] class RedisHeaderRetrieve(ValidateBase): redis_key: str = RedisValidationKeysAction.dynamic_header_request_key @property def header(self): """ Headers: Headers which is merged with response model && language models of event """ redis_header= RedisActions.get_json(list_keys=[f"{self.redis_key}:{self.intersection}"]) if redis_header.status: return redis_header.first raise ValueError("Header not found") class RedisValidationRetrieve(ValidateBase): redis_key: str = RedisValidationKeysAction.dynamic_validation_key @property def validation(self): """ Validation: Validation of event which is merged with response model && language models of event """ redis_validation = RedisActions.get_json(list_keys=[f"{self.redis_key}:{self.intersection}"]) if redis_validation.status: return redis_validation.first raise ValueError("Header not found") class ValidationsBoth(RedisHeaderRetrieve, RedisValidationRetrieve): @property def both(self) -> Dict[str, Any]: """ Headers: Headers which is merged with response model && language models of event Validation: Validation of event which is merged with response model && language models of event """ return {"headers": self.header, "validation": self.validation} class RetrieveValidation(BaseRouteModel): @classmethod def retrieve_validation(cls, data: Any): """ Retrieve validation by event function code """ if getattr(data, 'asked_field', "") not in ValidationsConfig.SUPPORTED_VALIDATIONS: raise ValueError(f"Invalid asked field please retry with valid fields {ValidationsConfig.SUPPORTED_VALIDATIONS}") reachable_codes = [] if cls.context_retriever.token.is_employee: reachable_codes = cls.context_retriever.token.selected_company.reachable_event_codes elif cls.context_retriever.token.is_occupant: reachable_codes = cls.context_retriever.token.selected_occupant.reachable_event_codes validate_dict = dict(url=data.url, reachable_code=reachable_codes) if data.asked_field == "all": return ValidationsBoth(**validate_dict).both elif data.asked_field == "headers": return RedisHeaderRetrieve(**validate_dict).header elif data.asked_field == "validation": return RedisValidationRetrieve(**validate_dict).validation