feat(api): PhoneCallOut 暴露 record_media_hash
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -217,6 +217,8 @@ class PhoneCallOut(BaseModel):
|
|||||||
# OSS URL of the call recording — surfaced so the Calls view can offer a
|
# OSS URL of the call recording — surfaced so the Calls view can offer a
|
||||||
# "播放录音" action when present.
|
# "播放录音" action when present.
|
||||||
record_file: str | None = None
|
record_file: str | None = None
|
||||||
|
# sha256 media_hash of the localized recording (NULL until downloaded).
|
||||||
|
record_media_hash: str | None = None
|
||||||
raw_json: dict[str, Any] | None = None
|
raw_json: dict[str, Any] | None = None
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -252,3 +252,42 @@ async def test_record_file_serializes(make_client):
|
|||||||
# c1/c2 have no record_file set -> None.
|
# c1/c2 have no record_file set -> None.
|
||||||
assert by_id["c1"]["record_file"] is None
|
assert by_id["c1"]["record_file"] is None
|
||||||
assert by_id["c2"]["record_file"] is None
|
assert by_id["c2"]["record_file"] is None
|
||||||
|
|
||||||
|
|
||||||
|
async def test_record_media_hash_serializes(make_client):
|
||||||
|
"""``record_media_hash`` (sha256 of the localized recording) round-trips so
|
||||||
|
the frontend can detect already-downloaded files — present when set, None
|
||||||
|
until the sync pass localizes the recording.
|
||||||
|
"""
|
||||||
|
|
||||||
|
async def seed(session: AsyncSession) -> None:
|
||||||
|
await _seed(session)
|
||||||
|
session.add(
|
||||||
|
PhoneCall(
|
||||||
|
call_id="c_hash",
|
||||||
|
channel="phone_call",
|
||||||
|
user_id="u1",
|
||||||
|
user_id_name="Alice",
|
||||||
|
start_call_time=8000,
|
||||||
|
call_duration=10,
|
||||||
|
call_status=1,
|
||||||
|
incoming_call=0,
|
||||||
|
record_media_hash="abc123",
|
||||||
|
)
|
||||||
|
)
|
||||||
|
await session.commit()
|
||||||
|
|
||||||
|
client = await make_client(seed)
|
||||||
|
r = await client.get("/api/calls", params={"user_id": "u1", "start": 8000})
|
||||||
|
assert r.status_code == 200
|
||||||
|
body = r.json()
|
||||||
|
assert body["total"] == 1
|
||||||
|
assert body["items"][0]["call_id"] == "c_hash"
|
||||||
|
assert body["items"][0]["record_media_hash"] == "abc123"
|
||||||
|
|
||||||
|
# Rows without an explicit hash serialize as JSON null.
|
||||||
|
r_all = await client.get("/api/calls")
|
||||||
|
by_id = {it["call_id"]: it for it in r_all.json()["items"]}
|
||||||
|
assert by_id["c1"]["record_media_hash"] is None
|
||||||
|
assert by_id["c2"]["record_media_hash"] is None
|
||||||
|
assert by_id["c3"]["record_media_hash"] is None
|
||||||
|
|||||||
Reference in New Issue
Block a user