feat: 扩展 Cloudflare 统计接口以支持 D1 数据库和 R2 存储数据

This commit is contained in:
seahi committed 2026-09-25 11:38:34 +08:00
1 parent e047538809
commit 9ddcb04be9
1 file changed
+64 -1
+64 -1
View File
@@ -58,6 +58,12 @@ export async function fetchAnalytics(platform: App.Platform | undefined) {
const token = platform?.env?.CF_API_TOKEN;
// @ts-expect-error Cloudflare env types
const zoneId = platform?.env?.CF_ZONE_ID;
// @ts-expect-error Cloudflare env types
const accountId = platform?.env?.CF_ACCOUNT_ID;
// @ts-expect-error Cloudflare env types
const d1Id = platform?.env?.CF_D1_ID;
// @ts-expect-error Cloudflare env types
const r2Bucket = platform?.env?.CF_R2_BUCKET;
if (!token || !zoneId) {
return null;
@@ -65,6 +71,50 @@ export async function fetchAnalytics(platform: App.Platform | undefined) {
const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000).toISOString().split('T')[0];
let accountQuery = '';
if (accountId) {
let d1Query = '';
if (d1Id) {
d1Query = `
d1AnalyticsAdaptiveGroups(
limit: 10000,
filter: { datetime_geq: "${thirtyDaysAgo}T00:00:00Z", databaseId: "${d1Id}" }
) {
sum {
readQueries
writeQueries
rowsRead
rowsWritten
}
}
`;
}
let r2Query = '';
if (r2Bucket) {
r2Query = `
r2StorageAdaptiveGroups(
limit: 1,
filter: { datetime_geq: "${thirtyDaysAgo}T00:00:00Z", bucketName: "${r2Bucket}" },
orderBy: [datetime_DESC]
) {
sum {
payloadSize
}
}
`;
}
if (d1Query || r2Query) {
accountQuery = `
accounts(filter: { accountTag: "${accountId}" }) {
${d1Query}
${r2Query}
}
`;
}
}
const query = `
query {
viewer {
@@ -84,9 +134,13 @@ export async function fetchAnalytics(platform: App.Platform | undefined) {
requests
pageViews
}
uniq {
uniques
}
}
}
${accountQuery}
}
}
`;
@@ -101,7 +155,16 @@ export async function fetchAnalytics(platform: App.Platform | undefined) {
});
const result = (await response.json()) as any;
return result?.data?.viewer?.zones?.[0]?.httpRequests1dGroups || [];
const trafficData = result?.data?.viewer?.zones?.[0]?.httpRequests1dGroups || [];
const accountData = result?.data?.viewer?.accounts?.[0];
return {
traffic: trafficData,
d1: accountData?.d1AnalyticsAdaptiveGroups || [],
r2: accountData?.r2StorageAdaptiveGroups || [],
missingEnvVars: !accountId || !d1Id || !r2Bucket
};
} catch (err) {
console.error('Failed to fetch analytics', err);
return null;