Commit Graph

289 Commits

Author SHA1 Message Date
76fb722a27 fix(docs): CLAUDE.md 사실 정정
- Next.js 버전 15 → 16 (package.json ^16.2.6 기준)
- GET /api/packs/sign-link → POST (실제 route.ts export async function POST)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-12 05:56:38 +09:00
7f5c7fcb20 chore: music 구매 고아 경로 차단(→/products) + CLAUDE.md 현행화 2026-06-12 05:54:18 +09:00
dbd4bbf21b feat(mypage): 내 의뢰 타임라인 + 추적 링크 2026-06-12 05:47:12 +09:00
5e90295d26 fix(admin): 추적링크 복사 상태 리셋 + 견적 뱃지 색 정리 2026-06-12 05:43:00 +09:00
32b07e31fa feat(admin): 의뢰 관리 8종 상태 머신 + 견적 연결·추적 링크 표시
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-12 05:38:40 +09:00
d62653e834 feat(quote): 거절 액션 + 의뢰 상태 동기화 + 관리자 알림 2026-06-12 05:31:25 +09:00
5ceae7e90b fix(admin): 견적 재발송 방어 + title 타입 검증
- POST /api/admin/quotes: title을 typeof + trim() 검증으로 falsy 문자열 방어
- POST /api/admin/quotes/[id]/send: sent/accepted/rejected 상태면 200 조기 반환(alreadySent: true)으로 중복 발송 차단
- 견적 편집 UI: isSentStatus 플래그로 발송 버튼 비활성화·라벨 "발송됨" 표시, alreadySent 응답 시 안내 alert 처리

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-12 05:28:22 +09:00
70abad31b7 feat(admin): 의뢰→견적 연결 생성 + 견적 발송(메일·상태 동기화) 2026-06-12 05:23:01 +09:00
f5cfb8bd6f feat(portal): /track/[token] 비회원 의뢰 추적 페이지
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 05:13:58 +09:00
b4f57c85ec refactor(outsourcing): 입력 스타일 상수화 + goNext 방어적 재검증
1. 반복되는 INPUT_STYLE 객체를 파일 상단 상수로 추출하여 5곳에서 재사용
   - textarea (단계③)
   - input[name] (단계④)
   - input[email] (단계④)
   - input[phone] (단계④)
   - button.prev (네비게이션)

2. goNext 함수 첫 줄에 방어적 재검증 추가
   - if (!stepValid(step)) return; 추가
   - step dependency 복원 (useCallback 의존성 배열)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 05:10:03 +09:00
