Commit graph

542 commits

Author SHA1 Message Date
d50488d7e3 refactor(members): PC 멤버 페이지 3열 레이아웃 + 마지막 줄 가운데 정렬
- 5열에서 3열 레이아웃으로 변경
- max-w-4xl로 카드 크기 축소
- flexbox로 마지막 줄 가운데 정렬

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-08 22:15:51 +09:00
45da9c6277 feat(members): 전 멤버 섹션 제거
- PC 멤버 페이지에서 전 멤버 섹션 제거
- 모바일 멤버 페이지에서 전 멤버 섹션 제거

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-08 22:10:47 +09:00
9163ade56d feat(schedule): 달력 및 일정 목록 영역에 진입 애니메이션 추가
- 왼쪽 영역(달력, 카테고리): 왼쪽에서 슬라이드 인
- 오른쪽 영역(일정 목록): 오른쪽에서 슬라이드 인
- 타이틀 애니메이션과 연속되도록 delay 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-08 22:09:11 +09:00
7d140aa1f3 fix(x-bot): 동기화 결과에 total 필드 추가
- syncNewTweets(), syncAllTweets()에 total 필드 추가
- 프론트엔드 토스트에서 undefined 표시되던 문제 해결

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-08 09:57:04 +09:00
c86cda00ae fix(meilisearch): 전체 동기화 시 DB에 없는 문서 삭제
- syncAllSchedules()에서 Meilisearch의 모든 문서 ID 조회
- DB에 없는 문서는 Meilisearch에서 삭제
- 삭제된 일정이 검색에 계속 나타나는 문제 해결

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-08 09:50:54 +09:00
294018c93b refactor(x-bot): x_profiles 테이블 제거, bot_x로 통합
- x_profiles 테이블 삭제 (bot_x에 프로필 정보 포함)
- saveProfile(), getProfile() 함수가 bot_x 테이블 사용하도록 수정
- Redis 캐시는 그대로 유지 (성능)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-08 09:42:26 +09:00
5d44434e36 feat(x-bot): 리트윗 옵션 및 고정 트윗 제외 기능 추가
- include_retweets 옵션으로 리트윗 포함 여부 설정 가능
- 고정된 트윗(pinned)은 기본적으로 파싱에서 제외
- XBotDialog에서 Twitter 아이콘을 X 아이콘으로 변경
- schedule_x의 username을 source_name으로 활용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-08 09:37:57 +09:00
9ceef6c656 feat(x-bot): 키워드 필터링 및 전체 동기화 기능 추가
Backend:
- bot_x 테이블에 text_filters 컬럼 추가
- syncNewTweets/syncAllTweets에 텍스트 필터링 로직 적용
- 봇 추가 시 전체 트윗 동기화 수행 (백그라운드)
- X 봇 API에 text_filters 필드 처리

