From 2a50b22ad25e80273228a3cb3ff62e4ee7c74214 Mon Sep 17 00:00:00 2001 From: Rotimi Best Date: Fri, 20 Sep 2024 11:16:19 +0100 Subject: [PATCH] fix: make env dynamic --- apps/dashboard/Dockerfile | 6 ++-- .../src/lib/utils/functions/domains.ts | 34 +++++++++---------- .../lib/utils/functions/supabase.server.ts | 4 +-- .../lib/utils/services/lemonsqueezy/index.ts | 4 +-- apps/dashboard/src/routes/+layout.server.ts | 8 ++--- .../src/routes/api/completion/+server.js | 4 +-- .../api/completion/customprompt/+server.js | 4 +-- .../api/completion/exerciseprompt/+server.js | 4 +-- .../api/completion/gradingprompt/+server.js | 4 +-- .../src/routes/api/lmz/subscribe/+server.js | 4 +-- .../src/routes/api/lmz/webhook/+server.js | 4 +-- .../src/routes/api/unsplash/+server.ts | 4 +-- 12 files changed, 41 insertions(+), 43 deletions(-) diff --git a/apps/dashboard/Dockerfile b/apps/dashboard/Dockerfile index 10ede97d..a41ac98d 100644 --- a/apps/dashboard/Dockerfile +++ b/apps/dashboard/Dockerfile @@ -1,5 +1,3 @@ - - FROM node:18 WORKDIR "/app" @@ -15,11 +13,11 @@ COPY . /app/ WORKDIR "/app/apps/dashboard" -RUN pnpm i --frozen-lockfile +RUN pnpm i --frozen-lockfile +RUN pnpm prepare RUN pnpm build EXPOSE 5000 -CMD ["ls", "-la"] CMD ["pnpm", "start"] # CMD [ "sh", "-c", "ls -la && cd apps/dashboard && pnpm build && pnpm start" ] diff --git a/apps/dashboard/src/lib/utils/functions/domains.ts b/apps/dashboard/src/lib/utils/functions/domains.ts index d6bc1ba6..a106961f 100644 --- a/apps/dashboard/src/lib/utils/functions/domains.ts +++ b/apps/dashboard/src/lib/utils/functions/domains.ts @@ -5,17 +5,17 @@ import { DomainConfigResponse, DomainVerificationResponse } from '$lib/utils/types/org'; -import { PROJECT_ID_VERCEL, TEAM_ID_VERCEL, AUTH_BEARER_TOKEN } from '$env/static/private'; +import { env } from '$env/dynamic/private'; export const addDomainToVercel = async (domain: string) => { return await fetch( - `https://api.vercel.com/v10/projects/${PROJECT_ID_VERCEL}/domains${ - TEAM_ID_VERCEL ? `?teamId=${TEAM_ID_VERCEL}` : '' + `https://api.vercel.com/v10/projects/${env.PROJECT_ID_VERCEL}/domains${ + env.TEAM_ID_VERCEL ? `?teamId=${env.TEAM_ID_VERCEL}` : '' }`, { method: 'POST', headers: { - Authorization: `Bearer ${AUTH_BEARER_TOKEN}`, + Authorization: `Bearer ${env.AUTH_BEARER_TOKEN}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ @@ -31,12 +31,12 @@ export const addDomainToVercel = async (domain: string) => { export const removeDomainFromVercelProject = async (domain: string) => { return await fetch( - `https://api.vercel.com/v9/projects/${PROJECT_ID_VERCEL}/domains/${domain}${ - TEAM_ID_VERCEL ? `?teamId=${TEAM_ID_VERCEL}` : '' + `https://api.vercel.com/v9/projects/${env.PROJECT_ID_VERCEL}/domains/${domain}${ + env.TEAM_ID_VERCEL ? `?teamId=${env.TEAM_ID_VERCEL}` : '' }`, { headers: { - Authorization: `Bearer ${AUTH_BEARER_TOKEN}` + Authorization: `Bearer ${env.AUTH_BEARER_TOKEN}` }, method: 'DELETE' } @@ -46,11 +46,11 @@ export const removeDomainFromVercelProject = async (domain: string) => { export const removeDomainFromVercelTeam = async (domain: string) => { return await fetch( `https://api.vercel.com/v6/domains/${domain}${ - TEAM_ID_VERCEL ? `?teamId=${TEAM_ID_VERCEL}` : '' + env.TEAM_ID_VERCEL ? `?teamId=${env.TEAM_ID_VERCEL}` : '' }`, { headers: { - Authorization: `Bearer ${AUTH_BEARER_TOKEN}` + Authorization: `Bearer ${env.AUTH_BEARER_TOKEN}` }, method: 'DELETE' } @@ -61,13 +61,13 @@ export const getDomainResponse = async ( domain: string ): Promise => { return await fetch( - `https://api.vercel.com/v9/projects/${PROJECT_ID_VERCEL}/domains/${domain}${ - TEAM_ID_VERCEL ? `?teamId=${TEAM_ID_VERCEL}` : '' + `https://api.vercel.com/v9/projects/${env.PROJECT_ID_VERCEL}/domains/${domain}${ + env.TEAM_ID_VERCEL ? `?teamId=${env.TEAM_ID_VERCEL}` : '' }`, { method: 'GET', headers: { - Authorization: `Bearer ${AUTH_BEARER_TOKEN}`, + Authorization: `Bearer ${env.AUTH_BEARER_TOKEN}`, 'Content-Type': 'application/json' } } @@ -79,12 +79,12 @@ export const getDomainResponse = async ( export const getConfigResponse = async (domain: string): Promise => { return await fetch( `https://api.vercel.com/v6/domains/${domain}/config${ - TEAM_ID_VERCEL ? `?teamId=${TEAM_ID_VERCEL}` : '' + env.TEAM_ID_VERCEL ? `?teamId=${env.TEAM_ID_VERCEL}` : '' }`, { method: 'GET', headers: { - Authorization: `Bearer ${AUTH_BEARER_TOKEN}`, + Authorization: `Bearer ${env.AUTH_BEARER_TOKEN}`, 'Content-Type': 'application/json' } } @@ -93,13 +93,13 @@ export const getConfigResponse = async (domain: string): Promise => { return await fetch( - `https://api.vercel.com/v9/projects/${PROJECT_ID_VERCEL}/domains/${domain}/verify${ - TEAM_ID_VERCEL ? `?teamId=${TEAM_ID_VERCEL}` : '' + `https://api.vercel.com/v9/projects/${env.PROJECT_ID_VERCEL}/domains/${domain}/verify${ + env.TEAM_ID_VERCEL ? `?teamId=${env.TEAM_ID_VERCEL}` : '' }`, { method: 'POST', headers: { - Authorization: `Bearer ${AUTH_BEARER_TOKEN}`, + Authorization: `Bearer ${env.AUTH_BEARER_TOKEN}`, 'Content-Type': 'application/json' } } diff --git a/apps/dashboard/src/lib/utils/functions/supabase.server.ts b/apps/dashboard/src/lib/utils/functions/supabase.server.ts index ffe41a57..7a9a4b44 100644 --- a/apps/dashboard/src/lib/utils/functions/supabase.server.ts +++ b/apps/dashboard/src/lib/utils/functions/supabase.server.ts @@ -1,4 +1,4 @@ -import { PRIVATE_SUPABASE_SERVICE_ROLE } from '$env/static/private'; +import { env } from '$env/dynamic/private'; import { createClient, SupabaseClient } from '@supabase/supabase-js'; import { config } from '$lib/config'; @@ -12,7 +12,7 @@ export let supabase: SupabaseClient; export const getServerSupabase = () => { if (supabase) return supabase; - supabase = createClient(config.supabaseConfig.url, PRIVATE_SUPABASE_SERVICE_ROLE || '', { + supabase = createClient(config.supabaseConfig.url, env.PRIVATE_SUPABASE_SERVICE_ROLE || '', { auth: { persistSession: false, autoRefreshToken: false, diff --git a/apps/dashboard/src/lib/utils/services/lemonsqueezy/index.ts b/apps/dashboard/src/lib/utils/services/lemonsqueezy/index.ts index 87178f75..358e4d88 100644 --- a/apps/dashboard/src/lib/utils/services/lemonsqueezy/index.ts +++ b/apps/dashboard/src/lib/utils/services/lemonsqueezy/index.ts @@ -1,9 +1,9 @@ -import { LEMON_SQUEEZY_API_KEY } from '$env/static/private'; +import { env } from '$env/dynamic/private'; import { lemonSqueezySetup } from '@lemonsqueezy/lemonsqueezy.js'; export function configureLemonSqueezy() { return lemonSqueezySetup({ - apiKey: LEMON_SQUEEZY_API_KEY, + apiKey: env.LEMON_SQUEEZY_API_KEY, onError: (error) => { throw new Error(`Lemon Squeezy API error: ${error.message}`); } diff --git a/apps/dashboard/src/routes/+layout.server.ts b/apps/dashboard/src/routes/+layout.server.ts index cd26c750..5c7a6090 100644 --- a/apps/dashboard/src/routes/+layout.server.ts +++ b/apps/dashboard/src/routes/+layout.server.ts @@ -6,7 +6,7 @@ import { getCurrentOrg } from '$lib/utils/services/org'; import { getSupabase, supabase } from '$lib/utils/functions/supabase'; import { loadTranslations } from '$lib/utils/functions/translations'; import type { CurrentOrg } from '$lib/utils/types/org'; -import { PRIVATE_APP_SUBDOMAINS, IS_SELFHOSTED, PRIVATE_APP_HOST } from '$env/static/private'; +import { env } from '$env/dynamic/private'; if (!supabase) { getSupabase(); @@ -30,7 +30,7 @@ export const load = async ({ url, cookies }): Promise => { }; // Selfhosted usecase would be here - if (IS_SELFHOSTED === 'true') { + if (env.IS_SELFHOSTED === 'true') { const subdomain = getSubdomain(url); // Student dashboard @@ -97,7 +97,7 @@ export const load = async ({ url, cookies }): Promise => { } } else if (subdomain === 'play' || debugPlay === 'true') { response.skipAuth = true; - } else if (!PRIVATE_APP_SUBDOMAINS.split(',').includes(subdomain) && !isDev) { + } else if (!env.PRIVATE_APP_SUBDOMAINS.split(',').includes(subdomain) && !isDev) { // This case is for anything in our blockedSubdomains throw redirect(307, 'https://app.classroomio.com'); } @@ -165,7 +165,7 @@ function getSubdomain(url: URL) { const host = url.host.replace('www.', ''); const parts = host.split('.'); - if (host.endsWith(PRIVATE_APP_HOST)) { + if (host.endsWith(env.PRIVATE_APP_HOST)) { return parts.length >= 3 ? parts[0] : null; } diff --git a/apps/dashboard/src/routes/api/completion/+server.js b/apps/dashboard/src/routes/api/completion/+server.js index 9b62f8e4..bc34f761 100644 --- a/apps/dashboard/src/routes/api/completion/+server.js +++ b/apps/dashboard/src/routes/api/completion/+server.js @@ -1,10 +1,10 @@ import { Configuration, OpenAIApi } from 'openai-edge'; import { OpenAIStream, StreamingTextResponse } from 'ai'; -import { OPENAI_API_KEY } from '$env/static/private'; +import { env } from '$env/dynamic/private'; // Create an OpenAI API client (that's edge friendly!) const openAIConfig = new Configuration({ - apiKey: OPENAI_API_KEY + apiKey: env.OPENAI_API_KEY }); const openai = new OpenAIApi(openAIConfig); diff --git a/apps/dashboard/src/routes/api/completion/customprompt/+server.js b/apps/dashboard/src/routes/api/completion/customprompt/+server.js index 907cb249..2033119f 100644 --- a/apps/dashboard/src/routes/api/completion/customprompt/+server.js +++ b/apps/dashboard/src/routes/api/completion/customprompt/+server.js @@ -1,10 +1,10 @@ -import { OPENAI_API_KEY } from '$env/static/private'; +import { env } from '$env/dynamic/private'; import { OpenAIStream, StreamingTextResponse } from 'ai'; import { Configuration, OpenAIApi } from 'openai-edge'; // Create an OpenAI API client (that's edge friendly!) const openAIConfig = new Configuration({ - apiKey: OPENAI_API_KEY + apiKey: env.OPENAI_API_KEY }); const openai = new OpenAIApi(openAIConfig); diff --git a/apps/dashboard/src/routes/api/completion/exerciseprompt/+server.js b/apps/dashboard/src/routes/api/completion/exerciseprompt/+server.js index 82c63b74..0d2c80f3 100644 --- a/apps/dashboard/src/routes/api/completion/exerciseprompt/+server.js +++ b/apps/dashboard/src/routes/api/completion/exerciseprompt/+server.js @@ -1,10 +1,10 @@ import { Configuration, OpenAIApi } from 'openai-edge'; import { OpenAIStream, StreamingTextResponse } from 'ai'; -import { OPENAI_API_KEY } from '$env/static/private'; +import { env } from '$env/dynamic/private'; // Create an OpenAI API client (that's edge friendly!) const openAIConfig = new Configuration({ - apiKey: OPENAI_API_KEY + apiKey: env.OPENAI_API_KEY }); const openai = new OpenAIApi(openAIConfig); diff --git a/apps/dashboard/src/routes/api/completion/gradingprompt/+server.js b/apps/dashboard/src/routes/api/completion/gradingprompt/+server.js index 61bd9b69..63181e5f 100644 --- a/apps/dashboard/src/routes/api/completion/gradingprompt/+server.js +++ b/apps/dashboard/src/routes/api/completion/gradingprompt/+server.js @@ -1,10 +1,10 @@ -import { OPENAI_API_KEY } from '$env/static/private'; +import { env } from '$env/dynamic/private'; import { OpenAIStream, StreamingTextResponse } from 'ai'; import { Configuration, OpenAIApi } from 'openai-edge'; // Create an OpenAI API client (that's edge friendly!) const openAIConfig = new Configuration({ - apiKey: OPENAI_API_KEY + apiKey: env.OPENAI_API_KEY }); const openai = new OpenAIApi(openAIConfig); diff --git a/apps/dashboard/src/routes/api/lmz/subscribe/+server.js b/apps/dashboard/src/routes/api/lmz/subscribe/+server.js index cef12e78..0c55b429 100644 --- a/apps/dashboard/src/routes/api/lmz/subscribe/+server.js +++ b/apps/dashboard/src/routes/api/lmz/subscribe/+server.js @@ -1,6 +1,6 @@ import { json } from '@sveltejs/kit'; import { createCheckout } from '@lemonsqueezy/lemonsqueezy.js'; -import { LEMON_SQUEEZY_STORE_ID } from '$env/static/private'; +import { env } from '$env/dynamic/private'; import { configureLemonSqueezy } from '$lib/utils/services/lemonsqueezy'; export async function POST({ request }) { @@ -23,7 +23,7 @@ export async function POST({ request }) { console.log({ checkoutData }); - const { data } = await createCheckout(LEMON_SQUEEZY_STORE_ID, productId, { + const { data } = await createCheckout(env.LEMON_SQUEEZY_STORE_ID, productId, { checkoutData }); diff --git a/apps/dashboard/src/routes/api/lmz/webhook/+server.js b/apps/dashboard/src/routes/api/lmz/webhook/+server.js index 17c2ec9f..3c208962 100644 --- a/apps/dashboard/src/routes/api/lmz/webhook/+server.js +++ b/apps/dashboard/src/routes/api/lmz/webhook/+server.js @@ -1,6 +1,6 @@ import { json } from '@sveltejs/kit'; import crypto from 'crypto'; -import { LEMON_SQUEEZY_WEBHOOK_SECRET } from '$env/static/private'; +import { env } from '$env/dynamic/private'; import { createOrgPlan, cancelOrgPlan } from '$lib/utils/services/org'; import { PLAN } from 'shared/src/plans/constants'; import { getServerSupabase } from '$lib/utils/functions/supabase.server'; @@ -15,7 +15,7 @@ export async function POST({ request }) { const body = await request.json(); // Check signature - const secret = LEMON_SQUEEZY_WEBHOOK_SECRET; + const secret = env.LEMON_SQUEEZY_WEBHOOK_SECRET; const hmac = crypto.createHmac('sha256', secret); const digest = Buffer.from(hmac.update(await clonedReq.text()).digest('hex'), 'utf8'); const signature = Buffer.from(request.headers.get('X-Signature') || '', 'utf8'); diff --git a/apps/dashboard/src/routes/api/unsplash/+server.ts b/apps/dashboard/src/routes/api/unsplash/+server.ts index 7bc309cc..2cc67205 100644 --- a/apps/dashboard/src/routes/api/unsplash/+server.ts +++ b/apps/dashboard/src/routes/api/unsplash/+server.ts @@ -1,7 +1,7 @@ import { json } from '@sveltejs/kit'; -import { UNSPLASH_API_KEY } from '$env/static/private'; +import { env } from '$env/dynamic/private'; -const UNSPLASH_API_URL = `https://api.unsplash.com/search/photos?page=2&per_page=15&auto=format&fit=crop&w=2970&q=80&client_id=${UNSPLASH_API_KEY}`; +const UNSPLASH_API_URL = `https://api.unsplash.com/search/photos?page=2&per_page=15&auto=format&fit=crop&w=2970&q=80&client_id=${env.UNSPLASH_API_KEY}`; // API to fetch photos from Unsplash export async function POST({ request }) {