관리자 계정 설정, 관리자 페이지 작업1

This commit is contained in:
wallace
2025-11-13 15:02:43 +09:00
parent c81f218a2b
commit 8403684df3
20 changed files with 1571 additions and 46 deletions

View File

@@ -0,0 +1,182 @@
import { NextRequest, NextResponse } from 'next/server';
import { prisma } from '@/lib/prisma';
// GET: 사용자-강좌 수강 관계 목록 조회
export async function GET(request: NextRequest) {
try {
const searchParams = request.nextUrl.searchParams;
const userId = searchParams.get('userId');
const lectureId = searchParams.get('lectureId');
const page = parseInt(searchParams.get('page') || '1');
const limit = parseInt(searchParams.get('limit') || '100');
const skip = (page - 1) * limit;
const where: any = {};
if (userId) where.userId = userId;
if (lectureId) where.lectureId = lectureId;
const [userLectures, total] = await Promise.all([
prisma.userLecture.findMany({
where,
skip,
take: limit,
orderBy: {
enrolledAt: 'desc',
},
include: {
user: {
select: {
id: true,
name: true,
email: true,
},
},
lecture: {
include: {
curriculum: {
select: {
title: true,
},
},
},
},
},
}),
prisma.userLecture.count({ where }),
]);
return NextResponse.json({
data: userLectures.map((ul) => ({
id: ul.id,
userId: ul.userId,
userName: ul.user.name,
userEmail: ul.user.email,
lectureId: ul.lectureId,
lectureName: ul.lecture.title,
courseName: ul.lecture.curriculum.title,
enrolledAt: ul.enrolledAt.toISOString().split('T')[0],
completedAt: ul.completedAt ? ul.completedAt.toISOString().split('T')[0] : null,
isCompleted: ul.isCompleted,
progress: ul.progress,
score: ul.score,
})),
pagination: {
page,
limit,
total,
totalPages: Math.ceil(total / limit),
},
});
} catch (error) {
console.error('Error fetching user lectures:', error);
return NextResponse.json(
{ error: '수강 관계 목록을 불러오는 중 오류가 발생했습니다.' },
{ status: 500 }
);
}
}
// POST: 사용자-강좌 수강 관계 생성 (수강 신청)
export async function POST(request: NextRequest) {
try {
const body = await request.json();
const { userId, lectureId } = body;
if (!userId || !lectureId) {
return NextResponse.json(
{ error: '사용자 ID와 강좌 ID는 필수입니다.' },
{ status: 400 }
);
}
// 사용자 존재 확인
const user = await prisma.user.findUnique({
where: { id: userId },
});
if (!user) {
return NextResponse.json(
{ error: '유효한 사용자를 선택해주세요.' },
{ status: 400 }
);
}
// 강좌 존재 확인
const lecture = await prisma.lecture.findUnique({
where: { id: lectureId },
});
if (!lecture) {
return NextResponse.json(
{ error: '유효한 강좌를 선택해주세요.' },
{ status: 400 }
);
}
// 이미 수강 중인지 확인
const existing = await prisma.userLecture.findUnique({
where: {
userId_lectureId: {
userId,
lectureId,
},
},
});
if (existing) {
return NextResponse.json(
{ error: '이미 수강 중인 강좌입니다.' },
{ status: 400 }
);
}
const userLecture = await prisma.userLecture.create({
data: {
userId,
lectureId,
},
include: {
user: {
select: {
id: true,
name: true,
email: true,
},
},
lecture: {
include: {
curriculum: {
select: {
title: true,
},
},
},
},
},
});
return NextResponse.json({
data: {
id: userLecture.id,
userId: userLecture.userId,
userName: userLecture.user.name,
userEmail: userLecture.user.email,
lectureId: userLecture.lectureId,
lectureName: userLecture.lecture.title,
courseName: userLecture.lecture.curriculum.title,
enrolledAt: userLecture.enrolledAt.toISOString().split('T')[0],
completedAt: userLecture.completedAt ? userLecture.completedAt.toISOString().split('T')[0] : null,
isCompleted: userLecture.isCompleted,
progress: userLecture.progress,
score: userLecture.score,
},
}, { status: 201 });
} catch (error) {
console.error('Error creating user lecture:', error);
return NextResponse.json(
{ error: '수강 신청 중 오류가 발생했습니다.' },
{ status: 500 }
);
}
}