- youtube/index.js: saveVideo에 withTransaction 적용
- x/index.js: saveTweet, saveYoutubeFromTweet에 withTransaction 적용
- schedules/index.js: DELETE 핸들러에 withTransaction 적용
- 중간 실패 시 자동 롤백으로 데이터 무결성 보장
- docs/improvements.md 문서 추가
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- architecture.md: routes/ 폴더 구조 추가
- development.md: API 클라이언트 헬퍼 사용법 추가
- code-review.md: 모든 작업 완료로 삭제
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
마이그레이션 완료로 더 이상 사용되지 않는 개별 export 제거
- get, post, put, del
- authGet, authPost, authPut, authDel
현재 방식: api.get(), authApi.post() 등
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
라우트를 플랫폼/영역별로 분리하여 관리 용이성 향상
- routes/pc/public/index.jsx: PC 공개 라우트
- routes/pc/admin/index.jsx: PC 관리자 라우트
- routes/mobile/index.jsx: Mobile 라우트
- App.jsx: 194줄 → 47줄로 간소화
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
utils/error.js에 정의된 헬퍼 함수들(badRequest, unauthorized, notFound,
conflict, serverError)을 전체 라우트 파일에 적용하여 에러 응답 처리 일관성 확보
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 매일 새벽 4시 5분 자동 재색인 (Watchtower 업데이트 후)
- 봇 관리 페이지에서 수동 동기화 및 시작/정지 가능
- bots.js에 meilisearch 타입 봇 설정 추가
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- JWT_SECRET 환경변수 필수화 (기본값 제거)
- 앨범 삭제 시 S3 파일(사진, 티저, 비디오) 함께 삭제
- 앨범 삭제 시 관련 DB 테이블 정리 (album_photo_members, album_photos, album_teasers)
- Meilisearch latest 태그로 변경 (v1.6 → latest)
- 코드 리뷰 문서 추가
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- frontend 폴더를 새로 리팩토링된 frontend-temp로 교체
- docs/architecture.md: 현재 프로젝트 구조 반영
- docs/development.md: API 클라이언트 구조 업데이트
- docs/frontend-improvement.md 삭제 (완료된 개선 계획)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- AnimatedNumber 공통 컴포넌트 추출 (32줄)
- BotCard 컴포넌트 분리 + XIcon, MeilisearchIcon 포함 (233줄)
- CategoryFormModal 컴포넌트 분리 (195줄)
- ScheduleBots.jsx: 570줄 → 339줄 (231줄 감소)
- ScheduleCategory.jsx: 441줄 → 289줄 (152줄 감소)
- 문서 업데이트: 개선 결과 테이블 추가
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- useScheduleSearch.js 생성 (217줄)
- 검색어 자동완성 API 호출 (debounce)
- 무한 스크롤 검색 결과 (useInfiniteQuery)
- 키보드 네비게이션 핸들러
- Schedules.jsx: 1139줄 → 1009줄 (130줄 감소)
- 검색 관련 상태/로직을 훅으로 이동
- 컴포넌트 복잡도 감소
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 5개 파일 분석 (Schedules, ScheduleForm, ScheduleDict, ScheduleBots, ScheduleCategory)
- 공통 코드 중복 문제 정리 (colorMap/getColorStyle)
- 파일별 개선 사항 및 우선순위 정리
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- WordItem.jsx 컴포넌트 추출 (단어 테이블 행 + 품사 드롭다운)
- POS_TAGS 상수 분리하여 export
- ScheduleDict.jsx: 714줄 → 572줄 (142줄 감소)
- 일정 관련 대형 파일 분리 완료
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- pages/pc/admin/common/NotFound.jsx 생성
- AdminLayout 사용, 대시보드 이동 버튼 포함
- App.jsx에 /admin/* catch-all 라우트 추가
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- constants/index.js에서 CATEGORY_ID 상수 삭제
- 카테고리 API 데이터의 name으로 비교하도록 변경 (유튜브, X)
- 봇 관리 페이지에 stagger 애니메이션 및 AnimatedNumber 추가
- admin/schedules API 경로 수정 (/admin/schedules/:id → /schedules/:id)
- authApi export 누락 수정
- 문서 업데이트 (Phase 1 완료, 관리자 에러 페이지 추가 예정)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
실제로 사용 중인 hooks를 잘못 삭제함:
- useMemberData.js (useMembers, useMemberDetail)
- useAlbumData.js (useAlbums, useAlbumDetail, useAlbumGallery)
- useScheduleData.js (useScheduleData, useScheduleDetail, useUpcomingSchedules, useCategories)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
변경 전:
api/
├── common/client.js
├── pc/admin/
├── pc/common/
└── pc/public/
변경 후:
api/
├── client.js
├── admin/
└── public/
- PC/Mobile 구분 제거 (같은 API 사용)
- 모든 import 경로 업데이트
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 기존 마이그레이션 문서 삭제 (admin-migration.md, frontend-refactoring.md, migration.md)
- 새로운 개선 계획서 작성 (frontend-improvement.md)
- constants 정리: CATEGORY_NAMES, ALBUM_TYPES, 불필요한 SNS 링크 삭제
- schedule.js: getMemberList에서 쉼표 구분 로직 제거
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- CategorySelector를 components/pc/admin/schedule/로 이동
- YouTube 수정 라우트 수정: /admin/schedule/:id/edit/youtube
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- form/index.jsx: 카테고리 선택 메인 페이지
- form/YouTubeForm.jsx: YouTube URL 기반 일정 추가
- form/XForm.jsx: X 게시글 ID 기반 일정 추가
- form/components/CategorySelector.jsx: 카테고리 선택기
- edit/YouTubeEditForm.jsx: YouTube 일정 수정 폼
- App.jsx 라우트 업데이트
- /admin/schedule/new → 새로운 카테고리 선택 폼
- /admin/schedule/new-legacy → 기존 레거시 폼
- /admin/schedule/youtube/:id/edit → YouTube 수정 폼
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- searchSchedules: 검색 시 현재 활동 멤버 수 캐시
- formatScheduleResponse: 전체 멤버인 경우 '프로미스나인'으로 대체
- syncAllSchedules: 동기화 시 탈퇴 멤버 제외, 멤버 수 캐시 갱신
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 백엔드: buildMemberMap, getScheduleDetail 함수에서 현재 활동 멤버 전원인 경우
"프로미스나인"으로 대체하여 반환
- 프론트엔드: getDisplayMembers 함수에서 멤버 수 계산 로직 제거 (백엔드에서 처리)
- 탈퇴 멤버(is_former=1) 제외하고 현재 활동 멤버만 계산
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 관리자 페이지 폴더 구조 재구성 (pages/pc/admin/)
- login/, dashboard/, members/, albums/, schedules/
- 앨범 관리 페이지 마이그레이션 (Albums, AlbumForm, AlbumPhotos, AlbumTeasers)
- 일정 관리 페이지 마이그레이션 (Schedules, ScheduleForm, ScheduleCategory, ScheduleDict, ScheduleBots)
- DatePicker 컴포넌트 버그 수정 (월 이동 및 연도 선택)
- 일정 관리 라우트 경로 수정 (/admin/schedule)
- 마이그레이션 문서 업데이트
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- AdminDashboard 페이지 추가
- AdminMembers 페이지 추가
- AdminMemberEdit 페이지 추가
- useToast 훅 추가
- App.jsx에 관리자 라우트 추가
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 관리자 API 추가 (albums, members, schedules, categories, stats, suggestions, bots)
- AdminLayout/Header 컴포넌트 추가
- 공통 컴포넌트 추가 (ConfirmDialog, DatePicker, TimePicker, NumberPicker)
- AdminLogin 페이지 마이그레이션
- App.jsx에 관리자 라우트 추가 (/admin)
- ScheduleDetail.jsx import 경로 수정
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- api/: common/, pc/common/, pc/public/, pc/admin/ 구조로 변경
- components/: pc/public/, pc/admin/ 구조로 변경
- hooks/: common/, pc/admin/ 구조로 변경
- pages/: pc/public/, mobile/ 구조로 변경
- confetti.js를 utils/로 이동
- 모든 import 경로 업데이트
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 3.7 리스트 key 검토 완료 (정적 리스트는 index 유지, 동적은 고유 ID 사용 중)
- 품질 점수 요약 업데이트 (6/10 → 8.5/10 달성)
- 모든 Phase 완료 표시
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- constants에 GROUP_INFO 상수 추가 (데뷔일, 팬덤명)
- PC Home에서 멤버 수 동적 계산 (API 기반)
- mobile/Layout.jsx 컴포넌트 분리 (Header.jsx, BottomNav.jsx)
- 미사용 유틸리티 함수는 관리자 페이지용으로 유지
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- PC Lightbox X 버튼에 e.stopPropagation() 추가 (이중 닫힘 방지)
- MobileLightbox AnimatePresence 구조 수정 (exit 애니메이션 활성화)
- 모바일 앨범 상세/갤러리 페이지에 헤더 표시 (hideHeader → pageTitle)
- 문서에 MobileLightbox 컴포넌트 추가
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- MobileLightbox 컴포넌트 생성 (Swiper 기반 터치 스와이프)
- 사진 정보 바텀시트 내장
- 다운로드, 카운터, 비디오 지원
- Mobile AlbumDetail에서 MobileLightbox 사용 (-185줄)
- Mobile AlbumGallery에서 MobileLightbox 사용 (-188줄)
- 코드 중복 제거로 총 414줄 감소
라이트박스 컴포넌트 구조:
- Lightbox: PC용 (키보드/클릭 네비게이션)
- MobileLightbox: Mobile용 (Swiper 터치 스와이프)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
AlbumGallery와 동일한 UX 패턴 적용:
- 사진 아래 직접 정보 표시 제거
- Info 버튼 추가 (ℹ️)
- 바텀시트로 멤버/컨셉 정보 표시
- 드래그하여 닫기 지원
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 공통 Lightbox 컴포넌트에 비디오 지원 추가 (teasers prop)
- 사진 메타데이터 표시 지원 (photos prop으로 컨셉/멤버 정보)
- showCounter, showDownload props 추가
- PC AlbumDetail의 인라인 라이트박스 코드 제거 (-285줄)
- 코드 중복 제거 및 유지보수성 향상
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- PC/Mobile 앨범 상세 페이지 컨셉 포토 라이트박스에서 좌우 네비게이션 지원
- 현재 보이는 미리보기 사진 내에서만 네비게이션 (PC 4장, Mobile 6장)
- 컨셉 이름과 멤버 정보 표시 (AlbumGallery와 동일한 UX)
- lightbox state에 photos 배열 추가하여 메타데이터 관리
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- utils/youtube.js: YouTube URL 파싱 유틸리티 생성
- getYoutubeVideoId, getYoutubeThumbnail, getYoutubeEmbedUrl
- utils/format.js: parseCredits, calculateTotalDuration 함수 추가
- hooks/useLightbox.js: 라이트박스 상태 관리 훅 생성
- components/common/ErrorMessage.jsx: 에러 메시지 컴포넌트 생성
- components/common/Loading.jsx: size prop 추가 (sm, md, lg)
- TrackDetail (PC/Mobile): 중복 함수 제거, 유틸리티 사용
- AlbumDetail (PC/Mobile): getTotalDuration -> calculateTotalDuration 유틸리티 사용
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>