fix: 카카오 로그인 콜백 URL 수정 프로덕션 배포 - #116
Merged
Merged
Conversation
* chore: initialize project folder structure - Add base directory layout for Next.js + domain-driven architecture - Add .gitkeep to track empty directories in git - Exclude MVP out-of-scope domains (shop, points, user-items) - No implementation files included, structure only Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * Update README.md --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add project overview and MVP scope definition - Add fixed product rules (categories, AI chat policy, judgement output) - Add architecture, domain scope, and state transition rules - Add auth/security, DB, frontend state, API, logging rules - Add Git workflow, Claude work process, STOP conditions - Add approval-required list and required reference documents Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add package.json with Next.js 15, React 19, TypeScript stack - Add next.config.ts (minimal Next.js 15 config) - Add tsconfig.json (strict mode, @/* path alias) - Add eslint.config.mjs (next/core-web-vitals + next/typescript) - Add .prettierrc and .prettierignore - Add .gitignore (node_modules, .next, .env.local, etc.) - Add .env.example (key names only, no real values) - Add prisma/schema.prisma (generator + datasource only) - Add data/mock/db.json (health check stub for json-server) - Add docs/TECH_STACK.md (package list and selection rationale) - Update README.md with run commands and env guide Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add PROJECT_DECISIONS.md (MVP scope, architecture, security principles) - Add guides/CLAUDE_WORKFLOW.md (work process, STOP conditions, approval rules) - Add guides/GIT_WORKFLOW.md (branch naming, commit convention, workflow) - Add guides/PR_RULES.md (PR target, title rules, review criteria) - Add guides/ENV_GUIDE.md (Vercel env pull, .env.example management) - Add guides/CODING_CONVENTION.md (naming, state management, folder rules) - Add db/STATUS_TRANSITION.md (room_mode, dispute_status transitions) - Add db/PRISMA_MAPPING.md (snake_case/camelCase mapping rules) - Add db/MASTER_DATA.md (categories, result types, DB master principles) - Add domains/README.md (domain list, MVP scope, writing guidelines) - Add domains/_DOMAIN_TEMPLATE.md (template for domain docs) Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add AUTH.md (kakao login, terms, session management) - Add COMMON.md (error handling, logging, common response) - Add ROOM.md (AI chat room, invite link, room_mode transitions) - Add PERSONAL_ANALYSIS.md (AI-based personal conflict analysis) - Add DISPUTE.md (1:1 mediation, roles, statements, dispute_status) - Add JUDGEMENT.md (AI judgement, Gemini API, result card) - Add GIFT.md (gift recommendation after judgement) - Add USER.md (mypage, profile, bottom tab) - Add CALENDAR.md (date-based record marking, monthly summary) - Add DIARY.md (emotion diary, author-only access, content protection) - Add STATISTICS.md (anonymous aggregation, summary components) - Add SHOP_FUTURE.md (v2.0 planned, MVP excluded) - Add POINTS_FUTURE.md (v2.0 planned, MVP excluded) - Add USER_ITEMS_FUTURE.md (v2.0 planned, MVP excluded) All documents are draft templates with TODO markers for assignees. No implementation, no API routes, no schema changes. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add src/app/layout.tsx (root layout with metadata and globals.scss import) - Add src/app/page.tsx (minimal root page for build verification) - Add src/app/globals.scss (imports src/styles/main.scss) - Add src/app/error.tsx (minimal error boundary with reset) - Add src/app/not-found.tsx (minimal 404 page) - Add src/app/loading.tsx (minimal loading page) - Add src/styles/main.scss (ordered SCSS entry point) - Add src/styles/abstracts/_variables.scss (color, typography, spacing tokens) - Add src/styles/abstracts/_mixins.scss (flex-center, respond-to breakpoints) - Add src/styles/base/_reset.scss (box-sizing, margin, button, img reset) - Add src/styles/base/_global.scss (body font, background, color defaults) - Add src/styles/layout/_page.scss (placeholder for page layout) Verified: type-check, lint, build all pass Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* infra: add Next.js App Router entry files and SCSS base structure - Add src/app/layout.tsx (root layout with metadata and globals.scss import) - Add src/app/page.tsx (minimal root page for build verification) - Add src/app/globals.scss (imports src/styles/main.scss) - Add src/app/error.tsx (minimal error boundary with reset) - Add src/app/not-found.tsx (minimal 404 page) - Add src/app/loading.tsx (minimal loading page) - Add src/styles/main.scss (ordered SCSS entry point) - Add src/styles/abstracts/_variables.scss (color, typography, spacing tokens) - Add src/styles/abstracts/_mixins.scss (flex-center, respond-to breakpoints) - Add src/styles/base/_reset.scss (box-sizing, margin, button, img reset) - Add src/styles/base/_global.scss (body font, background, color defaults) - Add src/styles/layout/_page.scss (placeholder for page layout) Verified: type-check, lint, build all pass Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: resolve ESLint and TypeScript config warnings - eslint.config.mjs: ignore next-env.d.ts and .next/** (auto-generated by Next.js, triple-slash reference false positive) - tsconfig.json: remove deprecated baseUrl option (TypeScript 5.x+, paths works without baseUrl) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
달력 UI 라이브러리로 MUI X Date Pickers + Day.js 사용을 확정하고 관련 문서(TECH_STACK, PROJECT_DECISIONS, CODING_CONVENTION, CALENDAR, DIARY, CLAUDE.md)에 반영한다.
달력 UI 구현을 위해 MUI X Date Pickers 및 필수 peer dependency를 설치한다. @mui/material@9.1.1, @emotion/react@11.14.0, @emotion/styled@11.14.1, @mui/x-date-pickers@9.5.0, dayjs@1.11.21
* infra: add Next.js App Router entry files and SCSS base structure - Add src/app/layout.tsx (root layout with metadata and globals.scss import) - Add src/app/page.tsx (minimal root page for build verification) - Add src/app/globals.scss (imports src/styles/main.scss) - Add src/app/error.tsx (minimal error boundary with reset) - Add src/app/not-found.tsx (minimal 404 page) - Add src/app/loading.tsx (minimal loading page) - Add src/styles/main.scss (ordered SCSS entry point) - Add src/styles/abstracts/_variables.scss (color, typography, spacing tokens) - Add src/styles/abstracts/_mixins.scss (flex-center, respond-to breakpoints) - Add src/styles/base/_reset.scss (box-sizing, margin, button, img reset) - Add src/styles/base/_global.scss (body font, background, color defaults) - Add src/styles/layout/_page.scss (placeholder for page layout) Verified: type-check, lint, build all pass Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: resolve ESLint and TypeScript config warnings - eslint.config.mjs: ignore next-env.d.ts and .next/** (auto-generated by Next.js, triple-slash reference false positive) - tsconfig.json: remove deprecated baseUrl option (TypeScript 5.x+, paths works without baseUrl) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- datasource: add directUrl for Supabase connection pooler support - enums: CategoryGroup, RoomMode, DisputeStatus, ParticipantRole, etc. - NextAuth models: User (with TALKY-OWL fields), Account, Session, VerificationToken - core models: DisputeRoom, RoomAiConversation, RoomAiMessage - dispute models: Dispute, DisputeParticipant, DisputeStatement - judgment models: AiJudgment, JudgmentResultCard - gift models: GiftRecommendation, GiftRecommendationItem - feature models: EmotionDiary, CalendarRecord - master data: ConflictTypeGroup, ConflictTypeDetail (DB-based, no enum hardcoding) - log models: AuditLog, ApiErrorLog, ModerationLog, RoomAccessLog, UserDeletionLog - .env.example: add DIRECT_URL for Supabase directUrl - v2.0 TODO: ShopItem, PointTransaction, UserItem, DisputeStatistic excluded Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
folders added:
- src/components/{personal-analysis,room,dispute,judgement,calendar,diary,statistics,gift}
- src/app/api/auth/[...nextauth]
- src/app/api/v1/{users,personal-analyses,rooms,disputes,statements,calendar,diary,statistics,cron}
files added:
- prisma/seed.ts (placeholder for ConflictTypeGroup master data)
docs updated (minimal):
- docs/domains/COMMON.md: add log table list, judgement_logs TODO note
- docs/domains/JUDGEMENT.md: clarify Storage is MVP-excluded scaffolding
- docs/guides/ENV_GUIDE.md: clarify Supabase Storage vars are MVP-excluded
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
…e group (#23) src/app/page/ (괄호 없음)는 /page/* URL segment를 생성하므로, Next.js App Router route group 문법인 src/app/(page)/로 변경한다. URL은 /landing, /home 등으로 노출되어야 하며 /page/... 가 아니다. 관련 문서 내 경로 참조도 모두 업데이트 (CLAUDE.md, docs/domains/*, docs/guides/*). Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(styles): 디자인 토큰 및 전역 스타일 설정 - _variables.scss에 글로벌 컬러 팔레트, 타이포그래피 변수, 시맨틱 CSS 커스텀 프로퍼티(:root) 추가 - _mixins.scss에 타이포그래피 mixin 추가 (text-display ~ text-value-m) - _global.scss body 폰트 Pretendard 적용 - next/font/local로 PretendardVariable 폰트 로드 (layout.tsx) - GIT_WORKFLOW.md 커밋 메시지 예시 한글로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 커밋 타입 style 추가 및 scope 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 컨테이너 max-width 1000px 설정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 루트 레이아웃 container 적용 및 개발 확인용 임시 border 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 개발 확인용 임시 border 색상 회색으로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: container min-height 100vh 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 커밋 타입 style 추가 및 scope 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(styles): 디자인 토큰 및 전역 스타일 설정 - _variables.scss에 글로벌 컬러 팔레트, 타이포그래피 변수, 시맨틱 CSS 커스텀 프로퍼티(:root) 추가 - _mixins.scss에 타이포그래피 mixin 추가 (text-display ~ text-value-m) - _global.scss body 폰트 Pretendard 적용 - next/font/local로 PretendardVariable 폰트 로드 (layout.tsx) - GIT_WORKFLOW.md 커밋 메시지 예시 한글로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 커밋 타입 style 추가 및 scope 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 컨테이너 max-width 1000px 설정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 루트 레이아웃 container 적용 및 개발 확인용 임시 border 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 개발 확인용 임시 border 색상 회색으로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: container min-height 100vh 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 커밋 타입 style 추가 및 scope 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: rem 스케일 토큰 추가 및 타이포그래피 변수 rem 참조로 전환 - Rem scale 섹션 추가 (0.25rem ~ 30rem) - 폰트 토큰에서 누락된 0.875rem(14px), 1.125rem(18px) 추가 - font-size, line-height 변수를 rem 스케일 변수 참조로 전환 - rem 스케일을 typography 섹션보다 상단으로 이동 (선언 순서) - 컴포넌트 width/height 대응을 위해 큰 단위(9rem~30rem) 포함 Co-Authored-By: Claude <noreply@anthropic.com> * style: r() 함수 분리 및 타이포그래피 변수 함수 기반으로 전환 - _functions.scss 신규 추가 — px → rem 변환 함수 r() 단독 관리 - _variables.scss에서 rem 스케일 변수 제거, fn.r() 참조로 전환 - _mixins.scss에 functions @use 추가 - 순환 참조 없이 variables → functions → (없음) 단방향 의존성 구성 Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(common): add Button, Toast, Header, BottomNavigation components - Button: primary / outline / disabled variants, design token 기반 - Toast: Zustand store 연동, 상단 고정, 시맨틱 컬러 토큰 적용 - Header: 뒤로가기 + title + subtitle 구조, 조건부 title centering - BottomNavigation: 4탭(홈/사건기록/일기/마이페이지), lucide-react 아이콘 - toastStore: Zustand UI 상태 (show/hide/message) * docs: update collaboration policy - GitHub Ruleset 브랜치 규칙 추가 (브랜치 Pattern 2, PR 제목 Pattern 1 분리) - Issues / Milestones / Project Board 미사용으로 관련 내용 제거 - GIT_WORKFLOW 작업 흐름에서 Issue 생성/자동종료 단계 제거 - PR_RULES PR 본문에서 관련 Issue 항목 제거
* feat(styles): 디자인 토큰 및 전역 스타일 설정 - _variables.scss에 글로벌 컬러 팔레트, 타이포그래피 변수, 시맨틱 CSS 커스텀 프로퍼티(:root) 추가 - _mixins.scss에 타이포그래피 mixin 추가 (text-display ~ text-value-m) - _global.scss body 폰트 Pretendard 적용 - next/font/local로 PretendardVariable 폰트 로드 (layout.tsx) - GIT_WORKFLOW.md 커밋 메시지 예시 한글로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 커밋 타입 style 추가 및 scope 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 컨테이너 max-width 1000px 설정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 루트 레이아웃 container 적용 및 개발 확인용 임시 border 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: 개발 확인용 임시 border 색상 회색으로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: container min-height 100vh 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: 커밋 타입 style 추가 및 scope 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * style: rem 스케일 토큰 추가 및 타이포그래피 변수 rem 참조로 전환 - Rem scale 섹션 추가 (0.25rem ~ 30rem) - 폰트 토큰에서 누락된 0.875rem(14px), 1.125rem(18px) 추가 - font-size, line-height 변수를 rem 스케일 변수 참조로 전환 - rem 스케일을 typography 섹션보다 상단으로 이동 (선언 순서) - 컴포넌트 width/height 대응을 위해 큰 단위(9rem~30rem) 포함 Co-Authored-By: Claude <noreply@anthropic.com> * style: r() 함수 분리 및 타이포그래피 변수 함수 기반으로 전환 - _functions.scss 신규 추가 — px → rem 변환 함수 r() 단독 관리 - _variables.scss에서 rem 스케일 변수 제거, fn.r() 참조로 전환 - _mixins.scss에 functions @use 추가 - 순환 참조 없이 variables → functions → (없음) 단방향 의존성 구성 Co-Authored-By: Claude <noreply@anthropic.com> * fix: :root {} 시맨틱 토큰을 _global.scss로 분리 _variables.scss에 :root {}가 있으면 module.scss에서 @use 시 CSS Modules 'not pure' 에러 발생. SCSS 변수는 _variables.scss, CSS 출력은 _global.scss로 분리. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(common): add Button, Toast, Header, BottomNavigation components - Button: primary / outline / disabled variants, design token 기반 - Toast: Zustand store 연동, 상단 고정, 시맨틱 컬러 토큰 적용 - Header: 뒤로가기 + title + subtitle 구조, 조건부 title centering - BottomNavigation: 4탭(홈/사건기록/일기/마이페이지), lucide-react 아이콘 - toastStore: Zustand UI 상태 (show/hide/message) * docs: update collaboration policy - GitHub Ruleset 브랜치 규칙 추가 (브랜치 Pattern 2, PR 제목 Pattern 1 분리) - Issues / Milestones / Project Board 미사용으로 관련 내용 제거 - GIT_WORKFLOW 작업 흐름에서 Issue 생성/자동종료 단계 제거 - PR_RULES PR 본문에서 관련 Issue 항목 제거 * feat(common): add Tabs, CaseCard, ActionPrompt, Input, Select, Textarea components Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(common): apply MUI icons and Snackbar, update MUI usage policy - Toast: MUI Snackbar (3s auto-dismiss) - BottomNavigation, Header, Select: lucide-react → @mui/icons-material - Install @mui/icons-material - CLAUDE.md, CODING_CONVENTION.md: MUI usage policy updated Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: update icon policy — @mui/icons-material except diary feature Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 사건조회 페이지 판결,유형 tab 공통 컴포넌트 생성 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 사건 관련 페이지의 진행 상태 컴포넌트 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: StatusBadge CSS 변수 하드코딩 제거 및 Tab className trailing space 수정 --------- Co-authored-by: jungmin park <jungxmin21@gmail.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(common): add Button, Toast, Header, BottomNavigation components - Button: primary / outline / disabled variants, design token 기반 - Toast: Zustand store 연동, 상단 고정, 시맨틱 컬러 토큰 적용 - Header: 뒤로가기 + title + subtitle 구조, 조건부 title centering - BottomNavigation: 4탭(홈/사건기록/일기/마이페이지), lucide-react 아이콘 - toastStore: Zustand UI 상태 (show/hide/message) * docs: update collaboration policy - GitHub Ruleset 브랜치 규칙 추가 (브랜치 Pattern 2, PR 제목 Pattern 1 분리) - Issues / Milestones / Project Board 미사용으로 관련 내용 제거 - GIT_WORKFLOW 작업 흐름에서 Issue 생성/자동종료 단계 제거 - PR_RULES PR 본문에서 관련 Issue 항목 제거 * feat(common): add Tabs, CaseCard, ActionPrompt, Input, Select, Textarea components Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(common): apply MUI icons and Snackbar, update MUI usage policy - Toast: MUI Snackbar (3s auto-dismiss) - BottomNavigation, Header, Select: lucide-react → @mui/icons-material - Install @mui/icons-material - CLAUDE.md, CODING_CONVENTION.md: MUI usage policy updated Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * docs: update icon policy — @mui/icons-material except diary feature Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(common): ActionPrompt message 제거 및 Textarea 글자수 카운터 absolute 배치 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- ApiResponse, ApiError, ApiFieldError, CategoryGroup (common.ts) - DisputeDto, CreateDisputeRequest, DisputeListResponse 등 (dispute.ts) - AiJudgmentDto, CreateAiJudgmentRequest 등 (judgment.ts) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- VALID_CATEGORY_GROUPS, IMMUTABLE_DISPUTE_STATUSES 상수 (constants/dispute.ts) - getSessionUserId NextAuth 세션 헬퍼 (auth/session.ts) - toAiJudgmentDto 공유 mapper (judgement/judgment.mapper.ts) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- GET /api/v1/disputes — 참여 사건 목록, categoryGroup 필터, 페이지네이션 - POST /api/v1/disputes — 사건 생성 + role_a 참여자 트랜잭션 등록 - GET /api/v1/disputes/:id — 사건 상세 조회 - PATCH /api/v1/disputes/:id — 사건 수정 (role_a 전용, 변경 불가 상태 차단) - DELETE /api/v1/disputes/:id — 사건 소프트 삭제 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- POST /api/v1/disputes/:id/judge — AI 판결 요청, JUDGING 상태 잠금으로 멱등성 보장 - GET /api/v1/disputes/:id/result — 판결 결과 조회 (참여자 전용) - AI 모듈 미구현 구간은 TODO 주석으로 마킹, 완료 전까지 503 반환 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 사건조회 페이지 판결,유형 tab 공통 컴포넌트 생성 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 사건 관련 페이지의 진행 상태 컴포넌트 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: StatusBadge CSS 변수 하드코딩 제거 및 Tab className trailing space 수정 * fix: StatusBadge 크기 조정 및 .playwright-mcp gitignore 추가 - StatusBadge min-width, height, padding, border-radius 수정 - justify-content: center 추가 - .playwright-mcp/ gitignore 등록 - package-lock.json peer dependency 재분류 반영 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: jungmin park <jungxmin21@gmail.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
/api/users/me(복수)와 /api/user/me(단수)가 동일한 역할로 중복 존재하던 문제를 해결한다. 기능이 완성된 /api/user/me(단수)를 유지하고, 최소 구현만 남아있던 /api/users/me(복수)를 삭제한다. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat(mypage): 회원탈퇴 전 약관 안내 페이지 추가 마이페이지에서 회원탈퇴 클릭 시 바로 모달이 뜨던 방식을 개선하여, 말해부엉 서비스 기준 탈퇴 안내 조항(5개 조, 약 5000자)을 담은 전용 페이지로 먼저 이동하고, 하단 '탈퇴하기' 버튼으로 최종 확인하는 흐름으로 변경. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(user): 회원탈퇴 DELETE 엔드포인트 및 탈퇴 계정 로그인 차단 추가 - DELETE /api/user/me: 소프트 딜리트(deletedAt, deletionRequestedAt 설정) 처리 및 AuditLog(USER_DELETED) 기록, 이미 탈퇴된 계정 재요청 시 409 반환 - signIn 콜백에서 deletedAt이 설정된 계정의 카카오 로그인을 차단(return false) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(mypage): CodeRabbit 리뷰 반영 — SCSS lint 3건 수정 및 탈퇴 중복 요청 방지 - page.module.scss: @include 뒤 빈 줄 추가(declaration-empty-line-before) 2건 - page.module.scss: word-wrap → overflow-wrap (property-no-deprecated) 1건 - page.tsx: handleWithdraw 재진입 가드(if loading return) 추가 - page.tsx: setConfirmOpen(false)를 API 호출 전으로 이동 - page.tsx: setLoading(false)를 finally 블록으로 통합 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(mypage): 프로필 이미지 미표시, 이름 기본값, MBTI 미설정 문구 수정 - mypage: Avatar에 profileImageUrl 전달하여 프로필 이미지 표시 - mypage/edit: 이름 필드 초기값을 user.name 우선으로 적용 (카카오 이름 기준) - mypage: MBTI 미설정 시 'MBTI를 설정해주세요' 안내 문구 표시 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(api): GET 핸들러 없는 라우트 빌드 에러 수정 동적 세그먼트 없이 GET 핸들러도 없는 API 라우트에서 Next.js 빌드 시 정적 생성 시도로 인한 'Failed to collect page data' 에러 방지를 위해 force-dynamic 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 판결 결과 컴포넌트 및 도메인 로직 초기 작업 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 판결 결과 페이지 구현 (#판결탭/유형탭/UI) - DisputePage: 판결/유형 서브탭(Tab 공통컴포넌트) 추가 - JudgmentResult: 이미지 기준 UI 재구성, nickname 적용 - JudgmentTypeResult: 유형탭 컴포넌트 신규 생성 (카드이미지, ActionPrompt) - Tab.module.scss: w60 h36 사이즈 조정 - DisputeParticipantDto: nickname 필드 추가 - disputes/[id]/route: nickname 조회 추가 - judgment.mapper: cardImageUrl 추가 - types/judgment: ConflictTypeDetailDto에 cardImageUrl 추가 - auth/index: 카카오 로그인 시 profileImageUrl 저장 - page.module.scss: diaryBox max-width 제거 - NewCaseButton: AbortController timeout 30s Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: next.config에 Supabase Storage 및 카카오 이미지 도메인 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: JudgmentResult Avatar img 태그를 next/image로 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #90 리뷰 반영 - participants nickname → name으로 변경 (DTO, route, 컴포넌트, useActiveCases) - next.config: 카카오 HTTP 패턴 제거 (HTTPS만 허용) - DisputePage: isCompleted null 케이스 처리 (!!dispute) - JudgmentResult.module.scss: declaration-empty-line-before stylelint 수정 - JudgmentTypeResult.module.scss: 동일 stylelint 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #90 추가 리뷰 반영 - JudgmentResult/JudgmentTypeResult: props 대신 disputeId 기반 직접 API 호출 (새로고침 시 데이터 유실 방지, TanStack Query 캐시로 중복 요청 없음) - DisputePage: judgment/participants props 제거, isError 기반 에러 처리 - auth/index.ts: 프로필 이미지 백필 try-catch 감싸기 (실패 시 로그인 차단 방지) - judgement.api.ts: 에러 메시지 사용자 친화적으로 개선 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: 불필요한 스크린샷 PNG 파일 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* ref(schema): ai_chat → ai_room 이름 변경 및 a_submitted 상태 추가 room_mode의 ai_chat을 ai_room으로 변경한다. AI 대화 기능이 없음에도 chat이라는 이름이 오해를 유발해 수정한다. dispute_status에 a_submitted를 추가한다. 단독/1:1 판결 흐름 모두 role_a 진술 제출 시 중간 상태를 명시적으로 표현한다. - 단독: draft → a_submitted → judging → judged - 1:1: ... → opponent_joined → a_submitted → both_submitted → judging → judged Co-Authored-By: Claude <noreply@anthropic.com> * fix(rooms): ai_room 상태 반영 및 초대 링크 재발급 허용 room_mode 변경(ai_chat → ai_room)에 따라 관련 API 코드를 일괄 수정한다. 초대 링크 발급 시 AI_ROOM과 INVITE_READY 모두 허용한다. 기존에는 AI_CHAT 상태에서만 발급 가능해 같은 버튼을 두 번 누르면 실패하는 문제가 있었다. 재발급 시 기존 링크는 무효화된다. 초대 링크 발급 시 dispute가 DRAFT 상태면 WAITING_OPPONENT로 업데이트한다. Co-Authored-By: Claude <noreply@anthropic.com> * fix(invite): 초대 링크 만료 기간 72시간 → 7일로 변경 카카오톡으로 링크를 전달한 뒤 상대방이 며칠 후 확인하는 케이스를 고려해 만료 기간을 7일로 늘린다. Co-Authored-By: Claude <noreply@anthropic.com> * fix(disputes): a_submitted 상태 기반 진술 제출 및 판결 로직 반영 role_a 진술 제출 시 dispute 상태를 WAITING_OPPONENT에서 A_SUBMITTED로 변경한다. role_b는 A_SUBMITTED 이후에만 진술 제출이 가능하도록 조건을 강화한다. 단독 판결 트리거 조건을 WAITING_OPPONENT에서 A_SUBMITTED로 변경한다. 진행중 사건 목록 필터에 A_SUBMITTED 상태를 추가한다. IMMUTABLE_DISPUTE_STATUSES에 A_SUBMITTED를 추가한다. Co-Authored-By: Claude <noreply@anthropic.com> * fix(disputes): 판결받기 버튼 활성화 조건 수정 진술 내용이 존재하면 단독 판결받기 버튼을 활성화한다. 기존에는 a_submitted 상태를 확인했으나 진술 작성 완료와 동시에 제출이 이루어지므로 content 존재 여부로 조건을 변경한다. StatusBadge에 a_submitted 상태를 추가한다. Co-Authored-By: Claude <noreply@anthropic.com> * docs: CLAUDE.md 상태 전이 및 서비스 흐름 업데이트 room_mode: ai_chat → ai_room 반영 dispute_status: a_submitted 추가 및 단독/1:1 흐름 분리 명시 서비스 흐름에서 AI 대화 단계 제거 (AI 대화 페이지 미구현) 방 정책 섹션 현행화 Co-Authored-By: Claude <noreply@anthropic.com> * ref(disputes): a_submitted 상태 제거 및 초대 트랜잭션 안전성 개선 waiting_opponent이 이미 'A 진술 제출 완료' 의미를 포함하므로 별도의 a_submitted 상태가 불필요하다고 판단해 제거. - schema, migration, types, constants에서 A_SUBMITTED 제거 - ROLE_A 진술 제출 후 상태: A_SUBMITTED → WAITING_OPPONENT 복원 - ROLE_B 제출 guard: OPPONENT_JOINED 기준으로 복원 (BOTH_SUBMITTED 허용으로 재시도 멱등성 보장) - 단독 판결 guard: WAITING_OPPONENT 기준으로 복원 - invite/route.ts: existingDispute 조회를 트랜잭션 내부로 이동 (TOCTOU 방지) - CLAUDE.md 상태 전이 업데이트 Co-Authored-By: Claude <noreply@anthropic.com> * ref(schema): 마이그레이션 두 단계 → 단일 파일로 통합 ai_chat → open → ai_room 두 단계 마이그레이션을 ai_chat → ai_room 단일 파일로 통합. Co-Authored-By: Claude <noreply@anthropic.com> --------- Co-authored-by: Claude <noreply@anthropic.com>
* refactor(ai): 메타 추출 모델 분리 및 프롬프트 출력 길이 축소 - extractDisputeMeta 전용 모델을 gemini-2.0-flash-lite로 분리 - moderation 모델도 gemini-2.0-flash-lite로 변경 - 제목 30자→20자, 요약 100자→50자로 축소 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(dispute): 사건종료 API 및 훅 구현 - PATCH /api/disputes/[id]/status 엔드포인트 추가 - closeDispute API 함수 및 useCloseDispute 훅 추가 - DisputePage 사건종료 버튼에 훅 연결 및 로딩/에러 처리 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(statement): 진술 제출 후 상태 업데이트 및 판결 요청 추가 - 진술 제출 시 dispute 상태를 waiting_opponent로 업데이트 - fire-and-forget 방식으로 judge API 호출 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor(home): AbortController를 AbortSignal.timeout으로 단순화 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(dispute): DisputePage 버튼 너비 및 푸터 보더 스타일 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(dispute): 자동 judge 호출 제거 및 스피너 조건 수정 - statement 제출 후 fire-and-forget judge 호출 제거 - 스피너를 DB status 기반이 아닌 isJudging (API 호출 중) 기준으로만 표시 - 판결 완료 후 query invalidation으로 자동 UI 전환 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(dispute): 새로고침 버튼에 dispute 재조회 연결 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(statement): 진술 저장 중 스피너 표시 및 meta 추출 완료 후 이동 - extractDisputeMeta fire-and-forget → await으로 변경 (title/summary 추출 완료 후 응답) - 저장 중 fullscreen 스피너 화면 추가 - 중복 PATCH /status 호출 제거 (statements route에서 이미 처리) - next/image 적용 및 카카오 이미지 도메인 허용 (next.config.ts) - avatarFallback → 기본 이미지(thumbnail-default.png) 폴백 - categoryChip inline background-color 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 코드리뷰 반영 - StatementPage: savingContent 폭 반응형 처리 (min(100%, 362px)) - statements/route: extractDisputeMeta에 10초 타임아웃 추가 - status/route: 동일 상태 재요청 시 멱등 성공 반환 - judgment.ts: Array.from 기반 유니코드 안전 문자열 절단 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
탈퇴 처리 시 accounts 레코드 삭제 및 kakao_id null 처리를 추가하여 탈퇴 후 동일 카카오 계정으로 재가입이 가능하도록 수정 Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* refactor(ai): 메타 추출 모델 분리 및 프롬프트 출력 길이 축소 - extractDisputeMeta 전용 모델을 gemini-2.0-flash-lite로 분리 - moderation 모델도 gemini-2.0-flash-lite로 변경 - 제목 30자→20자, 요약 100자→50자로 축소 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(dispute): 사건종료 API 및 훅 구현 - PATCH /api/disputes/[id]/status 엔드포인트 추가 - closeDispute API 함수 및 useCloseDispute 훅 추가 - DisputePage 사건종료 버튼에 훅 연결 및 로딩/에러 처리 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(statement): 진술 제출 후 상태 업데이트 및 판결 요청 추가 - 진술 제출 시 dispute 상태를 waiting_opponent로 업데이트 - fire-and-forget 방식으로 judge API 호출 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor(home): AbortController를 AbortSignal.timeout으로 단순화 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(dispute): DisputePage 버튼 너비 및 푸터 보더 스타일 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(dispute): 자동 judge 호출 제거 및 스피너 조건 수정 - statement 제출 후 fire-and-forget judge 호출 제거 - 스피너를 DB status 기반이 아닌 isJudging (API 호출 중) 기준으로만 표시 - 판결 완료 후 query invalidation으로 자동 UI 전환 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat(dispute): 새로고침 버튼에 dispute 재조회 연결 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(statement): 진술 저장 중 스피너 표시 및 meta 추출 완료 후 이동 - extractDisputeMeta fire-and-forget → await으로 변경 (title/summary 추출 완료 후 응답) - 저장 중 fullscreen 스피너 화면 추가 - 중복 PATCH /status 호출 제거 (statements route에서 이미 처리) - next/image 적용 및 카카오 이미지 도메인 허용 (next.config.ts) - avatarFallback → 기본 이미지(thumbnail-default.png) 폴백 - categoryChip inline background-color 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 코드리뷰 반영 - StatementPage: savingContent 폭 반응형 처리 (min(100%, 362px)) - statements/route: extractDisputeMeta에 10초 타임아웃 추가 - status/route: 동일 상태 재요청 시 멱등 성공 반환 - judgment.ts: Array.from 기반 유니코드 안전 문자열 절단 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(ai): gemini-2.0-flash-lite 미지원으로 gemini-2.5-flash로 모델 변경 * fix(api): rooms POST roomMode AI_ROOM 수정 및 에러 로깅 추가 * fix(statement): 진술 저장 성공 시 네비게이션 전까지 스피너 유지 * feat(disputes): AI 메타 추출 완료 전 폴링 스피너 및 에러 로깅 개선 * feat(layout): (page) 그룹 공통 BottomNavigation 레이아웃 적용, statement 제외 * chore(prisma): db pull 스키마 동기화 * fix(layout): 바텀 탭 숨김 경로 추가 (join, login, auth, terms, privacy) * fix(dispute): refetchInterval 콜백 타입 오류 수정 (UseQueryOptions 활용) * fix(dispute): a_submitted enum 제거, 폴링 종료 후 스피너 고정 버그 수정, 분석 중 메시지 순환 적용 * chore(prisma): db pull 스키마 동기화 * chore(prisma): dev 기준 스키마 복원 --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: 카카오 이미지 http 도메인 허용, 새로고침 버튼 로딩 스피너 추가 * fix(dispute): AI 메타 추출을 DB 저장 전에 실행하도록 순서 변경 * fix(dispute): AI 추출 실패 시 에러 반환 및 alert 처리, 화면 유지 * fix(dispute): 바텀탭 높이만큼 푸터 버튼 위치 조정 * fix(statement): 저장 중 AI 분석 풀스크린 제거, 버튼 비활성화로 대체 * fix(dispute): 초대 배너 클릭 시 페이지 이동 대신 handleInvite 호출로 변경 * fix(dispute): 판결 완료 콘텐츠 영역 하단 여백 추가 * fix(dispute): 판결 완료 후 페이지 새로고침으로 결과 화면 전환 * fix(ai): 갈등 유형 선택 시 양측 입장 종합 원칙 프롬프트에 명시 * feat(judgment): MBTI 기반 판결 분석 및 mbtiNote 추가 - JudgmentInput에 mbtiA, mbtiB 옵션 필드 추가 - SOLO/DUO 프롬프트에 MBTI 섹션 조건부 삽입 (있을 때만) - AI 응답 JSON에 mbtiNote 필드 요청 (없으면 null) - judge/route.ts에서 참여자 MBTI 조회 후 generateAiJudgment 전달 - mbtiNote를 rawResponse(JSON)에 저장 - AiJudgmentDto에 mbtiNote 노출, mapper에서 rawResponse 파싱 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(ai): META_PROMPT title 15자 제한, summary 서술형 톤으로 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(ai): 화해 멘트에 진술 말투(반말/존댓말) 반영 지시 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 리뷰 반영 - refresh 고착 방지, AI 추출 에러 코드 분리, 로그 정리 - handleRefresh: try/finally로 setIsRefreshing(false) 보장 - AI 추출 실패 코드 분리: TIMEOUT(504), PARSE_ERROR(502), FAILED(503) - console.error에서 err 원문 제거 - statement 페이지: AI 에러 코드 3종 alert 처리 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 판결 결과 컴포넌트 및 도메인 로직 초기 작업 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 판결 결과 페이지 구현 (#판결탭/유형탭/UI) - DisputePage: 판결/유형 서브탭(Tab 공통컴포넌트) 추가 - JudgmentResult: 이미지 기준 UI 재구성, nickname 적용 - JudgmentTypeResult: 유형탭 컴포넌트 신규 생성 (카드이미지, ActionPrompt) - Tab.module.scss: w60 h36 사이즈 조정 - DisputeParticipantDto: nickname 필드 추가 - disputes/[id]/route: nickname 조회 추가 - judgment.mapper: cardImageUrl 추가 - types/judgment: ConflictTypeDetailDto에 cardImageUrl 추가 - auth/index: 카카오 로그인 시 profileImageUrl 저장 - page.module.scss: diaryBox max-width 제거 - NewCaseButton: AbortController timeout 30s Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: next.config에 Supabase Storage 및 카카오 이미지 도메인 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: JudgmentResult Avatar img 태그를 next/image로 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #90 리뷰 반영 - participants nickname → name으로 변경 (DTO, route, 컴포넌트, useActiveCases) - next.config: 카카오 HTTP 패턴 제거 (HTTPS만 허용) - DisputePage: isCompleted null 케이스 처리 (!!dispute) - JudgmentResult.module.scss: declaration-empty-line-before stylelint 수정 - JudgmentTypeResult.module.scss: 동일 stylelint 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #90 추가 리뷰 반영 - JudgmentResult/JudgmentTypeResult: props 대신 disputeId 기반 직접 API 호출 (새로고침 시 데이터 유실 방지, TanStack Query 캐시로 중복 요청 없음) - DisputePage: judgment/participants props 제거, isError 기반 에러 처리 - auth/index.ts: 프로필 이미지 백필 try-catch 감싸기 (실패 시 로그인 차단 방지) - judgement.api.ts: 에러 메시지 사용자 친화적으로 개선 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: 불필요한 스크린샷 PNG 파일 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor: CalendarRecord 모델 제거 및 EmotionDiary title 필드 추가 - CalendarRecord 모델 및 CalendarRecordType enum 제거 - User, DisputeRoom, RoomAiConversation, Dispute에서 calendarRecords relation 제거 - EmotionDiary에 title 필드 추가 (VarChar 200) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 사건기록 페이지 API 연동 - GET /api/disputes에 completed=true 쿼리 파라미터 추가 (judged/closed 필터링) - fetchCompletedCases, useCompletedCases 추가 (카테고리 필터 + 최신순) - RecordListSection 더미 데이터 제거, 실제 API 연동 - 사건 박스 클릭 시 /disputes/{id}로 이동 (기존 Link 구조 유지) - 로딩/에러/빈 상태 처리 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 사건기록 빈 상태 UI 개선 - 빈 상태 텍스트 → '등록한 사건이 없어요' - character-case.png 이미지 + 텍스트 중앙 배치 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 사건박스 공통 컴포넌트 CaseRecordCard 분리 - CaseRecordCard 신규 생성 (src/components/ui) - MUI AvatarGroup으로 1인/2인 참여자 프로필 겹침 표시 - RecordListSection에서 CaseRecordCard 사용하도록 교체 - 카드 스타일 RecordListSection.module.scss → CaseRecordCard.module.scss로 이동 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 카카오 CDN http 프로토콜 이미지 허용 (img1.kakaocdn.net) 카카오 기본 프로필 이미지 URL이 http로 오는 경우가 있어 *.kakaocdn.net http 패턴 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 홈 페이지 배경 그라데이션 추가 (primary-200 → white) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 홈 그라데이션 범위 15%로 조정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: dispute.hooks.ts dev 브랜치 import 충돌 사전 해결 - UseQueryOptions, DisputeDto import 추가 (dev 브랜치 기준) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: dispute.hooks.ts dev 브랜치 useDispute refetchInterval 옵션 반영 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 코드레빗 및 juacheon 리뷰 반영 - disputes/route.ts: active/completed 동시 사용 시 if/else 분기로 필터 충돌 방지 - CaseRecordCard: <time> 요소에 dateTime 속성 추가 (접근성) - Header: transparent prop 추가, :global(header) 셀렉터 제거 - RecordListSection: 에러 메시지 구체화 - next.config.ts: 중복 HTTP 항목 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 달력 월별 조회 및 감정일기 날짜별 조회 API 구현 * refactor: diary , calendar 에러 응답처리
* chore: 이미지 에셋 png에서 svg 변경 및 favicon,ogimg 추가업로드 * chore: favicon, ogimg SVG 적용 및 메타데이터 업데이트 - favicon.png, ogimg.png를 SVG로 교체 - layout.tsx 메타데이터에 favicon, OG 이미지 경로 추가 - 앱 타이틀 말해부엉으로 업데이트 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: 기본썸네일 이미지 사이즈 변경후 재업로드 * chore: ogimg svg에서 png로 변경 --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: statement 페이지 footer position fixed 제거 및 padding 조정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor: Header/BottomNav를 (page) layout으로 분리, store 기반 헤더 관리 - headerStore(Zustand) 추가: 각 페이지에서 setHeader로 헤더 상태 설정 - SetHeader 클라이언트 컴포넌트 추가: 서버 컴포넌트 페이지에서 사용 - (page)/layout.tsx: Header + main + BottomNavigation 구조로 변경 - root layout: main → div.container로 변경 - 모든 (page) 경로 페이지에서 Header 직접 렌더링 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor: flex 기반 레이아웃으로 BottomNavigation position:fixed 제거 - (page)/layout.tsx: div.layout(flex column, 100dvh) 래퍼 추가 - (page)/layout.module.scss: layout/main flex 스타일 + 스크롤바 커스텀 - BottomNavigation: position:fixed 제거, flex-shrink:0으로 변경 - Header: flex-shrink:0 추가 - home page: app/page.tsx → app/(page)/page.tsx 이동, layout 통일 - _page.scss: main 블록 제거 (layout module로 이동) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: statementCard 클릭 시 진술 수정 페이지 이동 - DisputePage: 본인 진술 카드에 클릭 핸들러 추가 (/statement?edit=true) - DisputePage: .statementCardEditable 스타일 추가 (cursor pointer, hover border) - StatementPage: edit=true 쿼리파람 인식, 기존 진술 fetch 후 content 초기값 설정 - StatementPage: 수정 모드 시 헤더 '사건수정', 버튼 '수정저장'으로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 접근성 개선 및 SetHeader onBack prop 추가 - about/page.tsx: 중첩 <main> 제거, null 반환으로 변경 - disputes/[id]/page.tsx: 편집 가능한 statementCard에 role/tabIndex/onKeyDown 추가 - DisputePage.module.scss: statementCardEditable에 :focus 스타일 추가 - SetHeader.tsx: title 변형에 onBack prop 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: Select/Textarea focus 시 border-color 변경 방지 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: UI 간격 및 스타일 개선 - statement/page.tsx: userMe.mbti 자동선택 추가 - layout.module.scss: 스크롤바 숨김 처리 - login.module.scss: min-height 100svh 추가 - mypage/edit page.module.scss: footer bottom nav 높이만큼 조정 - page.module.scss: serviceInfoWrapper padding-bottom 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Remove left/right border lines that were added for development verification. These were marked as TODO for removal before deploy. Co-authored-by: Claude <noreply@anthropic.com>
* perf: API 응답 속도 개선 - useDispute: staleTime 30s 추가 — 페이지 이동 시 캐시 재사용 - useJudgment: staleTime 10m 추가 — 판결 결과 캐시 유지 - result route: DB 쿼리 3번 → 1번으로 통합 - runJudge: window.location.reload() → invalidateQueries 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 판결 결과 에러 시 모달 표시 및 즉시 에러 처리 * perf: getServerSession → getRequestUserId 교체로 API 인증 처리 경량화 * fix: 마이페이지 프로필 이미지 blob URL 누수 수정 - blobUrlRef로 이전 blob URL 추적 - 두 번째 이미지 선택 시 이전 URL revokeObjectURL 처리 - 컴포넌트 언마운트 시 마지막 URL 해제 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor: privacy·terms 페이지 Server Component 전환 - BackButton 공통 클라이언트 컴포넌트 분리 (router.back + MUI 아이콘) - privacy/page.tsx, terms/page.tsx에서 'use client' 제거 - 정적 콘텐츠를 서버에서 렌더링하여 초기 로딩 개선 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix(auth): 탈퇴 회원 카카오 재가입 허용 - signIn 콜백에서 deletedAt 존재 시 계정 복구 처리 - deletedAt, deletionRequestedAt null 초기화 - kakaoId 재연결 - auditLog에 USER_REACTIVATED 이벤트 기록 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(schema): AuditEventType에 USER_REACTIVATED 추가 - Vercel 빌드 타입 에러 해결 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* feat: 판결 결과 컴포넌트 및 도메인 로직 초기 작업 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 판결 결과 페이지 구현 (#판결탭/유형탭/UI) - DisputePage: 판결/유형 서브탭(Tab 공통컴포넌트) 추가 - JudgmentResult: 이미지 기준 UI 재구성, nickname 적용 - JudgmentTypeResult: 유형탭 컴포넌트 신규 생성 (카드이미지, ActionPrompt) - Tab.module.scss: w60 h36 사이즈 조정 - DisputeParticipantDto: nickname 필드 추가 - disputes/[id]/route: nickname 조회 추가 - judgment.mapper: cardImageUrl 추가 - types/judgment: ConflictTypeDetailDto에 cardImageUrl 추가 - auth/index: 카카오 로그인 시 profileImageUrl 저장 - page.module.scss: diaryBox max-width 제거 - NewCaseButton: AbortController timeout 30s Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: next.config에 Supabase Storage 및 카카오 이미지 도메인 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: JudgmentResult Avatar img 태그를 next/image로 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #90 리뷰 반영 - participants nickname → name으로 변경 (DTO, route, 컴포넌트, useActiveCases) - next.config: 카카오 HTTP 패턴 제거 (HTTPS만 허용) - DisputePage: isCompleted null 케이스 처리 (!!dispute) - JudgmentResult.module.scss: declaration-empty-line-before stylelint 수정 - JudgmentTypeResult.module.scss: 동일 stylelint 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #90 추가 리뷰 반영 - JudgmentResult/JudgmentTypeResult: props 대신 disputeId 기반 직접 API 호출 (새로고침 시 데이터 유실 방지, TanStack Query 캐시로 중복 요청 없음) - DisputePage: judgment/participants props 제거, isError 기반 에러 처리 - auth/index.ts: 프로필 이미지 백필 try-catch 감싸기 (실패 시 로그인 차단 방지) - judgement.api.ts: 에러 메시지 사용자 친화적으로 개선 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: 불필요한 스크린샷 PNG 파일 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor: CalendarRecord 모델 제거 및 EmotionDiary title 필드 추가 - CalendarRecord 모델 및 CalendarRecordType enum 제거 - User, DisputeRoom, RoomAiConversation, Dispute에서 calendarRecords relation 제거 - EmotionDiary에 title 필드 추가 (VarChar 200) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 사건기록 페이지 API 연동 - GET /api/disputes에 completed=true 쿼리 파라미터 추가 (judged/closed 필터링) - fetchCompletedCases, useCompletedCases 추가 (카테고리 필터 + 최신순) - RecordListSection 더미 데이터 제거, 실제 API 연동 - 사건 박스 클릭 시 /disputes/{id}로 이동 (기존 Link 구조 유지) - 로딩/에러/빈 상태 처리 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 사건기록 빈 상태 UI 개선 - 빈 상태 텍스트 → '등록한 사건이 없어요' - character-case.png 이미지 + 텍스트 중앙 배치 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 사건박스 공통 컴포넌트 CaseRecordCard 분리 - CaseRecordCard 신규 생성 (src/components/ui) - MUI AvatarGroup으로 1인/2인 참여자 프로필 겹침 표시 - RecordListSection에서 CaseRecordCard 사용하도록 교체 - 카드 스타일 RecordListSection.module.scss → CaseRecordCard.module.scss로 이동 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 카카오 CDN http 프로토콜 이미지 허용 (img1.kakaocdn.net) 카카오 기본 프로필 이미지 URL이 http로 오는 경우가 있어 *.kakaocdn.net http 패턴 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 홈 페이지 배경 그라데이션 추가 (primary-200 → white) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 홈 그라데이션 범위 15%로 조정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: dispute.hooks.ts dev 브랜치 import 충돌 사전 해결 - UseQueryOptions, DisputeDto import 추가 (dev 브랜치 기준) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: dispute.hooks.ts dev 브랜치 useDispute refetchInterval 옵션 반영 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 코드레빗 및 juacheon 리뷰 반영 - disputes/route.ts: active/completed 동시 사용 시 if/else 분기로 필터 충돌 방지 - CaseRecordCard: <time> 요소에 dateTime 속성 추가 (접근성) - Header: transparent prop 추가, :global(header) 셀렉터 제거 - RecordListSection: 에러 메시지 구체화 - next.config.ts: 중복 HTTP 항목 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 2인 판결결과 점수 그래프 UI 수정 - isEqual/barEqual 제거, 색상 로직 ratioA >= ratioB 패턴으로 단순화 - scoreGraph margin-bottom 추가 - scoreAvatarImg 크기 명시적 fn.r(48)로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 2인 판결결과 그래프 디테일 수정 - 바 height 12 → 16, border-radius 6 → 4 - 중앙 실선 추가 (solid, border-strong, h36) - barDark 컬러 → status-disabled-text - scoreTitle 이름 부분만 bold 처리 - AI 고지 문구 컬러 → text-secondary Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 진술 탭 참여자 이름/MBTI 표시, 프로필 이미지 fallback 개선 - 진술 카드 레이블 A/B → 참여자 실명으로 변경 - 진술 카드 하단 프로필 이미지 + MBTI 추가 - DisputeParticipantDto에 mbti 필드 추가 - API participants에 mbti 포함 (disputes/[id] GET/PATCH) - profileImageUrl null 시 image 필드 fallback 적용 (목록/상세 API) - DisputePage.module.scss mixins import 추가 - JudgmentResult 그래프 점선/바 높이 디테일 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: JudgmentResult 참여자 이름 변수 통일 및 텍스트 치환 적용 - nameA / nameB 변수로 cardLabel, barLabel 통일 - replaceRoleNames 함수로 aFault/bFault/aSuggestedLine/bSuggestedLine 내 A님→실제이름 치환 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 코드레빗 리뷰 반영 - replaceRoleNames 단일 패스 치환으로 개선 (A님|B님 alternation) - disputes 목록/POST API Prisma 쿼리에 image 필드 선택 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* fix: AI 판결 프롬프트 개선 - aFault/bFault에서 'A가/B가' 알파벳 지칭 제거, 실제 사용자 이름 사용 - mbtiNote 별도 필드 제거, aFault/bFault 내용에 MBTI 인사이트 통합 - judge route에서 user nickname/name 조회 후 프롬프트에 전달 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: AI 갈등 유형 선택 정확도 개선 - detailCode 영어 원문 의미 기준으로 구체적 유형 선택하도록 지시 추가 - expectation_mismatch 등 포괄적 유형은 최후 수단으로만 선택하도록 제한 - SOLO/DUO 프롬프트 모두 동일하게 적용 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: judgment 중복 fetch 제거 및 closed 상태 모달 버그 수정 - JudgmentResult, JudgmentTypeResult에서 useJudgment 제거, page.tsx에서 props로 전달 - 탭 전환 시 불필요한 API 재호출 방지 - closed 상태에서 판결 결과 없음 모달 버그 수정 (isJudged 조건 적용) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 사건 생성 플로우 개선 및 UI/성능 수정 - 홈에서 방 생성만 하고, 진술저장 클릭 시 dispute 생성 + AI 추출 원자적 처리 - POST /api/disputes: title 하드코딩 제거, content 받아 AI 추출 후 제목 자동 설정 - /rooms/[roomId]/statement 페이지 신규 추가 (취소/진술저장 버튼) - 취소 버튼: keepalive fetch로 방 삭제 후 즉시 홈 이동 (3s 블로킹 제거) - 진술저장 중 spinner 오버레이 + 멘트 순환 표시 - 판결받기 중 멘트 단일→순환 (5개, 2.5s 간격) - statementCardEditable hover 시 border 색상 변경 제거 - getCachedSession: getServerSession → JWT decode로 교체 (DB 조회 제거) - JudgmentResult/JudgmentTypeResult: useJudgment 중복 호출 → prop으로 수신 - dispute status judged 일 때만 judgment fetch 활성화 (closed 오작동 수정) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 보안·안정성 개선 (멱등성, 타임아웃, 로그, AI 익명화) - disputes POST: 중복 체크를 Serializable 트랜잭션 내부로 이동 (race condition 방지) - disputes POST: moderateContent에도 8s 타임아웃 적용 (withTimeout 공통 헬퍼) - disputes POST: 모더레이션 실패/차단 로그에서 원문 제거, 안전한 메타데이터만 기록 - judgment.ts: AI 프롬프트에서 실명 제거, A/B 레이블 고정 (표시 시 user.name으로 치환) - judge/route.ts: generateAiJudgment 호출에서 nameA/nameB 제거 - getSession.ts: decoded.sub 없을 시 null 반환으로 undefined user.id 방지 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 판결 결과 텍스트 A/B -> 실명 치환 패턴 확장 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
- 상점/고객문의 메뉴 클릭 시 페이지 이동 대신 토스트 메시지 표시 - 회원탈퇴 페이지 본문 폰트 색상을 text-secondary에서 text-primary로 변경 - 회원탈퇴 페이지 상단에 사용자 프로필(아바타, 이름, 이메일) 표시 Co-authored-by: Claude <noreply@anthropic.com>
* feat: 판결 결과 컴포넌트 및 도메인 로직 초기 작업 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 판결 결과 페이지 구현 (#판결탭/유형탭/UI) - DisputePage: 판결/유형 서브탭(Tab 공통컴포넌트) 추가 - JudgmentResult: 이미지 기준 UI 재구성, nickname 적용 - JudgmentTypeResult: 유형탭 컴포넌트 신규 생성 (카드이미지, ActionPrompt) - Tab.module.scss: w60 h36 사이즈 조정 - DisputeParticipantDto: nickname 필드 추가 - disputes/[id]/route: nickname 조회 추가 - judgment.mapper: cardImageUrl 추가 - types/judgment: ConflictTypeDetailDto에 cardImageUrl 추가 - auth/index: 카카오 로그인 시 profileImageUrl 저장 - page.module.scss: diaryBox max-width 제거 - NewCaseButton: AbortController timeout 30s Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: next.config에 Supabase Storage 및 카카오 이미지 도메인 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: JudgmentResult Avatar img 태그를 next/image로 교체 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #90 리뷰 반영 - participants nickname → name으로 변경 (DTO, route, 컴포넌트, useActiveCases) - next.config: 카카오 HTTP 패턴 제거 (HTTPS만 허용) - DisputePage: isCompleted null 케이스 처리 (!!dispute) - JudgmentResult.module.scss: declaration-empty-line-before stylelint 수정 - JudgmentTypeResult.module.scss: 동일 stylelint 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: PR #90 추가 리뷰 반영 - JudgmentResult/JudgmentTypeResult: props 대신 disputeId 기반 직접 API 호출 (새로고침 시 데이터 유실 방지, TanStack Query 캐시로 중복 요청 없음) - DisputePage: judgment/participants props 제거, isError 기반 에러 처리 - auth/index.ts: 프로필 이미지 백필 try-catch 감싸기 (실패 시 로그인 차단 방지) - judgement.api.ts: 에러 메시지 사용자 친화적으로 개선 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: 불필요한 스크린샷 PNG 파일 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * refactor: CalendarRecord 모델 제거 및 EmotionDiary title 필드 추가 - CalendarRecord 모델 및 CalendarRecordType enum 제거 - User, DisputeRoom, RoomAiConversation, Dispute에서 calendarRecords relation 제거 - EmotionDiary에 title 필드 추가 (VarChar 200) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 사건기록 페이지 API 연동 - GET /api/disputes에 completed=true 쿼리 파라미터 추가 (judged/closed 필터링) - fetchCompletedCases, useCompletedCases 추가 (카테고리 필터 + 최신순) - RecordListSection 더미 데이터 제거, 실제 API 연동 - 사건 박스 클릭 시 /disputes/{id}로 이동 (기존 Link 구조 유지) - 로딩/에러/빈 상태 처리 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 사건기록 빈 상태 UI 개선 - 빈 상태 텍스트 → '등록한 사건이 없어요' - character-case.png 이미지 + 텍스트 중앙 배치 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 사건박스 공통 컴포넌트 CaseRecordCard 분리 - CaseRecordCard 신규 생성 (src/components/ui) - MUI AvatarGroup으로 1인/2인 참여자 프로필 겹침 표시 - RecordListSection에서 CaseRecordCard 사용하도록 교체 - 카드 스타일 RecordListSection.module.scss → CaseRecordCard.module.scss로 이동 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 카카오 CDN http 프로토콜 이미지 허용 (img1.kakaocdn.net) 카카오 기본 프로필 이미지 URL이 http로 오는 경우가 있어 *.kakaocdn.net http 패턴 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 홈 페이지 배경 그라데이션 추가 (primary-200 → white) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 홈 그라데이션 범위 15%로 조정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: dispute.hooks.ts dev 브랜치 import 충돌 사전 해결 - UseQueryOptions, DisputeDto import 추가 (dev 브랜치 기준) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: dispute.hooks.ts dev 브랜치 useDispute refetchInterval 옵션 반영 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 코드레빗 및 juacheon 리뷰 반영 - disputes/route.ts: active/completed 동시 사용 시 if/else 분기로 필터 충돌 방지 - CaseRecordCard: <time> 요소에 dateTime 속성 추가 (접근성) - Header: transparent prop 추가, :global(header) 셀렉터 제거 - RecordListSection: 에러 메시지 구체화 - next.config.ts: 중복 HTTP 항목 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 2인 판결결과 점수 그래프 UI 수정 - isEqual/barEqual 제거, 색상 로직 ratioA >= ratioB 패턴으로 단순화 - scoreGraph margin-bottom 추가 - scoreAvatarImg 크기 명시적 fn.r(48)로 변경 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 2인 판결결과 그래프 디테일 수정 - 바 height 12 → 16, border-radius 6 → 4 - 중앙 실선 추가 (solid, border-strong, h36) - barDark 컬러 → status-disabled-text - scoreTitle 이름 부분만 bold 처리 - AI 고지 문구 컬러 → text-secondary Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 진술 탭 참여자 이름/MBTI 표시, 프로필 이미지 fallback 개선 - 진술 카드 레이블 A/B → 참여자 실명으로 변경 - 진술 카드 하단 프로필 이미지 + MBTI 추가 - DisputeParticipantDto에 mbti 필드 추가 - API participants에 mbti 포함 (disputes/[id] GET/PATCH) - profileImageUrl null 시 image 필드 fallback 적용 (목록/상세 API) - DisputePage.module.scss mixins import 추가 - JudgmentResult 그래프 점선/바 높이 디테일 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: JudgmentResult 참여자 이름 변수 통일 및 텍스트 치환 적용 - nameA / nameB 변수로 cardLabel, barLabel 통일 - replaceRoleNames 함수로 aFault/bFault/aSuggestedLine/bSuggestedLine 내 A님→실제이름 치환 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 코드레빗 리뷰 반영 - replaceRoleNames 단일 패스 치환으로 개선 (A님|B님 alternation) - disputes 목록/POST API Prisma 쿼리에 image 필드 선택 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * perf: statistics/categories API 빌드 시 DB 호출 제거 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * feat: 카테고리 사건 2개 제한 및 사건기록 무한스크롤 - POST /api/rooms 카테고리당 진행중 사건 2개 초과 시 CATEGORY_LIMIT_EXCEEDED(422) 반환 - DisputeListResponse에 hasNext 필드 추가 - fetchCompletedCases 페이지 기반 API 호출로 전환 (limit 10) - useCompletedCases useInfiniteQuery로 전환 - RecordListSection IntersectionObserver 기반 무한스크롤 구현 - 모든 데이터 로드 시 '모든 데이터를 불러왔습니다' 표시 - NewCaseButton 카테고리 한도 초과 시 에러 모달 표시 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 코드레빗 리뷰 반영 - GET /api/disputes: completed 파라미터 where 조건 반영으로 hasNext 정확도 개선 - POST /api/disputes: 카테고리 한도 체크 추가 (직접 API 호출 우회 방지) - NewCaseButton: limitError 모달 표시 시 body 스크롤 잠금 처리 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 카테고리 한도 초과 에러 모달 UI 개선 - 기존 카테고리 패널 스타일 재사용 → 독립 검은 배경 센터 모달로 변경 - limitOverlay, limitModal, limitMessage, limitCloseButton 스타일 추가 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: 카테고리 한도 에러 모달 메시지 줄바꿈 적용 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
* chore: update claude settings.json Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: update claude settings.json Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * @ feat(user): 마이페이지 프로필 편집 및 이미지 업로드 구현 - 마이페이지 편집 페이지 UI 및 프로필 수정 로직 구현 - 프로필 이미지 업로드 API (Supabase Storage 연동) - user/me API에 PATCH 메서드 추가 (닉네임, MBTI 수정) - user 도메인 API client, hooks, constants 구성 - auth constants 및 lib/storage 유틸 추가 - API 명세서 업데이트 - dev 최신 반영 (사건기록, 홈 화면 개선) Co-Authored-By: Claude <noreply@anthropic.com> @ * fix(auth): 카카오 로그인 시 kakao_id 중복 유니크 제약 위반 해결 동일 카카오 계정으로 user 레코드가 중복 생성된 경우, 기존 유저의 kakao_id를 null로 정리 후 현재 유저에 저장하도록 수정 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * @ fix(api): Remove duplicate profile image upload logic from user/me PATCH Profile image upload was handled in both api/user/me PATCH and the dedicated api/user/me/profile-image POST endpoint. Remove the duplicate code from PATCH including supabaseAdmin import, file validation constants, image signature checker, and upload logic. Co-Authored-By: Claude <noreply@anthropic.com> @ --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
DEV_BYPASS를 제거하고 next-auth 기본 미들웨어로 교체하여 비회원이 보호 페이지(감정일기, 마이페이지 등) 접근 시 로그인 화면으로 리다이렉트되도록 수정. 홈(/), about, contact, join 등 공개 페이지는 matcher에서 제외하여 비회원도 접근 가능하도록 유지. Co-authored-by: Claude <noreply@anthropic.com>
미들웨어가 callbackUrl을 절대 URL(https://...)로 생성하지만 login, auth/callback 페이지에서 상대 경로만 허용해 로그인 성공 후 원래 페이지 대신 홈(/)으로 리다이렉트되는 문제 수정. - login: 절대 URL을 상대 경로로 변환 후 전달 - auth/callback: URL 파싱으로 pathname 추출하여 리다이렉트 Co-authored-by: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
Contributor
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. 🗂️ Base branches to auto review (1)
Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Repository UI (base), Organization UI (inherited) Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Changes
login/page.tsx: 절대 URL → 상대 경로 변환auth/callback/page.tsx: URL 파싱으로 pathname 추출Test plan
/diary복귀 확인/mypage복귀 확인🤖 Generated with Claude Code