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)