Commit Graph

68 Commits

Author SHA1 Message Date
895b33d83d feat(phase3a): 음악 트랙 저장·조회 API (user_id + RLS)
- POST: 로그인 필수, createAdminClient로 music_tracks insert
- GET: 세션 클라이언트로 본인 것만(RLS music_select_own) 조회, 최신순
- JSON 파싱 try/catch(400), 필드 검증(str 헬퍼)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-03 13:02:22 +09:00
2aa424f3ce feat(phase3a): 스토리→가사(Gemini) + generate 인증·일일제한 + callback 정리
- lib/music/story-prompt.ts: MusicStory 스키마 + Gemini 응답 파싱/검증(타로 prompt.ts 방어 패턴 포팅)
- app/api/studio/story/route.ts: 로그인 인증 후 Gemini 모델 폴백(2.5-pro→2.5-flash→2.0-flash)으로 가사 JSON 생성. 일일 사용량은 미집계(생성 확정 전 초안 단계)
- app/api/studio/callback/route.ts: Suno webhook 수신용 최소 200 응답 엔드포인트
- app/api/studio/generate/route.ts: 인증(401) + 일일 제한(429, MUSIC_DAILY_LIMIT) 추가, Suno 생성 성공 시에만 recordUsage('music') 기록

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-03 12:56:58 +09:00
0742059db2 feat(phase3a): 음악 서비스 공개화 — 가드·HideableService·DEFAULT_SERVICES 정리
- app/music/layout.tsx: isServiceVisible/notFound 제거, metadata 유지
- lib/service-visibility.ts: HideableService type에서 'music' 제거 (gyeol|lotto만 유지)
- app/api/admin/services/route.ts: DEFAULT_SERVICES에서 music 행 제거

/music* 라우트가 이제 공개(static) 상태로 노출됨.
service_settings music DELETE는 Task 1 마이그레이션이 담당.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-03 12:51:54 +09:00
5fd7ab8872 feat(phase2): 사주 공개 전환 + analyze 로그인·일일제한(서버 강제)
- app/work/saju/layout.tsx: isServiceVisible 가드 제거, 사주 서비스 공개 전환
- lib/service-visibility.ts: HideableService에서 saju 제거
- app/api/admin/services/route.ts: DEFAULT_SERVICES에서 saju 행 제거
- app/api/saju/analyze/route.ts: saju_detail 결제 게이트(403) 제거,
  로그인(401) + 서버측 일일 1회 제한(429, ai_usage_log 기반)으로 교체.
  recordUsage는 실제 Gemini 해석 성공 반환 직전에만 호출(MOCK 폴백 제외)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 21:28:24 +09:00
b3d845a532 feat(phase2): 타로 저장·조회 API (user_id + RLS 본인 조회)
- POST /api/tarot/readings: 로그인 필수, interpretation_json 검증 후 insert
- GET /api/tarot/readings: 세션 클라이언트로 본인 것만 조회 (RLS tarot_select_own), 최신순
- Task 6·9가 소비

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AAtcmKKtqDUe4NyVgy1aLQ
2026-07-02 21:04:48 +09:00
10a60300ae fix(phase2): 타로 interpret 견고성 — maxOutputTokens 8192 + wall-clock 가드로 호출 상한 축소
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 21:01:43 +09:00
3acc1dbbe6 feat(phase2): 타로 interpret API — Gemini strict JSON + 인증·일일제한·reroll
lib/tarot/prompt.ts에 TarotInterpretation 스키마·시스템 프롬프트·JSON
파싱/검증 유틸을 추가하고, app/api/tarot/interpret/route.ts에서 사주
analyze와 동일한 Gemini 모델 폴백(getGenerativeModel systemInstruction +
generationConfig) 패턴을 재사용해 인증(401)→일일제한(429)→입력검증(400)
→API키(503)→호출 순서로 처리한다. GEMINI_API_KEY 미설정 시 예시 데이터
대신 503을 반환해 실데이터 오염을 막고, 스키마 검증 실패 시 사유를
주입해 1회 reroll한다.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 20:53:53 +09:00
f693c4c5b4 fix(phase1): ad-channels API 입력 견고성 — JSON 파싱 try/catch + 문자열 타입 가드
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 15:22:17 +09:00
3e031a1c80 feat(phase1): ad_channels 테이블 + admin CRUD API
- Migration: ad_channels table (uuid, name, url, status, memo)
- Routes: GET/POST /api/admin/ad-channels (list/create)
- Routes: PATCH/DELETE /api/admin/ad-channels/[id] (update/delete)
- Auth: admin_token verification via verifyAdminTokenNode
- RLS: service_role only, no additional policies

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 15:19:09 +09:00
7366c18692 chore(phase0): 고아 API 제거 — track/[token](페이지 직접조회로 대체됨)·saju/lotto
- app/api/track/[token]: 페이지에서 Supabase 직접 조회로 대체됨
- app/api/saju/lotto: 프론트 fetch 0회, 외부 saju-engine 전용

