다크모드
BE handoff — Organization의 Workspace 생성
정본 계약
Workspace 생성 RPC는 한 트랜잭션에서 다음을 처리한다.
- 호출자의 active Organization Membership과 관리자 역할 확인
workspaces행 생성과 불변workspace_number배정- 호출자의 Organization Role을 새 Workspace에 같은 등급으로 투영
- Organization 계약 품목과 요청 module의 교집합 검증
workspace_module_entitlements생성- 프로퍼티 후보를 선택했다면 외부 코드, 출처, 조회 시각, 원본 snapshot 저장
입력은 organizationId, Workspace 표시명·edition·module·프로퍼티 snapshot만 받는다. 가격, 계약 상태, 관리자 이름, 권한은 클라이언트 값을 신뢰하지 않고 서버에서 다시 읽는다.
불변식
- Workspace 코드는 Organization 안에서 unique이고 생성 뒤 변경할 수 없다.
workspace_number는 Organization 안에서 unique인 0 이상의 불변 순번이다.- Workspace·entitlement·외부 snapshot 중 하나라도 실패하면 전체 rollback한다.
- 외부 프로퍼티 snapshot 저장 실패도 부분 성공을 허용하지 않는다.
- 요청 module은 active Organization 계약 품목의 부분집합이어야 한다.
security definer함수는search_path = public, pg_temp를 고정한다.- 생성 RPC는
authenticated만 실행하고, 함수 안에서 현재 Principal과 Organization 권한을 다시 검증한다.
공공데이터 키는 Edge Function secret으로만 관리한다. 주소 검색은 사용자의 법정동 포함 입력을 사용하고, 상세 조회는 첫 응답의 전체 건수로 페이지 수를 확정한 뒤 제한된 병렬 요청으로 수집한다.
로그인 뒤 Workspace 선택과 상단 범위 전환은 UI 상태일 뿐 권한을 만들지 않는다. 서버는 매 요청에서 active Organization Membership + Role 투영 또는 active Workspace Membership + 직접 Role을 다시 검사한다.
Organization Role은 별도 Workspace Membership이나 직접 Role Assignment 없이 owner→owner, admin→admin, manager→manager, viewer→viewer로 투영한다. Workspace-only 사용자와 Workspace 직접 승격은 active Workspace Membership과 workspace.owner | workspace.admin | workspace.manager | workspace.viewer 중 하나를 필요로 한다.