Files
dataelement--bisheng/src/backend/bisheng/api/v1/report.py
T
2026-07-13 13:36:36 +08:00

92 lines
3.5 KiB
Python

import jwt
from fastapi import APIRouter, Body, HTTPException
from loguru import logger
from sqlalchemy import or_
from sqlmodel import select
from bisheng.api.v1.schemas import resp_200
from bisheng.common.services.config_service import settings as bisheng_settings
from bisheng.core.database import get_sync_db_session
from bisheng.core.storage.minio.minio_manager import get_minio_storage
from bisheng.database.models.report import Report
from bisheng.utils import generate_uuid
from bisheng_langchain.utils.requests import Requests
# build router
router = APIRouter(prefix='/report', tags=['report'])
mino_prefix = 'report/'
@router.post('/office_token')
async def get_office_token(payload: dict = Body(...)):
"""Sign the OnlyOffice editorConfig with JWT secret and return the token."""
secret = bisheng_settings.get_from_db('office_jwt_secret') or ''
if not secret:
return resp_200({'token': ''})
token = jwt.encode(payload, secret, algorithm='HS256')
return resp_200({'token': token})
@router.post('/callback')
async def callback(data: dict):
status = data.get('status')
file_url = data.get('url')
key = data.get('key')
logger.debug(f'calback={data}')
if status in {2, 6}:
# Save Back
logger.info(f'office_callback url={file_url}')
file = Requests().get(url=file_url)
object_name = mino_prefix + key + '.docx'
minio_client = await get_minio_storage()
await minio_client.put_object(bucket_name=minio_client.bucket,
object_name=object_name, file=file._content,
content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document') # noqa
# Duplicate save,key Data Update Error
with get_sync_db_session() as session:
db_report = session.exec(
select(Report).where(or_(Report.version_key == key,
Report.newversion_key == key))).first()
if not db_report:
logger.error(f'report_callback cannot find the flow_id flow_id={key}')
raise HTTPException(status_code=500, detail='cannot find the flow_id')
db_report.object_name = object_name
db_report.version_key = key
db_report.newversion_key = None
with get_sync_db_session() as session:
session.add(db_report)
session.commit()
return {'error': 0}
@router.get('/report_temp')
async def get_template(*, flow_id: str):
with get_sync_db_session() as session:
db_report = session.exec(
select(Report).where(Report.flow_id == flow_id,
Report.del_yn == 0).order_by(Report.update_time.desc())).first()
file_url = ''
if not db_report:
db_report = Report(flow_id=flow_id)
elif db_report.object_name:
minio_client = await get_minio_storage()
file_url = await minio_client.get_share_link(db_report.object_name, clear_host=False)
if not db_report.newversion_key or not db_report.object_name:
version_key = generate_uuid()
db_report.newversion_key = version_key
with get_sync_db_session() as session:
session.add(db_report)
session.commit()
session.refresh(db_report)
else:
version_key = db_report.newversion_key
res = {
'flow_id': flow_id,
'temp_url': file_url,
'original_version': db_report.version_key,
'version_key': version_key,
}
return resp_200(res)