Commit graph

264 commits

Author SHA1 Message Date
0e6e13fe65 refactor: 백엔드에 dayjs 도입 및 날짜 유틸리티 통합
- lib/date.js: dayjs 기반 공통 날짜 유틸리티 모듈 추가
  - toKST, formatDate, formatTime, utcToKSTDateTime, nowKST
  - parseNitterDateTime (Nitter 날짜 파싱)
  - dayjs/plugin/utc, timezone, customParseFormat 사용

- youtube-bot.js: 로컬 날짜 함수 제거, lib/date.js 사용
- x-bot.js: 로컬 날짜 함수 제거, lib/date.js 사용

- 중복 코드 제거로 유지보수성 향상
2026-01-10 19:44:07 +09:00
a3960489d4 fix: Meilisearch 검색 유사도 필터링 추가
- 유사도 0.5 미만인 검색 결과 필터링
- showRankingScore 활성화하여 점수 기반 필터링 적용
2026-01-10 19:06:49 +09:00
622839b0e8 feat: Meilisearch 동기화 봇 추가 및 시간대 관련 수정
봇 시스템:
- Meilisearch 동기화 봇 추가 (meilisearch-bot.js)
- bots 테이블 type enum에 meilisearch 추가
- youtube-scheduler.js에 meilisearch 봇 분기 추가
- admin.js API에서 meilisearch 봇 지원

