Files
upage-git/app/routes/api.1panel.$action/auth.server.ts

52 lines
1.8 KiB
TypeScript

import { type ActionFunctionArgs } from '@remix-run/node';
import { delete1PanelConnectionSettings, save1PanelConnectionSettings } from '~/.server/service/connection-settings';
import { errorResponse, successResponse } from '~/.server/utils/api-response';
import { getWebsiteList } from '~/routes/api.1panel.$action/1panel.server';
import { createScopedLogger } from '~/utils/logger';
const logger = createScopedLogger('api.1panel.auth');
export type HandleAuthArgs = ActionFunctionArgs & {
userId: string;
};
export async function handleAuth({ request, userId }: HandleAuthArgs) {
try {
const { serverUrl, apiKey } = await request.json();
if (!serverUrl) {
return errorResponse(400, '缺少服务器地址参数');
}
if (!apiKey) {
return errorResponse(400, '缺少API密钥参数');
}
const parsedServerUrl = serverUrl.replace(/\/$/, '');
const websitesResponse = await getWebsiteList(parsedServerUrl, apiKey);
if (websitesResponse.code !== 200) {
await delete1PanelConnectionSettings(userId);
return errorResponse(websitesResponse.code, websitesResponse.message || '连接1Panel失败');
}
await save1PanelConnectionSettings(userId, parsedServerUrl, apiKey);
logger.info(`用户 ${userId} 成功验证并保存了 1Panel 连接信息`);
const websites = websitesResponse.data || [];
websites.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
return successResponse(
{
websites,
totalWebsites: websites.length,
lastUpdated: new Date().toISOString(),
},
'1Panel 连接验证成功',
);
} catch (error) {
logger.error('验证 1Panel 连接失败:', error);
return errorResponse(500, '验证 1Panel 连接失败');
}
}