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(),