89 lines
3.0 KiB
TypeScript
89 lines
3.0 KiB
TypeScript
import { type ActionFunctionArgs } from '@remix-run/node';
|
||
import { get1PanelConnectionSettings, save1PanelConnectionSettings } from '~/.server/service/connection-settings';
|
||
import { deleteDeploymentsByPlatformAndId } from '~/.server/service/deployment';
|
||
import { errorResponse, successResponse } from '~/.server/utils/api-response';
|
||
import { deleteWebsite, getWebsiteList } from '~/routes/api.1panel.$action/1panel.server';
|
||
import { DeploymentPlatformEnum } from '~/types/deployment';
|
||
import { createScopedLogger } from '~/utils/logger';
|
||
|
||
interface WebsiteListRequestBody {
|
||
serverUrl?: string;
|
||
apiKey?: string;
|
||
}
|
||
|
||
interface DeleteWebsiteRequestBody {
|
||
serverUrl?: string;
|
||
apiKey?: string;
|
||
siteId: number;
|
||
}
|
||
|
||
export type HandleWebsitesArgs = ActionFunctionArgs & {
|
||
userId: string;
|
||
};
|
||
|
||
const logger = createScopedLogger('api.1panel.websites');
|
||
|
||
export async function handleWebsites({ request, userId }: HandleWebsitesArgs) {
|
||
try {
|
||
if (request.method === 'POST') {
|
||
const requestBody = (await request.json()) as WebsiteListRequestBody;
|
||
|
||
let connectionSettings = await get1PanelConnectionSettings(userId);
|
||
|
||
if (requestBody.serverUrl && requestBody.apiKey) {
|
||
connectionSettings = {
|
||
serverUrl: requestBody.serverUrl,
|
||
apiKey: requestBody.apiKey,
|
||
};
|
||
|
||
await save1PanelConnectionSettings(userId, requestBody.serverUrl, requestBody.apiKey);
|
||
}
|
||
|
||
if (!connectionSettings) {
|
||
return errorResponse(401, '未配置1Panel连接信息,请先设置服务器地址和API密钥');
|
||
}
|
||
|
||
const { serverUrl, apiKey } = connectionSettings;
|
||
|
||
const websites = await getWebsiteList(serverUrl, apiKey);
|
||
|
||
if (websites.code !== 200) {
|
||
logger.warn('获取网站列表失败', JSON.stringify(websites));
|
||
return errorResponse(websites.code, websites.message);
|
||
}
|
||
|
||
return successResponse(websites.data ?? [], '获取网站列表成功');
|
||
}
|
||
if (request.method === 'DELETE') {
|
||
const requestBody = (await request.json()) as DeleteWebsiteRequestBody;
|
||
|
||
if (!requestBody.siteId) {
|
||
return errorResponse(400, '未提供网站ID');
|
||
}
|
||
|
||
const connectionSettings = await get1PanelConnectionSettings(userId);
|
||
|
||
if (!connectionSettings) {
|
||
return errorResponse(401, '未配置1Panel连接信息,请先设置服务器地址和API密钥');
|
||
}
|
||
|
||
const { serverUrl, apiKey } = connectionSettings;
|
||
|
||
await deleteWebsite({
|
||
serverUrl,
|
||
apiKey,
|
||
siteId: requestBody.siteId,
|
||
});
|
||
|
||
await deleteDeploymentsByPlatformAndId(DeploymentPlatformEnum._1PANEL, requestBody.siteId);
|
||
|
||
return successResponse(true, '网站删除成功');
|
||
}
|
||
logger.warn('不支持的 HTTP 方法', JSON.stringify({ url: request.url, method: request.method }));
|
||
return errorResponse(405, '不支持的 HTTP 方法');
|
||
} catch (error) {
|
||
logger.error('处理 1Panel 网站请求错误:', error);
|
||
return errorResponse(500, '处理请求失败 - ' + (error instanceof Error ? error.message : String(error)));
|
||
}
|
||
}
|