# Issue ## 작업 유형 - [x] Feat: 새로운 기능 추가 - [ ] Fix: 버그 수정 - [ ] Docs: 문서 수정 - [ ] Refactor: 리팩토링 - [ ] Design: UI/CSS 수정 - [ ] Chore: 설정, 패키지, 기타 작업 - [ ] Hotfix: 긴급 수정 ## 작업 내용 - 워크스페이스 소유권 이전 기능 추가 - owner의 워크스페이스 삭제 기능 추가 - 혼자 남은 경우 탈퇴 대신 워크스페이스 삭제 가능 - 다른 멤버가 있는 경우에도 전체 워크스페이스 삭제 가능 - owner의 팀 탈퇴 플로우를 상황별로 분기 처리 - 설정 페이지의 기능을 워크스페이스·팀·개인 영역에 맞게 재배치 ## 작업 배경 - 기존에는 owner의 팀 탈퇴가 무조건 차단됐지만, 소유권을 이전하는 기능은 제공되지 않았음 - owner가 혼자 남은 경우에도 워크스페이스에서 나갈 방법이 없었기 때문에, 탈퇴 대신 워크스페이스를 삭제할 수 있는 기능이 필요했음 - 다른 멤버가 있는 owner는 소유권을 이전한 뒤 일반 멤버로 남거나 별도로 탈퇴할 수 있어야 했음 - 더 이상 유지하지 않을 워크스페이스는 다른 멤버의 존재 여부와 관계없이 owner가 직접 삭제할 수 있어야 했음 - 소유권 이전과 워크스페이스 삭제는 개인 프로필이 아닌 팀·워크스페이스 관리 기능에 가까워 설정 탭 구조 정리가 필요함 | 상황 | 가능한 행동 | | --- | --- | | 일반 멤버 | 바로 팀 탈퇴 | | owner, 혼자 남음 | 탈퇴 대신 워크스페이스 삭제 | | owner, 다른 멤버 있음 | 다른 멤버에게 소유권 이전 또는 워크스페이스 전체 삭제 | | 소유권을 이전한 기존 owner | 일반 멤버로 남거나 별도로 팀 탈퇴 | ## To Do - [ ] `transfer_workspace_ownership` RPC 추가 - `security definer` 방식으로 구현 - `workspaces.owner_id`와 기존·신규 owner의 role을 원자적으로 변경 - 대상 멤버 row를 잠가 소유권 이전과 동시 탈퇴가 겹치는 문제 방지 - 함수 내부에서 호출자와 대상 멤버 권한 검증 - [ ] `transferOwnership` 서버 액션 추가 - [ ] `deleteWorkspace` 서버 액션 추가 - 호출자가 현재 owner인지 먼저 확인 - Storage 파일 정리 후 워크스페이스 row 삭제 - 멤버 수와 관계없이 owner만 실행 가능 - [ ] 설정 페이지 탭 구조 재정리 - 워크스페이스 관리: 이름·설명 수정, 워크스페이스 삭제 - 팀 관리: 초대, 멤버 목록, 소유권 이전 - 프로필 설정: 닉네임 수정, 팀 탈퇴 - [ ] 설정 탭 라벨 변경 - 워크스페이스 정보 → 워크스페이스 관리 - 팀원 관리 → 팀 관리 - 프로필 → 프로필 설정 - [ ] 일반 멤버에게 소유권 이전 및 워크스페이스 삭제 UI가 노출되지 않도록 처리 - [ ] owner의 팀 탈퇴 버튼을 비활성화하고 상황별 이동 안내 추가 - 다른 멤버가 있으면 팀 관리 탭에서 소유권 이전 안내 - 혼자라면 워크스페이스 관리 탭에서 삭제 안내 ## 완료 기준 - [ ] 일반 멤버는 기존과 동일하게 바로 팀을 탈퇴할 수 있음 - [ ] owner는 팀에서 바로 탈퇴할 수 없으며 탈퇴 버튼이 비활성화됨 - [ ] owner 혼자 남은 경우 워크스페이스를 삭제할 수 있음 - [ ] 다른 멤버가 있는 owner도 워크스페이스 전체를 삭제할 수 있음 - [ ] owner이고 다른 멤버가 있으면 팀 관리 탭에서 소유권을 이전할 수 있음 - [ ] 소유권 이전 완료 후 새 owner에게 권한이 넘어감 - [ ] 기존 owner는 일반 멤버로 남으며, 이후 원하는 경우 별도로 탈퇴할 수 있음 - [ ] 일반 멤버에게 소유권 이전 및 워크스페이스 삭제 기능이 노출되지 않음 - [ ] 일반 멤버가 워크스페이스 삭제 서버 액션을 직접 호출해도 owner 검증에서 거부됨 - [ ] 워크스페이스 삭제 시 하위 DB 데이터와 Storage 파일이 함께 정리됨 - [ ] 타입체크 통과 - [ ] ESLint 통과 - [ ] 변경 파일 포맷 검사 통과 - [ ] 실제 브라우저 동작 확인 - owner 혼자 남은 경우 - owner와 다른 멤버가 함께 있는 경우 - 소유권을 이전하는 경우 - 일반 멤버가 탈퇴하는 경우 - 워크스페이스와 Storage 파일을 삭제하는 경우 ## 참고 사항 - 소유권을 이전받은 사용자의 화면은 실시간으로 갱신되지 않으며(Realtime 동기화는 이번 범위에서 제외), 다음 새로고침 또는 페이지 이동 시 변경된 권한이 반영됨 - 워크스페이스 하위 DB 데이터는 `ON DELETE CASCADE`로 삭제됨 - Storage의 `workspace-resources` 파일은 FK 캐스케이드 대상이 아니므로 서버 액션에서 명시적으로 먼저 삭제함 - Storage 삭제와 DB 삭제는 하나의 트랜잭션으로 묶을 수 없으므로, Storage 삭제 성공 후 DB 삭제가 실패하면 파일만 먼저 삭제될 가능성이 있음 ## 예상 브랜치명 ```txt Feat/#87/workspace-leave-flow
Issue
작업 유형
작업 내용
작업 배경
To Do
transfer_workspace_ownershipRPC 추가security definer방식으로 구현workspaces.owner_id와 기존·신규 owner의 role을 원자적으로 변경transferOwnership서버 액션 추가deleteWorkspace서버 액션 추가완료 기준
참고 사항
ON DELETE CASCADE로 삭제됨workspace-resources파일은 FK 캐스케이드 대상이 아니므로 서버 액션에서 명시적으로 먼저 삭제함예상 브랜치명