| import { NextResponse } from "next/server"; |
| import { createProviderConnection } from "@/models"; |
|
|
| const GITLAB_DEFAULT_BASE = "https://gitlab.com"; |
|
|
| |
| |
| |
| |
| export async function POST(request) { |
| try { |
| let body; |
| try { |
| body = await request.json(); |
| } catch { |
| return NextResponse.json({ error: "Invalid request body" }, { status: 400 }); |
| } |
|
|
| const { token, baseUrl } = body; |
| if (!token?.trim()) { |
| return NextResponse.json({ error: "Personal Access Token is required" }, { status: 400 }); |
| } |
|
|
| const base = (baseUrl?.trim() || GITLAB_DEFAULT_BASE).replace(/\/$/, ""); |
|
|
| |
| const userRes = await fetch(`${base}/api/v4/user`, { |
| headers: { "Private-Token": token.trim(), Accept: "application/json" }, |
| }); |
|
|
| if (!userRes.ok) { |
| const err = await userRes.text(); |
| return NextResponse.json({ error: `GitLab token verification failed: ${err}` }, { status: 401 }); |
| } |
|
|
| const user = await userRes.json(); |
| const email = user.email || user.public_email || ""; |
|
|
| await createProviderConnection({ |
| provider: "gitlab", |
| authType: "oauth", |
| accessToken: token.trim(), |
| refreshToken: null, |
| expiresAt: null, |
| email, |
| displayName: user.name || user.username || email, |
| testStatus: "active", |
| providerSpecificData: { |
| username: user.username || "", |
| email, |
| name: user.name || "", |
| baseUrl: base, |
| authKind: "personal_access_token", |
| }, |
| }); |
|
|
| return NextResponse.json({ success: true }); |
| } catch (error) { |
| console.error("GitLab PAT auth error:", error); |
| return NextResponse.json({ error: error.message }, { status: 500 }); |
| } |
| } |
|
|