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:
@@ -0,0 +1,47 @@
|
||||
import { useApi } from './useApi'
|
||||
import type {
|
||||
ApiRepoMember,
|
||||
InviteMemberPayload,
|
||||
UpdateMemberPayload,
|
||||
} from '@/types/member'
|
||||
|
||||
// 저장소 멤버 도메인 API Composable — 인터셉터가 success/data 를 언래핑
|
||||
// 경로는 모두 repoId(slugName) 하위: /repos/:repoId/members
|
||||
export function useMember() {
|
||||
const api = useApi()
|
||||
|
||||
// 멤버 목록 (멤버 또는 공개 저장소)
|
||||
async function list(repoId: string): Promise<ApiRepoMember[]> {
|
||||
return (await api.get(`/repos/${repoId}/members`)) as unknown as ApiRepoMember[]
|
||||
}
|
||||
|
||||
// 멤버 초대 (admin) — 가입된 사용자만 이메일로 초대
|
||||
async function invite(
|
||||
repoId: string,
|
||||
payload: InviteMemberPayload,
|
||||
): Promise<ApiRepoMember> {
|
||||
return (await api.post(
|
||||
`/repos/${repoId}/members`,
|
||||
payload,
|
||||
)) as unknown as ApiRepoMember
|
||||
}
|
||||
|
||||
// 멤버 역할/직무 변경 (admin, owner 제외)
|
||||
async function update(
|
||||
repoId: string,
|
||||
userId: string,
|
||||
payload: UpdateMemberPayload,
|
||||
): Promise<ApiRepoMember> {
|
||||
return (await api.patch(
|
||||
`/repos/${repoId}/members/${userId}`,
|
||||
payload,
|
||||
)) as unknown as ApiRepoMember
|
||||
}
|
||||
|
||||
// 멤버 제거 (admin, owner 제외)
|
||||
async function remove(repoId: string, userId: string): Promise<void> {
|
||||
await api.delete(`/repos/${repoId}/members/${userId}`)
|
||||
}
|
||||
|
||||
return { list, invite, update, remove }
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
import { useApi } from './useApi'
|
||||
import type { ApiMember } from '@/types/repo'
|
||||
|
||||
// 사용자 도메인 API Composable — 멤버 초대 자동완성용 검색/목록
|
||||
// 응답은 PublicUser(= ApiMember: { id, email, name, role }) 배열
|
||||
export function useUser() {
|
||||
const api = useApi()
|
||||
|
||||
// 사용자 검색 — q 가 있으면 이메일/이름 부분일치, 없으면 전체 목록
|
||||
async function search(q?: string): Promise<ApiMember[]> {
|
||||
const params = q && q.trim() ? { q: q.trim() } : {}
|
||||
return (await api.get('/users', { params })) as unknown as ApiMember[]
|
||||
}
|
||||
|
||||
return { search }
|
||||
}
|
||||
Reference in New Issue
Block a user