Files
Mayne0213 f78454c2a1
Some checks failed
Build Docker Image / build-and-push (push) Has been cancelled
CI / lint-and-build (push) Has been cancelled
CHORE(merge): merge from develop
- Initial setup and all features from develop branch
- Includes: auth, deploy, docker, style fixes
- K3S deployment configuration
2026-01-06 17:29:16 +09:00

97 lines
2.7 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server';
import { prisma } from '@/lib/prisma';
import { getPaginationParams, createPaginatedResponse } from '@/lib/utils';
// GET: 공지사항 조회 (pagination 지원)
export async function GET(request: NextRequest) {
try {
const { searchParams } = new URL(request.url);
const { page, limit, skip } = getPaginationParams(searchParams, 10);
const [announcements, total] = await Promise.all([
prisma.announcement.findMany({
include: {
author: {
select: {
id: true,
userId: true,
userName: true,
},
},
},
orderBy: { createdAt: 'desc' },
skip,
take: limit,
}),
prisma.announcement.count(),
]);
return NextResponse.json({
success: true,
...createPaginatedResponse(announcements, total, page, limit),
});
} catch (err) {
console.error('Get announcements error:', err);
const errorMessage = err instanceof Error ? err.message : '공지사항 조회에 실패했습니다.';
return NextResponse.json(
{ success: false, error: errorMessage },
{ status: 500 }
);
}
}
// POST: 새로운 공지사항 생성
export async function POST(request: NextRequest) {
try {
const body = await request.json();
const { title, content, isImportant, authorId, files } = body;
if (!title || !authorId) {
return NextResponse.json(
{ success: false, message: '필수 필드가 누락되었습니다.' },
{ status: 400 }
);
}
const announcement = await prisma.announcement.create({
data: {
title,
content: content || "",
isImportant: isImportant || false,
authorId,
files: files && files.length > 0 ? {
create: files.map((file: { fileKey: string; fileName: string; fileSize?: number; mimeType?: string }) => ({
fileKey: file.fileKey,
fileName: file.fileName,
fileSize: file.fileSize,
mimeType: file.mimeType,
}))
} : undefined,
},
include: {
author: {
select: {
id: true,
userId: true,
userName: true,
},
},
files: true,
},
});
return NextResponse.json({
success: true,
data: announcement,
}, { status: 201 });
} catch (err) {
console.error('Create announcement error:', err);
const errorMessage = err instanceof Error ? err.message : '공지사항 생성에 실패했습니다.';
return NextResponse.json(
{ success: false, message: errorMessage },
{ status: 500 }
);
}
}