Source code for q2_sdk.models.tip.variables

from typing import Set
from dataclasses import dataclass
from enum import Enum, StrEnum
from q2_sdk.tools.utils import pascalize
from q2_sdk.models.tip.exceptions import TIPModelParsingException

# common fields
TRANSACTION_ID_Q2_DB = "TransactionID"
AUDIT_ID_Q2_DB = "AuditID"
SESSION_ID_Q2_DB = "SessionID"
USER_ID_Q2_DB = "UserID"


@dataclass
class AuditEvent:
    short_name: str
    description: str
    category_name: str


class TIPAuditEvent(Enum):
    # using "SDK" as the audit category name. This seems reasonable as this is
    # an sdk extension. This is the ShortName in dbo.Q2_AuditCategory.
    TIPDecisionStarted = AuditEvent(
        short_name="TIPDecisionStarted",
        description="Transaction Interdiction Protocol started to decision a transaction",
        category_name="SDK",
    )
    TIPRequestValidationFailed = AuditEvent(
        short_name="TIPRequestValidationFailed",
        description="Transaction Interdiction Protocol failed to validate request from HQ",
        category_name="SDK",
    )
    TIPDecisionFailed = AuditEvent(
        short_name="TIPDecisionFailed",
        description="Transaction Interdiction Protocol failed whiled decisioning a transaction",
        category_name="SDK",
    )
    TIPDecisionSucceeded = AuditEvent(
        short_name="TIPDecisionSucceeded",
        description="Transaction Interdiction Protocol succeeded in decisioning a transaction",
        category_name="SDK",
    )


class TIPStrEnum(StrEnum):
    @classmethod
    def from_elem_str(cls, elem: str):
        try:
            return cls(elem)
        except Exception as e:
            raise TIPModelParsingException(
                f"Could not create enum {cls.__name__} from str: {elem}"
            ) from e

    @classmethod
    def valid_names(cls) -> Set[str]:
        """
        Get all valid string values for this enum.

        :return: Set of valid enum string values
        """
        return {enum_member.value for enum_member in cls}


class TIPStatus(TIPStrEnum):
    Allowed = "Allowed"
    Denied = "Denied"
    Suspect = "Suspect"
    MFARequired = "MFARequired"
    Exception = "Exception"


class TransactionTypeEnum(TIPStrEnum):
    Ach = "Ach"
    AchPassThru = "AchPassThru"
    DomesticWire = "DomesticWire"
    InternationalWire = "InternationalWire"
    FundsTransfer = "FundsTransfer"
    ExternalTransfer = "ExternalTransfer"


class TransferDirection(TIPStrEnum):
    Outbound = "Outbound"
    Inbound = "Inbound"
    Unsupported = "Unsupported"

    @classmethod
    def from_elem_str(cls, elem: str) -> "TransferDirection":
        try:
            try:
                return cls(elem)
            except Exception:
                return cls(pascalize(elem.lower()))
        except Exception as e:
            raise TIPModelParsingException(
                f"Could not create enum {cls.__name__} from str: {elem}"
            ) from e


class TIPRequestVersion(TIPStrEnum):
    # for now, all TIPRequest data classes are on v0
    # add versions here as request versions are incremented
    V0 = "0"

    @classmethod
    def latest_version(cls):
        return cls.V0


class TIPResponseVersion(TIPStrEnum):
    # for now, all TIPResponse data classes are on v0
    # add versions here as request versions are incremented
    V0 = "0"

    @classmethod
    def latest_version(cls):
        return cls.V0