From 1baaece2fcaf2eb80b3569e358c3525e68dcd8f4 Mon Sep 17 00:00:00 2001 From: Daseul Kim Date: Wed, 2 Jul 2025 15:25:25 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20qna=20=EB=93=B1=EB=A1=9D=20?= =?UTF-8?q?=EC=95=8C=EB=A6=BC=20=EB=A9=94=EC=9D=BC=20=EC=86=A1=EC=8B=A0=20?= =?UTF-8?q?api=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/api/qna/notify/route.ts | 60 +++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/app/api/qna/notify/route.ts diff --git a/src/app/api/qna/notify/route.ts b/src/app/api/qna/notify/route.ts new file mode 100644 index 0000000..ae5bdac --- /dev/null +++ b/src/app/api/qna/notify/route.ts @@ -0,0 +1,60 @@ +import { NextRequest, NextResponse } from 'next/server' +import { HttpStatusCode } from 'axios' +import { loggerWrapper } from '@/libs/api-wrapper' +import { sendEmail } from '@/libs/mailer' +import { prisma } from '@/libs/prisma' + +async function notify(request: NextRequest): Promise { + const formData = await request.formData() + const qnaClsLrgCd = formData.get('qnaCd') as string + + /* 파라미터 체크 */ + if (qnaClsLrgCd === '') { + return NextResponse.json({ error: '필수 파라미터가 누락되었습니다' }, { status: HttpStatusCode.BadRequest }) + } + + try { + /* 수신자 조회 */ + const receivers: string[] = await getReceiver(qnaClsLrgCd) + console.log('receivers: ', receivers) + + /* 메일 전송 */ + await sendEmail({ + from: 'test@test.com', + // to: receivers, // 테스트 완료 시 주석 해제 + to: 'seul@interplug.co.kr', // to: 'test@test.com', + subject: '메일 전송 테스트 제목', + content: '

메일 전송 테스트입니다.

', + }) + + return NextResponse.json('success') + } catch (error) { + console.error(`error : ${error}`) + return NextResponse.json({ error: `error : ${error}` }, { status: HttpStatusCode.InternalServerError }) + } +} + +/* 수신자 조회 */ +const getReceiver = async (qnaClsLrgCd: string): Promise => { + const query = ` + OPEN SYMMETRIC KEY SYMMETRICKEY DECRYPTION BY CERTIFICATE CERTI_QSPJP; + SELECT CONVERT(NVARCHAR(100), DecryptByKey(bu.e_mail)) AS email + FROM BC_USER bu + WHERE bu.user_id IN ( + SELECT user_id + FROM SY_POLICY_U spu + WHERE policy_cd = ( + SELECT bcl.ref_chr2 + FROM BC_COMM_L bcl + WHERE bcl.head_cd = (SELECT head_cd FROM BC_COMM_H bch WHERE head_id = 'QNA_CLS_MID_CD') + AND bcl.ref_chr1 = '${qnaClsLrgCd}' + GROUP BY bcl.ref_chr2 + ) + ) + CLOSE SYMMETRIC KEY SYMMETRICKEY; + ` + const receivers: { email: string }[] = await prisma.$queryRawUnsafe(query) + return receivers.map((receiver) => receiver.email) +} + +export const POST = loggerWrapper(notify) From b61261bea52ba060d6835dbc314a9d3211534a97 Mon Sep 17 00:00:00 2001 From: Daseul Kim Date: Wed, 2 Jul 2025 15:29:39 +0900 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20qna=20=EB=93=B1=EB=A1=9D=20?= =?UTF-8?q?=EC=95=8C=EB=A6=BC=20=EB=A9=94=EC=9D=BC=20=EC=86=A1=EC=8B=A0=20?= =?UTF-8?q?api=20=EC=97=90=20=EC=88=98=EC=8B=A0=EC=9E=90=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EC=9A=A9=20=ED=8C=8C=EB=9D=BC=EB=AF=B8?= =?UTF-8?q?=ED=84=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/api/qna/notify/route.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/app/api/qna/notify/route.ts b/src/app/api/qna/notify/route.ts index ae5bdac..866b8cc 100644 --- a/src/app/api/qna/notify/route.ts +++ b/src/app/api/qna/notify/route.ts @@ -8,6 +8,10 @@ async function notify(request: NextRequest): Promise { const formData = await request.formData() const qnaClsLrgCd = formData.get('qnaCd') as string + // 메일 발송 테스트용 파라미터. 테스트 완료 시 제거. + // 여러 수신자에게 발송 시 ', '(콤마)로 구분하여 입력 + const testReceivers = formData.get('testReceivers') as string + /* 파라미터 체크 */ if (qnaClsLrgCd === '') { return NextResponse.json({ error: '필수 파라미터가 누락되었습니다' }, { status: HttpStatusCode.BadRequest }) @@ -22,7 +26,7 @@ async function notify(request: NextRequest): Promise { await sendEmail({ from: 'test@test.com', // to: receivers, // 테스트 완료 시 주석 해제 - to: 'seul@interplug.co.kr', // to: 'test@test.com', + to: testReceivers, subject: '메일 전송 테스트 제목', content: '

메일 전송 테스트입니다.

', })