From 2acfe1901c3b5c160abe3c6ed0c5a50d9a591912 Mon Sep 17 00:00:00 2001 From: JeongwooSeo Date: Thu, 18 Dec 2025 17:49:16 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20=EB=B0=9C?= =?UTF-8?q?=EC=86=A1=20=EC=97=AC=EB=B6=80=EB=A5=BC=20=EA=B2=B0=EC=A0=95?= =?UTF-8?q?=ED=95=A0=20=EC=88=98=20=EC=9E=88=EB=8A=94=20=ED=94=8C=EB=9E=98?= =?UTF-8?q?=EA=B7=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/posts/route.ts | 5 ++-- app/entities/post/write/PostMetadataForm.tsx | 29 ++++++++++++++++++-- app/hooks/post/usePost.ts | 5 ++++ app/types/Post.d.ts | 1 + 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/app/api/posts/route.ts b/app/api/posts/route.ts index d4917b2..9b1e0b0 100644 --- a/app/api/posts/route.ts +++ b/app/api/posts/route.ts @@ -129,6 +129,7 @@ export async function POST(req: Request) { seriesId, tags, isPrivate, + sendToSubscribers, } = await req.json(); if (!title || !content || !author || !content) { @@ -176,8 +177,8 @@ export async function POST(req: Request) { }); } - // 새 글이 공개 글인 경우 구독자들에게 이메일 발송 - if (!post.isPrivate) { + // 공개 글이면서 구독자에게 발행 옵션이 활성화된 경우 이메일 발송 + if (!post.isPrivate && sendToSubscribers) { const { sendNewPostNotifications } = await import( '@/app/lib/email/notifications' ); diff --git a/app/entities/post/write/PostMetadataForm.tsx b/app/entities/post/write/PostMetadataForm.tsx index 5e6480a..9404d3b 100644 --- a/app/entities/post/write/PostMetadataForm.tsx +++ b/app/entities/post/write/PostMetadataForm.tsx @@ -21,6 +21,7 @@ interface PostMetadataFormProps { seriesId?: string; tags: string[]; isPrivate: boolean; + sendToSubscribers: boolean; }; } @@ -37,7 +38,8 @@ const PostMetadataForm = ({ }: PostMetadataFormProps) => { const [tagInput, setTagInput] = useState(''); - const { title, subTitle, seriesId, tags, isPrivate } = formData; + const { title, subTitle, seriesId, tags, isPrivate, sendToSubscribers } = + formData; const selectOptions = series.map((s) => ({ value: s._id, label: s.title, @@ -67,7 +69,15 @@ const PostMetadataForm = ({ }; const handlePublicChange = (e: ChangeEvent) => { - onFieldChange('isPrivate', e.target.checked); + const newIsPrivate = e.target.checked; + onFieldChange('isPrivate', newIsPrivate); + if (newIsPrivate) { + onFieldChange('sendToSubscribers', false); + } + }; + + const handleSendToSubscribersChange = (e: ChangeEvent) => { + onFieldChange('sendToSubscribers', e.target.checked); }; return ( @@ -161,6 +171,21 @@ const PostMetadataForm = ({ /> + {/* 구독자에게 발행 체크박스 */} +
+ +