From caefec61be89669d8cd762f28ebe92530fc1cfd2 Mon Sep 17 00:00:00 2001 From: in2q Date: Mon, 4 Aug 2025 08:11:34 -0700 Subject: [PATCH 1/2] feat: add card fraud case event models Add support for 5 new card fraud case event types: - CardFraudCaseCreatedEvent (card.fraudCase.created) - CardFraudCaseActivatedEvent (card.fraudCase.activated) - CardFraudCaseExpiredEvent (card.fraudCase.expired) - CardFraudCaseFraudEvent (card.fraudCase.fraud) - CardFraudCaseNoFraudEvent (card.fraudCase.noFraud) Each event includes status, decision, activityType, and expiresAt attributes to support comprehensive fraud case handling. --- unit/models/event.py | 92 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/unit/models/event.py b/unit/models/event.py index a683947..72252ad 100644 --- a/unit/models/event.py +++ b/unit/models/event.py @@ -232,6 +232,96 @@ def from_json_api(_id, _type, attributes, relationships): attributes["previousStatus"], attributes.get("tags"), relationships) +class CardFraudCaseCreatedEvent(BaseEvent): + def __init__(self, id: str, created_at: datetime, status: str, decision: str, activity_type: str, + expires_at: datetime, tags: Optional[Dict[str, str]], relationships: Optional[Dict[str, Relationship]]): + BaseEvent.__init__(self, id, created_at, tags, relationships) + self.type = 'card.fraudCase.created' + self.attributes["status"] = status + self.attributes["decision"] = decision + self.attributes["activityType"] = activity_type + self.attributes["expiresAt"] = expires_at + + @staticmethod + def from_json_api(_id, _type, attributes, relationships): + return CardFraudCaseCreatedEvent(_id, date_utils.to_datetime(attributes["createdAt"]), + attributes["status"], attributes["decision"], attributes["activityType"], + date_utils.to_datetime(attributes["expiresAt"]), attributes.get("tags"), + relationships) + + +class CardFraudCaseActivatedEvent(BaseEvent): + def __init__(self, id: str, created_at: datetime, status: str, decision: str, activity_type: str, + expires_at: datetime, tags: Optional[Dict[str, str]], relationships: Optional[Dict[str, Relationship]]): + BaseEvent.__init__(self, id, created_at, tags, relationships) + self.type = 'card.fraudCase.activated' + self.attributes["status"] = status + self.attributes["decision"] = decision + self.attributes["activityType"] = activity_type + self.attributes["expiresAt"] = expires_at + + @staticmethod + def from_json_api(_id, _type, attributes, relationships): + return CardFraudCaseActivatedEvent(_id, date_utils.to_datetime(attributes["createdAt"]), + attributes["status"], attributes["decision"], attributes["activityType"], + date_utils.to_datetime(attributes["expiresAt"]), attributes.get("tags"), + relationships) + + +class CardFraudCaseExpiredEvent(BaseEvent): + def __init__(self, id: str, created_at: datetime, status: str, decision: str, activity_type: str, + expires_at: datetime, tags: Optional[Dict[str, str]], relationships: Optional[Dict[str, Relationship]]): + BaseEvent.__init__(self, id, created_at, tags, relationships) + self.type = 'card.fraudCase.expired' + self.attributes["status"] = status + self.attributes["decision"] = decision + self.attributes["activityType"] = activity_type + self.attributes["expiresAt"] = expires_at + + @staticmethod + def from_json_api(_id, _type, attributes, relationships): + return CardFraudCaseExpiredEvent(_id, date_utils.to_datetime(attributes["createdAt"]), + attributes["status"], attributes["decision"], attributes["activityType"], + date_utils.to_datetime(attributes["expiresAt"]), attributes.get("tags"), + relationships) + + +class CardFraudCaseFraudEvent(BaseEvent): + def __init__(self, id: str, created_at: datetime, status: str, decision: str, activity_type: str, + expires_at: datetime, tags: Optional[Dict[str, str]], relationships: Optional[Dict[str, Relationship]]): + BaseEvent.__init__(self, id, created_at, tags, relationships) + self.type = 'card.fraudCase.fraud' + self.attributes["status"] = status + self.attributes["decision"] = decision + self.attributes["activityType"] = activity_type + self.attributes["expiresAt"] = expires_at + + @staticmethod + def from_json_api(_id, _type, attributes, relationships): + return CardFraudCaseFraudEvent(_id, date_utils.to_datetime(attributes["createdAt"]), + attributes["status"], attributes["decision"], attributes["activityType"], + date_utils.to_datetime(attributes["expiresAt"]), attributes.get("tags"), + relationships) + + +class CardFraudCaseNoFraudEvent(BaseEvent): + def __init__(self, id: str, created_at: datetime, status: str, decision: str, activity_type: str, + expires_at: datetime, tags: Optional[Dict[str, str]], relationships: Optional[Dict[str, Relationship]]): + BaseEvent.__init__(self, id, created_at, tags, relationships) + self.type = 'card.fraudCase.noFraud' + self.attributes["status"] = status + self.attributes["decision"] = decision + self.attributes["activityType"] = activity_type + self.attributes["expiresAt"] = expires_at + + @staticmethod + def from_json_api(_id, _type, attributes, relationships): + return CardFraudCaseNoFraudEvent(_id, date_utils.to_datetime(attributes["createdAt"]), + attributes["status"], attributes["decision"], attributes["activityType"], + date_utils.to_datetime(attributes["expiresAt"]), attributes.get("tags"), + relationships) + + class CheckDepositCreatedEvent(BaseEvent): def __init__(self, id: str, created_at: datetime, status: str, tags: Optional[Dict[str, str]], relationships: Optional[Dict[str, Relationship]]): @@ -807,6 +897,8 @@ def from_json_api(_id, _type, attributes, relationships): EventDTO = Union[ AccountClosedEvent, AccountFrozenEvent, ApplicationDeniedEvent, ApplicationAwaitingDocumentsEvent, ApplicationPendingReviewEvent, CardActivatedEvent, CardStatusChangedEvent, + CardFraudCaseCreatedEvent, CardFraudCaseActivatedEvent, CardFraudCaseExpiredEvent, + CardFraudCaseFraudEvent, CardFraudCaseNoFraudEvent, AuthorizationCreatedEvent, AuthorizationCanceledEvent, AuthorizationDeclinedEvent, AuthorizationRequestDeclinedEvent, AuthorizationRequestPendingEvent, AuthorizationRequestApprovedEvent, DocumentApprovedEvent, DocumentRejectedEvent, From 959a163b3a7c249d1f0c6888cfea369c4aabbede Mon Sep 17 00:00:00 2001 From: in2q Date: Wed, 6 Aug 2025 18:13:23 -0700 Subject: [PATCH 2/2] Nixed punctuation, updated to proper event names. --- unit/models/event.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/unit/models/event.py b/unit/models/event.py index 72252ad..a9d2e28 100644 --- a/unit/models/event.py +++ b/unit/models/event.py @@ -236,7 +236,7 @@ class CardFraudCaseCreatedEvent(BaseEvent): def __init__(self, id: str, created_at: datetime, status: str, decision: str, activity_type: str, expires_at: datetime, tags: Optional[Dict[str, str]], relationships: Optional[Dict[str, Relationship]]): BaseEvent.__init__(self, id, created_at, tags, relationships) - self.type = 'card.fraudCase.created' + self.type = 'cardFraudCase.created' self.attributes["status"] = status self.attributes["decision"] = decision self.attributes["activityType"] = activity_type @@ -254,7 +254,7 @@ class CardFraudCaseActivatedEvent(BaseEvent): def __init__(self, id: str, created_at: datetime, status: str, decision: str, activity_type: str, expires_at: datetime, tags: Optional[Dict[str, str]], relationships: Optional[Dict[str, Relationship]]): BaseEvent.__init__(self, id, created_at, tags, relationships) - self.type = 'card.fraudCase.activated' + self.type = 'cardFraudCase.activated' self.attributes["status"] = status self.attributes["decision"] = decision self.attributes["activityType"] = activity_type @@ -272,7 +272,7 @@ class CardFraudCaseExpiredEvent(BaseEvent): def __init__(self, id: str, created_at: datetime, status: str, decision: str, activity_type: str, expires_at: datetime, tags: Optional[Dict[str, str]], relationships: Optional[Dict[str, Relationship]]): BaseEvent.__init__(self, id, created_at, tags, relationships) - self.type = 'card.fraudCase.expired' + self.type = 'cardFraudCase.expired' self.attributes["status"] = status self.attributes["decision"] = decision self.attributes["activityType"] = activity_type @@ -290,7 +290,7 @@ class CardFraudCaseFraudEvent(BaseEvent): def __init__(self, id: str, created_at: datetime, status: str, decision: str, activity_type: str, expires_at: datetime, tags: Optional[Dict[str, str]], relationships: Optional[Dict[str, Relationship]]): BaseEvent.__init__(self, id, created_at, tags, relationships) - self.type = 'card.fraudCase.fraud' + self.type = 'cardFraudCase.fraud' self.attributes["status"] = status self.attributes["decision"] = decision self.attributes["activityType"] = activity_type @@ -308,7 +308,7 @@ class CardFraudCaseNoFraudEvent(BaseEvent): def __init__(self, id: str, created_at: datetime, status: str, decision: str, activity_type: str, expires_at: datetime, tags: Optional[Dict[str, str]], relationships: Optional[Dict[str, Relationship]]): BaseEvent.__init__(self, id, created_at, tags, relationships) - self.type = 'card.fraudCase.noFraud' + self.type = 'cardFraudCase.noFraud' self.attributes["status"] = status self.attributes["decision"] = decision self.attributes["activityType"] = activity_type