/** * Collabora 配置生成 API 路由 * * 功能: * - 生成 Collabora iframe URL * - 生成 WOPI access token * - 返回完整的 Collabora 配置 * * @encoding UTF-8 */ import { type LoaderFunctionArgs, json } from '@remix-run/node'; import { getUserSession } from '~/api/login/auth.server'; import { generateCollaboraConfig } from '~/services/collabora.config.server'; /** * GET /api/collabora/config * * 查询参数: * - fileId: 文件路径(例如:contracts/test.docx) * - mode: 模式(view 或 edit),默认 view * - userId: 用户 ID(可选,从 session 获取) * - userName: 用户名(可选,从 session 获取) */ export async function loader({ request }: LoaderFunctionArgs) { try { // 获取用户会话信息和 frontendJWT const { userInfo, frontendJWT } = await getUserSession(request); // 解析查询参数 const url = new URL(request.url); const fileId = url.searchParams.get('fileId'); const mode = (url.searchParams.get('mode') || 'view') as 'view' | 'edit'; const userId = url.searchParams.get('userId') || userInfo?.sub || 'guest'; const userName = url.searchParams.get('userName') || userInfo?.nick_name || '访客'; // 验证必需参数 if (!fileId) { return json( { error: '文件路径不能为空' }, { status: 400 } ); } // 验证 frontendJWT if (!frontendJWT) { return json( { error: '用户未认证' }, { status: 401 } ); } // 生成 Collabora 配置 const config = await generateCollaboraConfig({ fileId, mode, userId, userName, frontendJWT, }); return json(config); } catch (error) { console.error('生成 Collabora 配置失败:', error); return json( { error: error instanceof Error ? error.message : '生成配置失败', }, { status: 500 } ); } }