feat: ingest HTTP 201/409 for event_id idempotency
- Validate UUID format; log created/duplicate/rejected - Tests for 201, 409, 422; update agent-integration and work-plan - Docs: neutral IDE wording (no product-specific editor names)
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.exc import IntegrityError
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.models import Event, Host
|
||||
@@ -85,5 +86,12 @@ def ingest_event(db: Session, payload: dict) -> tuple[Event, bool]:
|
||||
payload=payload,
|
||||
)
|
||||
db.add(event)
|
||||
db.flush()
|
||||
try:
|
||||
db.flush()
|
||||
except IntegrityError:
|
||||
db.rollback()
|
||||
raced = db.scalar(select(Event).where(Event.event_id == event_id))
|
||||
if raced is not None:
|
||||
return raced, False
|
||||
raise
|
||||
return event, True
|
||||
|
||||
@@ -15,7 +15,7 @@ def get_event_validator() -> Draft202012Validator:
|
||||
path = Path(__file__).resolve().parents[3] / "schemas" / "event-schema-v1.json"
|
||||
schema = json.loads(path.read_text(encoding="utf-8"))
|
||||
Draft202012Validator.check_schema(schema)
|
||||
return Draft202012Validator(schema)
|
||||
return Draft202012Validator(schema, format_checker=Draft202012Validator.FORMAT_CHECKER)
|
||||
|
||||
|
||||
def validate_event_payload(payload: dict) -> list[str]:
|
||||
|
||||
Reference in New Issue
Block a user