참조: Task 6 (Phase 0 cleanup)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 14:25:05 +09:00
1e926fcb19 chore(phase0): PortOne 잔재 제거 — 계좌이체 단일 소스 확정, saju 결제 CTA 제거
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 14:12:38 +09:00
8e1cf9b4e1 chore(phase0): packages·subscription 제거 — 페이지/API/cron/vercel.json + 파급(stats·members·saju) 수정
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 14:07:56 +09:00
88fe56163d chore(phase0): eBay 세트 제거 — 문진·문서 admin/API/lib/CONTENT + cheerio
Delete:
- app/api/questionnaire/ (submit/route.ts)
- app/admin/questionnaire/ (page.tsx)
- app/api/admin/questionnaire/ (route.ts + [id]/route.ts)
- app/admin/documents/ (page.tsx)
- app/api/admin/documents/ ([filename]/route.ts)
- lib/ebay-tools/ (crawler.ts·pricing.ts·ai-analyzer.ts·types.ts)
- CONTENT/ebay-tool-{questionnaire,proposal}.html
- CONTENT/ARCHITECTURE_EBAY_PARTS_TOOL.md

Modify:
- app/admin/components/AdminSidebar.tsx: Remove NAV_ITEMS for /admin/documents & /admin/questionnaire
- package.json: Remove cheerio dependency

Verify: npm test (4 files, 20 tests PASS), npm run build OK

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-02 14:02:47 +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
8e820760e2 feat(contact): 구조화 필드 + 추적 토큰 + 고객 접수 확인 메일
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-12 01:32:31 +09:00
d2a20c5cb7 feat(admin): 제품 관리 — CRUD + 파일 업로드·제품 배정
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-12 00:20:48 +09:00
7b02e28f6c feat(admin): 주문 관리 페이지 — 입금 확인 원클릭 + 다운로드 활성화 메일
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 09:13:34 +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
f6df890297 feat(visibility): service_settings 기반 서비스 숨김 가드 + 레거시 서비스 시드
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-11 01:24:07 +09:00
1b4e6803a2 fix(db): contact_requests.phone 컬럼 보장 + project_milestones anon 전체 CRUD 정책 제거
- contact route가 phone을 INSERT하나 schema에 컬럼 부재 → 문의 DB 저장이
  조용히 실패(이메일은 정상)할 수 있어 ADD COLUMN IF NOT EXISTS로 보장
- 003_fix_quotes_rls의 'Admin manage milestones'(anon FOR ALL USING true) 제거:
  비로그인 누구나 고객 마일스톤 CRUD 가능한 보안 구멍. 실제 접근은 전부
  service_role 서버 API라 제거해도 무영향
