feat: 멤버 관리 연동 + 사용자 검색 API (3단계)

- 멤버 목록/초대/역할변경/제거 프론트 연동(RepoMembersPage), 초대 자동완성
- GET /users 사용자 검색 API + UserController
- RepoMembersPage 역할 변경 드롭다운 잘림(overflow) 수정
- InviteMember/UpdateMember DTO, RepoMember 엔티티 정비

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-17 18:11:46 +09:00
parent e2fe089321
commit c01f8e535c
13 changed files with 686 additions and 199 deletions
+11 -7
View File
@@ -56,6 +56,12 @@ export interface Repo {
progressLevel: 'done' | 'mid' | 'low'
/** 진행률 텍스트(예: "67% 완료", "시작 전") */
progressLabel: string
/** Gitea HTTPS clone URL (미연동 시 null/undefined) */
cloneUrl?: string | null
/** Gitea 웹 UI URL (미연동 시 null/undefined) */
htmlUrl?: string | null
/** Gitea 조직에서 사라진 저장소 표시(역방향 동기화로 갱신) */
giteaMissing?: boolean
}
/** 저장소 상세의 업무 목록 행 */
@@ -744,8 +750,6 @@ export function countActive(groups: MyTaskGroup[]): number {
export interface RepoMember {
user: User
email: string
/** 저장소 내 직무 표기(예: 리드, 콘텐츠 디자인) */
subRole: string
/** 담당 업무 수 */
taskCount: number
/** 권한 역할 */
@@ -758,11 +762,11 @@ export interface RepoMember {
export const REPO_MEMBERS: Record<string, RepoMember[]> = {
'q3-launch-campaign': [
{ user: USERS.jung, email: 'tkjung@acme.co', subRole: '리드', taskCount: 1, roleType: 'admin', isYou: true, owner: true },
{ user: USERS.kim, email: 'sykim@acme.co', subRole: '콘텐츠 디자인', taskCount: 2, roleType: 'member' },
{ user: USERS.park, email: 'jhpark@acme.co', subRole: '퍼포먼스 마케팅', taskCount: 2, roleType: 'member' },
{ user: USERS.lee, email: 'dylee@acme.co', subRole: '카피라이터', taskCount: 2, roleType: 'member' },
{ user: USERS.choi, email: 'yjchoi@acme.co', subRole: 'UX 디자인', taskCount: 1, roleType: 'member' },
{ user: USERS.jung, email: 'tkjung@acme.co', taskCount: 1, roleType: 'admin', isYou: true, owner: true },
{ user: USERS.kim, email: 'sykim@acme.co', taskCount: 2, roleType: 'member' },
{ user: USERS.park, email: 'jhpark@acme.co', taskCount: 2, roleType: 'member' },
{ user: USERS.lee, email: 'dylee@acme.co', taskCount: 2, roleType: 'member' },
{ user: USERS.choi, email: 'yjchoi@acme.co', taskCount: 1, roleType: 'member' },
],
}