common 영역 DB 스키마
공통(인증/사용자/알림/문의) 영역에서 쓰는 Firestore 컬렉션 스키마 모음. 개별 엔드포인트 문서에서 참조용으로 사용합니다.
컬렉션 맵
users/{uid} # 사용자 본문 (프로필, 소셜 연동, 로그인 상태 등)
├─ membership/{membership_id} # 회사/현장/장비 소속 관계
├─ equipments/{equipment_id} # 개인 소유 장비
├─ notifications/{notification_id} # 인앱 알림
├─ requests/{request_id} # 가입/출근 등 승인 대기 요청
├─ login_logs/{log_id} # 로그인 성공 기록
├─ inquiries/{inquiry_id} # 사용자 문의사항
├─ certificates/{certificate_id} # 워크마루 자격증 → workmaru 영역 참조
└─ resumes/{resume_id} # 워크마루 이력서 → workmaru 영역 참조
문서 목록
| 컬렉션 | 스키마 문서 | 설명 |
|---|---|---|
users/{uid} |
users.md | 사용자 프로필, 암호화 필드, 소셜 연동, 로그인 시도/잠금, FCM 토큰 |
users/{uid}/membership/{id} |
membership.md | 회사/현장/장비 소속. role = owner/admin/manager/worker/equipment |
users/{uid}/equipments/{id} |
equipments.md | 장비 소유자 기준 개인 장비 목록 |
users/{uid}/notifications/{id} |
notifications.md | 인앱 알림 (푸시 수신 내역, 읽음 여부) |
users/{uid}/requests/{id} |
requests.md | 회사/현장 가입, 출근, 현장 변경 등 요청 상태 |
암호화 3종 패턴
개인정보는 다음 3종으로 저장됩니다 (see users.md):
{field}_enc: AES-CBC 암호화 (랜덤 IV){field}_hash: SHA256(value + SALT) — 비교/검색용{field}: 평문 (민감도 낮은 필드만)
다른 영역과의 관계
- company / site: 회사·현장 가입 승인 시
users/{uid}/membership이 생성되며, 회사 멤버(companies/{cid}/members/{uid})와 현장 멤버(companies/{cid}/sites/{sid}/members/{uid}) 문서가 함께 쓰입니다. - system: 알림/파일/FCM 토큰은 공통 영역과 시스템 영역이 함께 사용합니다. 파일 메타는 system/_schema/files.md 참조.
- workmaru:
users/{uid}/certificates,users/{uid}/resumes는 워크마루 서비스 전용이므로 workmaru/_schema/README.md 참조.
탈퇴(withdraw) 시 정리 대상
withdraw 호출 시 다음 서브컬렉션이 삭제됩니다:
users/{uid}/equipments/*users/{uid}/certificates/*users/{uid}/resumes/*users/{uid}/requests/*users/{uid}/inquiries/*
users/{uid}/membership에 하나라도 남아있으면 탈퇴가 거부됩니다. users/{uid} 본문은 삭제하지 않고 개인정보 필드만 마스킹/삭제한 채 withdrawn=True로 표시됩니다.