- schema.sql에 phone 동기화, contact route의 불필요한 created_at 명시 제거

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-01 15:13:59 +09:00
fa9b05c7e8 feat(api): /api/admin/survey GET — 목록 + 통계 + CSV export
- ?range=all|today|week 필터
- ?format=csv → BOM 포함 UTF-8 CSV 다운로드 (Excel 호환)
- 통계: 각 질문별 카운트 분포 + 만족도 평균 + 이메일률 + 완료시간 중간값
- admin HMAC cookie 인증 (verifyAdminTokenNode)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 05:36:40 +09:00
41f6b347a9 feat(api): /api/survey POST — DB 저장 + Resend 확인 메일
- Rate limit: IP당 1분 5회 (기존 contact 패턴)
- 필수 validation: age_range, status, awareness_freq
- 입력 정제(sanitizeStr) + 이메일 형식 검증
- supabase INSERT (service role, RLS 우회)
- 이메일 입력 시: Resend 즉시 확인 메일 + email_confirmation_sent 마킹
- 메일 실패는 응답 저장 성공에 영향 X

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-16 05:33:50 +09:00
774835a37a feat(mypage): 다운로드 버튼 활성화 (Phase 2) + status 분기
- packFiles state + /api/packs/list-mine fetch (RLS 우회 위해 admin client 라우트)
- handleDownload: /api/packs/sign-link 호출 → window.location 이동
- 카드: 자료 리스트 DB SSOT (PACK_ASSETS.files 폐기)
- order.status === 'completed' 만 다운로드 활성, 그 외는 Phase 1 placeholder 유지
- 4시간 만료 안내 추가

