""" Webhook Event Types and Payload Builders Defines the canonical event types and helper functions to build well-structured payloads for each event. """ import datetime # Event type constants ANNOTATION_CREATED = "annotation.created" ANNOTATION_UPDATED = "annotation.updated" ITEM_FULLY_ANNOTATED = "item.fully_annotated" TASK_COMPLETED = "task.completed" USER_PHASE_COMPLETED = "user.phase_completed" QUALITY_ATTENTION_CHECK_FAILED = "quality.attention_check_failed" ALL_EVENTS = [ ANNOTATION_CREATED, ANNOTATION_UPDATED, ITEM_FULLY_ANNOTATED, TASK_COMPLETED, USER_PHASE_COMPLETED, QUALITY_ATTENTION_CHECK_FAILED, ] def _now_iso(): return datetime.datetime.utcnow().isoformat() + "Z" def build_annotation_payload(event_type, user_id, instance_id, annotations, schema_name=None): """Build payload for annotation.created / annotation.updated.""" return { "event": event_type, "timestamp": _now_iso(), "data": { "user_id": user_id, "instance_id": instance_id, "annotations": annotations, "schema_name": schema_name, }, } def build_item_fully_annotated_payload(instance_id, annotator_count, required_count): """Build payload for item.fully_annotated.""" return { "event": ITEM_FULLY_ANNOTATED, "timestamp": _now_iso(), "data": { "instance_id": instance_id, "annotator_count": annotator_count, "required_count": required_count, }, } def build_task_completed_payload(user_id, total_annotations): """Build payload for task.completed.""" return { "event": TASK_COMPLETED, "timestamp": _now_iso(), "data": { "user_id": user_id, "total_annotations": total_annotations, }, } def build_phase_completed_payload(user_id, phase_name, next_phase=None): """Build payload for user.phase_completed.""" return { "event": USER_PHASE_COMPLETED, "timestamp": _now_iso(), "data": { "user_id": user_id, "completed_phase": phase_name, "next_phase": next_phase, }, } def build_attention_check_failed_payload(user_id, instance_id, message=None, blocked=False): """Build payload for quality.attention_check_failed.""" return { "event": QUALITY_ATTENTION_CHECK_FAILED, "timestamp": _now_iso(), "data": { "user_id": user_id, "instance_id": instance_id, "message": message, "blocked": blocked, }, }