Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions app/RegisterSW.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
"use client";

import { useEffect } from "react";

export default function RegisterSW() {
useEffect(() => {
if ("serviceWorker" in navigator) {
navigator.serviceWorker
.register("/sw.js")
.then(() => console.log("SW registered"))
.catch((err) => console.error("SW registration failed:", err));
}
}, []);

return null;
}
50 changes: 26 additions & 24 deletions app/api/github/check-repo/[repo_name]/route.ts
Original file line number Diff line number Diff line change
@@ -1,31 +1,33 @@
import { NextResponse } from 'next/server';
import { checkRepositoryAvailability } from '@/lib/services/github';
import { NextResponse } from "next/server";
import type { NextRequest } from "next/server";
import { checkRepositoryAvailability } from "@/lib/github-api";
import { getPlainServiceToken } from "@/lib/services/tokens";

interface RouteContext {
params: Promise<{ repo_name: string }>;
}
export const runtime = "nodejs";
export const dynamic = "force-dynamic";

export async function GET(_request: Request, { params }: RouteContext) {
export async function GET(
_req: NextRequest,
{ params }: { params: Promise<{ repo_name: string }> }
) {
try {
const { repo_name } = await params;
const result = await checkRepositoryAvailability(repo_name);
if (result.exists) {
return NextResponse.json({ available: false, username: result.username }, { status: 409 });
const { repo_name } = await params; // 🔥 여기서 await 해야 함

const token = await getPlainServiceToken("github");
if (!token) {
return NextResponse.json({ error: "No GitHub token" }, { status: 401 });
}
return NextResponse.json({ available: true, username: result.username });
} catch (error) {
console.error('[API] Failed to check repository availability:', error);
const status = error instanceof Error && 'status' in error ? (error as any).status ?? 500 : 500;
return NextResponse.json(
{
success: false,
error: 'Failed to check repository availability',
message: error instanceof Error ? error.message : 'Unknown error',
},
{ status },

const owner = process.env.GITHUB_OWNER!;
const result = await checkRepositoryAvailability(
token,
owner,
repo_name
);

return NextResponse.json(result);
} catch (err) {
console.error(err);
return NextResponse.json({ error: "Failed" }, { status: 500 });
}
}

export const runtime = 'nodejs';
export const dynamic = 'force-dynamic';
84 changes: 61 additions & 23 deletions app/api/github/create-repo/route.ts
Original file line number Diff line number Diff line change
@@ -1,28 +1,70 @@
import { NextRequest, NextResponse } from 'next/server';
import { createRepository, getGithubUser } from '@/lib/services/github';
import { NextRequest, NextResponse } from "next/server";
import { getPlainServiceToken } from "@/lib/services/tokens";

export const runtime = "nodejs";
export const dynamic = "force-dynamic";

export async function POST(request: NextRequest) {
try {
const body = await request.json();
if (!body || typeof body !== 'object') {
return NextResponse.json({ success: false, error: 'Invalid payload' }, { status: 400 });

const repoName = body?.repo_name;
const description = body?.description ?? "";
const isPrivate = body?.private ?? false;

if (!repoName || typeof repoName !== "string") {
return NextResponse.json(
{ success: false, error: "repo_name is required" },
{ status: 400 }
);
}

const repoName = typeof body.repo_name === 'string' ? body.repo_name : undefined;
if (!repoName) {
return NextResponse.json({ success: false, error: 'repo_name is required' }, { status: 400 });
const token = await getPlainServiceToken("github");
if (!token) {
return NextResponse.json(
{ success: false, error: "GitHub token not configured" },
{ status: 401 }
);
}

const description = typeof body.description === 'string' ? body.description : '';
const isPrivate = typeof body.private === 'boolean' ? body.private : false;
// 1️⃣ 사용자 정보 가져오기
const userRes = await fetch("https://api.github.com/user", {
headers: {
Authorization: `Bearer ${token}`,
Accept: "application/vnd.github+json",
},
});

if (!userRes.ok) {
throw new Error("Failed to fetch GitHub user");
}

const repo = await createRepository({
repoName,
description,
private: isPrivate,
const user = await userRes.json();

// 2️⃣ 레포 생성
const repoRes = await fetch("https://api.github.com/user/repos", {
method: "POST",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
Accept: "application/vnd.github+json",
},
body: JSON.stringify({
name: repoName,
description,
private: isPrivate,
}),
});

const user = await getGithubUser();
if (!repoRes.ok) {
const err = await repoRes.json().catch(() => ({}));
return NextResponse.json(
{ success: false, error: err?.message ?? "Failed to create repo" },
{ status: repoRes.status }
);
}

const repo = await repoRes.json();

return NextResponse.json({
success: true,
Expand All @@ -33,18 +75,14 @@ export async function POST(request: NextRequest) {
owner: user.login,
});
} catch (error) {
console.error('[API] Failed to create GitHub repository:', error);
const status = error instanceof Error && 'status' in error ? (error as any).status ?? 500 : 500;
console.error("[API] Failed to create GitHub repository:", error);

return NextResponse.json(
{
success: false,
error: 'Failed to create GitHub repository',
message: error instanceof Error ? error.message : 'Unknown error',
error: "Failed to create GitHub repository",
},
{ status },
{ status: 500 }
);
}
}

export const runtime = 'nodejs';
export const dynamic = 'force-dynamic';
}
98 changes: 0 additions & 98 deletions app/api/projects/[project_id]/files/content/route.ts

This file was deleted.

43 changes: 0 additions & 43 deletions app/api/projects/[project_id]/files/route.ts

This file was deleted.

53 changes: 0 additions & 53 deletions app/api/projects/[project_id]/github/connect/route.ts

This file was deleted.

Loading