Skip to content

Fix/kanban api#70

Merged
Jieunsse merged 40 commits into
mainfrom
fix/kanban-api
Feb 23, 2026
Merged

Fix/kanban api#70
Jieunsse merged 40 commits into
mainfrom
fix/kanban-api

Conversation

@Jieunsse

Copy link
Copy Markdown
Contributor

Summary

  • 이 PR에서 변경한 내용 한 줄 요약

Issue

  • Closes #

Scope

  • 포함

    • 변경한 내용
  • 특이사항

Jieunsse and others added 30 commits February 20, 2026 02:47
팀 추가 기능이 모달에서 링크 방식으로 변경됨에 따라 사용하지 않는 모달 컴포넌트 파일들을 삭제

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- useKanbanTasks: task CRUD, 체크 상태, 모달 상태 관리 담당
- useKanbanDnd: 드래그 센서 설정 및 드롭 처리 담당
- KanbanBoard: 두 훅을 조합하는 얇은 컴포넌트로 전환
Jieunsse and others added 10 commits February 23, 2026 00:37
- TeamNavClient: 드로어 상태 관리 클라이언트 컴포넌트 생성
- TeamTabletHeader: onMenuClick prop을 지원하는 피처 전용 태블릿 헤더 생성
- 공유 MobileHeader의 onMenuClick을 드로어 open과 연결
- layout.tsx에서 TabletHeader/MobileHeader 래퍼를 TeamNavClient로 교체
- page.module.css에서 미사용 tabletHeaderWrapper/mobileHeaderWrapper 클래스 제거

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
팀 생성 시 currentUser 쿼리를 invalidate하지 않아 사이드바의
memberships 목록이 갱신되지 않던 문제를 수정

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@Jieunsse Jieunsse self-assigned this Feb 23, 2026
@Jieunsse Jieunsse added the 긴급 🔥 조속한 조치가 필요할 때 이용해주세요 label Feb 23, 2026

@yooolleee yooolleee left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

긴급 처리합니다

@gemini-code-assist

Copy link
Copy Markdown
Contributor

Summary of Changes

Hello @Jieunsse, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

이 PR은 팀 작업 관리를 위한 칸반 보드 기능을 도입하고, 그룹 및 태스크 목록 관리를 위한 API 통합을 완료합니다. 또한, 팀 멤버 초대 및 삭제 기능을 포함한 멤버 관리 기능을 강화하고, 다양한 디바이스에서 일관된 사용자 경험을 제공하기 위한 반응형 UI를 구현했습니다. 내부적으로는 API 통신을 프록시 방식으로 전환하여 보안과 유지보수성을 향상시켰습니다.