봇 관리 페이지 개선 (AdminScheduleBots.jsx):
- Meilisearch 공식 로고 아이콘 추가
- Meilisearch 봇 통계: 동기화 수/소요 시간 표시
- 봇 타입별 배경색 (X: 검정, Meilisearch: #ddf1fd, YouTube: 빨강)

시간대 정리:
- MariaDB KST 설정으로 DATE_ADD(NOW(), INTERVAL 9 HOUR) → NOW() 변경
- youtube-bot.js, x-bot.js에서 10곳 수정
2026-01-10 18:59:39 +09:00
8780384164 fix(x-bot): 유튜브 일정에 채널명(source_name) 추가
- createScheduleFromYoutube에서 video.channelTitle을 source_name에 저장
- Meilisearch 동기화 시에도 source_name 포함
2026-01-10 18:26:43 +09:00
0ee587ad08 chore: 불필요한 스크립트 파일 삭제
- scrape_all.cjs, scrape_all.js, scrape_search.cjs 삭제 (미사용)
- scrape_log.txt, scrape_search_log.txt 삭제 (로그 파일)
- extract_youtube_from_x.js 삭제 (일회성 스크립트)
2026-01-10 17:22:45 +09:00
59e5a1d47b feat: X 봇 구현 및 봇 관리 기능 개선
- X 봇 서비스 추가 (x-bot.js)
  - Nitter를 통한 @realfromis_9 트윗 수집
  - 트윗을 일정으로 자동 저장 (카테고리 12)
  - 관리 채널 외 유튜브 링크 감지 시 별도 일정 추가
  - 1분 간격 동기화 지원

- DB 스키마 변경
  - bots.type enum 수정 (vlive, weverse 제거, x 추가)
  - bot_x_config 테이블 추가

- 봇 스케줄러 수정 (youtube-scheduler.js)
  - 봇 타입별 동기화 함수 분기 (syncBot)
  - X 봇 지원 추가

- 관리자 페이지 개선 (AdminScheduleBots.jsx)
  - 봇 타입별 아이콘 표시 (YouTube/X)
  - X 아이콘 SVG 컴포넌트 추가

- last_added_count 로직 수정
  - 추가 항목 없으면 이전 값 유지 (0으로 초기화 방지)

- 기존 X 일정에서 유튜브 영상 추출 스크립트 추가
2026-01-10 17:06:23 +09:00
0376c0ac73 feat: 검색 카드 제목 2줄 ellipsis 적용
- line-clamp-2 추가하여 긴 제목 잘림 처리
2026-01-10 10:37:11 +09:00
3b79aa13c2 feat: 검색 카드 날짜 레이아웃 개선
- 왼쪽에 날짜 세로 배치 (년도/월.일/요일)
- 일요일 빨간색, 토요일 파란색 요일 색상 적용
- 오른쪽 콘텐츠 영역으로 분리
2026-01-10 10:35:00 +09:00
54fe3074dc feat: 검색 결과 카드 디자인 개선
- TimelineScheduleCard 스타일로 리디자인
- 날짜 뱃지 추가 (M.D (요일) 형식)
- 시간/카테고리 뱃지 스타일 통일
- 멤버 태그 그라데이션 적용
- 스프링 애니메이션 추가
2026-01-10 10:31:22 +09:00
83e3689f02 feat: 모바일 검색 뒤로가기 버튼 처리
- enterSearchMode()에서 history.pushState로 히스토리 상태 추가
- popstate 이벤트로 뒤로가기 시 검색 모드 종료
- 이전 페이지로 이동하지 않고 일정 화면으로 복귀
2026-01-10 10:28:21 +09:00
0521e3d0ec fix: 모바일 일정 HTML 엔티티 디코딩 적용
- decodeHtmlEntities 함수 추가
- ScheduleCard, TimelineScheduleCard title에 적용
- & → & 등으로 올바르게 표시
2026-01-10 10:26:21 +09:00
d84ab36a83 fix: 검색 스크롤 초기화 개선
- virtualizer.scrollToOffset(0) 사용
- DOM 스크롤도 함께 초기화 (fallback)
2026-01-10 10:23:03 +09:00
ff2c596865 fix: 검색 시 스크롤 위치 초기화
- searchTerm 변경 시 scrollContainerRef.scrollTop = 0 적용
- 검색 취소 후 재검색 시 맨 위부터 표시
2026-01-10 10:16:19 +09:00
54bbe75ecc fix: 검색 모드 진입 시 기존 일정 숨김
- isSearchMode일 때 searchTerm 없으면 '검색어를 입력하세요' 표시
- 기존 날짜별 일정이 보이지 않도록 조건 수정
2026-01-10 10:14:59 +09:00
c8ec8de946 fix: 모바일 검색 X버튼 중복 및 하단 여백 수정
- type='search' → type='text'로 변경하여 브라우저 기본 X버튼 제거
- 무한 스크롤 트리거 여백 py-4 → py-2로 축소
2026-01-10 10:12:32 +09:00
660acd0007 feat: 모바일 일정 검색에 가상 스크롤 적용
- @tanstack/react-virtual useVirtualizer 적용
- 동적 높이 지원 (measureElement, data-index)
- SEARCH_LIMIT 10 → 20으로 증가
- 검색 결과가 많아도 DOM에는 화면에 보이는 요소만 렌더링
2026-01-10 10:10:36 +09:00
b35dab5eea feat: 모바일 일정 검색 UX 개선
- 입력 시마다 검색 → 키패드 검색 버튼 눌러야 검색으로 변경
- searchInput과 searchTerm 분리
- type='search', enterKeyHint='search' 추가로 모바일 키보드 최적화
- 취소 버튼 잘림 현상 수정 (flex-shrink-0, min-w-0)
2026-01-10 10:05:56 +09:00
0efa0a8e5c feat: AdminSchedule.jsx에 동적 높이 가상 스크롤 적용
- measureElement와 data-index 추가
- 고정 높이 제거하여 내용에 맞게 자동 조절
2026-01-10 09:52:34 +09:00
4ecc16347c fix: 일정 페이지 최소 높이 및 관리 페이지 글씨 크기 수정
- Schedule.jsx: 검색 결과 아이템에 min-h-[100px] 추가
- AdminSchedule.jsx: 글씨 크기 및 아이콘 크기 원복
2026-01-10 09:50:56 +09:00
d22466ec23 feat: 가상 스크롤 동적 높이 지원
- measureElement와 data-index 사용으로 각 아이템 실제 높이 측정
- 고정 높이(h-[120px]) 제거하여 내용에 맞게 자동 조절
2026-01-10 09:46:38 +09:00
0cab67dfbe fix: 가상 스크롤 컨테이너 높이에서 마지막 여백 제거 2026-01-10 09:43:58 +09:00
92782e9022 fix: 마지막 검색 결과 항목 여백 제거 2026-01-10 09:42:34 +09:00
043f8b465d fix: 가상 스크롤 버그 수정
- searchSchedules 미정의 오류 수정 (setSearchTerm만 사용)
- Schedule.jsx 항목 간 여백 추가 (ITEM_HEIGHT 136px)
2026-01-10 09:40:40 +09:00
ad2d501c39 feat: 일정 검색에 가상 스크롤 최적화 적용
- @tanstack/react-virtual 라이브러리 추가
- Schedule.jsx, AdminSchedule.jsx에 useVirtualizer 적용
- 검색 결과가 많아도 DOM에는 화면에 보이는 요소만 렌더링
- 스크롤 성능 대폭 향상
2026-01-10 09:34:18 +09:00
7192379eb0 chore: 일정 검색 페이징 limit을 20개로 변경
- Schedule.jsx, AdminSchedule.jsx SEARCH_LIMIT 5 -> 20
2026-01-10 09:20:27 +09:00
9986b918d8 fix: 검색 모드에서 카테고리 필터링 적용
- 검색 결과에도 selectedCategories로 필터링 추가
- Schedule.jsx, AdminSchedule.jsx 수정
2026-01-10 09:16:15 +09:00
bedda590eb fix: 검색 모드에서 카테고리 카운트 수정
- 검색 모드일 때 selectedDate 조건 제거하여 모든 검색 결과의 카테고리 표시
- Schedule.jsx, AdminSchedule.jsx 수정
2026-01-10 09:13:49 +09:00
cdca23e317 refactor: PC public 페이지 공통 컴포넌트 및 유틸 적용
- LightboxIndicator 공통 컴포넌트 생성 및 AlbumDetail, AlbumGallery에 적용
- formatDate를 utils/date에서 import하도록 변경 (Album, Members, AlbumDetail)
- 중복 코드 약 100줄 제거
2026-01-10 09:06:26 +09:00
22db79e960 fix: PC 공개 일정 페이지 HTML 엔티티 디코딩 수정
- decodeHtmlEntities 함수 추가하여 < > 등 올바르게 표시
- 레이아웃 변경 없음 (원래 상태 유지)
2026-01-10 00:45:30 +09:00
97767bc5ca fix: 일정 목록 높이 자동 계산으로 잘림 문제 해결
- main을 flex flex-col로 변경
- 브레드크럼, 타이틀에 flex-shrink-0 추가
- 그리드에 flex-1 min-h-0 추가
- 일정 목록 컬럼에 flex flex-col min-h-0 추가
- 스크롤 컨테이너에서 max-h 고정값 제거하고 flex-1로 변경
2026-01-10 00:31:34 +09:00
04ce4beba4 fix: 일정 관리 페이지 UI 수정
1. 외부 스크롤 제거 (h-screen overflow-hidden flex flex-col)
2. HTML 엔티티 디코딩 함수 추가 (< > 등 올바르게 표시)
3. decodeHtmlEntities 함수를 컴포넌트 외부로 이동하여 ScheduleItem에서 접근 가능
2026-01-10 00:27:32 +09:00
0f7d3d6f39 Revert "fix: 관리 페이지 날짜 상태 조건부 초기화"
This reverts commit 2dd5219265.
2026-01-10 00:20:04 +09:00
2dd5219265 fix: 관리 페이지 날짜 상태 조건부 초기화
문제: 일정 관리 페이지에서 날짜 선택 후 홈으로 갔다왔을 때
오늘 날짜로 초기화가 안됨

해결:
- useScheduleStore에 preserveState 플래그 추가
- AdminSchedule에서 preserveState가 false면 오늘 날짜로 초기화
- AdminScheduleForm, AdminScheduleBots에서 일정 관리로 돌아갈 때
  preserveState를 true로 설정하여 상태 유지
2026-01-10 00:19:06 +09:00
d6eb8d410c feat: 모바일 홈 화면 섹션별 애니메이션 추가
- 히어로 섹션: 페이드인 + 텍스트 슬라이드업
- 멤버 섹션: 프로필 팝 애니메이션
- 앨범 섹션: 카드 슬라이드업
- 일정 섹션: 카드 슬라이드인
- 순차적 딜레이로 자연스러운 로딩 효과
2026-01-10 00:11:04 +09:00
dc879fc60d feat: 모바일 멤버 페이지 카드 애니메이션 추가
- 페이드인 + 슬라이드업 애니메이션 적용
- 순차적 딜레이로 자연스러운 등장 효과
2026-01-10 00:09:13 +09:00
24fc1f2b87 fix: 누락된 getAlbumTracks API 함수 추가
- api/public/albums.js에 getAlbumTracks 함수 누락으로 모바일 페이지 오류 발생
- AlbumDetail.jsx에서 사용하는 함수 추가
2026-01-10 00:05:57 +09:00
1f9cf34e31 refactor: 모바일 public 페이지 API 모듈 적용
수정된 파일 (5개):
- pages/mobile/public/Album.jsx
  - fetch('/api/albums') → getAlbums()

- pages/mobile/public/Members.jsx
  - fetch('/api/members') → getMembers()

- pages/mobile/public/AlbumDetail.jsx
  - fetch('/api/albums') → getAlbums()
  - fetch('/api/albums/{id}/tracks') → getAlbumTracks()

- pages/mobile/public/AlbumGallery.jsx
  - fetch('/api/albums') → getAlbums()
  - fetch('/api/albums/{id}/photos') → getAlbumPhotos()

- pages/mobile/public/Schedule.jsx
  - fetch('/api/schedules?year=...') → getSchedules()
  - fetch('/api/schedules/categories') → getCategories()
  - fetch('/api/schedules?search=...') → searchSchedules()

Home.jsx는 이미 API 모듈 사용 중이므로 제외
2026-01-10 00:02:42 +09:00
8e01692d6e refactor: ConfirmDialog 추가 적용 및 일정 제목 truncate 제거
수정된 파일:
- AdminScheduleCategory.jsx (50줄 → 15줄, 35줄 제거)
- AdminAlbumPhotos.jsx (60줄 → 15줄, 45줄 제거)
- AdminScheduleForm.jsx (55줄 → 12줄, 43줄 제거)
- AdminSchedule.jsx 일정 제목 truncate 2곳 제거

총 약 220줄의 중복 코드 제거
2026-01-09 23:44:37 +09:00
d52b43397c refactor: ConfirmDialog 공통 컴포넌트 생성 및 적용
새로 생성된 파일:
- components/admin/ConfirmDialog.jsx (109줄)
  - 삭제 확인 등 위험한 작업을 위한 공통 다이얼로그
  - Props: isOpen, onClose, onConfirm, title, message, loading, variant 등

수정된 파일:
- pages/pc/admin/AdminAlbums.jsx (60줄 → 15줄)
- pages/pc/admin/AdminSchedule.jsx (70줄 → 17줄)

총 약 100줄의 중복 코드 제거
2026-01-09 23:36:34 +09:00
5c812b7ac5 fix: AdminAlbumPhotos 로딩 시 헤더 유지
- 로딩 상태에서도 AdminHeader 표시
- 콘텐츠 영역만 스피너로 대체
- 페이지 전환 시 헤더 깜빡임 해결
2026-01-09 23:28:58 +09:00
b37ca360a5 fix: AdminAlbumForm 페이지 전환 애니메이션 제거
- motion.div를 일반 div로 변경
- pageVariants 변수 제거
- 다른 Admin 페이지와 일관성 유지
- 페이지 전환 시 헤더 깜빡임 해결
2026-01-09 23:25:48 +09:00
97fb4b7964 refactor: AdminHeader 공통 컴포넌트를 모든 Admin 페이지에 적용
새로 생성된 파일:
- components/admin/AdminHeader.jsx (47줄)

수정된 파일 (10개):
- pages/pc/admin/AdminMembers.jsx
- pages/pc/admin/AdminMemberEdit.jsx
- pages/pc/admin/AdminAlbums.jsx
- pages/pc/admin/AdminAlbumForm.jsx
- pages/pc/admin/AdminAlbumPhotos.jsx
- pages/pc/admin/AdminSchedule.jsx
- pages/pc/admin/AdminScheduleForm.jsx
- pages/pc/admin/AdminScheduleBots.jsx
- pages/pc/admin/AdminScheduleCategory.jsx
- pages/pc/admin/AdminDashboard.jsx

각 파일에서:
- 중복 헤더 JSX 제거 (24줄 → 1줄)
- handleLogout 함수 제거 (4~6줄)
- LogOut import 제거

총 약 300줄의 중복 코드 제거
2026-01-09 23:18:48 +09:00
7f9c53b53a refactor: AdminHeader 공통 컴포넌트 생성 및 AdminMembers 적용
새로 생성된 파일:
- components/admin/AdminHeader.jsx (47줄)
  - 로고, Admin 배지, 사용자 정보, 로그아웃 버튼 포함

수정된 파일:
- pages/pc/admin/AdminMembers.jsx
  - AdminHeader import 추가
  - 중복 헤더 JSX 제거 (24줄 -> 1줄)
  - handleLogout 함수 제거 (5줄)

나머지 9개 Admin 페이지도 동일한 패턴으로 적용 가능
2026-01-09 23:09:11 +09:00
07a0c30f0f refactor: NumberPicker, CustomTimePicker 공통 컴포넌트로 분리
새로 생성된 파일:
- components/admin/NumberPicker.jsx (185줄)
- components/admin/CustomTimePicker.jsx (176줄)

수정된 파일:
- pages/pc/admin/AdminScheduleForm.jsx (362줄 제거)

AdminScheduleForm에서 중복 정의된 NumberPicker, CustomTimePicker를
별도 파일로 분리하고 import로 대체.

총 코드 변화: 361줄 → 0줄 (361줄 제거)
2026-01-09 23:05:38 +09:00
0b00055773 refactor: useToast 커스텀 훅으로 Toast 로직 통합
- hooks/useToast.js 생성 (44줄)
- 적용 파일 (9개):
  - AdminMembers.jsx
  - AdminMemberEdit.jsx
  - AdminAlbums.jsx
  - AdminAlbumForm.jsx
  - AdminAlbumPhotos.jsx
  - AdminSchedule.jsx
  - AdminScheduleForm.jsx
  - AdminScheduleBots.jsx
  - AdminScheduleCategory.jsx
- 각 파일에서 중복된 toast useState/useEffect 제거
- showSuccess/showError 편의 메서드 활용

총 약 70줄의 중복 코드 제거
2026-01-09 22:57:34 +09:00
3367f4806d chore: scrape 파일 gitignore에 추가 2026-01-09 22:49:26 +09:00
8424c3422d fix: Schedule 페이지 오류 수정 및 년월 선택 스타일 통일
- Schedule.jsx: yearRange, monthNames 변수 누락 수정
- Schedule.jsx, AdminSchedule.jsx: 현재 년도/월 테두리 제거, 글씨색만 유지
- CustomDatePicker.jsx: 동일 스타일 적용
2026-01-09 22:47:32 +09:00
7867eb8928 refactor: CustomDatePicker 공통 컴포넌트로 분리
- components/admin/CustomDatePicker.jsx 생성 (269줄)
- AdminMemberEdit에서 중복 제거 (-237줄)
- AdminAlbumForm에서 중복 제거 (-273줄)
- AdminScheduleForm에서 중복 제거 (-349줄)
- 현재 년도/월 표시: 테두리 제거, 글씨색만 유지
- 오늘 날짜: 배경색 제거, 글씨색만 유지
- 요일/일요일/토요일 색상 구분 추가

총 코드 감소: 약 860줄
2026-01-09 22:42:33 +09:00
8124a1abe1 refactor: 모든 Admin 페이지 API 모듈화 완료
- AdminMemberEdit API 모듈 적용
- AdminScheduleForm API 모듈 적용
- AdminAlbumPhotos API 모듈 적용 (업로드는 SSE 유지)
- api/admin/albums.js에 getAlbumTeasers, deleteAlbumTeaser 추가

총 적용 완료:
- Public 페이지: 7개
- Admin 페이지: 10개 전체 완료
2026-01-09 22:26:37 +09:00
f006309ef4 refactor: 남은 Admin 페이지 API 모듈 적용 완료
- AdminAlbums API 모듈 적용

총 적용 완료:
- Public 페이지: 7개 (PC 6 + 모바일 1)
- Admin 페이지: 7개 (Schedule, ScheduleBots, ScheduleCategory, Login, Dashboard, Albums, Schedule)
2026-01-09 22:16:25 +09:00