From 43d494bcb9129bb566c9a6156fd2e3c67ba40c5b Mon Sep 17 00:00:00 2001 From: pi Date: Thu, 26 Mar 2026 00:40:08 +1300 Subject: [PATCH] fix(api): prevent circular reference in pattern create --- src/controllers/pattern.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/controllers/pattern.py b/src/controllers/pattern.py index 510f468..dc0cf37 100644 --- a/src/controllers/pattern.py +++ b/src/controllers/pattern.py @@ -47,11 +47,23 @@ async def get_pattern(request, id): async def create_pattern(request): """Create a new pattern.""" try: - data = request.json or {} - name = data.get("name", "") - pattern_id = patterns.create(name, data.get("data", {})) - if data: - patterns.update(pattern_id, data) + payload = request.json or {} + name = payload.get("name", "") + pattern_data = payload.get("data", {}) + + # IMPORTANT: + # `patterns.create()` stores `pattern_data` as the underlying dict value. + # If we then call `patterns.update(pattern_id, payload)` with the full + # request object, it may assign `payload["data"]` back onto that same + # dict object, creating a circular reference (json.dumps fails). + pattern_id = patterns.create(name, pattern_data) + + # Only merge "extra" metadata fields (anything except name/data). + extra = dict(payload) + extra.pop("name", None) + extra.pop("data", None) + if extra: + patterns.update(pattern_id, extra) return json.dumps(patterns.read(pattern_id)), 201, {'Content-Type': 'application/json'} except Exception as e: return json.dumps({"error": str(e)}), 400