34 lines
1.3 KiB
Python
34 lines
1.3 KiB
Python
from __future__ import annotations
|
|
|
|
from sanic import response
|
|
from sqlalchemy import select
|
|
|
|
from app.core.models.content_v3 import EncryptedContent, ContentDerivative
|
|
from app.core._config import PROJECT_HOST
|
|
|
|
|
|
async def s_api_v1_content_derivatives(request):
|
|
cid = request.args.get('cid')
|
|
if not cid:
|
|
return response.json({"error": "BAD_REQUEST"}, status=400)
|
|
session = request.ctx.db_session
|
|
ec = (await session.execute(select(EncryptedContent).where(EncryptedContent.encrypted_cid == cid))).scalars().first()
|
|
if not ec:
|
|
return response.json({"error": "NOT_FOUND"}, status=404)
|
|
rows = (await session.execute(select(ContentDerivative).where(ContentDerivative.content_id == ec.id))).scalars().all()
|
|
out = []
|
|
for r in rows:
|
|
# Derive /api/v1.5/storage/<hash> from local_path if possible
|
|
path_hash = (r.local_path or '').split('/')[-1]
|
|
storage_url = f"{PROJECT_HOST}/api/v1.5/storage/{path_hash}" if path_hash else None
|
|
out.append({
|
|
'kind': r.kind,
|
|
'interval': [r.interval_start_ms, r.interval_end_ms] if r.interval_start_ms is not None else None,
|
|
'content_type': r.content_type,
|
|
'size_bytes': r.size_bytes,
|
|
'status': r.status,
|
|
'url': storage_url,
|
|
})
|
|
return response.json({'cid': cid, 'derivatives': out})
|
|
|