Commit graph

141 commits

Author SHA1 Message Date
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
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
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
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
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
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
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
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
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
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
87a69c0cbd refactor: API 응답에서 datetime을 date와 time으로 분리
- datetime 필드를 date와 time 필드로 분리하여 00:00 시간도 정상 표시되도록 수정
- 백엔드: formatSchedule, Meilisearch 검색 결과, 스키마 업데이트
- 프론트엔드: datetime 파싱 로직 제거, date/time 직접 사용
- 문서: API 응답 예시 업데이트

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 10:11:02 +09:00
980ae3fe1d refactor: frontend-temp를 frontend로 대체 및 문서 업데이트
- frontend 폴더를 새로 리팩토링된 frontend-temp로 교체
- docs/architecture.md: 현재 프로젝트 구조 반영
- docs/development.md: API 클라이언트 구조 업데이트
- docs/frontend-improvement.md 삭제 (완료된 개선 계획)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-23 10:29:30 +09:00
3922d5c6f7 refactor(frontend): 관리자 일정 API도 새 형식에 맞게 업데이트
- admin/schedules.js에 transformSchedule 함수 추가
- AdminSchedule.jsx의 검색 로직을 schedulesApi.searchSchedules 사용으로 변경
- 직접 fetch 호출 제거

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 23:35:17 +09:00
9d365dcadb fix(frontend): 멤버 표시 오류 수정 및 생일 우선 정렬 추가
수정:
- AdminSchedule.jsx 1306번 라인 멤버 처리 오류 수정
- getMemberList 헬퍼 함수 사용으로 통일

생일 우선 정렬:
- PC 공개 일정 페이지: filteredSchedules에 생일 우선 정렬 추가
- PC 관리 페이지: filteredSchedules에 생일 우선 정렬 추가
- 모바일 공개 페이지: groupedSchedules, selectedDateSchedules에 생일 우선 정렬 추가

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 16:26:17 +09:00
b4c393c20a fix(frontend): 검색 결과 멤버 표시 오류 수정
- getMemberList 헬퍼 함수 추가 (검색 결과/일반 데이터 모두 처리)
- 검색 결과의 members가 문자열 배열인 경우 처리
- AdminSchedule.jsx trim() 오류 수정

수정 파일:
- pc/public/Schedule.jsx
- pc/admin/AdminSchedule.jsx
- mobile/public/Schedule.jsx

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 16:22:44 +09:00
84113a8c48 fix(frontend): 일정 추가/수정 페이지 useEffect → useQuery 변경
- React 18 Strict Mode 중복 요청 방지
- members, categories를 useQuery로 전환
- 수정 모드 일정 로드는 useEffect 유지 (폼 상태 초기화 필요)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 14:26:59 +09:00
e3278c81de fix(frontend): 봇 관리 페이지 useEffect → useQuery 변경
- React 18 Strict Mode 중복 요청 방지
- getBots, getQuotaWarning을 useQuery로 전환
- toggleBot에서 queryClient.setQueryData 사용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 14:25:16 +09:00
46469fd324 fix(frontend): YouTube 수정 페이지 API 대응 및 사전 페이지 중복 요청 수정
- YouTubeEditForm: 변경된 API 응답 구조에 맞게 수정
  - schedule.youtube?.videoId → schedule.videoId
  - schedule.youtube?.channelName → schedule.channelName
  - schedule.date/time → schedule.datetime 파싱