Frontend:
- XBotDialog에 고급 설정 (키워드 필터) UI 추가
- BotTableRow에서 X 봇 수정/삭제 버튼 활성화

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-08 09:23:45 +09:00
eeb5e7234c feat(frontend): X 봇 관리 UI 추가
- XBotDialog 컴포넌트 생성
- ScheduleBots 페이지에 X 봇 추가/수정/삭제 통합
- X 섹션에 canAdd 활성화

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-08 09:12:38 +09:00
ec0e587434 feat(frontend): X 봇 API 클라이언트 함수 추가
- getXBot, lookupXProfile, createXBot, updateXBot, deleteXBot

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-08 09:08:52 +09:00
86769f1edc feat(admin): 봇 목록 API에 X 봇 상세 정보 추가
- 스키마에 X 봇 필드 추가 (username, display_name, avatar_url)
- X 봇 응답에 db_id, cron_interval 포함

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-07 23:56:45 +09:00
25c2b45cf5 feat(scheduler): X 봇 DB 기반 로드 추가
- getXBotsFromDB() 함수 추가
- getAllBots()에서 X 봇도 DB에서 로드
- config/bots.js에서 X 봇 제거 (meilisearch만 남음)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-07 23:51:38 +09:00
2355068c77 feat(admin): X 봇 CRUD API 추가
- POST /api/admin/x-bots/lookup: 프로필 조회
- GET /api/admin/x-bots: 목록 조회
- GET /api/admin/x-bots/🆔 상세 조회
- POST /api/admin/x-bots: 봇 추가
- PUT /api/admin/x-bots/🆔 봇 수정
- DELETE /api/admin/x-bots/🆔 봇 삭제

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-07 23:48:58 +09:00
535fbb6768 feat(x): Nitter 프로필 조회 함수 추가
- fetchProfile() 함수 추가: username으로 프로필 정보 조회
- displayName, avatarUrl 반환

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-07 20:08:59 +09:00
4f11e14b12 refactor(db): 봇 테이블 이름 통일 및 X 봇 스키마 추가
- youtube_bots → bot_youtube, x_bots → bot_x로 테이블 이름 변경
- bot_x 테이블 생성 및 시드 데이터 추가
- 관련 백엔드 코드에서 테이블 참조 업데이트
- X 봇 동적 관리 구현 계획 문서 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-07 19:52:41 +09:00
2e7fe697fc feat(admin): YouTube 봇 추가/수정/삭제 기능 완성
- 채널 핸들로 채널 정보 조회 API 추가 (POST /youtube-bots/lookup)
- getChannelByHandle 함수 추가 (YouTube API forHandle 사용)
- 봇 추가 시 채널 조회 후 배너 이미지 표시
- 봇 수정 API 스키마에 null 허용 추가
- 삭제 확인 다이얼로그 및 삭제 기능 구현
- 디버깅 로그 제거

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-07 10:51:45 +09:00
ec3839bcc7 feat(admin): YouTube 봇 CRUD API 및 수정 다이얼로그 개선
- YouTube 봇 전용 API 라우트 추가 (GET/POST/PUT/DELETE /api/admin/youtube-bots)
- 봇 목록 API에 YouTube 봇 상세 정보 포함 (db_id, channel_id 등)
- 수정 다이얼로그에서 useQuery로 봇 데이터 조회
- 채널 배너 이미지 표시 추가
- Fastify 스키마에 additionalProperties 설정으로 auto_schedule_config 정상 반환

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-07 10:43:06 +09:00
a8c12aa76d feat: YouTube 봇 DB 기반 관리로 마이그레이션
- YouTube 봇 설정을 bots.js에서 youtube_bots 테이블로 이동
- 봇 ID를 AUTO_INCREMENT로 변경 (youtube-{id} 형식)
- 고정 멤버 다중 선택 지원 (default_member_ids JSON)
- 제목 필터 다중 키워드 지원 (title_filters JSON)
- Redis 캐싱 제거 (Activities API 사용으로 불필요)
- 채널 배너 URL DB 저장 (youtube_bots.banner_url)
- YouTubeBotDialog UI 개선:
  - Portal 기반 드롭다운 (overflow 문제 해결)
  - AnimatePresence 애니메이션 적용
  - 다중 선택 컴포넌트 추가
  - 태그 입력 형태의 제목 필터
  - 뒷배경 클릭 방지

Co-Authored-By: Claude <noreply@anthropic.com>
2026-02-07 10:15:07 +09:00
730da864a4 fix: YouTube 봇 fetchRecentVideos를 Activities API로 변경
- playlistItems API 대신 Activities API 사용
- playlistItems는 새 영상 반영이 지연되는 문제가 있었음
- Activities API는 새 업로드를 즉시 반영함
- upload 외 다른 활동(좋아요, 플레이리스트 등)도 포함되므로 2배로 조회 후 필터링
- API 할당량 비용은 동일 (1 단위)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 21:58:38 +09:00
f3f99c7428 fix: 드롭다운 z-index 수정 및 YouTubeBotDialog 커스텀 드롭다운 적용
- WordItem, ScheduleDict 드롭다운 z-index를 z-20에서 z-40으로 변경
  (테이블 헤더의 z-30보다 높게 설정하여 가려지는 문제 해결)
