feat(youtube-bot): 예정 일정에 고정 멤버 포함 옵션 추가

예정 일정 자동 생성 시 봇의 고정 멤버(default_member_ids)를 함께
추가하는 옵션(auto_schedule_config.includeDefaultMembers). 워크돌처럼
멤버가 고정인 채널의 다음 주 예정 일정에 멤버가 자동으로 붙음.
DB/라우트 변경 없이 auto_schedule_config JSON에 플래그 추가 +
관리자 다이얼로그에 토글.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
caadiq 2026-06-07 18:12:26 +09:00
parent 8a8548e2d7
commit 7d58d19737
2 changed files with 37 additions and 0 deletions

View file

@ -110,6 +110,15 @@ async function youtubeBotPlugin(fastify) {
[newScheduleId, null, 'video', bot.channelId, bot.channelName]
);
// 옵션: 예정 일정에 고정 멤버 포함
if (autoScheduleNext.includeDefaultMembers && bot.defaultMemberIds?.length > 0) {
const values = [...new Set(bot.defaultMemberIds)].map(id => [newScheduleId, id]);
await conn.query(
'INSERT INTO schedule_members (schedule_id, member_id) VALUES ?',
[values]
);
}
return newScheduleId;
});

View file

@ -293,6 +293,7 @@ function YouTubeBotDialog({ isOpen, onClose, botId = null, onSuccess }) {
const [scheduleTime, setScheduleTime] = useState('18:00');
const [titleTemplate, setTitleTemplate] = useState('{channelName} {episode}화');
const [deadlineDayOfWeek, setDeadlineDayOfWeek] = useState(5);
const [includeDefaultMembers, setIncludeDefaultMembers] = useState(false);
//
const [showAdvanced, setShowAdvanced] = useState(false);
@ -371,12 +372,14 @@ function YouTubeBotDialog({ isOpen, onClose, botId = null, onSuccess }) {
setScheduleTime(config.time?.slice(0, 5) || '18:00');
setTitleTemplate(config.titleTemplate || '{channelName} {episode}화');
setDeadlineDayOfWeek(config.deadlineDayOfWeek ?? 5);
setIncludeDefaultMembers(config.includeDefaultMembers ?? false);
} else {
setAutoScheduleEnabled(false);
setScheduleDayOfWeek(4);
setScheduleTime('18:00');
setTitleTemplate('{channelName} {episode}화');
setDeadlineDayOfWeek(5);
setIncludeDefaultMembers(false);
}
setTitleFilters(bot.title_filters || []);
@ -458,6 +461,7 @@ function YouTubeBotDialog({ isOpen, onClose, botId = null, onSuccess }) {
time: `${scheduleTime}:00`,
titleTemplate,
deadlineDayOfWeek,
includeDefaultMembers,
}
: null,
weekly_schedule_config: pollingMode === 'weekly'
@ -756,6 +760,30 @@ function YouTubeBotDialog({ isOpen, onClose, botId = null, onSuccess }) {
요일까지 영상이 없으면 예정 일정을 삭제합니다
</p>
</div>
{/* 고정 멤버 포함 */}
<div
className="flex items-center justify-between cursor-pointer pt-1"
onClick={() => setIncludeDefaultMembers(!includeDefaultMembers)}
>
<div>
<p className="text-sm text-gray-700">고정 멤버 포함</p>
<p className="text-xs text-gray-400 mt-0.5">
예정 일정에 고급 설정의 고정 멤버를 함께 추가합니다
</p>
</div>
<div
className={`flex-shrink-0 w-11 h-6 rounded-full transition-colors ${
includeDefaultMembers ? 'bg-red-500' : 'bg-gray-200'
}`}
>
<div
className={`w-5 h-5 bg-white rounded-full shadow-sm transform transition-transform mt-0.5 ${
includeDefaultMembers ? 'translate-x-5.5 ml-0.5' : 'translate-x-0.5'
}`}
/>
</div>
</div>
</div>
)}
</div>