- AdminScheduleDict: useEffect → useQuery 변경으로 중복 요청 방지

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 13:52:46 +09:00
8e15cd6d2c refactor: UI 개선 및 날짜 제한 수정
- 멤버 페이지에서 포지션 영역 제거 (PC/모바일)
- 모바일 일정 페이지 멤버 표시 로직 API 응답에 맞게 수정
- 데이트픽커 연도 제한 2025 → 2017로 변경
- 2017년 1월에서 이전 달 버튼 비활성화

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 16:17:54 +09:00
4a4a163abe feat: YouTube 일정 수정 폼 구현
- YouTube 일정 수정 API (PUT /api/admin/youtube/schedule/:id)
- 멤버 선택, 영상 유형(video/shorts) 수정 기능
- 일정 API에 멤버 배열 추가 (5명 이상 시 "프로미스나인")
- 관리 페이지 React Query 캐싱 적용
- Shorts/Video 별 UI 레이아웃 분리
- React Query 사용 가이드 문서화

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-20 14:06:02 +09:00
2d469739b7 fix: 봇 상태 표시 및 일정 추가 애니메이션 개선
- 봇 lastAddedCount를 실제 추가시에만 업데이트 (0으로 덮어쓰지 않음)
- 일정 추가 폼 애니메이션 타이밍 개선 (첫 로딩: 딜레이, 카테고리 변경: 즉시)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 21:31:43 +09:00
1a9fa54981 fix: 생일 표시 버그 수정 및 데이트픽커 개선
- 생일이 생년 이전 년도에 표시되는 버그 수정
- 페이지 진입 애니메이션 추가 (사전 관리, 일정 추가)
- 데이트픽커 12년 단위 이동으로 변경
- 년도 선택 시 월 선택 화면 전환 제거
- 시작 년도 2025년 고정, 이전 이동 비활성화
- PC/모바일 일정 페이지, 관리자 페이지 모두 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 16:41:34 +09:00
2576a244c0 feat: 사전 관리, 일정 추가 페이지에 애니메이션 추가
- framer-motion을 사용한 페이지 진입 애니메이션
- 섹션별 stagger 애니메이션으로 순차적 등장 효과
- 카테고리 전환 시 폼 fade 애니메이션

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 16:01:54 +09:00
84ed48fa78 fix: X 폼 Nitter 파싱 수정 및 아이콘 변경
- scraper.js: main-tweet 파싱 정규식 수정 (id 선택자 사용)
- XForm.jsx: Twitter 아이콘을 X 로고로 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 15:59:26 +09:00
bc3f536ec7 feat: X 카테고리 일정 추가 폼 구현
- 백엔드: /api/admin/x/post-info, /api/admin/x/schedule API 추가
- scraper.js에 fetchSingleTweet 함수 추가 (Nitter로 단일 트윗 조회)
- 프론트엔드: XForm 컴포넌트 생성 (게시글 ID 입력 → 미리보기 → 저장)
- 일정 추가 폼에서 X 카테고리 분기 추가
- API 문서 업데이트

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 12:57:06 +09:00
0a73149849 feat: 일정 추가 페이지 카테고리별 폼 분리 (YouTube)
- 카테고리 선택 UI를 최상단으로 이동
- YouTube 카테고리 전용 폼 추가 (URL 입력 → 자동 정보 조회)
- 폴더 구조 분리: pages/pc/admin/schedule/form/
- API 추가:
  - GET /schedules/categories (카테고리 목록)
  - DELETE /schedules/:id (일정 삭제)
  - GET /admin/youtube/video-info (영상 정보 조회)
  - POST /admin/youtube/schedule (YouTube 일정 저장)
- fetchApi에서 body 없는 요청 시 Content-Type 미설정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-19 12:49:29 +09:00
841c3c8626 feat: 봇 관리 API 추가 및 타임존 수정
- 봇 관리 API 엔드포인트 추가 (routes/admin/bots.js)
  - GET /api/admin/bots: 봇 목록 조회
  - POST /api/admin/bots/:id/start: 봇 시작
  - POST /api/admin/bots/:id/stop: 봇 정지
  - POST /api/admin/bots/:id/sync-all: 전체 동기화
  - GET/DELETE /api/admin/bots/quota-warning: 할당량 경고
