from typing import Dict, Any from mypy_boto3_mturk.literals import EventTypeType from pydantic import BaseModel, Field from jb.models.custom_types import AwareDatetimeISO, AMTBoto3ID class MTurkEvent(BaseModel): """ What AWS SNS will POST to our mturk_notifications endpoint (inside the request body) """ event_type: EventTypeType = Field( json_schema_extra={"example": "AssignmentSubmitted"} ) event_timestamp: AwareDatetimeISO = Field( json_schema_extra={"example": "2025-10-16T18:45:51Z"} ) amt_hit_id: AMTBoto3ID = Field( json_schema_extra={"example": "12345678901234567890"} ) amt_assignment_id: str = Field( max_length=64, json_schema_extra={"example": "1234567890123456789012345678901234567890"}, ) amt_hit_type_id: AMTBoto3ID = Field( json_schema_extra={"example": "09876543210987654321"} ) @classmethod def from_sns(cls, data: Dict[str, Any]): return cls.model_validate( { "event_type": data["EventType"], "event_timestamp": cls.fix_mturk_timestamp(data["EventTimestamp"]), "amt_hit_id": data["HITId"], "amt_assignment_id": data["AssignmentId"], "amt_hit_type_id": data["HITTypeId"], } ) @staticmethod def fix_mturk_timestamp(ts: str) -> str: if ts.endswith("Z") and "." not in ts: ts = ts[:-1] + ".000Z" return ts