- YouTubeBotDialog에 커스텀 Dropdown 컴포넌트 추가
- 네이티브 select 요소를 커스텀 드롭다운으로 교체
- 시간 선택을 위한 TIME_OPTIONS (00:00~23:00) 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 18:30:34 +09:00
3fa9f1520a feat: YouTube 봇 추가/수정 다이얼로그 UI 구현
- 채널 핸들 입력 및 조회 기능 (UI만)
- 동기화 간격 선택
- 예정 일정 자동 생성 설정 (요일, 시간, 제목 템플릿, 마감 요일)
- 고급 설정 (제목 필터, 멤버 추출)
- 추가/수정 모드 지원

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 18:22:56 +09:00
802aacd22e fix: 봇 테이블 액션 컬럼 너비 조정 (20% → 16%)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 18:18:38 +09:00
2417cd287d fix: 봇 테이블 액션 컬럼 너비 확대 (12% → 20%)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 18:16:48 +09:00
de3cb91191 feat: 봇 테이블 액션 버튼 완성
- 삭제 버튼 추가 (YouTube만)
- 버튼 순서: 전체 동기화 → 시작/정지 → 수정 → 삭제
- 모든 버튼에 Tooltip 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 18:16:12 +09:00
0c9dd44c2b feat: 봇 테이블 액션 버튼 개선
- 전체 동기화 아이콘을 RotateCcw로 변경
- YouTube 봇에만 수정(Pencil) 버튼 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 18:12:22 +09:00
6b39cf043f fix: 봇 테이블 중간 4개 컬럼 너비 통일 (10%)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 18:09:57 +09:00
47afd68921 fix: 봇 테이블 컬럼 너비 고정
- table-fixed 적용으로 컬럼 너비 통일
- 각 컬럼에 퍼센트 너비 지정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 18:09:02 +09:00
e729d33aee refactor: 봇 관리 UI 통일 및 개선
- 모든 섹션에 테이블형 디자인 통일
- 섹션 헤더에서 "N개의 봇" 텍스트 제거
- Meilisearch 섹션에 전용 아이콘 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 18:06:01 +09:00
b5118f2dea feat: 봇 관리 섹션별 다른 디자인 적용
- Meilisearch: 리스트형 (BotListItem) - 한 줄에 모든 정보
- YouTube: 미니 카드형 (BotMiniCard) - 호버시 액션 버튼
- X: 테이블형 (BotTableRow) - 표 형식으로 정보 비교

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 18:04:16 +09:00
dbfee503d5 fix: BotCard 구분 개선
- 테두리 및 그림자 강화
- 통계 영역 배경색 추가로 구분감 향상

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 18:01:49 +09:00
b3357e0663 refactor: BotCard 디자인 개선
- 타입별 아이콘 제거 (섹션 헤더에서 표시)
- 통계 정보 가로 배열로 컴팩트하게 변경
- 버튼을 하단에 플랫하게 배치
- 전체적으로 미니멀하고 깔끔한 스타일로 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 18:01:15 +09:00
68027f0654 fix: X 섹션 아이콘 및 텍스트 수정
- Twitter 아이콘 → X 아이콘으로 변경
- "X (Twitter)" → "X"로 간소화

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 17:59:53 +09:00
1c04f4ed6d refactor: 봇 관리 페이지 타입별 섹션 분리
- Meilisearch, YouTube, X 세 섹션으로 분리
- 각 섹션에 아이콘 및 색상 적용
- YouTube 섹션에 "봇 추가" 버튼 추가 (기능은 추후 구현)
- YouTube 봇 동적 관리 계획서 추가 (docs/youtube-bots-plan.md)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 17:58:30 +09:00
46295a5f15 fix: Meilisearch 동기화 시간을 00시로 변경
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 18:06:07 +09:00
78eb513c28 Revert "fix: 봇 관리 페이지 시간 24시간제로 표시"
This reverts commit 7d56531bee.
2026-02-05 18:05:47 +09:00
7d56531bee fix: 봇 관리 페이지 시간 24시간제로 표시
- hour12: false 옵션 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 18:05:01 +09:00
47cd93173c fix: 예정 배지 세로 중앙 정렬
- items-start → items-center로 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 18:25:36 +09:00
277c6a79c9 refactor: 예정 일정 placeholder UI 개선
- 유튜브 아이콘 제거
- 업로드 예정 텍스트 하단으로 이동
- 배경 오버레이를 하단 그라데이션으로 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 18:24:55 +09:00
f01b2b8054 fix: 유튜브 채널 배너 이미지 고해상도로 변경
- bannerUrl에 =w2560 파라미터 추가하여 2560px 너비로 요청

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 18:22:45 +09:00
cb184e4fa5 feat: 유튜브 예정 일정에 채널 배너 이미지 표시
- YouTube API에서 채널 정보(배너 이미지) 조회 함수 추가
- 채널 정보 Redis 캐싱 (24시간)
- 일정 상세 API에 bannerUrl 필드 추가
- 예정 일정 placeholder에 배너 이미지 배경 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 18:20:49 +09:00
eb7d2005b7 refactor: 예정 일정 placeholder 텍스트 변경
- "영상 준비 중" → "업로드 예정"으로 변경
- 불필요한 부연 설명 제거

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 18:14:35 +09:00
b16aa963cd feat: 유튜브 예정 일정 UI 추가
- PC YoutubeSection에 예정 일정 placeholder UI 추가
- 예정 일정일 경우 "예정" 배지 표시
- 영상 준비 중 placeholder 컴포넌트 추가
- 예정 일정에도 channelName 반환하도록 API 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 14:57:58 +09:00
e759d14ed6 feat: 스프 채널 다음 주 예정 일정 자동 생성 기능
- 새 영상(쇼츠 제외) 추가 시 다음 주 같은 요일 예정 일정 자동 생성
- 실제 영상 업로드 시 예정 일정을 실제 정보로 덮어씌움
- 금요일 00시까지 영상 없으면 예정 일정 삭제 + 다음 주 예정 일정 생성
- autoScheduleNext 설정: dayOfWeek, time, title, deadlineDayOfWeek, excludeShorts

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 14:51:12 +09:00
9735206da7 feat: 콘서트 폼 프론트엔드-백엔드 연결
- createConcertSchedule API 함수 추가
- handleSubmit에서 FormData 구성 및 API 호출 구현
- 유효성 검사 및 저장 성공 시 목록으로 이동

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 14:13:53 +09:00
48f41c6db0 feat: 장소 검색 API 추가 (카카오/구글)
- 국내: 카카오맵 API (/api/admin/kakao/places)
- 해외: 구글 Places API (/api/admin/google/places)
- YOUTUBE_API_KEY를 GOOGLE_API_KEY로 통합

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 14:06:33 +09:00
65b1d931f3 feat: 콘서트 일정 저장 API 구현
콘서트 폼 데이터를 저장하는 백엔드 API 추가.
multipart/form-data로 포스터, 굿즈 이미지, 회차, 세트리스트를 처리하고
트랜잭션으로 관련 테이블에 일괄 저장 후 Meilisearch 동기화.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 11:48:50 +09:00
ad8406fdd7 feat: 세트리스트 섹션 및 곡 검색 다이얼로그 추가
- 세트리스트 섹션: 곡명, 앨범명, 참여 멤버 선택
- 곡 검색 다이얼로그: 앨범별 트랙 검색 및 다중 선택
- 직접 입력과 곡 검색 두 가지 방식으로 곡 추가 가능
- 공연 일정/세트리스트 추가 버튼을 하단으로 이동
- ConfirmDialog에 createPortal 적용
- 콘서트 정보 → 공연 정보로 명칭 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 23:05:15 +09:00
169c584d31 feat: 콘서트 폼에 굿즈 섹션 추가
- 굿즈 이미지 다중 업로드 및 드래그 순서 변경
- 삭제 시 확인 다이얼로그 표시

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 22:20:01 +09:00
7f3fe7e251 feat: 콘서트 일정 추가 폼 UI 구현
- 콘서트 정보 섹션: 공연명, 포스터, 참여 멤버 선택
- 공연 일정 섹션: 다회차 지원 (날짜, 시간, 장소)
- VenueSearchDialog 컴포넌트 추가 (국내/해외 장소 검색)
- 회차 추가/삭제 애니메이션 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 23:57:33 +09:00
83c955f8a9 refactor: Meilisearch 봇을 단순 일일 동기화 방식으로 변경
- Watchtower 제외 라벨 추가하여 자동 업데이트 방지
- 버전 체크 방식 제거, 매일 12시 전체 동기화로 변경
- 봇 관리 UI를 다른 봇들과 동일하게 통일 (버전 → 업데이트 간격)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 11:59:18 +09:00