modules/firestore/main.tf (122 lines of code) (raw):

/** * Copyright 2024 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ locals { firestore_database_name = var.database_create ? google_firestore_database.firestore_database[0].name : var.database.name } resource "google_firestore_database" "firestore_database" { count = var.database_create ? 1 : 0 provider = google-beta project = var.project_id name = var.database.name location_id = var.database.location_id type = var.database.type concurrency_mode = var.database.concurrency_mode app_engine_integration_mode = var.database.app_engine_integration_mode point_in_time_recovery_enablement = var.database.point_in_time_recovery_enablement delete_protection_state = var.database.delete_protection_state deletion_policy = var.database.deletion_policy dynamic "cmek_config" { for_each = var.database.kms_key_name == null ? [] : [""] content { kms_key_name = var.database.kms_key_name } } lifecycle { precondition { condition = var.database.type != null && contains(["DATASTORE_MODE", "FIRESTORE_NATIVE"], var.database.type) error_message = "Invalid type. Possible values: DATASTORE_MODE, FIRESTORE_NATIVE" } precondition { condition = var.database.location_id != null error_message = "location_id must be set." } } } resource "google_firestore_backup_schedule" "firestore_backup_schedule" { count = var.backup_schedule == null ? 0 : 1 project = var.project_id database = local.firestore_database_name retention = var.backup_schedule.retention dynamic "daily_recurrence" { for_each = var.backup_schedule.daily_recurrence ? [""] : [] content { } } dynamic "weekly_recurrence" { for_each = var.backup_schedule.weekly_recurrence == null ? [] : [""] content { day = var.backup_schedule.weekly_recurrence } } } resource "google_firestore_field" "firestore_fields" { for_each = var.fields project = var.project_id database = local.firestore_database_name collection = each.value.collection field = each.value.field dynamic "index_config" { for_each = each.value.indexes == null ? [] : [""] content { dynamic "indexes" { for_each = each.value.indexes content { query_scope = indexes.value.query_scope order = indexes.value.order array_config = indexes.value.array_config } } } } dynamic "ttl_config" { for_each = each.value.ttl_config ? [""] : [] content { } } } resource "google_firestore_document" "firestore_documents" { for_each = var.documents project = var.project_id database = local.firestore_database_name collection = each.value.collection document_id = each.value.document_id fields = jsonencode(each.value.fields) } resource "google_firestore_index" "firestore_indexes" { for_each = var.indexes project = var.project_id database = local.firestore_database_name collection = each.value.collection dynamic "fields" { for_each = each.value.fields content { field_path = fields.value.field_path order = fields.value.order array_config = fields.value.array_config dynamic "vector_config" { for_each = fields.value.vector_config == null ? [] : [""] content { dimension = fields.value.vector_config.dimension dynamic "flat" { for_each = fields.value.vector_config.flat ? [""] : [] content { } } } } } } }