search_index 스키마
Firestore 트리거로 자동 생성·동기화되는 검색 인덱스 컬렉션. 회사 멤버/현장 멤버/현장 장비/회사 기본 정보의 경량 스냅샷을 한 문서에 배열 형태로 집계하여, 검색 시 단일 읽기로 해결하게 만듭니다.
저장 위치
companies/{company_id}/search_index/{index_id}
index_id == company_id: 회사 레벨 인덱스 (회사 멤버 + 소속 회사 리스트)
index_id == site_id: 현장 레벨 인덱스 (해당 현장의 인력/장비)
상태 흐름
자동 생성/동기화: functions/endpoints/con24/triggers.py의 firestore_fn.on_document_written 트리거가 다음 이벤트에서 갱신합니다.
| 트리거 소스 |
갱신되는 인덱스 |
companies/{cid}/members/{mid} |
companies/{cid}/search_index/{cid} (current_members / resign_members) |
companies/{cid}/sites/{sid}/members/{mid} |
companies/{cid}/search_index/{sid} (current_members / resign_members) |
companies/{cid}/sites/{sid}/equipments/{eid} |
companies/{cid}/search_index/{sid} (current_equipments / resign_equipments) |
companies/{cid} |
companies/{cid}/search_index/{cid} (회사 스냅샷) |
트리거는 resign 플래그의 before/after 비교로 입사/퇴사 판정을 하고, 대상 배열로 이동시킵니다.
문서 필드 (회사 레벨 index_id == company_id)
| 필드 |
타입 |
설명 |
current_members |
object[] |
재직 중인 회사 멤버 스냅샷 |
resign_members |
object[] |
퇴사한 회사 멤버 스냅샷 |
companies_list |
object[] |
해당 회사에 연관된 회사들 ({company_id, name}) |
문서 필드 (현장 레벨 index_id == site_id)
| 필드 |
타입 |
설명 |
current_members |
object[] |
현장 재직 근로자 스냅샷 |
resign_members |
object[] |
현장 퇴사 근로자 스냅샷 |
current_equipments |
object[] |
현장 배정 장비 스냅샷 |
resign_equipments |
object[] |
현장 해제 장비 스냅샷 |
Member 스냅샷 공통 필드
배열 원소 하나의 형태 (회사 멤버 / 현장 멤버 공통):
| 필드 |
타입 |
설명 |
UID |
string |
멤버 UID |
name |
string |
이름 스냅샷 |
phone_masked |
string |
"010-****-XXXX" 마스킹 전화번호 |
role |
string |
역할 (owner/admin/manager/worker 등) |
Equipment 스냅샷 필드 (현장 레벨만)
| 필드 |
타입 |
설명 |
equipment_id |
string |
장비 문서 ID |
UID |
string |
장비 소유자 UID |
name |
string |
소유자 이름 |
equipment_type |
string |
장비 종류 |
equipment_name |
string |
장비명 |
equipment_number |
string |
장비 번호 |
phone_masked |
string |
소유자 마스킹 전화번호 |
예시 문서 (현장 레벨)
{
"current_members": [
{
"UID": "uid_worker1",
"name": "홍길동",
"phone_masked": "010-****-5678",
"role": "worker"
}
],
"resign_members": [],
"current_equipments": [
{
"equipment_id": "eq_001",
"UID": "uid_driver1",
"name": "김기사",
"equipment_type": "굴착기",
"equipment_name": "BX200",
"equipment_number": "서울 01가 1234",
"phone_masked": "010-****-9876"
}
],
"resign_equipments": []
}
주의
- 이 컬렉션은 프론트/백엔드에서 직접 쓰기 금지. 반드시 소스 컬렉션(
members, equipments)을 수정하고 트리거가 동기화하도록 합니다.
- 재직/퇴사 전환은 소스 문서의
resign 필드 변화로만 판정됩니다.