- 프론트엔드 API 엔드포인트 경로 수정
- 봇 업데이트 시간 UTC → 로컬 시간 변환 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 23:45:54 +09:00
d4697ad996 refactor: 일정 API source 객체 구조 변경
- source_name, source_url → source: { name, url } 형태로 변경
- YouTube: schedule_youtube에서 video_id로 URL 생성
- X: schedule_x에서 post_id로 URL 생성
- 프론트엔드 전체 파일 source 객체 형태로 수정
- 문서 업데이트 (api.md, architecture.md, migration.md 등)
- tracks → album_tracks 테이블명 변경 반영

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-18 21:50:04 +09:00
5521c44fa9 feat: 어드민 사전 관리 기능 추가
- 형태소 분석기 사용자 사전 관리 페이지 추가
- 단어 추가/삭제/수정 시 즉시 저장 및 형태소 분석기 리로드
- 품사별 통계 및 필터링 기능
- 검색 기능 추가

백엔드:
- GET/PUT /api/schedules/suggestions/dict API 추가
- morpheme.js에 reloadMorpheme(), getUserDictPath() 함수 추가

프론트엔드:
- AdminScheduleDict.jsx 페이지 추가
- AdminSchedule.jsx에 사전 관리 버튼 추가
- 라우트 추가 (/admin/schedule/dict)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-18 13:53:51 +09:00
b89255780e refactor: 일정 API 응답 형식에 맞게 프론트엔드 수정
- API 응답(날짜별 그룹화)을 플랫 배열로 변환하는 로직 추가
- 별도 카테고리 API 호출 제거, 일정 데이터에서 카테고리 추출
- PC/모바일 Schedule.jsx, AdminSchedule.jsx 수정

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 17:52:15 +09:00
b0f7169226 refactor: API 라우트 구조 통합 및 파일 분리
- /api/admin/* + /api/* 분리 구조를 /api/*로 통합
- GET 요청은 공개, POST/PUT/DELETE는 인증 필요로 변경
- albums 라우트를 기능별 파일로 분리 (index, photos, teasers)
- 프론트엔드 API 호출 경로 업데이트

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 13:01:35 +09:00
428a74a703 feat: 대시보드 통계 API 추가
- /api/admin/stats 라우트 추가 (멤버, 앨범, 사진, 일정, 트랙 수)
- AdminDashboard에서 단일 API 호출로 통계 조회
- useQuery로 변경하여 중복 요청 방지
- AnimatedNumber 컴포넌트에 3자리 쉼표 및 애니메이션 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-17 00:08:16 +09:00
86220bdd3d refactor: 앨범 관리 페이지 useEffect를 useQuery로 변경
- AdminAlbums.jsx: useQuery로 앨범 목록 조회, 삭제 후 캐시 무효화
- AdminAlbumForm.jsx: useQuery로 앨범 상세 조회, 저장 후 캐시 무효화
- AdminAlbumPhotos.jsx: useQuery로 앨범/사진/티저/멤버 조회
- backend: 정적 파일 서빙 추가 (프로덕션 모드용)
- backend: 앨범 라우트에 인증 미들웨어 적용

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 23:40:47 +09:00
f5ae81d21a feat: 앨범 관리 API 구현 및 프론트엔드 연동
Backend:
- 앨범 CRUD API 구현 (목록, 상세, 생성, 수정, 삭제)
- 앨범 사진 관리 API 구현 (업로드, 삭제, 티저 관리)
- 이미지 서비스에 앨범 관련 함수 추가
- Public 라우트 추가 (앨범, 멤버 공개 API)

Frontend:
- AdminAlbums.jsx admin API로 변경

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 23:16:41 +09:00
6462949bc7 refactor: 어드민 페이지 인증 로직을 useAdminAuth 훅으로 통합
- 8개 어드민 페이지에서 중복된 인증 코드 제거
- localStorage 직접 접근 → useAdminAuth 훅 사용
- authApi.hasToken()/verifyToken() 호출 제거
- 일관된 인증 상태 관리 (5분 캐시, 자동 리다이렉트)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-16 23:10:30 +09:00