fix(api): prevent circular reference in pattern create
This commit is contained in:
@@ -47,11 +47,23 @@ async def get_pattern(request, id):
|
|||||||
async def create_pattern(request):
|
async def create_pattern(request):
|
||||||
"""Create a new pattern."""
|
"""Create a new pattern."""
|
||||||
try:
|
try:
|
||||||
data = request.json or {}
|
payload = request.json or {}
|
||||||
name = data.get("name", "")
|
name = payload.get("name", "")
|
||||||
pattern_id = patterns.create(name, data.get("data", {}))
|
pattern_data = payload.get("data", {})
|
||||||
if data:
|
|
||||||
patterns.update(pattern_id, 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'}
|
return json.dumps(patterns.read(pattern_id)), 201, {'Content-Type': 'application/json'}
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return json.dumps({"error": str(e)}), 400
|
return json.dumps({"error": str(e)}), 400
|
||||||
|
|||||||
Reference in New Issue
Block a user