- 해시태그(#xxx): primary 색상 하이라이트, 클릭 시 x.com/hashtag/xxx로 이동
- URL: primary 색상 + 밑줄, 클릭 시 해당 URL로 이동
- 웹(모바일/PC), 앱 모두 적용
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- getProfile: bot_x에 없는 계정도 Nitter에서 직접 조회 후 Redis 캐시
- refetch-retweets 스크립트: 원본 작성자 타임라인에서 매칭 트윗 찾아 이미지/내용 복구
- 기존 21건 리트윗 데이터 재수집 완료 (이미지 포함)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- extractTextFromHtml: Nitter 프록시 t.co URL을 원본 https://t.co/ URL로 변환
- parseTweets: 리트윗 원본 작성자(originalUsername) 추출, URL을 원본 작성자 기준으로 생성
- saveTweet: 리트윗인 경우 원본 작성자를 username으로 저장
- refetch-retweets 엔드포인트 및 스크립트 추가 (기존 잘못된 데이터 재수집)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- ScheduleDetail 모델: 새 API 형식 (category 중첩 객체, YouTube/X 전용 필드)
- YouTube 섹션: omni_video_player로 앱 내 재생, 예정 플레이스홀더 추가
- X 섹션: username, content, imageUrls, postUrl 직접 사용
- 숏츠 영상 16:9 통일, 날짜 형식 웹과 동일하게 변경
- 콘서트 섹션을 기본 섹션으로 통합 (API 변경 반영)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Schedule 모델: dynamic id로 변경 (생일/기념일 문자열 ID 지원)
- 생일/데뷔/기념일 특별 필드 추가 (isBirthday, isDebut 등)
- BirthdayCard: 핑크-보라 그라데이션, 멤버 사진, 케이크 이모지
- DebutCard: 블루 그라데이션, DEBUT/N YEARS 아이콘, 별 장식
- 일정 목록에서 특별 일정 카드 자동 분기 렌더링
- 특별 일정 클릭 시 상세 라우팅 방지
- 달력 그리드 그림자 클리핑 수정
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- PageView 카드 스와이프 → 2열 그리드 레이아웃
- 상단 썸네일 인디케이터 제거
- 카드 탭 시 모달로 상세 정보 표시 (이미지, 이름, 생일, 인스타그램)
- 개별 카드 staggered 애니메이션 + 탭 scale 효과
- 컨트롤러에서 불필요한 currentIndex 상태 제거
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Schedule 모델: category/source 중첩 객체, members 배열 파싱
- 일정 서비스: { schedules: [] } 래핑된 응답 처리
- 홈/웹 일정 카드: sourceName을 별도 줄로 분리하여 표시
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
생일 당일 접속 시 폭죽과 함께 멤버 사진, HAPPY OOO DAY 제목,
날짜를 보여주는 축하 다이얼로그 표시. 데뷔 다이얼로그와 동일하게
localStorage로 하루 1회만 표시.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 로그 formatDateTime에서 UTC 메서드 사용하여 KST 이중 변환 방지
- 일반 일정 페이지 n개 일정 텍스트에 모드 전환 애니메이션 적용
- Vite HMR 오버레이 비활성화 (외부 봇 malformed URI 에러 방지)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
localStorage.getItem("adminToken")이 null을 반환하여 401 인증
에러가 발생하던 문제 수정. Zustand auth-storage에서 토큰을 올바르게
조회하도록 7개 파일 수정.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Logs.jsx에서 상수/유틸과 다이얼로그를 components/pc/admin/log/로 분리하여
프로젝트 구조 패턴에 맞춤. 빈 객체 {} details가 표시되던 버그 수정.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- 카테고리를 하드코딩 대신 DB에서 조회하도록 변경 (GET /admin/logs/categories)
- 카테고리 칩을 체크박스 멀티셀렉트 드롭다운으로 교체
- 카테고리가 없을 때 드롭다운 비활성화
- DatePicker에 min/max/compact prop 추가 (날짜 범위 제한, 높이 통일)
- 날짜 선택 칸 너비 축소, 초기화 버튼 여백 축소
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
api.md에 GET /admin/logs 명세 추가, architecture.md에
logs 테이블/파일 추가, development.md에 로그 시스템 가이드 추가,
logs.md를 실제 구현 결과에 맞게 갱신.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
더미데이터를 실제 API 호출(React Query)로 교체.
서버 사이드 필터링/페이지네이션, 검색 디바운스(300ms),
keepPreviousData로 페이지 전환 시 깜빡임 방지,
페이지 수가 많을 때 생략 부호(...) 페이지네이션 추가.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
12개 관리자 라우트와 3개 봇 서비스 파일에 활동 로그 기록 추가.
관리자 작업(일정/앨범/멤버/봇 CRUD)과 봇 동기화(완료/에러)를
logs 테이블에 fire-and-forget으로 기록.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- /admin/logs 라우트 등록, 대시보드 메뉴에 활동 로그 항목 추가
- 테이블 컬럼 비율 조정 (내용 컬럼 공간 확보)
- 날짜 선택기를 커스텀 DatePicker로 교체
- 행위자 드롭다운에 애니메이션 추가
- reorder 액션 제거
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
기존: 매 폴링마다 activities.list + videos.list (2 units)
변경: activities.list로 videoId 확인 후 DB에 없는 새 영상만 videos.list 호출
결과: 일일 API 사용량 약 50% 감소 (1분 간격 3채널도 가능)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
DB 조회 시 WHERE enabled = 1 필터를 제거하여 비활성 봇도 시스템에서
인식되도록 변경. 이전에는 비활성 봇이 목록/검색에서 완전히 제외되어
재시작 불가 및 관리 UI에서 사라지는 문제가 있었음.
PUT 엔드포인트의 stopBot/startBot 조건 로직도 함께 정리.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- bot_x.sql에 누락된 컬럼 추가 (text_filters, include_retweets, extract_youtube)
- api.md에 X 봇 API 응답 스키마 및 필드 설명 추가
- architecture.md bot_x 테이블 설명 구체화
- development.md API 클라이언트 함수 목록 보완
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
X 봇 설정에서 트윗 내 YouTube 링크 자동 추출 기능을 온/오프 가능하게 함:
- bot_x 테이블에 extract_youtube 컬럼 추가 (기본값: false)
- 고급 설정에 "YouTube 영상 추출" 토글 추가
- extractYoutube가 true일 때만 YouTube 일정 자동 생성
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
PC와 동일하게 videoId가 없는 예정 일정에 대한 UI 추가:
- MobileScheduledPlaceholder 컴포넌트 (배너 이미지/패턴 배경)
- "예정" 배지 표시
- 예정 일정일 때 "YouTube에서 보기" 버튼 숨김
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- react-linkify 대신 커스텀 linkifyText 함수 사용
- bit.ly, t.co, youtu.be 등 단축 URL 도메인 지원
- PC, 모바일 양쪽 수정
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- syncAllSchedules()에서 Meilisearch의 모든 문서 ID 조회
- DB에 없는 문서는 Meilisearch에서 삭제
- 삭제된 일정이 검색에 계속 나타나는 문제 해결
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- x_profiles 테이블 삭제 (bot_x에 프로필 정보 포함)
- saveProfile(), getProfile() 함수가 bot_x 테이블 사용하도록 수정
- Redis 캐시는 그대로 유지 (성능)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- include_retweets 옵션으로 리트윗 포함 여부 설정 가능
- 고정된 트윗(pinned)은 기본적으로 파싱에서 제외
- XBotDialog에서 Twitter 아이콘을 X 아이콘으로 변경
- schedule_x의 username을 source_name으로 활용
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
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>
- getXBotsFromDB() 함수 추가
- getAllBots()에서 X 봇도 DB에서 로드
- config/bots.js에서 X 봇 제거 (meilisearch만 남음)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 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>
- youtube_bots → bot_youtube, x_bots → bot_x로 테이블 이름 변경
- bot_x 테이블 생성 및 시드 데이터 추가
- 관련 백엔드 코드에서 테이블 참조 업데이트
- X 봇 동적 관리 구현 계획 문서 추가
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>