81 lines
2.2 KiB
TypeScript
81 lines
2.2 KiB
TypeScript
import { getNetlifyConnectionSettings } from '~/lib/.server/connectionSettings';
|
||
import { errorResponse, successResponse } from '~/utils/api-response';
|
||
import { createScopedLogger } from '~/utils/logger';
|
||
|
||
const logger = createScopedLogger('api.netlify.stats');
|
||
|
||
export type GetNetlifyStatsArgs = {
|
||
userId: string;
|
||
};
|
||
|
||
export async function getNetlifyStats({ userId }: GetNetlifyStatsArgs) {
|
||
try {
|
||
const connectionSettings = await getNetlifyConnectionSettings(userId);
|
||
|
||
if (!connectionSettings) {
|
||
return errorResponse(401, '未连接到Netlify,请先设置访问令牌');
|
||
}
|
||
|
||
const { token } = connectionSettings;
|
||
|
||
const sitesResponse = await fetch('https://api.netlify.com/api/v1/sites', {
|
||
headers: {
|
||
Authorization: `Bearer ${token}`,
|
||
'Content-Type': 'application/json',
|
||
},
|
||
});
|
||
|
||
if (!sitesResponse.ok) {
|
||
return errorResponse(sitesResponse.status, '获取站点列表失败');
|
||
}
|
||
|
||
const sitesData = await sitesResponse.json();
|
||
|
||
let deploysData = [];
|
||
let buildsData = [];
|
||
let lastDeployTime = '';
|
||
|
||
if (sitesData && sitesData.length > 0) {
|
||
const firstSite = sitesData[0];
|
||
|
||
const deploysResponse = await fetch(`https://api.netlify.com/api/v1/sites/${firstSite.id}/deploys`, {
|
||
headers: {
|
||
Authorization: `Bearer ${token}`,
|
||
},
|
||
});
|
||
|
||
if (deploysResponse.ok) {
|
||
deploysData = await deploysResponse.json();
|
||
|
||
if (deploysData.length > 0) {
|
||
lastDeployTime = deploysData[0].created_at;
|
||
|
||
const buildsResponse = await fetch(`https://api.netlify.com/api/v1/sites/${firstSite.id}/builds`, {
|
||
headers: {
|
||
Authorization: `Bearer ${token}`,
|
||
},
|
||
});
|
||
|
||
if (buildsResponse.ok) {
|
||
buildsData = await buildsResponse.json();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return successResponse(
|
||
{
|
||
sites: sitesData,
|
||
deploys: deploysData,
|
||
builds: buildsData,
|
||
lastDeployTime,
|
||
totalSites: sitesData.length,
|
||
},
|
||
'获取 Netlify 站点统计信息成功',
|
||
);
|
||
} catch (error) {
|
||
logger.error('获取 Netlify 站点统计信息失败:', error);
|
||
return errorResponse(500, '获取 Netlify 站点统计信息失败');
|
||
}
|
||
}
|