From 7f7c93d13fb3d908d3f06f78eb17218782068631 Mon Sep 17 00:00:00 2001 From: maksim hodasevich Date: Thu, 16 Nov 2023 13:50:34 +0100 Subject: [PATCH] refactor env variables --- .env.example | 10 ++--- .github/workflows/import-dataset.yml | 4 +- app/api/roll-out/route.ts | 57 ++++++++++++++++------------ lib/email.ts | 5 +++ lib/services.ts | 6 +-- 5 files changed, 47 insertions(+), 35 deletions(-) create mode 100644 lib/email.ts diff --git a/.env.example b/.env.example index 020c594..00413de 100644 --- a/.env.example +++ b/.env.example @@ -3,17 +3,17 @@ SANITY_API_READ_TOKEN= NEXT_PUBLIC_SANITY_PROJECT_ID= NEXT_PUBLIC_SANITY_DATASET= -// roll-out feature -HOST= +REPO_TYPE= TEAM_GITHUB_REPO_ID= TEAM_GITHUB_REPO_PRODUCTION_BRANCH= -REPO_TYPE= +PROJECT_NAME= SANITY_ORGANIZATION_ID= VERCEL_FR_TEAM_ID= SANITY_PERSONAL_AUTH_TOKEN= VERCEL_PERSONAL_AUTH_TOKEN= - -PROJECT_NAME=mvp-next-sanity +GITHUB_PERSONAL_ACCESS_TOKEN= +# token to access "/api/roll-out" | "/api/roll-out/deploy" endpoints +ROLL_OUT_API_TOKEN= diff --git a/.github/workflows/import-dataset.yml b/.github/workflows/import-dataset.yml index 32ebcb0..c69c6ed 100644 --- a/.github/workflows/import-dataset.yml +++ b/.github/workflows/import-dataset.yml @@ -100,7 +100,7 @@ jobs: -d '{ "type":"document", "name":"Sanity Studio", - "url": "https://${{ inputs.vercel-project-name }}.vercel.app/api/sanity-deploy", + "url": "https://${{ inputs.vercel-project-name }}.vercel.app/api/roll-out/deploy", "httpMethod":"POST", "apiVersion":"v2021-03-25", "includeDrafts":false, @@ -109,7 +109,7 @@ jobs: "on": ["create", "update", "delete"] }, "headers": { - "Authorization": "Bearer ${{ secrets.VERCEL_PERSONAL_AUTH_TOKEN }}" + "Authorization": "Bearer ${{ secrets.ROLL_OUT_API_TOKEN }}" } }' - name: Curl command to triger vercel initial deployment diff --git a/app/api/roll-out/route.ts b/app/api/roll-out/route.ts index 53a5989..4b60814 100644 --- a/app/api/roll-out/route.ts +++ b/app/api/roll-out/route.ts @@ -1,41 +1,48 @@ import { createSanityProject, createVercelProject, triggerGithubWorkflow } from '@/lib/services'; import { headers } from 'next/headers'; +import { isValidEmail } from '@/lib/email'; + export async function POST(request: Request) { if (headers().get('authorization') !== `Bearer ${process.env.ROLL_OUT_API_TOKEN}`) { return new Response('Invalid roll-out token', { status: 401 }); } const { email } = await request.json(); - const username = email - .split('@')[0] - .toLowerCase() - .replace(/[^a-z0-9]/g, '') // prevent forbidden symbols - .slice(0, 90); // prevent project name from being too long - - const sanityProjectId = await createSanityProject(username); - const sanityDatasetName = process.env.NEXT_PUBLIC_SANITY_DATASET || 'production'; - - if (sanityProjectId) { - const projectData = await createVercelProject({ - projectNamePrifix: username, - sanityProjectId: sanityProjectId, - sanityDatasetName, - }); - - if (projectData) { - await triggerGithubWorkflow({ - sanityProjectId, + + if (email && isValidEmail(email)) { + const username = email + .split('@')[0] + .toLowerCase() + .replace(/[^a-z0-9]/g, '') // prevent forbidden symbols + .slice(0, 90); // prevent project name from being too long + + const sanityProjectId = await createSanityProject(username); + const sanityDatasetName = process.env.NEXT_PUBLIC_SANITY_DATASET || 'production'; + + if (sanityProjectId) { + const projectData = await createVercelProject({ + projectNamePrifix: username, + sanityProjectId: sanityProjectId, sanityDatasetName, - vercelProjectId: projectData.projectId, - vercelProjectName: projectData.projectName, - vercelDeploymentUrl: projectData.deploymentUrl, - email, }); - return Response.json({ ok: true, status: 200, statusText: 'All steps were successful 🎉' }); + if (projectData) { + await triggerGithubWorkflow({ + sanityProjectId, + sanityDatasetName, + vercelProjectId: projectData.projectId, + vercelProjectName: projectData.projectName, + vercelDeploymentUrl: projectData.deploymentUrl, + email, + }); + + return Response.json({ ok: true, status: 200, statusText: 'All steps were successful 🎉' }); + } } + + return Response.json({ status: '503', statusText: 'One of the steps was not successful😿' }); } - return Response.json({ status: '503', statusText: 'One of the steps was not successful😿' }); + return Response.json({ status: '400', statusText: 'Email is not valid' }); } diff --git a/lib/email.ts b/lib/email.ts new file mode 100644 index 0000000..4594a65 --- /dev/null +++ b/lib/email.ts @@ -0,0 +1,5 @@ +export function isValidEmail(email: string) { + const emailRegex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; + + return emailRegex.test(email); +} diff --git a/lib/services.ts b/lib/services.ts index 59c2e38..cbf31a0 100644 --- a/lib/services.ts +++ b/lib/services.ts @@ -57,15 +57,15 @@ export async function createVercelProject({ }, { key: 'TEAM_GITHUB_REPO_ID', - value: '684968839', + value: process.env.TEAM_GITHUB_REPO_ID, }, { key: 'TEAM_GITHUB_REPO_PRODUCTION_BRANCH', - value: 'auto-roll-out', + value: process.env.TEAM_GITHUB_REPO_PRODUCTION_BRANCH, }, { key: 'REPO_TYPE', - value: 'github', + value: process.env.REPO_TYPE, }, { key: 'VERCEL_PERSONAL_AUTH_TOKEN',