Commit graph

350 commits

Author SHA1 Message Date
1626091539 style(mobile): 일정 상세 액션바 카테고리 텍스트 font-bold로 변경
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 14:09:38 +09:00
aaec7fa071 style(mobile): 예능 썸네일 블러 배경 + 높이 축소
- 높이 h-52로 고정
- 배경에 동일 이미지를 scale-110 blur-2xl로 깔아서 빈 공간 채움
- 메인 이미지는 object-contain으로 원본 비율 유지

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 14:07:46 +09:00
45819f7a01 style(pc): 예능 상세 썸네일/정보 가로 배치, 높이 독립
- 썸네일: w-52 h-72 고정, object-cover
- 정보 카드: flex-1, 콘텐츠에 따라 높이 자유
- items-start로 서로 높이 영향 없음

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 14:05:37 +09:00
de3adc0ad6 refactor: 예능 상세 페이지 썸네일/정보 분리 레이아웃
- 가로 flex → 세로 분리 (썸네일 카드 + 정보 카드)
- 썸네일: object-contain으로 원본 비율 유지, max-h 제한
- 기본 이미지: 카테고리 색상 배경 + Tv 아이콘
- 제목이 길어져도 레이아웃 깨지지 않음
- PC/모바일 모두 적용

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 14:03:48 +09:00
2a1849f608 feat: 예능 썸네일 없을 때 카테고리 색상 기본 이미지 표시
- 썸네일 없으면 카테고리 색상 배경 + Tv 아이콘 표시
- PC/모바일 모두 적용
- 항상 flex 레이아웃 유지 (썸네일 유무와 무관)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:58:57 +09:00
4bc188b4f9 feat: 모바일 예능 일정 상세 섹션 추가
- MobileVarietySection: 썸네일(w-32) + 콘텐츠 flex 레이아웃
- 방송사 뱃지, 제목, 멤버 칩, 다시보기 버튼
- PC 버전과 동일한 구조, 모바일 사이즈에 맞게 축소

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:57:03 +09:00
83dd852ffb style: 예능 다시보기 버튼을 다크 스타일로 변경
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:54:49 +09:00
de1399579f style: 예능 상세 텍스트 크기 전체적으로 확대
- 방송사 뱃지/날짜: text-xs → text-sm
- 제목: text-lg → text-xl
- 멤버 칩: text-xs → text-sm, 패딩 증가
- 다시보기 버튼: text-xs → text-sm, 패딩 증가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:53:11 +09:00
b1d890d758 style: 예능 상세 레이아웃 상단/하단 분리
- 방송사+날짜, 제목, 멤버: 상단에 붙임
- 다시보기 버튼: mt-auto로 하단에 고정
- justify-between으로 세로 공간 분배

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:52:12 +09:00
c990af41e1 style: 예능 상세 페이지 디자인 정리
- 썸네일 hover 효과 제거, 너비 w-44로 축소
- 다시보기 버튼: 멤버 칩과 같은 줄에 compact하게 배치 (회색 pill)
- 불필요한 border-t 구분선 제거
- 전체적으로 compact한 레이아웃

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:51:09 +09:00
fcbda88464 fix: 예능 상세 썸네일을 세로 포스터 레이아웃으로 변경
- 가로 전체 → 왼쪽 세로 포스터(w-52) + 오른쪽 콘텐츠 (flex 레이아웃)
- 세로 이미지가 잘리지 않도록 object-cover + 고정 너비

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:48:12 +09:00
36854a223f style: PC 예능 상세 페이지 디자인 개선
- 썸네일: aspect-video 비율, hover 시 확대 + 재생 버튼 오버레이
- 방송사 뱃지: 카테고리 색상 기반, 날짜와 한 줄로 배치
- 다시보기 버튼: 다크 pill 스타일, 유튜브면 Play 아이콘
- 전체 카드 레이아웃으로 통일

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:46:31 +09:00
6feedae267 feat: PC 예능 일정 상세 페이지 추가
- VarietySection: 썸네일, 방송사 뱃지, 제목, 날짜/시간, 멤버, 다시보기 버튼
- ScheduleDetail에서 '예능' 카테고리 분기 연결

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:45:14 +09:00
c14bd90e89 fix: 카테고리 API를 React Query로 변경 (중복 호출 방지)
- useEffect + useState → useQuery로 변경
- staleTime 10분으로 캐시하여 중복 요청 제거
- 카테고리 색상 Redis 캐시도 삭제 (DB 변경 반영)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:40:17 +09:00
48ed3bb9e0 feat(variety): 방송사 프리셋을 입력 빈도수 기반으로 변경
- GET /admin/variety/broadcasters: DB에서 빈도수 상위 10개 조회 (Redis 1시간 캐시)
- 일정 생성/수정 시 캐시 무효화
- 프론트엔드: 하드코딩 프리셋 제거, API에서 동적으로 로드

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 13:37:52 +09:00
a01d368728 feat(variety): 썸네일을 RustFS 이미지 업로드로 변경
- schedule/{id}/thumbnail/ 경로에 original/medium_800/thumb_400 webp 업로드
- images 테이블로 이미지 관리, schedule_variety.thumbnail_id로 참조
- 프론트엔드: URL 입력 → 파일 업로드(드래그&드롭) + 미리보기로 변경
- 수정 시 기존 썸네일 교체/삭제 지원

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 19:07:08 +09:00
c88eb1fb60 fix(variety): 날짜/시간 입력을 커스텀 DatePicker/TimePicker로 변경
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 18:45:28 +09:00
73f84fd7ac feat: 예능 카테고리 관리 기능 구현
- 백엔드: POST/PUT/GET /admin/variety/schedule API
- 백엔드: 일정 상세 응답에 broadcaster, replayUrl, thumbnailUrl 포함
- 프론트엔드: VarietyForm (추가), VarietyEditForm (수정) 페이지
- 방송사 프리셋 버튼 (KBS, MBC, SBS, tvN, 유튜브, 티빙 등)
- 출연 멤버 선택, 다시보기 링크, 썸네일 URL 지원
- 라우트 등록 및 일정 목록 편집 링크 연결

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-04 18:16:16 +09:00
af6b3e1654 style: X 게시글 하이퍼링크 색상을 파란색으로 변경 (해시태그와 구분)
- 해시태그: primary (초록)
- URL 링크: blue-500 (파란)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 19:36:03 +09:00
ce41fc1a60 feat(concert): 콘서트 수정 페이지 추가
- 백엔드: GET /admin/concert/schedule/:seriesId (상세 조회)
- 백엔드: PUT /admin/concert/schedule/:seriesId (수정)
- 프론트엔드: ConcertEditForm 페이지 (생성 폼 컴포넌트 재사용)
- 라우트: /admin/schedule/concert/:seriesId/edit 등록
- 일정 목록: 콘서트 카테고리 편집 버튼이 수정 페이지로 연결
- schedule.js: formatSchedule에 concertSeriesId 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 18:25:01 +09:00
637172ddd7 style(concert): 네이티브 select를 커스텀 드롭다운으로 변경
- 선택된 회차 + 날짜 표시, 화살표 아이콘 회전 애니메이션
- 활성 항목 primary 하이라이트
- 외부 클릭 시 자동 닫기

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 18:09:26 +09:00
cdb94972a3 refactor(concert): 세트리스트 회차 선택을 탭에서 드롭다운으로 변경
- 탭 UI → select 드롭다운 (회차가 많아도 깔끔)
- 드롭다운에 날짜 표시 (예: "1회차 (2026-04-01)")
- 회차 전환 시 애니메이션 제거
- framer-motion 의존성 제거

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 18:08:39 +09:00
8ccf18e8b1 feat(concert): 회차별 세트리스트 입력 지원
- 프론트엔드: 단일 setlist → 회차별 setlists (탭 UI로 전환)
- 회차 추가 시 이전 회차의 세트리스트 자동 복사
- '다른 회차에서 복사' 기능 추가
- 백엔드: 각 concert_id별로 독립적인 세트리스트 저장
- 하위호환: 기존 setlist 필드도 지원 (단일 배열 → 첫 회차에 적용)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 18:03:08 +09:00
1f3c2f3d9b feat: X 게시글 해시태그 하이라이트 및 클릭 링크 추가
- 해시태그(#xxx): primary 색상 하이라이트, 클릭 시 x.com/hashtag/xxx로 이동
- URL: primary 색상 + 밑줄, 클릭 시 해당 URL로 이동
- 웹(모바일/PC), 앱 모두 적용

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 14:15:58 +09:00
0ddde32bed feat(app): 홈 화면 일정 API를 새 응답 형식에 맞게 업데이트
- Schedule 모델: category/source 중첩 객체, members 배열 파싱
- 일정 서비스: { schedules: [] } 래핑된 응답 처리
- 홈/웹 일정 카드: sourceName을 별도 줄로 분리하여 표시

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-27 18:15:19 +09:00
9d18449d3a feat: 생일 축하 다이얼로그 추가 (PC/모바일)
생일 당일 접속 시 폭죽과 함께 멤버 사진, HAPPY OOO DAY 제목,
날짜를 보여주는 축하 다이얼로그 표시. 데뷔 다이얼로그와 동일하게
localStorage로 하루 1회만 표시.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-20 13:39:55 +09:00
8effebf681 fix: 로그 시간 KST 중복 보정, 일정 카운트 애니메이션, HMR 오버레이 비활성화
- 로그 formatDateTime에서 UTC 메서드 사용하여 KST 이중 변환 방지
- 일반 일정 페이지 n개 일정 텍스트에 모드 전환 애니메이션 적용
- Vite HMR 오버레이 비활성화 (외부 봇 malformed URI 에러 방지)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-11 21:49:13 +09:00
159dd5c000 fix(admin): localStorage 토큰 조회를 useAuthStore로 통일
localStorage.getItem("adminToken")이 null을 반환하여 401 인증
에러가 발생하던 문제 수정. Zustand auth-storage에서 토큰을 올바르게
조회하도록 7개 파일 수정.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 19:44:24 +09:00
4005228270 style(admin): 활동 로그 테이블 컬럼 비율 조정
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 00:28:53 +09:00
aa95f737ba refactor(admin): 활동 로그 컴포넌트 분리 및 빈 상세정보 처리
Logs.jsx에서 상수/유틸과 다이얼로그를 components/pc/admin/log/로 분리하여
프로젝트 구조 패턴에 맞춤. 빈 객체 {} details가 표시되던 버그 수정.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 21:49:14 +09:00
607a652c2b fix(admin): 활동 로그 필터 UI 개선
- 카테고리를 하드코딩 대신 DB에서 조회하도록 변경 (GET /admin/logs/categories)
- 카테고리 칩을 체크박스 멀티셀렉트 드롭다운으로 교체
- 카테고리가 없을 때 드롭다운 비활성화
- DatePicker에 min/max/compact prop 추가 (날짜 범위 제한, 높이 통일)
- 날짜 선택 칸 너비 축소, 초기화 버튼 여백 축소

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 17:16:52 +09:00
414b798914 feat(frontend): 활동 로그 API 연동 및 더미데이터 제거
더미데이터를 실제 API 호출(React Query)로 교체.
서버 사이드 필터링/페이지네이션, 검색 디바운스(300ms),
keepPreviousData로 페이지 전환 시 깜빡임 방지,
페이지 수가 많을 때 생략 부호(...) 페이지네이션 추가.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 17:06:39 +09:00
c6332c4f96 refactor: activity_logs → logs로 네이밍 통일
- DB 테이블: activity_logs → logs
- 문서: activity-logs.md → logs.md
- 컴포넌트: ActivityLogs.jsx → Logs.jsx
- 라우트 import 업데이트

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 16:54:08 +09:00
01cf083da2 feat(admin): 활동 로그 라우트/메뉴 연결 및 UI 개선
- /admin/logs 라우트 등록, 대시보드 메뉴에 활동 로그 항목 추가
- 테이블 컬럼 비율 조정 (내용 컬럼 공간 확보)
- 날짜 선택기를 커스텀 DatePicker로 교체
- 행위자 드롭다운에 애니메이션 추가
- reorder 액션 제거

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 16:40:27 +09:00
c4cd0dec30 feat(admin): 활동 로그 페이지 컴포넌트 및 설계 문서 추가
더미데이터로 활동 로그 UI 구현 (필터, 테이블, 페이지네이션)
라우트/메뉴 연결은 다음 단계에서 진행

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 16:16:59 +09:00
ba7def935c feat(x-bot): YouTube 영상 추출 옵션 추가
X 봇 설정에서 트윗 내 YouTube 링크 자동 추출 기능을 온/오프 가능하게 함:
- bot_x 테이블에 extract_youtube 컬럼 추가 (기본값: false)
- 고급 설정에 "YouTube 영상 추출" 토글 추가
- extractYoutube가 true일 때만 YouTube 일정 자동 생성

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-08 22:40:52 +09:00
8ecc4e6263 feat(mobile): 예정된 YouTube 영상 상세 페이지 구현
PC와 동일하게 videoId가 없는 예정 일정에 대한 UI 추가:
- MobileScheduledPlaceholder 컴포넌트 (배너 이미지/패턴 배경)
- "예정" 배지 표시
- 예정 일정일 때 "YouTube에서 보기" 버튼 숨김

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-08 22:34:10 +09:00
406098d1b9 fix(schedule): X 일정에서 단축 URL 인식 개선
- react-linkify 대신 커스텀 linkifyText 함수 사용
- bit.ly, t.co, youtu.be 등 단축 URL 도메인 지원
- PC, 모바일 양쪽 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-08 22:28:41 +09:00
f90a5f4b17 refactor(members): PC 멤버 페이지 2/3 배열 레이아웃으로 변경
- 5열에서 2/3 배열로 변경
- 카드 크기 축소 (max-w-3xl)
- 첫 줄 2명, 둘째 줄 3명 가운데 정렬

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-08 22:20:56 +09:00
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
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
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
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