sites/{site_id}/supervisor 스키마 (현장 감독자)
현장에 배정된 감독자(owner / admin / manager) 문서. 회사 레벨
companies/{cid}/members에서 특정 현장에allowed_sites로 접근 권한을 부여받은 시점에 해당 현장의supervisor서브컬렉션에 스냅샷이 복사됩니다.회사 레벨 풀(
companies/{cid}/members)과의 차이, 그리고 비슷한 스키마 문서인 company/_schema/supervisor.md의 차이점은 아래 차이 비교를 참고하세요.
저장 위치
- 문서 ID는 감독자의 UID와 동일합니다.
- 회사 레벨 감독자 풀은
companies/{company_id}/members이고, 현장 단위로 빠르게 조회하기 위한 복사본이 이 컬렉션입니다.
생성/삭제 흐름
site/registration.py (현장 생성 시)
├── 요청자(UID) supervisor에 추가
├── 감독자(supervisor_UID) supervisor에 추가 (요청자와 다를 때)
└── 소유자(owner) supervisor에 추가 (요청자/감독자와 다를 때)
site/site_state.py (_change_site_info)
└── supervisor_UID 변경 시 새 supervisor를 supervisor 컬렉션에 추가
company/rules.py
├── _set_site_rules (여러 현장 allowed_sites 일괄 변경)
│ ├── added_sites: 각 현장 supervisor에 문서 write
│ └── removed_sites: 해당 현장 supervisor의 모든 문서 delete
├── _add_site_supervisor (단일 현장에 추가)
│ ├── members.allowed_sites에 site_id ArrayUnion
│ └── supervisor/{UID} write (멤버 정보 전체 복사 + 할당 메타)
└── _delete_site_supervisor (단일 현장에서 제거)
├── members.allowed_sites에서 site_id 제거
└── supervisor에서 UID 일치 문서 delete
company/assign.py (_company_resign, 멤버 탈퇴)
└── 모든 현장 supervisor 서브컬렉션에서 해당 UID 문서 일괄 delete
문서 필드
companies/{cid}/members/{UID} 문서 전체를 통째로 복사(dict(member))한 뒤 할당 메타 2개 필드를 추가합니다. 주요 필드는 다음과 같습니다.
| 필드 | 타입 | 설명 |
|---|---|---|
UID |
string | 감독자 UID (문서 ID와 동일) |
name |
string | 이름 (멤버 스냅샷) |
phone_enc |
string | 전화번호 AES 암호화 |
phone_masked |
string | "010-****-XXXX" 마스킹 |
email_enc |
string | 이메일 AES 암호화 |
main_address |
string | 주소 (평문) |
sub_address_enc |
string | 상세주소 AES 암호화 |
birth |
timestamp | 생년월일 |
sex |
string | "male" | "female" |
role |
string | "owner" | "admin" | "manager" |
position |
string | 직급 |
field |
string | 직종 |
labor_supplier |
string | 인력 공급처 |
wage_rate |
number | 일당 |
allowed_sites |
string[] | 할당 시점의 members.allowed_sites 스냅샷 (참고용, 최신 권한 소스는 members) |
allowed_pages |
string[] | 할당 시점의 members.allowed_pages 스냅샷 |
approved_UID |
string | 회사 가입 승인자 UID |
created_at |
timestamp | 회사 가입 시각 |
resign |
bool | 퇴사 여부 (할당 시점은 false) |
fcm_token |
string? | 있을 경우 복사됨 |
doc_id |
string | (복사 시 딕셔너리에 포함될 수 있음) |
assigned_by_UID |
string | (추가) 이 현장에 감독으로 할당한 사람의 UID |
assigned_at |
timestamp | (추가) 이 현장에 할당된 시각 |
차이 비교
| 항목 | companies/{cid}/members/{UID} |
companies/{cid}/sites/{sid}/supervisor/{UID} |
|---|---|---|
| 범위 | 회사 전체 감독자 풀 | 특정 현장에 배정된 감독자만 |
| 문서 ID | 멤버 UID | 멤버 UID (동일) |
| 권한 소스 | 원본 (allowed_sites가 권한 소스) |
복사본 스냅샷 (권한 참조용 X) |
| 업데이트 경로 | member 관련 엔드포인트 | 회사 권한 변경/현장 생성 시점에만 write |
| 삭제 시점 | resign=true 플래그만 변경 (삭제 X) | allowed_sites 제거 / 현장 퇴출 시 문서 delete |
비슷한 파일
company/_schema/supervisor.md는 같은 컬렉션을 "회사 관리 > 감독자 풀" 관점에서 설명한 문서입니다. 본 문서(site)는 "현장 단위에서 감독자 리스트를 빠르게 조회"하는 용도에 초점을 둡니다. 두 문서 모두 저장 위치와 필드는 동일합니다.
데이터 동기화 주의사항
- 이 문서는 할당 시점의 스냅샷입니다.
members문서가 이후에 업데이트되어도supervisor문서는 자동 동기화되지 않습니다 (트리거 없음). - 권한 체크(
check_company_permission)는members.allowed_sites를 기준으로 합니다.supervisor컬렉션은 조회 편의성을 위한 복사본입니다. - 회사 탈퇴 시(
_company_resign) 전 현장을 순회하며 supervisor 문서를 일괄 삭제합니다. 단, members 문서는resign=true플래그만 변경되고 삭제되지 않습니다.
예시 문서
{
"UID": "firebase_uid_manager",
"name": "박매니저",
"phone_enc": "AES(...)",
"phone_masked": "010-****-9876",
"email_enc": "AES(...)",
"main_address": "서울특별시 서초구",
"sub_address_enc": "AES(...)",
"birth": "1988-07-20T00:00:00Z",
"sex": "female",
"role": "manager",
"position": "대리",
"field": "안전관리자",
"labor_supplier": "직영",
"wage_rate": 120000,
"allowed_sites": ["site_1", "site_2"],
"allowed_pages": ["홈", "즐겨찾기", "노임대장"],
"approved_UID": "firebase_uid_owner",
"created_at": "2026-04-15T09:30:00Z",
"resign": false,
"assigned_by_UID": "firebase_uid_owner",
"assigned_at": "2026-04-18T14:00:00Z"
}