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