429780d65d feat(outsourcing): 4단계 의뢰 폼 + 접수 완료 추적 안내
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-12 05:00:46 +09:00
8e820760e2 feat(contact): 구조화 필드 + 추적 토큰 + 고객 접수 확인 메일
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-12 01:32:31 +09:00
146836f56b fix(portal): 토큰 DEFAULT·UNIQUE 인덱스 보장 + 메일 제목 이스케이프 제거
- contact_requests.public_token: 인라인 UNIQUE 제거, 백필 UPDATE 직후 SET DEFAULT + CREATE UNIQUE INDEX IF NOT EXISTS 패턴으로 교체 (라이브 DB 멱등성 보장)
- quotes.public_token: ADD COLUMN IF NOT EXISTS + SET DEFAULT + 백필 UPDATE + CREATE UNIQUE INDEX IF NOT EXISTS 4줄 구조로 교체 (인라인 UNIQUE NO-OP 문제 해소)
- sendQuoteSentEmail / sendQuoteDecisionEmail subject에서 escapeHtml() 제거 — 메일 제목은 평문, HTML 본문 이스케이프는 유지

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-12 01:29:36 +09:00
f7d26c4c3f feat(portal): 의뢰 상태 머신(TDD) + 의뢰/견적 메일 2026-06-12 01:21:30 +09:00
5077f6ad17 feat(db): 고객 포털 — contact_requests 상태머신·토큰 + quotes FK 2026-06-12 01:18:51 +09:00
5751cddcea docs(plan): 리뉴얼 Phase 3 구현 계획 — 외주 고객 포털 + 레거시 정리
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-12 01:16:46 +09:00
a3933c1081 feat(home): 소프트웨어 진열 섹션 products 동적 연동
getListedProducts(createAdminClient()) try/catch로 상위 3개 카드 렌더,
0개이면 기존 출시 준비 중 폴백 유지. force-dynamic으로 항상 최신 목록 노출.
2026-06-12 00:26:03 +09:00
d2a20c5cb7 feat(admin): 제품 관리 — CRUD + 파일 업로드·제품 배정
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-12 00:20:48 +09:00
e713ebceee docs(plan): Phase 2 재개 체크포인트 — P2-8까지 완료, P2-9 미커밋 중단 2026-06-11 13:21:01 +09:00
dc5e9d431c fix(admin): 주문 취소에도 confirm 확인 추가 2026-06-11 09:17:57 +09:00
7b02e28f6c feat(admin): 주문 관리 페이지 — 입금 확인 원클릭 + 다운로드 활성화 메일
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 09:13:34 +09:00
8dafb98f47 fix(products): 모달 401 세션만료 처리 + callback open redirect 방어 + 초기 포커스
- BankTransferModal: POST /api/orders 401 응답 시 setAuthState('guest')로 전환 (에러 텍스트 대신 로그인 유도 UI 복귀)
- BankTransferModal: 모달 열릴 때 closeBtnRef.current?.focus() 호출 (접근성 초기 포커스)
- auth/callback: next 파라미터를 safeNext 패턴으로 검증 — startsWith('/') && !startsWith('//') && !startsWith('/\') 미충족 시 /mypage 폴백

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 09:11:05 +09:00
199dae0ee5 feat(products): 동적 카탈로그·상세 페이지 + 계좌이체 구매 모달
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 09:07:00 +09:00
f151af89f3 feat(downloads): 다운로드 검증을 orders 단일 소스로 교체 + 내 제품 제품별 그룹핑
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 08:47:32 +09:00
3fa865a6e7 fix(orders): user 기준 rate limit + 상품 조회 예외 처리
- checkRateLimit('orders:{user.id}', 60_000, 5) 인증 직후 적용 → 429 반환
- getProductById try/catch 추가 → DB 장애 시 500 '상품 조회에 실패했습니다'
- lib/order-emails.ts sendOrderPaidEmail HTML 이스케이프 대상 없음 (해당 없음)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 08:41:42 +09:00
1d5e7254ed feat(orders): 계좌이체 주문 생성 API + 접수/입금확인 메일
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 08:36:22 +09:00
692fb504d9 feat(products): orders 기반 제품/파일 조회 헬퍼 2026-06-11 08:32:44 +09:00
e86ca27831 feat(db): 음악 팩 구매 이력 contact_requests → orders 멱등 이관 2026-06-11 08:28:34 +09:00
5d90ac310e feat(db): products 카탈로그 확장 + 음악 제품 시드 + pack_files.product_id 백필 2026-06-11 08:28:31 +09:00
cf89e8cbdb feat(products): vitest 도입 + 제품 접근 확장 로직 (music tier 하위 호환)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 08:24:33 +09:00
fe055fd0d0 docs(plan): 리뉴얼 Phase 2 구현 계획 — orders 단일 소스 제품 판매 시스템
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 08:21:39 +09:00
gahusb
0580fe8f5a Merge pull request #1 from gahusb/feature/renewal-phase1
리뉴얼 Phase 1: 외주+소프트웨어 2축 풀 리디자인 + 레거시 서비스 숨김
2026-06-11 03:13:35 +09:00
a25b645933 fix(renewal): mypage 숨김 링크 교체 + /products 스텁 + sitemap 정리
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 03:04:06 +09:00
c447294c84 fix(quote): 보라 잔재·navy 리터럴을 jsm 토큰으로 정리 2026-06-11 02:49:19 +09:00
c2d7455f65 refactor(design): 노출 페이지 잔여 글래스·다크 스타일 정리
- layout.tsx: GlassFilter 렌더·import 제거 (LiquidGlass.tsx 파일은 숨김 페이지용으로 유지)
- payment/success,fail: #04102b 다크 헤더 → jsm-navy 토큰, h2 색상 jsm-ink 토큰으로 교체
- legal/terms,privacy,refund: h1 text-[#04102b] → jsm-ink CSS 변수
- portfolio/[token]: bg-slate-950 + 다크 radial-gradient → jsm-bg/surface/navy 라이트 테마
- quote/[token]: #0a0f1e/#0f172a 전체 다크 테마 → jsm-* 라이트 토큰 기반으로 전면 교체 (print CSS·수락/거절 로직 무수정)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 02:44:36 +09:00
4bd5400406 feat(mypage): 4탭 재구성 + 전문 톤 리디자인 (데이터·다운로드 로직 무수정)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 02:31:40 +09:00
76994c28f1 fix(login): 포커스 링·type=button·disabled 대비 접근성 보완
- 이메일/비밀번호 input에 focus-visible:ring-2 추가
- Google 로그인 버튼에 type=\"button\" 명시
- disabled 상태 배경 jsm-line → jsm-ink-faint로 변경 (대비 개선)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 02:18:37 +09:00
cd1f67d076 feat(login): 로그인 페이지 전문 톤 리디자인 (인증 로직 무수정)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 02:14:43 +09:00
e0b6120bb6 fix(outsourcing): 착수금 표기를 기존 공표 조건(30%)으로 정정 2026-06-11 02:12:29 +09:00
a11006fab5 feat(outsourcing): 외주 의뢰 페이지 신설 + work 라우트 리다이렉트
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 02:04:38 +09:00
b846a713c1 fix(seo): jsonLd Service URL을 /outsourcing으로 정렬
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 01:56:58 +09:00
be3cc3752e feat(home): 외주+소프트웨어 2축 메인 페이지 풀 리디자인 + 메타데이터 교체 2026-06-11 01:53:08 +09:00
89dc5364d1 fix(nav): 모바일 드로어 접근성 (aria-expanded·Esc·dialog role) + hover 클래스화
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 01:48:24 +09:00
6d6d6f353a feat(nav): 외주·소프트웨어 2축 네비게이션 + 푸터 리뉴얼
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 01:42:37 +09:00
b13ddd3841 feat(visibility): 사주·음악·설문·패키지 라우트 숨김 가드 적용 2026-06-11 01:35:46 +09:00
281edd9a52 fix(visibility): 기존 시드 행도 숨김 갱신되도록 DO UPDATE + 재사용 경고 JSDoc
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 01:29:23 +09:00
f6df890297 feat(visibility): service_settings 기반 서비스 숨김 가드 + 레거시 서비스 시드
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 01:24:07 +09:00
776985eca8 fix(design): 미정의 --font-pretendard 변수 간접참조 제거
var(--font-pretendard, ...) 패턴은 --font-pretendard가 어디에도
정의되지 않아 항상 fallback으로 동작합니다. npm CSS import 방식에서
next/font 제거 후 변수 주입이 안되므로 직접 'Pretendard Variable'로
단순화하여 의도 명확화합니다. 모든 fallback stack은 유지됩니다.

변경 위치:
- @theme inline (font-sans, font-mono)
- body (전역 폰트)
- .font-mono 유틸리티
- .kx-section, .kx-display, .kx-label (Kinetic Ether)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-11 01:22:13 +09:00
e14e527e28 feat(design): JSM 전문 토큰 체계 + Pretendard 도입, kx 토큰 재매핑
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 01:15:11 +09:00
a496c2244b docs(plan): 리뉴얼 Phase 1 구현 계획 — 디자인 토큰·숨김 가드·메인/외주/로그인/마이페이지
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-11 01:06:48 +09:00