빌드 복구: B3에서 깨진 mypage 빌드를 이번 commit이 복구.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 09:11:08 +09:00
ce23c4e612 feat(api): /api/admin/packs — admin 파일 목록/편집/삭제
- GET: pack_files 목록 (deleted_at IS NULL)
- PATCH: { id, label?, sort_order?, min_tier? } 인라인 편집
- DELETE: web-backend 통한 soft delete

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 09:05:30 +09:00
3f0c5e7f1c feat(api): /api/admin/packs/upload-url — admin 일회성 HMAC 업로드 토큰 발급
15분 만료 + jti 단발성. 브라우저는 이 토큰을 web-backend /api/packs/upload에
직접 multipart POST 시 Authorization Bearer 헤더로 전달 → Vercel function body
limit 우회 (5GB 업로드).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 09:04:19 +09:00
f40940ca4b feat(api): /api/packs/sign-link — 사용자 다운로드 권한 검증 + DSM 링크 발급
- supabase auth → user
- contact_requests.status='completed' 인 Music 팩 구매 확인
- extractPackTier로 tier 도출, hierarchy 매핑
- pack_files.min_tier 매칭 검증
- web-backend signLink 호출 → 4시간 만료 URL 반환

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 09:03:13 +09:00
b8c5a202ce feat: Suno sunoapi.org v1 스펙 적용 + 팩 상세 섹션 재구성
- Suno API: /api/v1/generate (taskId) + record-info 폴링으로 전환
- SUNO_API_URL 기본값 https://api.sunoapi.org, SUNO_API_KEY만 필수
- 모델: V4 / V4_5 / V3_5, customMode·callBackUrl 지원
- 결과 카드: sunoData 배열(오디오·이미지·태그·duration) 렌더
- 팩 상세: 팩 구성품 + 추천 대상 섹션 추가, Before/After 제거
2026-04-15 03:34:44 +09:00
a362f7b387 feat: 스튜디오 페이지 + Suno API 프록시 + 팩 상세 가격 최상단 재구성
- TopNav: 홈/샘플/팩 상세/스튜디오 4개 링크 구조
- /services/music: 컴팩트 헤더 + PRICING 최상단 배치 (상세 포맷)
- /studio: Suno Generate UI (simple/custom 모드, 태그 프리셋, 폴링)
- /api/studio/generate, /api/studio/status: Suno API 프록시
2026-04-15 03:27:17 +09:00
2c8a0f1c37 chore: Resend 발신 도메인을 자체 검증 도메인으로 교체
onboarding@resend.dev (샌드박스) → noreply@jaengseung-made.com (검증 완료).
스팸 판정 위험 감소 + 브랜드 일관성.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 01:44:58 +09:00
03340c64a6 feat: /portfolio/[token] 공유 URL + /admin/hidden 관리자 대시보드
- lib/admin-auth: HMAC 서명 포트폴리오 토큰 발급/검증 (1~365일)
- /api/admin/portfolio-token: 관리자 쿠키 인증 후 토큰 발급
- /portfolio/[token]: 위시캣 제출용 게이트웨이 (noindex, 만료 시 404)
- /admin/hidden: 숨김 페이지 바로가기 + 토큰 발급 UI

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 01:01:24 +09:00
5cc224a743 refactor: AI 음악 메인 개편 — 로또/프롬프트/자동화 삭제, 음악/블로그 팩 신규
- 삭제: services/{lotto,prompt,automation,ai-kit,stock,tools} + api/{lotto,tools}
- 노출 제거: /freelance, /services/website (noindex + robots/sitemap 제외, 외부 지원서 링크 유지)
- 신규: /services/music (3-tier 39k/99k/149k, 4단계 프로세스)
- 신규: /services/blog (블로그 자동화 팩 29k 1회성)
- 신규: PurchaseAgreementModal (전자상거래법 17조 동의 + 계좌이체)
- 개편: 홈 대시보드 (음악 Hero + 사주/블로그팩/일반문의 서브카드)
- 사이드바 재구성, sitemap/robots/JSON-LD 갱신
- 환불정책 신규 상품 반영 + 법적 근거 명시

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-15 00:56:34 +09:00
fae92940e5 feat: 하이브로지스틱스 견적서 + 컨셉 시안 + 견적 UI 개선
- 하이브로지스틱스코리아 홈페이지 리뉴얼 견적서(docs) + 컨셉 시안(HTML)
- 관리자 견적항목: grid→flex 레이아웃, 수량/선택 축소, 설명 확대
- 고객용 견적서: table-layout fixed, 카테고리 줄바꿈 방지, WBS 너비 통일
- PUT API wbs 필드 허용 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-11 08:47:41 +09:00
769544b453 feat: 포트원 V2 결제 마이그레이션 + 법적 페이지 추가 (PG 심사용)
- 토스페이먼츠 SDK → 포트원 V2 (@portone/browser-sdk) 전환
- 4채널 결제수단 선택 UI: 카드(KPN)/카카오페이/네이버페이/토스페이
- 서버 결제 검증 API를 포트원 V2 조회 방식으로 변경
- 이용약관(/legal/terms), 개인정보처리방침(/legal/privacy), 환불정책(/legal/refund) 페이지 생성
- 푸터에 법적 페이지 링크 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 23:52:22 +09:00
3537862c99 feat: 도구 쇼케이스 페이지 + 네이버 블로그 AI 자동화 툴
- 사이드바 "이베이 부품 검색" → "여긴 뭐 만들어요?" (DEMO 배지, /tools)
- /tools 쇼케이스: 완성형 레퍼런스 데모 카드 그리드 + 상담 CTA
- /tools/naver-blog: 주제·키워드·형식·톤·분량 선택 → AI 블로그 글 자동 생성
- 결과 3탭 (글 미리보기·SEO 정보·이미지 가이드) + 전체 복사
- Claude API 연동 SEO 최적화 프롬프트 + fallback 지원

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 00:59:00 +09:00
e27d13b6ec feat: 질문지 제출 기능 + 관리자 응답 관리 + iframe 미리보기 수정
- 질문지 HTML에 제출/임시저장 JavaScript 추가 (localStorage 임시저장, API 제출)
- questionnaire_responses 테이블 마이그레이션 (005)
- /api/questionnaire/submit POST 엔드포인트
- 관리자 질문지 응답 목록/상세/상태변경 페이지 및 API
- 관리자 문서 미리보기를 fetch+srcdoc 방식으로 변경 (X-Frame-Options 우회)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-03 00:44:27 +09:00
7003e8d27e feat: 이베이 부품 AI 리스팅 툴 — 실제 크롤링·AI·가격 모듈 구현
[핵심 모듈 (lib/ebay-tools/)]
- types.ts: 검색 요청/결과/크롤링/가격 공통 타입 정의
- crawler.ts: RockAuto HTTP 크롤러 + eBay 검색 (cheerio, UA 로테이션)
- ai-analyzer.ts: Claude API Tool Use로 크롤링 결과 구조화 (lazy 클라이언트, 런타임 검증)
- pricing.ts: 환율 API 연동 + HS Code 관세 + VAT + 소액면세 계산

[검색 API]
- Mock 데이터 → 실제 크롤링+AI+가격 파이프라인으로 교체
- AI 실패 시 fallback 결과 생성
- 입력값 50자 제한 + 허용 문자 검증

[프론트엔드]
- 중복 타입 제거 → lib/ebay-tools/types import
- 가격 탭에 VAT, 총 수입비용, 면세 여부, 면책 문구 추가

[DB]
- 004_ebay_search_history.sql: 검색 이력 테이블 + RLS (anon 전체 권한 제거)

