콘텐츠로 이동

search_index 스키마

Firestore 트리거로 자동 생성·동기화되는 검색 인덱스 컬렉션. 회사 멤버/현장 멤버/현장 장비/회사 기본 정보의 경량 스냅샷을 한 문서에 배열 형태로 집계하여, 검색 시 단일 읽기로 해결하게 만듭니다.

저장 위치

companies/{company_id}/search_index/{index_id}
  • index_id == company_id: 회사 레벨 인덱스 (회사 멤버 + 소속 회사 리스트)
  • index_id == site_id: 현장 레벨 인덱스 (해당 현장의 인력/장비)

상태 흐름

자동 생성/동기화: functions/endpoints/con24/triggers.pyfirestore_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 필드 변화로만 판정됩니다.