"""Project logic.""" from typing import Any, Optional import config from lambdacommon.common_config import logger from src.constants.fields import PROJECT_EXCLUSION_LIST from src.logic.types import OpensearchBulkDocument from src.models import ows_project_manager from src.utils.document import prepare_for_upload from src.utils.parser import parse_spec_file def prepare_doc(event: dict[str, Any]) -> Optional[OpensearchBulkDocument]: """Construct an Opensearch document for the project index. Args: event (dict): event with project data from Maxwell's Returns: dict: Opensearch document ready for upload """ json_doc: dict[str, Any] = {} doc_type = "update" event_type = event.get("type") if not event_type or event.get("_metadata"): logger.warning("An event with incompatible format received: %s", event) return None if event_type == "delete": doc_type = "delete" if doc_type == "update": json_doc = ows_project_manager.get_project_document(event["data"]["project_id"]) if not json_doc: return None # Prevent subaccount_name from having a null value. if not json_doc.get("subaccount_name"): json_doc["subaccount_name"] = "" if event["data"]["project_id"] in PROJECT_EXCLUSION_LIST: # Delete the Opensearch record for exclusion list doc_type = "delete" doc: OpensearchBulkDocument = { "_index": config.PROJECT_INDEX_NAME, "_op_type": doc_type, "_id": event["data"]["project_id"], # no prefix like CS key. "doc": json_doc, # with this it will do upsert and not return NOT_FOUND error. "doc_as_upsert": True, } logger.info(f"{doc_type} project with id {event['data']['project_id']}") return prepare_for_upload(parse_spec_file("projects"), doc)