[Evaluator 반영]
- anon RLS 보안 취약점 수정
- AI 응답 런타임 필드 검증 추가
- Anthropic 클라이언트 lazy 초기화

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-02 14:04:22 +09:00
244781f96a feat: 이베이 부품 AI 리스팅 툴 — 기획·설계·견적서·MVP 스캐폴딩
[기획/설계 문서]
- CONTENT/ARCHITECTURE_EBAY_PARTS_TOOL.md: 3-tier 아키텍처 설계서
- CONTENT/ebay-tool-proposal.html: 공식 제안서 (3단 패키지 120/198/330만원)
- CONTENT/ebay-tool-questionnaire.html: 사전 요구사항 질문지 (17항목)

[관리자 문서 뷰어]
- admin/documents/page.tsx: 프로젝트 문서 카드 목록 + iframe 미리보기
- api/admin/documents/[filename]: 인증 기반 HTML 문서 서빙 API
- AdminSidebar: "프로젝트 문서" 메뉴 추가

[MVP 스캐폴딩]
- tools/ebay-parts/page.tsx: 품번 입력 → 5탭 결과 UI (Mock 데이터)
- api/tools/ebay-parts/search: POST 검색 API (Mock 반환)
- Sidebar: "이베이 부품 검색" 메뉴 추가

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-02 13:49:06 +09:00
fe1e8ffcf0 fix: 외주 플랫폼 전환율 개선 + API 보안 정비 + 시크릿 노출 제거
[Backend API]
- contact/route: 문의 내역 contact_requests DB 저장 추가 (이메일+DB 병행)
- projects/route, link/route: 미사용 Bearer 토큰 인증 제거, Cookie 전용
- projects/route: DB 에러 메시지 클라이언트 노출 차단 (console.error로 전환)
- quote/[token]/route: valid_until 만료 검증 + expired 플래그 응답 추가

[Frontend UX]
- mypage: 로또 잔존 코드 완전 제거 (PLAN_LABELS, lotto_history 쿼리)
- mypage: 기본 탭 projects로 변경, 탭 순서 외주 고객 우선 재배치
- freelance: 포트폴리오 가격대 뱃지 추가, 각 항목 CTA 링크 추가
- freelance: 후기 섹션 하단 CTA 블록 추가

[견적서 페이지]
- quote/[token]/page: 만료 견적서 경고 배너 + 수락 버튼 숨김
- quote/layout: DashboardShell 없이 독립 렌더링

[보안]
- test-flow.mjs: 하드코딩 시크릿 → .env.test 환경변수 참조로 교체
- GitGuardian 3건 대응 (admin password, JWT, test password)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-02 08:49:05 +09:00
2c9af41631 feat: 프로젝트 API Bearer 토큰 인증 + E2E 테스트 스크립트 + 크몽 마케팅 이미지
- app/api/projects, link/route: Cookie + Bearer 토큰 이중 인증 지원 (E2E 테스트 대응)
- app/mypage: 로또 기록 탭 제거, 구독 빈 상태 프롬프트 서비스로 변경
- scripts/test-flow.mjs: 견적서 발송→연결→마일스톤 진행 E2E 테스트 스크립트
- supabase/migrations/003: quotes RLS 비활성화 (관리자 서버 전용 접근)
- marketing/kmong-images: 크몽 서비스 A 상세 이미지 5장 (HTML 스크린샷용)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-02 04:15:47 +09:00
19b09e3b90 feat: 프로젝트 진행 현황 추적 시스템 구축 + 마케팅 카피 강화
[DB]
- supabase/migrations/002_project_milestones.sql 추가
  quotes.user_id 컬럼 + project_milestones 테이블 생성 SQL

[API]
- GET  /api/projects            — 로그인 사용자의 프로젝트+마일스톤 조회
- POST /api/projects/link       — 견적서 토큰으로 계정에 프로젝트 연결
- GET/POST /api/admin/milestones — 관리자 마일스톤 목록/기본 7단계 초기화
- PATCH/DELETE /api/admin/milestones/[id] — 관리자 단계별 상태·메모 업데이트

