"""S3 response shapes. Plain dicts only — no DB, no Depends.""" def serialize_upload(result: dict) -> dict: """upload result → API dict. ``url`` is the stable private object address for DB.""" return { "bucket": result.get("bucket"), "key": result.get("key"), "url": result.get("url"), "content_type": result.get("content_type"), "size": result.get("size"), "filename": result.get("filename"), "source": result.get("source"), "record_id": result.get("record_id"), "owner_id": result.get("owner_id"), "access": "private", } def serialize_open(result: dict) -> dict: """Short-lived presigned GET for opening a private CV in the browser.""" return { "key": result.get("key"), "url": result.get("url"), "expires_in": result.get("expires_in"), } def serialize_delete(result: dict) -> dict: return { "bucket": result.get("bucket"), "key": result.get("key"), "deleted": bool(result.get("deleted")), } def serialize_health(result: dict) -> dict: return { "status": result.get("status") or "ok", "bucket": result.get("bucket"), "region": result.get("region"), "object_base_url": result.get("object_base_url") or result.get("public_base_url"), "access": result.get("access") or "private", "presign_expires_seconds": result.get("presign_expires_seconds"), }