|
1 | 1 | import type { PageServerLoad } from './$types' |
2 | | -import type { TimeRange, SourceResult } from '$lib/server/types.js' |
3 | | -import type { UmamiData } from '$lib/server/sources/umami.js' |
4 | | -import type { CloudflareData } from '$lib/server/sources/cloudflare.js' |
5 | | -import type { PaddleData } from '$lib/server/sources/paddle.js' |
6 | | -import type { GitHubData } from '$lib/server/sources/github.js' |
7 | | -import type { PostHogData } from '$lib/server/sources/posthog.js' |
8 | | -import type { LicenseData } from '$lib/server/sources/license.js' |
9 | | -import { fetchUmamiData } from '$lib/server/sources/umami.js' |
10 | | -import { fetchCloudflareData } from '$lib/server/sources/cloudflare.js' |
11 | | -import { fetchPaddleData } from '$lib/server/sources/paddle.js' |
12 | | -import { fetchGitHubData } from '$lib/server/sources/github.js' |
13 | | -import { fetchPostHogData } from '$lib/server/sources/posthog.js' |
14 | | -import { fetchLicenseData } from '$lib/server/sources/license.js' |
| 2 | +import { fetchDashboardData } from '$lib/server/fetch-all.js' |
15 | 3 |
|
16 | | -const validRanges = new Set<TimeRange>(['24h', '7d', '30d']) |
17 | | - |
18 | | -export interface DashboardData { |
19 | | - range: TimeRange |
20 | | - updatedAt: string |
21 | | - umami: SourceResult<UmamiData> |
22 | | - cloudflare: SourceResult<CloudflareData> |
23 | | - paddle: SourceResult<PaddleData> |
24 | | - github: SourceResult<GitHubData> |
25 | | - posthog: SourceResult<PostHogData> |
26 | | - license: SourceResult<LicenseData> |
27 | | -} |
28 | | - |
29 | | -function missingEnv(name: string): SourceResult<never> { |
30 | | - return { ok: false, error: `${name}: not configured (missing env vars)` } |
31 | | -} |
32 | | - |
33 | | -/** Returns the env object from CF Pages platform, falling back to $env/dynamic/private for local dev. */ |
34 | | -async function resolveEnv(platform: App.Platform | undefined): Promise<App.Platform['env']> { |
35 | | - if (platform?.env) return platform.env |
36 | | - // In local dev (vite dev), platform.env is undefined. Use SvelteKit's $env/dynamic/private |
37 | | - // which properly loads .env files (handling quoting, escaping, etc.). |
38 | | - const { env } = await import('$env/dynamic/private') |
39 | | - return { |
40 | | - UMAMI_API_URL: env.UMAMI_API_URL ?? '', |
41 | | - UMAMI_USERNAME: env.UMAMI_USERNAME ?? '', |
42 | | - UMAMI_PASSWORD: env.UMAMI_PASSWORD ?? '', |
43 | | - UMAMI_WEBSITE_ID: env.UMAMI_WEBSITE_ID ?? '', |
44 | | - UMAMI_BLOG_WEBSITE_ID: env.UMAMI_BLOG_WEBSITE_ID ?? '', |
45 | | - CLOUDFLARE_API_TOKEN: env.CLOUDFLARE_API_TOKEN ?? '', |
46 | | - CLOUDFLARE_ACCOUNT_ID: env.CLOUDFLARE_ACCOUNT_ID ?? '', |
47 | | - PADDLE_API_KEY_LIVE: env.PADDLE_API_KEY_LIVE ?? '', |
48 | | - POSTHOG_API_KEY: env.POSTHOG_API_KEY ?? '', |
49 | | - POSTHOG_PROJECT_ID: env.POSTHOG_PROJECT_ID ?? '', |
50 | | - POSTHOG_API_URL: env.POSTHOG_API_URL ?? '', |
51 | | - GITHUB_TOKEN: env.GITHUB_TOKEN || undefined, |
52 | | - LICENSE_SERVER_ADMIN_TOKEN: env.LICENSE_SERVER_ADMIN_TOKEN ?? '', |
53 | | - } |
54 | | -} |
| 4 | +export type { DashboardData } from '$lib/server/fetch-all.js' |
55 | 5 |
|
56 | 6 | export const load: PageServerLoad = async ({ url, platform }) => { |
57 | | - const rangeParam = url.searchParams.get('range') ?? '7d' |
58 | | - const range: TimeRange = validRanges.has(rangeParam as TimeRange) ? (rangeParam as TimeRange) : '7d' |
59 | | - |
60 | | - const env = await resolveEnv(platform) |
61 | | - |
62 | | - const [umami, cloudflare, paddle, github, posthog, license] = await Promise.all([ |
63 | | - env?.UMAMI_API_URL |
64 | | - ? fetchUmamiData( |
65 | | - { |
66 | | - UMAMI_API_URL: env.UMAMI_API_URL, |
67 | | - UMAMI_USERNAME: env.UMAMI_USERNAME, |
68 | | - UMAMI_PASSWORD: env.UMAMI_PASSWORD, |
69 | | - UMAMI_WEBSITE_ID: env.UMAMI_WEBSITE_ID, |
70 | | - UMAMI_BLOG_WEBSITE_ID: env.UMAMI_BLOG_WEBSITE_ID, |
71 | | - }, |
72 | | - range |
73 | | - ) |
74 | | - : Promise.resolve(missingEnv('Umami')), |
75 | | - env?.CLOUDFLARE_API_TOKEN |
76 | | - ? fetchCloudflareData( |
77 | | - { CLOUDFLARE_API_TOKEN: env.CLOUDFLARE_API_TOKEN, CLOUDFLARE_ACCOUNT_ID: env.CLOUDFLARE_ACCOUNT_ID }, |
78 | | - range |
79 | | - ) |
80 | | - : Promise.resolve(missingEnv('Cloudflare')), |
81 | | - env?.PADDLE_API_KEY_LIVE |
82 | | - ? fetchPaddleData({ PADDLE_API_KEY_LIVE: env.PADDLE_API_KEY_LIVE }, range) |
83 | | - : Promise.resolve(missingEnv('Paddle')), |
84 | | - fetchGitHubData({ GITHUB_TOKEN: env?.GITHUB_TOKEN }), |
85 | | - env?.POSTHOG_API_KEY |
86 | | - ? fetchPostHogData( |
87 | | - { |
88 | | - POSTHOG_API_KEY: env.POSTHOG_API_KEY, |
89 | | - POSTHOG_PROJECT_ID: env.POSTHOG_PROJECT_ID, |
90 | | - POSTHOG_API_URL: env.POSTHOG_API_URL, |
91 | | - }, |
92 | | - range |
93 | | - ) |
94 | | - : Promise.resolve(missingEnv('PostHog')), |
95 | | - env?.LICENSE_SERVER_ADMIN_TOKEN |
96 | | - ? fetchLicenseData({ LICENSE_SERVER_ADMIN_TOKEN: env.LICENSE_SERVER_ADMIN_TOKEN }) |
97 | | - : Promise.resolve(missingEnv('License server')), |
98 | | - ]) |
99 | | - |
100 | | - return { |
101 | | - range, |
102 | | - updatedAt: new Date().toISOString(), |
103 | | - umami, |
104 | | - cloudflare, |
105 | | - paddle, |
106 | | - github, |
107 | | - posthog, |
108 | | - license, |
109 | | - } satisfies DashboardData |
| 7 | + return fetchDashboardData(platform, url.searchParams.get('range') ?? '7d') |
110 | 8 | } |
0 commit comments