fix(export): one attacker per line in exported JSON

This commit is contained in:
2026-04-30 10:45:03 -04:00
parent 2ddba04f79
commit bbb1762250

View File

@@ -73,20 +73,24 @@ async def export_attackers(
""" """
rows = await repo.get_all_attackers_for_export() rows = await repo.get_all_attackers_for_export()
observations = [_shape_observation(r) for r in rows] observations = [_shape_observation(r) for r in rows]
payload = { def _dump(obj: object) -> str:
return json.dumps(obj, default=str, ensure_ascii=False, separators=(',', ':'))
meta = _dump({
"export_metadata": { "export_metadata": {
"source": _SOURCE, "source": _SOURCE,
"version": _SCHEMA_VERSION, "version": _SCHEMA_VERSION,
"exported_at": datetime.now(timezone.utc).isoformat().replace("+00:00", "Z"), "exported_at": datetime.now(timezone.utc).isoformat().replace("+00:00", "Z"),
"total_records": len(observations), "total_records": len(observations),
"schema_version": _SCHEMA_VERSION, "schema_version": _SCHEMA_VERSION,
}, }
"observations": observations, })
} obs_lines = ",\n".join(_dump(o) for o in observations)
content = f'{meta[:-1]},"observations":[\n{obs_lines}\n]}}'
ts = datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%SZ") ts = datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%SZ")
filename = f"decnet-export-{ts}.json" filename = f"decnet-export-{ts}.json"
return Response( return Response(
content=json.dumps(payload, default=str, ensure_ascii=False, indent=2), content=content,
media_type="application/json", media_type="application/json",
headers={"Content-Disposition": f'attachment; filename="{filename}"'}, headers={"Content-Disposition": f'attachment; filename="{filename}"'},
) )