Skip to content

feat: 워크스페이스 소유권 이전 및 삭제 기능 추가 #87

Description

@0011810

Issue

작업 유형

  • 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 삭제가 실패하면 파일만 먼저 삭제될 가능성이 있음

예상 브랜치명

Feat/#87/workspace-leave-flow

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions