From 050d75446aa15c6dbc8bff2248e66a3676c1b850 Mon Sep 17 00:00:00 2001 From: Sanchit Rishi Date: Mon, 18 May 2026 14:12:58 +0530 Subject: [PATCH 1/6] feat: add GitLab OAuth sign-in and token storage (#9) --- src/app/page.tsx | 8 +++++++- src/lib/auth.ts | 36 ++++++++++++++++++++++++++++++++++-- src/types/next-auth.d.ts | 6 ++++++ supabase/schema.sql | 4 +++- 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/app/page.tsx b/src/app/page.tsx index cb51474..a468529 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -18,13 +18,19 @@ export default async function HomePage() { Open-source developer productivity dashboard. Track coding habits, visualize GitHub contributions, and hit your goals.

-
+
Sign in with GitHub + + Sign in with GitLab + Date: Tue, 19 May 2026 11:49:50 +0530 Subject: [PATCH 2/6] fix: add supabase migration for gitlab columns (#9) --- supabase/migrations/20260520000000_add_gitlab_columns.sql | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 supabase/migrations/20260520000000_add_gitlab_columns.sql diff --git a/supabase/migrations/20260520000000_add_gitlab_columns.sql b/supabase/migrations/20260520000000_add_gitlab_columns.sql new file mode 100644 index 0000000..497b244 --- /dev/null +++ b/supabase/migrations/20260520000000_add_gitlab_columns.sql @@ -0,0 +1,3 @@ +sqlalter table users add column if not exists gitlab_id text unique; +alter table users add column if not exists gitlab_login text; +alter table users alter column github_id drop not null; From 101bd097064983131adc6d795cd259c078b62310 Mon Sep 17 00:00:00 2001 From: Sanchit Rishi Date: Tue, 19 May 2026 12:24:06 +0530 Subject: [PATCH 3/6] fix: address PR review migration file, env example, gitlab upsert conflict key (#9) --- .env.example | 20 +++++++++++++++++++ src/lib/auth.ts | 5 +++-- .../20260519000001_add_gitlab_columns.sql | 2 ++ 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 .env.example create mode 100644 supabase/migrations/20260519000001_add_gitlab_columns.sql diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..78e863f --- /dev/null +++ b/.env.example @@ -0,0 +1,20 @@ +# Supabase — create project at supabase.com +NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co +NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... +SUPABASE_SERVICE_ROLE_KEY=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... + +# NextAuth +NEXTAUTH_URL=http://localhost:3000 +NEXTAUTH_SECRET=your_nextauth_secret_min_32_chars + +# GitHub OAuth App — create at github.com/settings/applications/new +GITHUB_ID=your_github_oauth_app_client_id +GITHUB_SECRET=your_github_oauth_app_client_secret +GITLAB_ID=your_gitlab_application_id +GITLAB_SECRET=your_gitlab_application_secret +# Second callback URL to register in your GitHub OAuth App settings: +# {NEXTAUTH_URL}/api/auth/link-github/callback + +# 32-byte hex string for AES-256-GCM token encryption +# Generate with: node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" +ENCRYPTION_KEY= diff --git a/src/lib/auth.ts b/src/lib/auth.ts index 1a6a3e4..e1a297c 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -60,14 +60,15 @@ export const authOptions: NextAuthOptions = { ); } if (account?.provider === "gitlab" && profile) { - const p = profile as { id: number; username: string }; + const p = profile as { id: number; username: string; email: string }; await supabaseAdmin.from("users").upsert( { + email: p.email, gitlab_id: String(p.id), gitlab_login: p.username, updated_at: new Date().toISOString(), }, - { onConflict: "gitlab_id" } + { onConflict: "email" } ); } return true; diff --git a/supabase/migrations/20260519000001_add_gitlab_columns.sql b/supabase/migrations/20260519000001_add_gitlab_columns.sql new file mode 100644 index 0000000..fbd43be --- /dev/null +++ b/supabase/migrations/20260519000001_add_gitlab_columns.sql @@ -0,0 +1,2 @@ +sqlALTER TABLE users ADD COLUMN IF NOT EXISTS gitlab_id text UNIQUE; +ALTER TABLE users ADD COLUMN IF NOT EXISTS gitlab_login text; From 86a74f0a5f26eac2bbb822e4b588d88f312b545a Mon Sep 17 00:00:00 2001 From: Sanchit Rishi Date: Tue, 19 May 2026 12:26:18 +0530 Subject: [PATCH 4/6] fix: remove typo from gitlab migration (#9) --- supabase/migrations/20260519000001_add_gitlab_columns.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/supabase/migrations/20260519000001_add_gitlab_columns.sql b/supabase/migrations/20260519000001_add_gitlab_columns.sql index fbd43be..b69c3a5 100644 --- a/supabase/migrations/20260519000001_add_gitlab_columns.sql +++ b/supabase/migrations/20260519000001_add_gitlab_columns.sql @@ -1,2 +1,2 @@ -sqlALTER TABLE users ADD COLUMN IF NOT EXISTS gitlab_id text UNIQUE; +ALTER TABLE users ADD COLUMN IF NOT EXISTS gitlab_id text UNIQUE; ALTER TABLE users ADD COLUMN IF NOT EXISTS gitlab_login text; From 696ab0b860f74efc35de8bf3e73534159e6d81f7 Mon Sep 17 00:00:00 2001 From: Sanchit Rishi Date: Tue, 19 May 2026 12:28:10 +0530 Subject: [PATCH 5/6] fix: use gitlab_id conflict key for gitlab upsert (#9) --- src/lib/auth.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/auth.ts b/src/lib/auth.ts index e1a297c..4fb8c8d 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -68,7 +68,7 @@ export const authOptions: NextAuthOptions = { gitlab_login: p.username, updated_at: new Date().toISOString(), }, - { onConflict: "email" } + { onConflict: "gitlab_id" } ); } return true; From b07b2c05b03b75fe560eece50196e47308559bd1 Mon Sep 17 00:00:00 2001 From: Sanchit Rishi Date: Tue, 19 May 2026 19:03:27 +0530 Subject: [PATCH 6/6] fix: clean migration, drop github_login not null, fix gitlab button style (#9) --- src/app/page.tsx | 2 +- supabase/migrations/20260519000001_add_gitlab_columns.sql | 2 -- supabase/migrations/20260520000000_add_gitlab_columns.sql | 7 ++++--- supabase/schema.sql | 2 +- 4 files changed, 6 insertions(+), 7 deletions(-) delete mode 100644 supabase/migrations/20260519000001_add_gitlab_columns.sql diff --git a/src/app/page.tsx b/src/app/page.tsx index a468529..e7430ca 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -27,7 +27,7 @@ export default async function HomePage() { Sign in with GitLab diff --git a/supabase/migrations/20260519000001_add_gitlab_columns.sql b/supabase/migrations/20260519000001_add_gitlab_columns.sql deleted file mode 100644 index b69c3a5..0000000 --- a/supabase/migrations/20260519000001_add_gitlab_columns.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE users ADD COLUMN IF NOT EXISTS gitlab_id text UNIQUE; -ALTER TABLE users ADD COLUMN IF NOT EXISTS gitlab_login text; diff --git a/supabase/migrations/20260520000000_add_gitlab_columns.sql b/supabase/migrations/20260520000000_add_gitlab_columns.sql index 497b244..33f4378 100644 --- a/supabase/migrations/20260520000000_add_gitlab_columns.sql +++ b/supabase/migrations/20260520000000_add_gitlab_columns.sql @@ -1,3 +1,4 @@ -sqlalter table users add column if not exists gitlab_id text unique; -alter table users add column if not exists gitlab_login text; -alter table users alter column github_id drop not null; +sqlALTER TABLE users ADD COLUMN IF NOT EXISTS gitlab_id text UNIQUE; +ALTER TABLE users ADD COLUMN IF NOT EXISTS gitlab_login text; +ALTER TABLE users ALTER COLUMN github_id DROP NOT NULL; +ALTER TABLE users ALTER COLUMN github_login DROP NOT NULL; diff --git a/supabase/schema.sql b/supabase/schema.sql index 88f8071..8866879 100644 --- a/supabase/schema.sql +++ b/supabase/schema.sql @@ -3,7 +3,7 @@ create table if not exists users ( id text primary key default gen_random_uuid()::text, github_id text unique, - github_login text not null, + github_login text, gitlab_id text unique, gitlab_login text, created_at timestamptz default now(),