|
1 | | -from typing import Any, List, Tuple, Union |
| 1 | +from typing import Dict, List, Tuple, Union |
| 2 | +from uuid import uuid4 |
2 | 3 |
|
3 | | -from src.entities.events import Event |
| 4 | +from src.entities.events import Event, EVENT_CLASSES |
4 | 5 | from src.entities.metrics import Metric |
5 | 6 | from src.usecases.event_functions import EVENT_FUNCTIONS |
6 | 7 |
|
| 8 | +def _convert_payload_to_event( |
| 9 | + payload: Dict, aggregate_version: int |
| 10 | +) -> Event: |
| 11 | + try: |
| 12 | + event_type = payload["event_type"] |
| 13 | + aggregate_id = payload["aggregate_id"] |
| 14 | + event_payload = payload.copy() |
| 15 | + for key in ["event_type", "aggregate_id"]: |
| 16 | + event_payload.pop(key, None) |
| 17 | + event_class, payload_class = EVENT_CLASSES[event_type] |
| 18 | + return event_class( |
| 19 | + aggregate_id=aggregate_id, |
| 20 | + aggregate_version=aggregate_version + 1, |
| 21 | + event_id=str(uuid4()), |
| 22 | + payload=payload_class(**event_payload) |
| 23 | + ) |
| 24 | + except Exception as err: |
| 25 | + return err |
7 | 26 |
|
8 | 27 | def handle_event( |
9 | | - payload: Any, aggregate_events: List[Event] |
| 28 | + payload: Dict, aggregate_events: List[Event] |
10 | 29 | ) -> Union[Exception, Tuple[Event, List[Metric]]]: |
11 | 30 | if "event_type" in payload: |
12 | | - if payload["event_type"] in EVENT_FUNCTIONS: |
13 | | - event, metrics = EVENT_FUNCTIONS[payload["event_type"]]( |
14 | | - payload, aggregate_events |
15 | | - ) |
16 | | - return (event, metrics) |
| 31 | + event_type = payload["event_type"] |
| 32 | + if event_type in EVENT_CLASSES: |
| 33 | + event = _convert_payload_to_event(payload, len(aggregate_events)) |
| 34 | + if event_type in EVENT_FUNCTIONS: |
| 35 | + event, metrics = EVENT_FUNCTIONS[event_type]( |
| 36 | + event, aggregate_events |
| 37 | + ) |
| 38 | + return (event, metrics) |
| 39 | + else: |
| 40 | + return Exception(f"No event type function defined: {event_type}") |
17 | 41 | else: |
18 | | - return Exception(f"Unknown event type {payload['event_type']}") |
| 42 | + return Exception(f"Unknown event type {event_type}") |
19 | 43 | return Exception("Malformed event with no event_type") |
0 commit comments