From 1940e33bc778b321108116cdf7b557af772c21e4 Mon Sep 17 00:00:00 2001 From: Vishesh 'ironeagle' Bangotra Date: Sun, 12 Jul 2026 23:53:42 +0530 Subject: [PATCH] nested schema fixes --- openapi_first/templates/vet_app/openapi.yaml | 24 ++++++++++---------- openapi_first/templates/vet_app/routes.py | 4 ++-- openapi_first/templates/vet_app/sse.py | 16 ++++++++----- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/openapi_first/templates/vet_app/openapi.yaml b/openapi_first/templates/vet_app/openapi.yaml index 494ceec..6ddd926 100644 --- a/openapi_first/templates/vet_app/openapi.yaml +++ b/openapi_first/templates/vet_app/openapi.yaml @@ -190,19 +190,19 @@ components: x-label: "Complications" required: [noteType, surgeryType] - Call: + Action: type: object x-primary-key: _received_at - x-display-format: "{sound}" - x-list-columns: [sound] + x-display-format: "{action}" + x-list-columns: [action] properties: - sound: + action: type: string - enum: [woof, meow, coo] - x-label: "Sound" + enum: [wagging_tail, blep, stretching, showing_belly, barking, panting, purring, kneading, head_tilt, chirping, wing_flap] + x-label: "Action" x-order: 1 x-filterable: false - required: [sound] + required: [action] Parent: type: object @@ -1058,10 +1058,10 @@ paths: $ref: '#/components/responses/ValidationError' '500': $ref: '#/components/responses/InternalServerError' - /pets/{id}/calls: + /pets/{id}/actions: get: - summary: Stream animal sounds via SSE, scoped to a pet's species - operationId: stream_calls + summary: Stream animal actions via SSE, scoped to a pet's species + operationId: stream_actions x-sse: true parameters: - name: id @@ -1070,11 +1070,11 @@ paths: schema: {type: integer} responses: '200': - description: SSE stream of random animal sounds + description: SSE stream of random animal actions (behaviors) content: text/event-stream: schema: - $ref: '#/components/schemas/Call' + $ref: '#/components/schemas/Action' /appointments: get: diff --git a/openapi_first/templates/vet_app/routes.py b/openapi_first/templates/vet_app/routes.py index 848fee6..22be04c 100644 --- a/openapi_first/templates/vet_app/routes.py +++ b/openapi_first/templates/vet_app/routes.py @@ -369,8 +369,8 @@ def delete_appointment(id: int, response: Response): response.status_code = 204 -async def stream_calls(id: int): - """Stream animal sounds via SSE, scoped to a pet's species.""" +async def stream_actions(id: int): + """Stream animal actions via SSE, scoped to a pet's species.""" try: pet = _get_pet(id) except KeyError: diff --git a/openapi_first/templates/vet_app/sse.py b/openapi_first/templates/vet_app/sse.py index 1dcc5fa..c688165 100644 --- a/openapi_first/templates/vet_app/sse.py +++ b/openapi_first/templates/vet_app/sse.py @@ -2,16 +2,20 @@ import asyncio import random import json -_sounds_by_species = {"dog": ["woof"], "cat": ["meow"], "bird": ["coo"]} +_behaviors_by_species = { + "dog": ["wagging_tail", "stretching", "showing_belly", "barking", "panting"], + "cat": ["blep", "stretching", "showing_belly", "purring", "kneading"], + "bird": ["head_tilt", "stretching", "chirping", "wing_flap"], +} _subscribers: dict[int, list[asyncio.Queue]] = {} _worker_tasks: dict[int, asyncio.Task] = {} -async def _sound_worker(pet_id: int, species: str): - sounds = _sounds_by_species.get(species, ["woof"]) +async def _behavior_worker(pet_id: int, species: str): + behaviors = _behaviors_by_species.get(species, ["wagging_tail"]) while True: - sound = random.choice(sounds) - data = json.dumps({"sound": sound}) + action = random.choice(behaviors) + data = json.dumps({"action": action}) queues = _subscribers.get(pet_id, []) for q in queues: await q.put(data) @@ -22,7 +26,7 @@ def _ensure_worker(pet_id: int, species: str): if pet_id not in _worker_tasks or _worker_tasks[pet_id].done(): _subscribers.setdefault(pet_id, []) _worker_tasks[pet_id] = asyncio.create_task( - _sound_worker(pet_id, species) + _behavior_worker(pet_id, species) )