// Copyright 2018 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.

syntax = "proto3";

package google.firestore.admin.v1beta2;

import "google/api/annotations.proto";
import "google/firestore/admin/v1beta2/field.proto";
import "google/firestore/admin/v1beta2/index.proto";
import "google/longrunning/operations.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/field_mask.proto";

option csharp_namespace = "Google.Cloud.Firestore.Admin.V1Beta2";
option go_package = "google.golang.org/genproto/googleapis/firestore/admin/v1beta2;admin";
option java_multiple_files = true;
option java_outer_classname = "FirestoreAdminProto";
option java_package = "com.google.firestore.admin.v1beta2";
option objc_class_prefix = "GCFS";


// Operations are created by service `FirestoreAdmin`, but are accessed via
// service `google.longrunning.Operations`.
service FirestoreAdmin {
  // Gets the metadata and configuration for a Field.
  rpc GetField(GetFieldRequest) returns (Field) {
    option (google.api.http) = {
      get: "/v1beta2/{name=projects/*/databases/*/collectionGroups/*/fields/*}"
    };
  }

  // Updates a field configuration. Currently, field updates apply only to
  // single field index configuration. However, calls to
  // [FirestoreAdmin.UpdateField][google.firestore.admin.v1beta2.FirestoreAdmin.UpdateField] should provide a field mask to avoid
  // changing any configuration that the caller isn't aware of. The field mask
  // should be specified as: `{ paths: "index_config" }`.
  //
  // This call returns a [google.longrunning.Operation][google.longrunning.Operation] which may be used to
  // track the status of the field update. The metadata for
  // the operation will be the type [FieldOperationMetadata][google.firestore.admin.v1beta2.FieldOperationMetadata].
  //
  // To configure the default field settings for the database, use
  // the special `Field` with resource name:
  // `/projects/{project_id}/databases/{database_id}/collectionGroups/__default__/fields/*`.
  rpc UpdateField(UpdateFieldRequest) returns (google.longrunning.Operation) {
    option (google.api.http) = {
      patch: "/v1beta2/{field.name=projects/*/databases/*/collectionGroups/*/fields/*}"
      body: "field"
    };
  }

  // Lists the field configuration and metadata for this database.
  //
  // Currently, [FirestoreAdmin.ListFields][google.firestore.admin.v1beta2.FirestoreAdmin.ListFields] only supports listing fields
  // that have been explicitly overridden. To issue this query, call
  // [FirestoreAdmin.ListFields][google.firestore.admin.v1beta2.FirestoreAdmin.ListFields] with the filter set to
  // `indexConfig.usesAncestorConfig:false`.
  rpc ListFields(ListFieldsRequest) returns (ListFieldsResponse) {
    option (google.api.http) = {
      get: "/v1beta2/{parent=projects/*/databases/*/collectionGroups/*}/fields"
    };
  }
}

// The request for [FirestoreAdmin.UpdateField][google.firestore.admin.v1beta2.FirestoreAdmin.UpdateField].
message UpdateFieldRequest {
  // The field to be updated.
  Field field = 1;

  // A mask, relative to the field. If specified, only configuration specified
  // by this field_mask will be updated in the field.
  google.protobuf.FieldMask update_mask = 2;
}

// The request for [FirestoreAdmin.GetField][google.firestore.admin.v1beta2.FirestoreAdmin.GetField].
message GetFieldRequest {
  // A name of the form
  // `/projects/{project_id}/databases/{database_id}/collectionGroups/{collection_id}/fields/{field_id}`
  string name = 1;
}

// The request for [FirestoreAdmin.ListFields][google.firestore.admin.v1beta2.FirestoreAdmin.ListFields].
message ListFieldsRequest {
  // A parent name of the form
  // `/projects/{project_id}/databases/{database_id}/collectionGroups/{collection_id}`
  string parent = 1;

  // The filter to apply to list results. Currently,
  // [FirestoreAdmin.ListFields][google.firestore.admin.v1beta2.FirestoreAdmin.ListFields] only supports listing fields
  // that have been explicitly overridden. To issue this query, call
  // [FirestoreAdmin.ListFields][google.firestore.admin.v1beta2.FirestoreAdmin.ListFields] with the filter set to
  // `indexConfig.usesAncestorConfig:false`.
  string filter = 2;

  // The number of results to return.
  int32 page_size = 3;

  // A page token, returned from a previous call to
  // [FirestoreAdmin.ListFields][google.firestore.admin.v1beta2.FirestoreAdmin.ListFields], that may be used to get the next
  // page of results.
  string page_token = 4;
}

// The response for [FirestoreAdmin.ListFields][google.firestore.admin.v1beta2.FirestoreAdmin.ListFields].
message ListFieldsResponse {
  // The requested fields.
  repeated Field fields = 1;

  // A page token that may be used to request another page of results. If blank,
  // this is the last page.
  string next_page_token = 2;
}
