diff --git a/app/routes/api.file-upload.tsx b/app/routes/api.file-upload.tsx deleted file mode 100644 index d104fbb..0000000 --- a/app/routes/api.file-upload.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { json, type ActionFunctionArgs } from '@remix-run/node'; -import { difyClient } from '../services/dify-client.server'; -import { getSessionInfo, commitSession } from '../utils/session.server'; - -export async function action({ request }: ActionFunctionArgs) { - try { - const { user, session } = await getSessionInfo(request); - - // console.log('💬 File Upload API - User:', user); - - // 从请求中获取文件 - const formData = await request.formData(); - const file = formData.get('file') as File; - - if (!file) { - return json({ error: '没有找到文件' }, { status: 400 }); - } - - // 获取文件内容 - const fileBuffer = await file.arrayBuffer(); - - // 这里需要在dify-client.server.ts中添加上传文件的方法 - // 目前我们返回一个临时响应 - // TODO: 实现文件上传功能 - - // 构造模拟响应 - const uploadId = `upload_${Date.now()}`; - - // console.log('✅ File Upload API - Success:', { id: uploadId, fileName: file.name, size: file.size }); - - return json({ id: uploadId }, { - headers: { - 'Set-Cookie': await commitSession(session), - }, - }); - } catch (error: any) { - console.error('❌ File Upload API - Error:', error); - return json( - { - error: error.message || '文件上传失败' - }, - { - status: 500, - headers: { - 'Set-Cookie': await commitSession((await getSessionInfo(request)).session), - }, - } - ); - } -} \ No newline at end of file diff --git a/app/routes/api.messages.tsx b/app/routes/api.messages.tsx deleted file mode 100644 index 1c898b2..0000000 --- a/app/routes/api.messages.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import { json, type LoaderFunctionArgs } from '@remix-run/node'; -import { difyClient } from '../services/dify-client.server'; -import { getSessionInfo, commitSession } from '../utils/session.server'; - -export async function loader({ request }: LoaderFunctionArgs) { - try { - // 获取用户会话信息和 JWT - const { getUserSession } = await import("~/api/login/auth.server"); - const { frontendJWT } = await getUserSession(request); - const { session } = await getSessionInfo(request); - const url = new URL(request.url); - const conversationId = url.searchParams.get('conversation_id'); - - if (!conversationId) { - return json( - { error: 'conversation_id is required' }, - { status: 400 } - ); - } - - // 检查 JWT 是否存在 - if (!frontendJWT) { - console.error('❌ [API] Messages API - JWT不存在'); - return json( - { error: 'JWT认证失败,请重新登录' }, - { - status: 401, - headers: { - 'Set-Cookie': await commitSession(session), - }, - } - ); - } - - console.log('📨 [API] Messages API - 获取会话消息:', { - conversationId, - hasJWT: !!frontendJWT - }); - - const data = await difyClient.getConversationMessages(conversationId, frontendJWT); - - console.log('✅ [API] Messages API - Success'); - - return json(data, { - headers: { - 'Set-Cookie': await commitSession(session), - }, - }); - } catch (error: any) { - console.error('❌ [API] Messages API - Error:', error); - - // 检查是否是JWT认证失败 - const status = error.message?.includes('JWT认证失败') ? 401 : 500; - - return json( - { error: error.message || 'Failed to fetch messages' }, - { - status, - headers: { - 'Set-Cookie': await commitSession((await getSessionInfo(request)).session), - }, - } - ); - } -} \ No newline at end of file diff --git a/app/routes/api.oauth.token.tsx b/app/routes/api.oauth.token.tsx deleted file mode 100644 index a0e6328..0000000 --- a/app/routes/api.oauth.token.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { type ActionFunctionArgs, json } from "@remix-run/node"; -import { OAuthClient } from "~/api/login/oauth-client"; -import { getServerOAuthConfigRuntime } from "~/config/oauth-secret.server"; - -/** - * 这个Action作为获取OAuth Access Token的服务器端代理。 - * 它接收来自前端回调的`code`,然后在后端安全地换取令牌, - * 以避免在网络策略限制服务器直接访问外部服务时出现问题。 - */ -export async function action({ request }: ActionFunctionArgs) { - // 1. 只允许POST请求 - if (request.method !== "POST") { - return json({ success: false, error: "Method Not Allowed" }, { status: 405 }); - } - - try { - // 2. 从请求体中获取`code` - const { code } = await request.json(); - - if (!code || typeof code !== 'string') { - return json({ success: false, error: "Missing or invalid 'code' in request body" }, { status: 400 }); - } - - console.log("🔧 [/api/oauth/token] 收到代理请求, code:", code ? `${code.substring(0, 10)}...` : null); - - // 3. 在服务器端使用OAuthClient安全地获取访问令牌 - // 🔒 安全:从 .server.ts 文件运行时读取配置,确保环境变量正确加载 - const oauthClient = new OAuthClient(getServerOAuthConfigRuntime()); - const tokenResponse = await oauthClient.getAccessToken(code); - - // 4. 处理来自IDaaS服务器的响应 - if (!tokenResponse) { - console.error("❌ [/api/oauth/token] 从IDaaS获取访问令牌失败。"); - // 502 Bad Gateway 表示上游服务器(IDaaS)响应无效 - return json({ success: false, error: "Failed to get access token from IDaaS" }, { status: 502 }); - } - - console.log("✅ [/api/oauth/token] 已通过代理成功获取令牌。"); - - // 5. 将成功的令牌响应返回给调用方 (callback.tsx) - return json({ success: true, ...tokenResponse }); - - } catch (error) { - console.error("❌ [/api/oauth/token] 代理API发生意外错误:", error); - const errorMessage = error instanceof Error ? error.message : "An unknown error occurred."; - return json({ success: false, error: "Proxy internal error", details: errorMessage }, { status: 500 }); - } -} \ No newline at end of file diff --git a/app/routes/api.oauth.userinfo.tsx b/app/routes/api.oauth.userinfo.tsx deleted file mode 100644 index fcb761a..0000000 --- a/app/routes/api.oauth.userinfo.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { type ActionFunctionArgs, json } from "@remix-run/node"; -import { OAuthClient } from "~/api/login/oauth-client"; -import { getServerOAuthConfigRuntime } from "~/config/oauth-secret.server"; - -/** - * 这个Action作为获取用户信息的服务器端代理。 - * 它接收来自前端的`access_token`,然后在后端安全地获取用户信息。 - */ -export async function action({ request }: ActionFunctionArgs) { - if (request.method !== "POST") { - return json({ success: false, error: "Method Not Allowed" }, { status: 405 }); - } - - try { - const { accessToken } = await request.json(); - - if (!accessToken || typeof accessToken !== 'string') { - return json({ success: false, error: "Missing or invalid 'accessToken' in request body" }, { status: 400 }); - } - - console.log("🔧 [/api/oauth/userinfo] 收到代理请求。"); - - // 🔒 安全:从 .server.ts 文件运行时读取配置 - const oauthClient = new OAuthClient(getServerOAuthConfigRuntime()); - const userInfoResponse = await oauthClient.getUserInfo(accessToken); - - if (!userInfoResponse || !userInfoResponse.success) { - console.error("❌ [/api/oauth/userinfo] 从IDaaS获取用户信息失败。"); - return json({ success: false, error: "Failed to get user info from IDaaS" }, { status: 502 }); - } - - console.log("✅ [/api/oauth/userinfo] 已通过代理成功获取用户信息。"); - - return json({ success: true, data: userInfoResponse.data }); - - } catch (error) { - console.error("❌ [/api/oauth/userinfo] 代理API发生意外错误:", error); - const errorMessage = error instanceof Error ? error.message : "An unknown error occurred."; - return json({ success: false, error: "Proxy internal error", details: errorMessage }, { status: 500 }); - } -} \ No newline at end of file