diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..25458c98 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,72 @@ +name: CI/CD Pipeline + +on: + pull_request: + branches: + - main + +jobs: + lint-and-build: + name: Lint and Build + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Node.js (Use Required Version) + uses: actions/setup-node@v4 + with: + node-version: 20.18.0 # Set to the required version + + - name: Install dependencies + run: npm install + + - name: Set up environment variables + run: | + echo "NEXTAUTH_SECRET=${{ secrets.NEXTAUTH_SECRET }}" >> .env + echo "NEXTAUTH_URL=${{ secrets.NEXTAUTH_URL }}" >> .env + echo "NEXT_PUBLIC_APP_URL=${{ secrets.NEXT_PUBLIC_APP_URL }}" >> .env + echo "RESEND_API_KEY=${{ secrets.RESEND_API_KEY }}" >> .env + echo "DATABASE_URL=${{ secrets.DATABASE_URL }}" >> .env + echo "DATABASE_URL_UNPOOLED=${{ secrets.DATABASE_URL_UNPOOLED }}" >> .env + echo "PGHOST=${{ secrets.PGHOST }}" >> .env + echo "PGHOST_UNPOOLED=${{ secrets.PGHOST_UNPOOLED }}" >> .env + echo "PGUSER=${{ secrets.PGUSER }}" >> .env + echo "PGDATABASE=${{ secrets.PGDATABASE }}" >> .env + echo "PGPASSWORD=${{ secrets.PGPASSWORD }}" >> .env + echo "POSTGRES_URL=${{ secrets.POSTGRES_URL }}" >> .env + echo "POSTGRES_URL_NON_POOLING=${{ secrets.POSTGRES_URL_NON_POOLING }}" >> .env + echo "POSTGRES_USER=${{ secrets.POSTGRES_USER }}" >> .env + echo "POSTGRES_HOST=${{ secrets.POSTGRES_HOST }}" >> .env + echo "POSTGRES_PASSWORD=${{ secrets.POSTGRES_PASSWORD }}" >> .env + echo "POSTGRES_DATABASE=${{ secrets.POSTGRES_DATABASE }}" >> .env + echo "POSTGRES_URL_NO_SSL=${{ secrets.POSTGRES_URL_NO_SSL }}" >> .env + echo "POSTGRES_PRISMA_URL=${{ secrets.POSTGRES_PRISMA_URL }}" >> .env + echo "GOOGLE_CLIENT_ID=${{ secrets.GOOGLE_CLIENT_ID }}" >> .env + echo "GOOGLE_CLIENT_SECRET=${{ secrets.GOOGLE_CLIENT_SECRET }}" >> .env + echo "GITHUB_ID=${{ secrets.GH_ID }}" >> .env + echo "GITHUB_SECRET=${{ secrets.GH_SECRET }}" >> .env + + - name: Debug File Listing + run: | + echo "Checking for matching files..." + find . -type f \( -name "*.js" -o -name "*.ts" -o -name "*.jsx" -o -name "*.tsx" -o -name "*.json" -o -name "*.md" -o -name "*.css" -o -name "*.scss" \) \ + ! -path "./node_modules/*" ! -path "./dist/*" ! -path "./.git/*" ! -path "./coverage/*" \ + || echo "No matching files found." + + - name: Run Biome Formatter & Linter + run: | + FILES=$(find . -type f \( -name "*.js" -o -name "*.ts" -o -name "*.jsx" -o -name "*.tsx" -o -name "*.json" -o -name "*.md" -o -name "*.css" -o -name "*.scss" \) \ + ! -path "./node_modules/*" ! -path "./dist/*" ! -path "./.git/*" ! -path "./coverage/*") + + if [ -n "$FILES" ]; then + echo "Running Biome on found files..." + echo "$FILES" | xargs npx biome format --write + echo "$FILES" | xargs npx biome lint --write + else + echo "No files found to format or lint. Skipping." + fi + + - name: Run Build + run: npm run build diff --git a/app/admin/page.tsx b/app/admin/page.tsx index c903e012..f2fb41de 100644 --- a/app/admin/page.tsx +++ b/app/admin/page.tsx @@ -1,33 +1,34 @@ -import { authOptions } from "@/lib/auth.config" -import { getServerSession } from "next-auth/next" -import { redirect } from "next/navigation" +import { authOptions } from "@/lib/auth.config"; +import { getServerSession } from "next-auth/next"; +import { redirect } from "next/navigation"; export default async function AdminDashboard() { - const session = await getServerSession(authOptions) + const session = await getServerSession(authOptions); - if (!session || session.user.role !== "ADMIN") { - redirect("/unauthorized") - } + if (!session || session.user.role !== "ADMIN") { + redirect("/unauthorized"); + } - return ( -
You are signed in as an admin: {session.user.email}
-Your role is: {session.user.role}
-You are signed in as an admin: {session.user.email}
+Your role is: {session.user.role}
+Enter your email to receive a password reset link.
-+ Enter your email to receive a password reset link. +
+We sent a code to {email}
-The OTP will expire in 10 minutes
-+ We sent a code to {email} +
++ The OTP will expire in 10 minutes +
+