nested schema fixes

This commit is contained in:
2026-07-12 23:53:42 +05:30
parent 5da0a688a8
commit 1940e33bc7
3 changed files with 24 additions and 20 deletions

View File

@@ -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:

View File

@@ -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:

View File

@@ -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)
)