Highlights

  • 칸반 보드 기능 추가: 팀 작업 관리를 위한 칸반 보드 컴포넌트와 관련 로직(드래그 앤 드롭, 태스크 추가/수정/삭제)이 구현되었습니다.
  • 그룹 및 태스크 API 통합: 그룹 정보 조회, 수정, 삭제, 초대 링크 생성 및 태스크 목록 관리(생성, 조회, 삭제)를 위한 새로운 API 엔드포인트와 TanStack Query 훅이 추가되었습니다.
  • 멤버 관리 기능 개선: 팀 멤버 초대 및 삭제 기능이 추가되었으며, 멤버 목록을 표시하는 UI 컴포넌트가 구현되었습니다.
  • 반응형 디자인 및 내비게이션: 데스크톱, 태블릿, 모바일 환경에 맞춰 칸반 보드와 사이드바, 헤더가 반응형으로 동작하도록 UI 및 레이아웃이 개선되었습니다.
  • API 호출 구조 리팩토링: 기존 API 호출 방식이 /api/proxy를 통한 프록시 방식으로 변경되었으며, 이미지 업로드를 위한 전용 API 라우트가 추가되었습니다.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Changelog
  • .env.example
    • API 설정에 필요한 환경 변수 예시가 추가되었습니다.
  • .gitignore
    • .mcp.json.documents 폴더 내 여러 파일들이 Git 추적에서 제외되도록 업데이트되었습니다.
  • src/app/(root)/mypage/hooks/useUser.ts
    • 사용자 API 함수들의 import 경로가 업데이트되었습니다.
  • src/app/[teamid]/_domain/apis/group.ts
    • 그룹 정보 조회, 수정, 삭제, 초대 링크 조회, 그룹 태스크 조회 등 그룹 관련 API 함수들이 추가되었습니다.
  • src/app/[teamid]/_domain/apis/taskList.ts
    • 태스크 목록 생성, 조회, 삭제 등 태스크 목록 관련 API 함수들이 추가되었습니다.
  • src/app/[teamid]/_domain/apis/types.ts
    • 그룹, 멤버, 태스크, 태스크 목록 등 도메인 엔티티에 대한 TypeScript 타입 정의가 추가되었습니다.
  • src/app/[teamid]/_domain/components/Kanban/KanbanBoard.module.css
    • 칸반 보드 레이아웃 및 드래그 앤 드롭 요소에 대한 CSS 스타일이 추가되었습니다.
  • src/app/[teamid]/_domain/components/Kanban/KanbanBoard.tsx
    • DndContext를 사용하여 칸반 보드 컴포넌트가 구현되었으며, 태스크 관리 훅과 통합되었습니다.
  • src/app/[teamid]/_domain/components/Kanban/KanbanColumn.module.css
    • 칸반 컬럼에 대한 CSS 스타일이 추가되었습니다.
  • src/app/[teamid]/_domain/components/Kanban/KanbanColumn.tsx
    • 드롭 가능한 영역을 처리하고 칸반 아이템을 표시하는 칸반 컬럼 컴포넌트가 구현되었습니다.
  • src/app/[teamid]/_domain/components/Kanban/KanbanItem.module.css
    • 개별 칸반 아이템, 편집 모드 및 컨텍스트 메뉴에 대한 CSS 스타일이 추가되었습니다.
  • src/app/[teamid]/_domain/components/Kanban/KanbanItem.tsx
    • 드래그 앤 드롭, 컨텍스트 메뉴, 인라인 편집 기능을 포함하는 칸반 아이템 컴포넌트가 구현되었습니다.
  • src/app/[teamid]/_domain/components/Member/MemberCard.module.css
    • 멤버 카드에 대한 CSS 스타일이 추가되었습니다.
  • src/app/[teamid]/_domain/components/Member/MemberCard.tsx
    • 멤버 정보를 표시하고 액션 메뉴를 포함하는 멤버 카드 컴포넌트가 구현되었습니다.
  • src/app/[teamid]/_domain/components/Member/MemberKebabMenu.module.css
    • 멤버 케밥 메뉴에 대한 CSS 스타일이 추가되었습니다.
  • src/app/[teamid]/_domain/components/Member/MemberKebabMenu.tsx
    • 삭제 기능을 포함하는 멤버 케밥 메뉴 컴포넌트가 구현되었습니다.
  • src/app/[teamid]/_domain/components/Member/MemberSection.module.css
    • 멤버 섹션, 초대 버튼 및 토스트 메시지 위치에 대한 CSS 스타일이 추가되었습니다.
  • src/app/[teamid]/_domain/components/Member/MemberSection.tsx
    • 팀 멤버를 표시하고 초대 기능을 처리하는 멤버 섹션 컴포넌트가 구현되었습니다.
  • src/app/[teamid]/_domain/components/Team/SidebarWrapper.tsx
    • 사이드바를 위한 래퍼 컴포넌트가 추가되어 사용자 데이터와 팀 드롭다운을 통합했습니다.
  • src/app/[teamid]/_domain/components/Team/TeamDashboard.module.css
    • 팀 대시보드 레이아웃 및 반응형 조정을 위한 CSS 스타일이 추가되었습니다.
  • src/app/[teamid]/_domain/components/Team/TeamDashboard.tsx
    • 칸반 보드, 오늘의 보고서, 멤버 섹션을 통합하는 메인 팀 대시보드 컴포넌트가 구현되었습니다.
  • src/app/[teamid]/_domain/components/Team/TeamNavClient.module.css
    • 반응형 내비게이션 래퍼에 대한 CSS가 추가되었습니다.
  • src/app/[teamid]/_domain/components/Team/TeamNavClient.tsx
    • 태블릿 및 모바일용 클라이언트 측 내비게이션 컴포넌트(모바일 드로어 포함)가 구현되었습니다.
  • src/app/[teamid]/_domain/components/Team/TeamSidebarDropdown.module.css
    • 팀 사이드바 드롭다운에 대한 CSS 스타일이 추가되었습니다.
  • src/app/[teamid]/_domain/components/Team/TeamSidebarDropdown.tsx
    • 팀 목록 및 팀 추가 옵션을 표시하는 팀 사이드바 드롭다운 컴포넌트가 구현되었습니다.
  • src/app/[teamid]/_domain/components/Team/TeamTabletHeader.module.css
    • 태블릿 헤더에 대한 CSS 스타일이 추가되었습니다.
  • src/app/[teamid]/_domain/components/Team/TeamTabletHeader.tsx
    • 햄버거 메뉴와 로고를 포함하는 태블릿 헤더 컴포넌트가 구현되었습니다.
  • src/app/[teamid]/_domain/components/TodayReport/TodayReport.module.css
    • 오늘의 보고서 카드에 대한 CSS 스타일이 추가되었습니다.
  • src/app/[teamid]/_domain/components/TodayReport/TodayReport.tsx
    • 태스크 진행 상황과 팀 설정을 표시하는 오늘의 보고서 컴포넌트가 구현되었습니다.
  • src/app/[teamid]/_domain/constants/mockData.ts
    • 팀, 멤버, 태스크 및 보고서에 대한 목업 데이터가 추가되었습니다.
  • src/app/[teamid]/_domain/hooks/useKanbanDnd.ts
    • @dnd-kit을 사용하여 칸반 드래그 앤 드롭 로직을 위한 커스텀 훅이 구현되었습니다.
  • src/app/[teamid]/_domain/hooks/useKanbanTasks.ts
    • API 호출 및 로컬 상태 관리를 포함하는 칸반 태스크 관리를 위한 커스텀 훅이 구현되었습니다.
  • src/app/[teamid]/_domain/interfaces/team.ts
    • 칸반 관련 엔티티(상태, 멤버, 태스크 아이템, 태스크, 목업 팀)에 대한 TypeScript 인터페이스가 정의되었습니다.
  • src/app/[teamid]/_domain/queries/queryKeys.ts
    • TanStack Query의 팀 그룹 및 태스크 목록 관련 쿼리 키가 정의되었습니다.
  • src/app/[teamid]/_domain/queries/useCreateTaskListMutation.ts
    • 태스크 목록 생성을 위한 뮤테이션 훅이 구현되었습니다.
  • src/app/[teamid]/_domain/queries/useDeleteGroupMutation.ts
    • 그룹 삭제를 위한 뮤테이션 훅이 구현되었습니다.
  • src/app/[teamid]/_domain/queries/useDeleteTaskListMutation.ts
    • 태스크 목록 삭제를 위한 뮤테이션 훅이 구현되었습니다.
  • src/app/[teamid]/_domain/queries/useGroupInvitationQuery.ts
    • 그룹 초대 링크를 가져오기 위한 쿼리 훅이 구현되었습니다.
  • src/app/[teamid]/_domain/queries/useGroupQuery.ts
    • 그룹 상세 정보를 가져오기 위한 쿼리 훅이 구현되었습니다.
  • src/app/[teamid]/_domain/queries/useGroupTasksQuery.ts
    • 그룹 태스크를 가져오기 위한 쿼리 훅이 구현되었습니다.
  • src/app/[teamid]/_domain/queries/useRemoveMemberMutation.ts
    • 그룹 멤버 삭제를 위한 뮤테이션 훅이 구현되었습니다.
  • src/app/[teamid]/_domain/queries/useTaskListQuery.ts
    • 태스크 목록 상세 정보를 가져오기 위한 쿼리 훅이 구현되었습니다.
  • src/app/[teamid]/_domain/queries/useUpdateGroupMutation.ts
    • 그룹 정보 업데이트를 위한 뮤테이션 훅이 구현되었습니다.
  • src/app/[teamid]/_domain/styles/common.module.css
    • 플렉스박스 레이아웃을 위한 공통 유틸리티 CSS 클래스가 추가되었습니다.
  • src/app/[teamid]/layout.tsx
    • 사이드바와 내비게이션을 포함하는 팀별 페이지를 위한 새로운 레이아웃이 추가되었습니다.
  • src/app/[teamid]/page.module.css
    • 팀 페이지 레이아웃 및 칸반 반응형 조정을 위한 CSS 스타일이 추가되었습니다.
  • src/app/[teamid]/page.tsx
    • TeamDashboard를 동적으로 임포트하는 팀 페이지가 구현되었습니다.
  • src/app/addteam/_domain/apis/image.ts
    • 공유 이미지 업로드 API가 내보내졌습니다.
  • src/app/addteam/_domain/components/JoinTeamCard.tsx
    • JoinTeamCard 컴포넌트가 폼 제출, 피드백 및 비활성화 상태를 처리하도록 업데이트되었습니다.
  • src/app/addteam/_domain/hooks/useJoinTeam.ts
    • 초대 링크/토큰을 사용하여 팀에 참여하는 커스텀 훅이 구현되었습니다.
  • src/app/addteam/_domain/queries/useUploadImageMutation.ts
    • 이미지 업로드를 위한 뮤테이션 훅이 구현되었습니다.
  • src/app/addteam/create/page.tsx
    • 팀 생성 페이지가 새 팀 대시보드 경로로 리디렉션되도록 업데이트되었습니다.
  • src/app/addteam/join/page.tsx
    • 팀 참여 페이지가 새 useJoinTeam 훅을 사용하고, 초대 토큰을 위한 URL 매개변수를 처리하며, 피드백을 표시하도록 업데이트되었습니다.
  • src/app/api/images/upload/route.ts
    • 멀티파트 폼 데이터 및 인증을 처리하는 이미지 업로드를 위한 새로운 API 라우트가 추가되었습니다.
  • src/components/sidebar/TabletHeader.tsx
    • 반응형 내비게이션을 위한 새로운 TabletHeader 컴포넌트가 추가되었습니다.
  • src/components/sidebar/index.ts
    • 새로운 TabletHeader 컴포넌트가 내보내졌습니다.
  • src/components/sidebar/styles/TabletHeader.module.css
    • 새로운 TabletHeader에 대한 CSS 스타일이 추가되었습니다.
  • src/shared/apis/groups/http.ts
    • API 요청 함수가 프록시 경로를 사용하고 헤더를 동적으로 구성하도록 수정되었습니다.
  • src/shared/apis/groups/types.ts
    • AcceptInvitationBody 인터페이스에 userEmail이 포함되도록 업데이트되었습니다.
  • src/shared/apis/images.ts
    • 프록시 라우트를 통해 이미지를 업로드하기 위한 새로운 API 함수가 추가되었습니다.
  • src/shared/apis/user.ts
    • 현재 사용자 정보 및 멤버십을 가져오기 위한 새로운 API 함수와 타입이 추가되었습니다.
  • src/shared/apis/user/userApi.ts
    • 사용자 API 함수가 새 프록시 경로를 사용하고 직접적인 fetchApi 호출을 제거하도록 리팩토링되었습니다.
  • src/shared/queries/groups/queryKeys.ts
    • acceptInvitation을 위한 새로운 쿼리 키가 추가되었습니다.
  • src/shared/queries/groups/useAcceptInvitationMutation.ts
    • 그룹 초대를 수락하기 위한 뮤테이션 훅이 구현되었습니다.
  • src/shared/queries/groups/useCreateGroupMutation.ts
    • 그룹 생성 뮤테이션이 현재 사용자 쿼리를 무효화하도록 업데이트되었습니다.
  • src/shared/queries/user/useCurrentUserQuery.ts
    • 현재 사용자 데이터를 가져오고 일시 중단하기 위한 새로운 쿼리 키와 훅이 추가되었습니다.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@Jieunsse Jieunsse merged commit 684ca0e into main Feb 23, 2026