[UI — 마이페이지]
- '프로젝트 현황' 탭 신규 추가 (Tab type 확장)
- 진행률 바, 단계별 타임라인, 개발자 메모 표시
- 견적서 코드 입력 → 계정 연결 폼

[UI — 관리자 견적서 편집]
- '진행 단계' 탭 추가: 기본 7단계 초기화, 단계별 status/메모 편집

[마케팅 카피]
- page.tsx PROMISES 4번째 추가: "진행 현황 마이페이지 실시간 확인"
- freelance 보증 카드 5번째 추가: 실시간 진행 현황 (그리드 2×5)
- services/website trust badge 5번째 추가

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-02 02:49:40 +09:00
9af12d94c0 feat: 관리자 패널 방문자 분석 페이지 추가 (GA4 Data API 연동)
- /admin/analytics 페이지 신규 추가
  - 일별 방문자 추이 바 차트 (7일/30일/90일 전환)
  - 오늘/이번주/기간별 요약 카드
  - 유입 경로 (채널별 비율 바)
  - 기기 유형 분포 (PC/모바일/태블릿)
  - 상위 페이지 조회수
- GET /api/admin/analytics 라우트 신규 추가 (@google-analytics/data)
- 사이드바에 방문자 분석 메뉴 추가
- 카페24 리뉴얼 견적 비교 SVG 에셋 추가 (public/marketing/quote-cafe24.svg)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-31 02:10:06 +09:00
df22691d50 feat: 보안 강화 + 자동화 도구 3종 추가 (웹 크롤러·PPT·엑셀)
- lib/security.ts: escapeHtml, isValidEmail, sanitizeStr, checkRateLimit 유틸 추가
- next.config.ts: 보안 헤더 적용 (X-Frame-Options, HSTS, Permissions-Policy 등)
- api/contact: XSS 방어, Rate Limit(5/min), 입력 길이 제한
- api/payment/confirm: 사용자 인증·소유권 검증, 타입 체크, 에러 메시지 정제
- api/admin/quotes: PUT 허용 필드 화이트리스트 적용
- api/saju/analyze: 로그인·결제 검증, 입력 크기 제한, gender 값 검증
- public/downloads/web_scraper_v1.0.py: requests+BS4+openpyxl 웹 크롤러
- public/downloads/ppt_automation_v1.0.py: python-pptx+openpyxl PPT 자동화
- app/services/automation/tools/scraper: 크롤러 상세 페이지 추가
- app/services/automation/tools/ppt: PPT 도구 상세 페이지 추가
- app/services/automation/page.tsx: scraper ready=true, email→PPT 교체

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-23 07:25:46 +09:00
de941442ae fix: dev/prod 환경 분리 — Google OAuth 리다이렉트 + TossPayments 키 구분
[Google OAuth]
- login/page.tsx: NODE_ENV=development일 때 NEXT_PUBLIC_SITE_URL 무시하고
  window.location.origin(localhost) 사용
- auth/callback/route.ts: dev에서는 항상 request origin 사용하도록 수정
  (이전: siteUrl이 없을 때만 origin 사용 → dev이면 무조건 origin)

[TossPayments]
- confirm/route.ts: 실수로 dev에서 live 키 사용 시 console.warn 추가
- PaymentButton.tsx: NEXT_PUBLIC_TOSS_CLIENT_KEY가 test_ck_* 이면
  버튼 우상단에 TEST 배지 표시 (dev 확인용)

[환경변수 구조]
- dev  (.env.local): test_ck_*, test_sk_* → 테스트 결제 (실청구 없음)
- prod (Vercel ENV): live_ck_*, live_sk_* → 실결제
- 코드 변경 없이 같은 변수명으로 환경별 키만 다르게 설정

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-22 17:33:43 +09:00
3f53594d3f feat: 견적서 자동화, 마케팅 에셋, 전체 카피 강화
- 관리자 견적서 CRUD (WBS/항목/향후관리/특이사항 5탭 편집기)
- 고객용 공개 견적서 페이지 (optional 항목 선택 + 실시간 총액 + 수락)
- 마케팅 SVG 에셋 6종 (썸네일 5개 + 배너 1개) + 관리자 에셋 페이지
- 전체 카피 강화: 크레덴셜 제거 → URL증거/환불보장/계약서/납기패널티 중심

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-21 10:48:28 +09:00