Skip to content

Commit 205799f

Browse files
committed
metadata (domain vs. avro vs. pydantic) fixes
1 parent 726276e commit 205799f

File tree

21 files changed

+96
-45
lines changed

21 files changed

+96
-45
lines changed

backend/app/api/routes/events.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from app.core.utils import get_client_ip
1313
from app.domain.enums.common import SortOrder
1414
from app.domain.events.event_models import EventFilter
15-
from app.infrastructure.kafka.events.metadata import EventMetadata
15+
from app.infrastructure.kafka.events.metadata import AvroEventMetadata as EventMetadata
1616
from app.schemas_pydantic.events import (
1717
DeleteEventResponse,
1818
EventAggregationRequest,

backend/app/api/routes/execution.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from app.domain.enums.execution import ExecutionStatus
1515
from app.domain.enums.user import UserRole
1616
from app.infrastructure.kafka.events.base import BaseEvent
17-
from app.infrastructure.kafka.events.metadata import EventMetadata
17+
from app.infrastructure.kafka.events.metadata import AvroEventMetadata as EventMetadata
1818
from app.schemas_pydantic.execution import (
1919
CancelExecutionRequest,
2020
CancelResponse,

backend/app/api/routes/user_settings.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ async def update_user_settings(
4646
timezone=updates.timezone,
4747
date_format=updates.date_format,
4848
time_format=updates.time_format,
49-
notifications=DomainNotificationSettings(**updates.notifications.model_dump()) if updates.notifications else None,
49+
notifications=(
50+
DomainNotificationSettings(**updates.notifications.model_dump()) if updates.notifications else None
51+
),
5052
editor=DomainEditorSettings(**updates.editor.model_dump()) if updates.editor else None,
5153
custom_settings=updates.custom_settings,
5254
)

backend/app/db/repositories/admin/admin_events_repository.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from dataclasses import asdict
12
from datetime import datetime, timedelta, timezone
23
from typing import Any, Dict, List
34

@@ -362,9 +363,7 @@ async def get_events_preview_for_replay(self, query: Dict[str, Any], limit: int
362363
summaries: List[Dict[str, Any]] = []
363364
for doc in event_docs:
364365
summary = self.summary_mapper.from_mongo_document(doc)
365-
summary_dict = self.summary_mapper.to_dict(summary)
366-
# Convert EventFields enum keys to strings
367-
summaries.append({str(k): v for k, v in summary_dict.items()})
366+
summaries.append(asdict(summary))
368367

369368
return summaries
370369

backend/app/domain/events/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from app.domain.events.event_metadata import EventMetadata
12
from app.domain.events.event_models import (
23
ArchivedEvent,
34
Event,
@@ -12,7 +13,6 @@
1213
EventStatistics,
1314
ExecutionEventsResult,
1415
)
15-
from app.infrastructure.kafka.events.metadata import EventMetadata
1616

1717
__all__ = [
1818
"ArchivedEvent",
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
from dataclasses import asdict, dataclass, field, replace
2+
from typing import Any
3+
from uuid import uuid4
4+
5+
from app.domain.enums.common import Environment
6+
7+
8+
@dataclass
9+
class EventMetadata:
10+
"""Domain event metadata for auditing and tracing."""
11+
12+
service_name: str
13+
service_version: str
14+
correlation_id: str = field(default_factory=lambda: str(uuid4()))
15+
user_id: str | None = None
16+
ip_address: str | None = None
17+
user_agent: str | None = None
18+
environment: Environment = Environment.PRODUCTION
19+
20+
def to_dict(self, exclude_none: bool = True) -> dict[str, Any]:
21+
result = asdict(self)
22+
if isinstance(result.get("environment"), Environment):
23+
result["environment"] = result["environment"].value
24+
if exclude_none:
25+
return {k: v for k, v in result.items() if v is not None}
26+
return result
27+
28+
@classmethod
29+
def from_dict(cls, data: dict[str, Any]) -> "EventMetadata":
30+
env = data.get("environment", Environment.PRODUCTION)
31+
if isinstance(env, str):
32+
env = Environment(env)
33+
return cls(
34+
service_name=data.get("service_name", "unknown"),
35+
service_version=data.get("service_version", "1.0"),
36+
correlation_id=data.get("correlation_id", str(uuid4())),
37+
user_id=data.get("user_id"),
38+
ip_address=data.get("ip_address"),
39+
user_agent=data.get("user_agent"),
40+
environment=env,
41+
)
42+
43+
def with_correlation(self, correlation_id: str) -> "EventMetadata":
44+
return replace(self, correlation_id=correlation_id)
45+
46+
def with_user(self, user_id: str) -> "EventMetadata":
47+
return replace(self, user_id=user_id)

backend/app/domain/events/event_models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
from app.core.utils import StringEnum
66
from app.domain.enums.events import EventType
7-
from app.infrastructure.kafka.events.metadata import EventMetadata
7+
from app.domain.events.event_metadata import EventMetadata
88

99
MongoQueryValue = str | dict[str, str | list[str] | float | datetime]
1010
MongoQuery = dict[str, MongoQueryValue]

backend/app/infrastructure/kafka/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
"""Kafka infrastructure for event-driven architecture."""
22

33
from app.infrastructure.kafka.events.base import BaseEvent
4-
from app.infrastructure.kafka.events.metadata import EventMetadata
4+
from app.infrastructure.kafka.events.metadata import AvroEventMetadata
55
from app.infrastructure.kafka.mappings import get_event_class_for_type, get_topic_for_event
66
from app.infrastructure.kafka.topics import get_all_topics, get_topic_configs
77

88
__all__ = [
99
"BaseEvent",
10-
"EventMetadata",
10+
"AvroEventMetadata",
1111
"get_all_topics",
1212
"get_topic_configs",
1313
"get_event_class_for_type",

backend/app/infrastructure/kafka/events/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
ExecutionStartedEvent,
1111
ExecutionTimeoutEvent,
1212
)
13-
from app.infrastructure.kafka.events.metadata import EventMetadata
13+
from app.infrastructure.kafka.events.metadata import AvroEventMetadata
1414
from app.infrastructure.kafka.events.notification import (
1515
NotificationClickedEvent,
1616
NotificationCreatedEvent,
@@ -70,7 +70,7 @@
7070
__all__ = [
7171
# Base
7272
"BaseEvent",
73-
"EventMetadata",
73+
"AvroEventMetadata",
7474
# Execution
7575
"ExecutionRequestedEvent",
7676
"ExecutionAcceptedEvent",

backend/app/infrastructure/kafka/events/base.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from app.domain.enums.events import EventType
99
from app.domain.enums.kafka import KafkaTopic
10-
from app.infrastructure.kafka.events.metadata import EventMetadata
10+
from app.infrastructure.kafka.events.metadata import AvroEventMetadata
1111

1212

1313
class BaseEvent(AvroBase):
@@ -18,7 +18,7 @@ class BaseEvent(AvroBase):
1818
event_version: str = "1.0"
1919
timestamp: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
2020
aggregate_id: str | None = None
21-
metadata: EventMetadata
21+
metadata: AvroEventMetadata
2222

2323
# Each subclass must define its topic
2424
topic: ClassVar[KafkaTopic]

0 commit comments

Comments
 (0)