1 check passed

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

The pull request introduces a comprehensive Kanban board feature, including task management, member sections, and team dashboards. While the overall structure is solid and leverages modern React patterns like TanStack Query and dnd-kit, there are several critical logic issues. Specifically, the Kanban board's status derivation logic conflicts with its drag-and-drop functionality, and the progress reporting in the dashboard counts lists instead of individual tasks. There are also potential runtime issues with API response parsing and timezone handling for 'Today' reports.

Comment on lines +30 to +32
export function getGroupInvitation(groupId: number): Promise<string> {
return requestJson<string>(`/groups/${groupId}/invitation`, GROUP_ERROR_MESSAGE.invitation);
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The requestJson helper calls response.json() internally. If the API returns a raw JWT string (as the comment on line 29 suggests), this will result in a syntax error during JSON parsing because a raw JWT is not a valid JSON value. If the response is indeed a raw string, you should use a helper that utilizes response.text() instead.

Comment on lines +14 to +20
function deriveStatus(items: TaskItem[]): KanbanStatus {
if (items.length === 0) return 'todo';
const doneCount = items.filter((item) => item.checked).length;
if (doneCount === 0) return 'todo';
if (doneCount === items.length) return 'done';
return 'inProgress';
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The status of a task list is automatically derived from its items via deriveStatus. However, the Kanban board allows users to manually drag cards between columns, which updates the status in local state. Since this manual status change is not persisted to the backend and is overwritten by the derived status whenever the API data refreshes (due to the logic on lines 61-64), the drag-and-drop functionality is effectively non-functional. You should either implement persistence for the status change or rely solely on the derived status and disable manual dragging between columns.

Comment on lines +17 to +19
function getTodayDateString(): string {
return new Date().toISOString().split('T')[0];
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Using new Date().toISOString() to determine the current date results in a UTC-based date string. This can lead to the 'Today' report displaying the incorrect date for users in different timezones (e.g., a user in KST might see yesterday's date in the early morning). Consider using local date formatting to ensure the date is relative to the user's timezone.

Comment on lines +75 to +76
const totalTasks = taskListQueries.length;
const doneTasks = taskListQueries.filter((q) => isTaskListDone(q.data?.tasks ?? [])).length;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The totalTasks and doneTasks calculations are currently based on the number of task lists rather than individual tasks. This means the progress bar in the TodayReport reflects how many lists are fully completed, which may not accurately represent the user's actual workload progress. It is recommended to aggregate the total and completed task counts across all lists for a more granular progress report.

Comment on lines +12 to +16
function buildHeaders(options?: RequestInit): HeadersInit {
const method = (options?.method ?? 'GET').toUpperCase();
const needsContentType = ['POST', 'PATCH', 'PUT'].includes(method) && options?.body !== undefined;
return needsContentType ? { 'Content-Type': 'application/json' } : {};
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The buildHeaders function unconditionally sets Content-Type: application/json for POST, PATCH, and PUT requests if a body is present. This will cause failures when the body is a FormData object (e.g., during file uploads), as the browser must be allowed to set the multipart boundary automatically. You should add a check to ensure the body is not an instance of FormData before adding this header.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

긴급 🔥 조속한 조치가 필요할 때 이용해주세요

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants