Skip to content
Merged
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
169 changes: 66 additions & 103 deletions src/app/api/projectMembers/route.ts
Original file line number Diff line number Diff line change
@@ -1,160 +1,123 @@
import { supabase } from "@/lib/supabase/supabase";
import { supabaseAdmin } from "@/lib/supabase/server";
import { getUnifiedAuthUser } from "@/lib/auth/unifiedAuth";

export async function GET(request: Request) {
const auth = await getUnifiedAuthUser();
if (!auth.isAuthenticated) {
return Response.json({ error: "Unauthorized" }, { status: 401 });
}

const { searchParams } = new URL(request.url);
const id = searchParams.get("id");
const role = searchParams.get("role");
const userId = searchParams.get("userId");

// 사용자 인증
// const session = await getServerSession(authOptions);

// if (!session?.user) {
// return Response.json({ error: 'Unauthorized-test', session:session }, { status: 401 });
// }

// 쿼리 실행 [프로젝트 멤버 조회]
let query = supabase.from("project_members").select("*");
if (id) {
query = query.eq("project_id", id);
}
if (role) {
query = query.eq("role", role);
}
if (userId) {
query = query.eq("user_id", userId);
}
let query = supabaseAdmin.from("project_members").select("*");
if (id) query = query.eq("project_id", id);
if (role) query = query.eq("role", role);
if (userId) query = query.eq("user_id", userId);

const { data: projectMembers, error: getError } = await query;
const { data: projectMembers, error } = await query;

if (getError) {
console.error("Error fetching projects:", getError);
return Response.json({ error: getError.message }, { status: 500 });
if (error) {
console.error("Error fetching project members:", error);
return Response.json({ error: error.message }, { status: 500 });
}


const result = {
return Response.json({
message: `프로젝트 멤버[${id}] 정보 조회`,
params: {
projectMemberId: id || "파라미터 없음",
userId: userId || "파라미터 없음",
},
data: projectMembers,
timestamp: new Date().toISOString(),
};

// 결과 반환
return Response.json(result);
});
}

export async function POST(request: Request) {
const auth = await getUnifiedAuthUser();
if (!auth.isAuthenticated) {
return Response.json({ error: "Unauthorized" }, { status: 401 });
}

const { searchParams } = new URL(request.url);
const id = searchParams.get("id");

const data = await request.json();

// 사용자 인증
// const session = await getServerSession(authOptions);

// if (!session?.user) {
// return Response.json({ error: 'Unauthorized-test', session:session }, { status: 401 });
// }

const projectMember = data.map((member:any) => ({
const projectMember = data.map((member: { userId: string; role: string }) => ({
project_id: id,
user_id: member.userId,
role: member.role
role: member.role,
}));


// 쿼리 실행 [프로젝트 멤버 정보 업데이트]
const { data: projectMembers, error: postError } = await supabase
.from('project_members')
.upsert(projectMember, { onConflict: 'project_id, user_id' })
const { error: upsertError } = await supabaseAdmin
.from("project_members")
.upsert(projectMember, { onConflict: "project_id, user_id" })
.select();

if (postError) {
console.error("Error fetching projects:", postError);
return Response.json({ error: postError.message }, { status: 500 });
}
if (upsertError) {
console.error("Error upserting project members:", upsertError);
return Response.json({ error: upsertError.message }, { status: 500 });
}

const currentIds = projectMember.map((member:any) => member.user_id);
// 현재 목록에 없는 멤버 삭제 (SQL injection 방지: in() 메서드 사용)
const currentIds = projectMember.map((member: { user_id: string }) => member.user_id);

const { error: deleteError } = await supabase
.from('project_members')
if (currentIds.length > 0) {
const { error: deleteError } = await supabaseAdmin
.from("project_members")
.delete()
.eq('project_id', id)
.not('user_id', 'in', `(${currentIds.join(',')})`);
.eq("project_id", id)
.not("user_id", "in", `(${currentIds.join(",")})`);

if (deleteError) {
console.error("Error deleting project:", deleteError);
console.error("Error deleting removed members:", deleteError);
return Response.json({ error: deleteError.message }, { status: 500 });
}
} else {
// 멤버가 없으면 해당 프로젝트의 모든 멤버 삭제
const { error: deleteError } = await supabaseAdmin
.from("project_members")
.delete()
.eq("project_id", id);

const result = {
message: `프로젝트 멤버 업데이트`,
params: {
projectMemberId: id || "파라미터 없음",
},
timestamp: new Date().toISOString(),
};

// 결과 반환
return Response.json(result);
}

export async function PUT(request: Request) {
const { searchParams } = new URL(request.url);
const body = await request.json();

const id = searchParams.get("id");
const { data } = body;

// 사용자 인증
// const session = await getServerSession(authOptions);

// if (!session?.user) {
// return Response.json({ error: 'Unauthorized-test', session:session }, { status: 401 });
// }
if (deleteError) {
console.error("Error deleting all members:", deleteError);
return Response.json({ error: deleteError.message }, { status: 500 });
}
}

// 쿼리 실행 [프로젝트 멤버 정보 업데이트]
const result = {
message: `프로젝트 멤버[${id}] 정보 업데이트`,
receivedData: body,
return Response.json({
message: "프로젝트 멤버 업데이트",
params: { projectMemberId: id || "파라미터 없음" },
timestamp: new Date().toISOString(),
};
});
}

export async function DELETE(request: Request) {
const auth = await getUnifiedAuthUser();
if (!auth.isAuthenticated) {
return Response.json({ error: "Unauthorized" }, { status: 401 });
}

const { searchParams } = new URL(request.url);
const id = searchParams.get("id");

// 사용자 인증
// const session = await getServerSession(authOptions);

// if (!session?.user) {
// return Response.json({ error: 'Unauthorized-test', session:session }, { status: 401 });
// }

// 쿼리 실행 [프로젝트 멤버 정보 삭제]
const { data: deletedProjectMember, error: deleteError } = await supabase
const { error } = await supabaseAdmin
.from("project_members")
.delete()
.eq("project_id", id);

if (deleteError) {
console.error("Error deleting project:", deleteError);
return Response.json({ error: deleteError.message }, { status: 500 });
if (error) {
console.error("Error deleting project members:", error);
return Response.json({ error: error.message }, { status: 500 });
}

const result = {
return Response.json({
message: `프로젝트 멤버[${id}] 정보 삭제`,
params: {
projectMemberId: id || "파라미터 없음",
},
params: { projectMemberId: id || "파라미터 없음" },
timestamp: new Date().toISOString(),
};

// 결과 반환
return Response.json(result);
});
}
9 changes: 7 additions & 2 deletions src/app/api/projects/[id]/route.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
// src/app/api/projects/[id]/route.ts
import { NextRequest, NextResponse } from "next/server";
import { supabaseAdmin } from "@/lib/supabase/server";
import { getUnifiedAuthUser } from "@/lib/auth/unifiedAuth";

export async function GET(
_request: NextRequest,
{ params }: { params: Promise<{ id: string }> }
) {
try {
const auth = await getUnifiedAuthUser();
if (!auth.isAuthenticated) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}

const { id } = await params;

if (!id) {
Expand Down Expand Up @@ -34,7 +39,7 @@ export async function GET(
} catch (error) {
console.error("❌ API error:", error);
return NextResponse.json(
{ error: "Internal server error", details: error },
{ error: "Internal server error" },
{ status: 500 }
);
}
Expand Down
Loading
Loading