// Copyright 2025 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.cloud.apigeeregistry.v1;

import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/httpbody.proto";
import "google/api/resource.proto";
import "google/cloud/apigeeregistry/v1/registry_models.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/field_mask.proto";

option csharp_namespace = "Google.Cloud.ApigeeRegistry.V1";
option go_package = "cloud.google.com/go/apigeeregistry/apiv1/apigeeregistrypb;apigeeregistrypb";
option java_multiple_files = true;
option java_outer_classname = "RegistryServiceProto";
option java_package = "com.google.cloud.apigeeregistry.v1";
option php_namespace = "Google\\Cloud\\ApigeeRegistry\\V1";
option ruby_package = "Google::Cloud::ApigeeRegistry::V1";

// The Registry service allows teams to manage descriptions of APIs.
service Registry {
  option (google.api.default_host) = "apigeeregistry.googleapis.com";
  option (google.api.oauth_scopes) = "https://www.googleapis.com/auth/cloud-platform";

  // Returns matching APIs.
  rpc ListApis(ListApisRequest) returns (ListApisResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*}/apis"
    };
    option (google.api.method_signature) = "parent";
  }

  // Returns a specified API.
  rpc GetApi(GetApiRequest) returns (Api) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/apis/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a specified API.
  rpc CreateApi(CreateApiRequest) returns (Api) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*}/apis"
      body: "api"
    };
    option (google.api.method_signature) = "parent,api,api_id";
  }

  // Used to modify a specified API.
  rpc UpdateApi(UpdateApiRequest) returns (Api) {
    option (google.api.http) = {
      patch: "/v1/{api.name=projects/*/locations/*/apis/*}"
      body: "api"
    };
    option (google.api.method_signature) = "api,update_mask";
  }

  // Removes a specified API and all of the resources that it
  // owns.
  rpc DeleteApi(DeleteApiRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/apis/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Returns matching versions.
  rpc ListApiVersions(ListApiVersionsRequest) returns (ListApiVersionsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*/apis/*}/versions"
    };
    option (google.api.method_signature) = "parent";
  }

  // Returns a specified version.
  rpc GetApiVersion(GetApiVersionRequest) returns (ApiVersion) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/apis/*/versions/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a specified version.
  rpc CreateApiVersion(CreateApiVersionRequest) returns (ApiVersion) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*/apis/*}/versions"
      body: "api_version"
    };
    option (google.api.method_signature) = "parent,api_version,api_version_id";
  }

  // Used to modify a specified version.
  rpc UpdateApiVersion(UpdateApiVersionRequest) returns (ApiVersion) {
    option (google.api.http) = {
      patch: "/v1/{api_version.name=projects/*/locations/*/apis/*/versions/*}"
      body: "api_version"
    };
    option (google.api.method_signature) = "api_version,update_mask";
  }

  // Removes a specified version and all of the resources that
  // it owns.
  rpc DeleteApiVersion(DeleteApiVersionRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/apis/*/versions/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Returns matching specs.
  rpc ListApiSpecs(ListApiSpecsRequest) returns (ListApiSpecsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*/apis/*/versions/*}/specs"
    };
    option (google.api.method_signature) = "parent";
  }

  // Returns a specified spec.
  rpc GetApiSpec(GetApiSpecRequest) returns (ApiSpec) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/apis/*/versions/*/specs/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Returns the contents of a specified spec.
  // If specs are stored with GZip compression, the default behavior
  // is to return the spec uncompressed (the mime_type response field
  // indicates the exact format returned).
  rpc GetApiSpecContents(GetApiSpecContentsRequest) returns (google.api.HttpBody) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/apis/*/versions/*/specs/*}:getContents"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a specified spec.
  rpc CreateApiSpec(CreateApiSpecRequest) returns (ApiSpec) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*/apis/*/versions/*}/specs"
      body: "api_spec"
    };
    option (google.api.method_signature) = "parent,api_spec,api_spec_id";
  }

  // Used to modify a specified spec.
  rpc UpdateApiSpec(UpdateApiSpecRequest) returns (ApiSpec) {
    option (google.api.http) = {
      patch: "/v1/{api_spec.name=projects/*/locations/*/apis/*/versions/*/specs/*}"
      body: "api_spec"
    };
    option (google.api.method_signature) = "api_spec,update_mask";
  }

  // Removes a specified spec, all revisions, and all child
  // resources (e.g., artifacts).
  rpc DeleteApiSpec(DeleteApiSpecRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/apis/*/versions/*/specs/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Adds a tag to a specified revision of a spec.
  rpc TagApiSpecRevision(TagApiSpecRevisionRequest) returns (ApiSpec) {
    option (google.api.http) = {
      post: "/v1/{name=projects/*/locations/*/apis/*/versions/*/specs/*}:tagRevision"
      body: "*"
    };
  }

  // Lists all revisions of a spec.
  // Revisions are returned in descending order of revision creation time.
  rpc ListApiSpecRevisions(ListApiSpecRevisionsRequest) returns (ListApiSpecRevisionsResponse) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/apis/*/versions/*/specs/*}:listRevisions"
    };
  }

  // Sets the current revision to a specified prior revision.
  // Note that this creates a new revision with a new revision ID.
  rpc RollbackApiSpec(RollbackApiSpecRequest) returns (ApiSpec) {
    option (google.api.http) = {
      post: "/v1/{name=projects/*/locations/*/apis/*/versions/*/specs/*}:rollback"
      body: "*"
    };
  }

  // Deletes a revision of a spec.
  rpc DeleteApiSpecRevision(DeleteApiSpecRevisionRequest) returns (ApiSpec) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/apis/*/versions/*/specs/*}:deleteRevision"
    };
    option (google.api.method_signature) = "name";
  }

  // Returns matching deployments.
  rpc ListApiDeployments(ListApiDeploymentsRequest) returns (ListApiDeploymentsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*/apis/*}/deployments"
    };
    option (google.api.method_signature) = "parent";
  }

  // Returns a specified deployment.
  rpc GetApiDeployment(GetApiDeploymentRequest) returns (ApiDeployment) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/apis/*/deployments/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a specified deployment.
  rpc CreateApiDeployment(CreateApiDeploymentRequest) returns (ApiDeployment) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*/apis/*}/deployments"
      body: "api_deployment"
    };
    option (google.api.method_signature) = "parent,api_deployment,api_deployment_id";
  }

  // Used to modify a specified deployment.
  rpc UpdateApiDeployment(UpdateApiDeploymentRequest) returns (ApiDeployment) {
    option (google.api.http) = {
      patch: "/v1/{api_deployment.name=projects/*/locations/*/apis/*/deployments/*}"
      body: "api_deployment"
    };
    option (google.api.method_signature) = "api_deployment,update_mask";
  }

  // Removes a specified deployment, all revisions, and all
  // child resources (e.g., artifacts).
  rpc DeleteApiDeployment(DeleteApiDeploymentRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/apis/*/deployments/*}"
    };
    option (google.api.method_signature) = "name";
  }

  // Adds a tag to a specified revision of a
  // deployment.
  rpc TagApiDeploymentRevision(TagApiDeploymentRevisionRequest) returns (ApiDeployment) {
    option (google.api.http) = {
      post: "/v1/{name=projects/*/locations/*/apis/*/deployments/*}:tagRevision"
      body: "*"
    };
  }

  // Lists all revisions of a deployment.
  // Revisions are returned in descending order of revision creation time.
  rpc ListApiDeploymentRevisions(ListApiDeploymentRevisionsRequest) returns (ListApiDeploymentRevisionsResponse) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/apis/*/deployments/*}:listRevisions"
    };
  }

  // Sets the current revision to a specified prior
  // revision. Note that this creates a new revision with a new revision ID.
  rpc RollbackApiDeployment(RollbackApiDeploymentRequest) returns (ApiDeployment) {
    option (google.api.http) = {
      post: "/v1/{name=projects/*/locations/*/apis/*/deployments/*}:rollback"
      body: "*"
    };
  }

  // Deletes a revision of a deployment.
  rpc DeleteApiDeploymentRevision(DeleteApiDeploymentRevisionRequest) returns (ApiDeployment) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/apis/*/deployments/*}:deleteRevision"
    };
    option (google.api.method_signature) = "name";
  }

  // Returns matching artifacts.
  rpc ListArtifacts(ListArtifactsRequest) returns (ListArtifactsResponse) {
    option (google.api.http) = {
      get: "/v1/{parent=projects/*/locations/*}/artifacts"
      additional_bindings {
        get: "/v1/{parent=projects/*/locations/*/apis/*}/artifacts"
      }
      additional_bindings {
        get: "/v1/{parent=projects/*/locations/*/apis/*/versions/*}/artifacts"
      }
      additional_bindings {
        get: "/v1/{parent=projects/*/locations/*/apis/*/versions/*/specs/*}/artifacts"
      }
      additional_bindings {
        get: "/v1/{parent=projects/*/locations/*/apis/*/deployments/*}/artifacts"
      }
    };
    option (google.api.method_signature) = "parent";
  }

  // Returns a specified artifact.
  rpc GetArtifact(GetArtifactRequest) returns (Artifact) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/artifacts/*}"
      additional_bindings {
        get: "/v1/{name=projects/*/locations/*/apis/*/artifacts/*}"
      }
      additional_bindings {
        get: "/v1/{name=projects/*/locations/*/apis/*/versions/*/artifacts/*}"
      }
      additional_bindings {
        get: "/v1/{name=projects/*/locations/*/apis/*/versions/*/specs/*/artifacts/*}"
      }
      additional_bindings {
        get: "/v1/{name=projects/*/locations/*/apis/*/deployments/*/artifacts/*}"
      }
    };
    option (google.api.method_signature) = "name";
  }

  // Returns the contents of a specified artifact.
  // If artifacts are stored with GZip compression, the default behavior
  // is to return the artifact uncompressed (the mime_type response field
  // indicates the exact format returned).
  rpc GetArtifactContents(GetArtifactContentsRequest) returns (google.api.HttpBody) {
    option (google.api.http) = {
      get: "/v1/{name=projects/*/locations/*/artifacts/*}:getContents"
      additional_bindings {
        get: "/v1/{name=projects/*/locations/*/apis/*/artifacts/*}:getContents"
      }
      additional_bindings {
        get: "/v1/{name=projects/*/locations/*/apis/*/versions/*/artifacts/*}:getContents"
      }
      additional_bindings {
        get: "/v1/{name=projects/*/locations/*/apis/*/versions/*/specs/*/artifacts/*}:getContents"
      }
      additional_bindings {
        get: "/v1/{name=projects/*/locations/*/apis/*/deployments/*/artifacts/*}:getContents"
      }
    };
    option (google.api.method_signature) = "name";
  }

  // Creates a specified artifact.
  rpc CreateArtifact(CreateArtifactRequest) returns (Artifact) {
    option (google.api.http) = {
      post: "/v1/{parent=projects/*/locations/*}/artifacts"
      body: "artifact"
      additional_bindings {
        post: "/v1/{parent=projects/*/locations/*/apis/*}/artifacts"
        body: "artifact"
      }
      additional_bindings {
        post: "/v1/{parent=projects/*/locations/*/apis/*/versions/*}/artifacts"
        body: "artifact"
      }
      additional_bindings {
        post: "/v1/{parent=projects/*/locations/*/apis/*/versions/*/specs/*}/artifacts"
        body: "artifact"
      }
      additional_bindings {
        post: "/v1/{parent=projects/*/locations/*/apis/*/deployments/*}/artifacts"
        body: "artifact"
      }
    };
    option (google.api.method_signature) = "parent,artifact,artifact_id";
  }

  // Used to replace a specified artifact.
  rpc ReplaceArtifact(ReplaceArtifactRequest) returns (Artifact) {
    option (google.api.http) = {
      put: "/v1/{artifact.name=projects/*/locations/*/artifacts/*}"
      body: "artifact"
      additional_bindings {
        put: "/v1/{artifact.name=projects/*/locations/*/apis/*/artifacts/*}"
        body: "artifact"
      }
      additional_bindings {
        put: "/v1/{artifact.name=projects/*/locations/*/apis/*/versions/*/artifacts/*}"
        body: "artifact"
      }
      additional_bindings {
        put: "/v1/{artifact.name=projects/*/locations/*/apis/*/versions/*/specs/*/artifacts/*}"
        body: "artifact"
      }
      additional_bindings {
        put: "/v1/{artifact.name=projects/*/locations/*/apis/*/deployments/*/artifacts/*}"
        body: "artifact"
      }
    };
    option (google.api.method_signature) = "artifact";
  }

  // Removes a specified artifact.
  rpc DeleteArtifact(DeleteArtifactRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1/{name=projects/*/locations/*/artifacts/*}"
      additional_bindings {
        delete: "/v1/{name=projects/*/locations/*/apis/*/artifacts/*}"
      }
      additional_bindings {
        delete: "/v1/{name=projects/*/locations/*/apis/*/versions/*/artifacts/*}"
      }
      additional_bindings {
        delete: "/v1/{name=projects/*/locations/*/apis/*/versions/*/specs/*/artifacts/*}"
      }
      additional_bindings {
        delete: "/v1/{name=projects/*/locations/*/apis/*/deployments/*/artifacts/*}"
      }
    };
    option (google.api.method_signature) = "name";
  }
}

// Request message for ListApis.
message ListApisRequest {
  // Required. The parent, which owns this collection of APIs.
  // Format: `projects/*/locations/*`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "apigeeregistry.googleapis.com/Api"
    }
  ];

  // The maximum number of APIs to return.
  // The service may return fewer than this value.
  // If unspecified, at most 50 values will be returned.
  // The maximum is 1000; values above 1000 will be coerced to 1000.
  int32 page_size = 2;

  // A page token, received from a previous `ListApis` call.
  // Provide this to retrieve the subsequent page.
  //
  // When paginating, all other parameters provided to `ListApis` must match
  // the call that provided the page token.
  string page_token = 3;

  // An expression that can be used to filter the list. Filters use the Common
  // Expression Language and can refer to all message fields.
  string filter = 4;
}

// Response message for ListApis.
message ListApisResponse {
  // The APIs from the specified publisher.
  repeated Api apis = 1;

  // A token, which can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request message for GetApi.
message GetApiRequest {
  // Required. The name of the API to retrieve.
  // Format: `projects/*/locations/*/apis/*`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "apigeeregistry.googleapis.com/Api"
    }
  ];
}

// Request message for CreateApi.
message CreateApiRequest {
  // Required. The parent, which owns this collection of APIs.
  // Format: `projects/*/locations/*`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "apigeeregistry.googleapis.com/Api"
    }
  ];

  // Required. The API to create.
  Api api = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The ID to use for the API, which will become the final component of
  // the API's resource name.
  //
  // This value should be 4-63 characters, and valid characters
  // are /[a-z][0-9]-/.
  //
  // Following AIP-162, IDs must not have the form of a UUID.
  string api_id = 3 [(google.api.field_behavior) = REQUIRED];
}

// Request message for UpdateApi.
message UpdateApiRequest {
  // Required. The API to update.
  //
  // The `name` field is used to identify the API to update.
  // Format: `projects/*/locations/*/apis/*`
  Api api = 1 [(google.api.field_behavior) = REQUIRED];

  // The list of fields to be updated. If omitted, all fields are updated that
  // are set in the request message (fields set to default values are ignored).
  // If an asterisk "*" is specified, all fields are updated, including fields
  // that are unspecified/default in the request.
  google.protobuf.FieldMask update_mask = 2;

  // If set to true, and the API is not found, a new API will be created.
  // In this situation, `update_mask` is ignored.
  bool allow_missing = 3;
}

// Request message for DeleteApi.
message DeleteApiRequest {
  // Required. The name of the API to delete.
  // Format: `projects/*/locations/*/apis/*`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "apigeeregistry.googleapis.com/Api"
    }
  ];

  // If set to true, any child resources will also be deleted.
  // (Otherwise, the request will only work if there are no child resources.)
  bool force = 2;
}

// Request message for ListApiVersions.
message ListApiVersionsRequest {
  // Required. The parent, which owns this collection of versions.
  // Format: `projects/*/locations/*/apis/*`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "apigeeregistry.googleapis.com/ApiVersion"
    }
  ];

  // The maximum number of versions to return.
  // The service may return fewer than this value.
  // If unspecified, at most 50 values will be returned.
  // The maximum is 1000; values above 1000 will be coerced to 1000.
  int32 page_size = 2;

  // A page token, received from a previous `ListApiVersions` call.
  // Provide this to retrieve the subsequent page.
  //
  // When paginating, all other parameters provided to `ListApiVersions` must
  // match the call that provided the page token.
  string page_token = 3;

  // An expression that can be used to filter the list. Filters use the Common
  // Expression Language and can refer to all message fields.
  string filter = 4;
}

// Response message for ListApiVersions.
message ListApiVersionsResponse {
  // The versions from the specified publisher.
  repeated ApiVersion api_versions = 1;

  // A token, which can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request message for GetApiVersion.
message GetApiVersionRequest {
  // Required. The name of the version to retrieve.
  // Format: `projects/*/locations/*/apis/*/versions/*`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "apigeeregistry.googleapis.com/ApiVersion"
    }
  ];
}

// Request message for CreateApiVersion.
message CreateApiVersionRequest {
  // Required. The parent, which owns this collection of versions.
  // Format: `projects/*/locations/*/apis/*`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "apigeeregistry.googleapis.com/ApiVersion"
    }
  ];

  // Required. The version to create.
  ApiVersion api_version = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The ID to use for the version, which will become the final component of
  // the version's resource name.
  //
  // This value should be 1-63 characters, and valid characters
  // are /[a-z][0-9]-/.
  //
  // Following AIP-162, IDs must not have the form of a UUID.
  string api_version_id = 3 [(google.api.field_behavior) = REQUIRED];
}

// Request message for UpdateApiVersion.
message UpdateApiVersionRequest {
  // Required. The version to update.
  //
  // The `name` field is used to identify the version to update.
  // Format: `projects/*/locations/*/apis/*/versions/*`
  ApiVersion api_version = 1 [(google.api.field_behavior) = REQUIRED];

  // The list of fields to be updated. If omitted, all fields are updated that
  // are set in the request message (fields set to default values are ignored).
  // If an asterisk "*" is specified, all fields are updated, including fields
  // that are unspecified/default in the request.
  google.protobuf.FieldMask update_mask = 2;

  // If set to true, and the version is not found, a new version will be
  // created. In this situation, `update_mask` is ignored.
  bool allow_missing = 3;
}

// Request message for DeleteApiVersion.
message DeleteApiVersionRequest {
  // Required. The name of the version to delete.
  // Format: `projects/*/locations/*/apis/*/versions/*`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "apigeeregistry.googleapis.com/ApiVersion"
    }
  ];

  // If set to true, any child resources will also be deleted.
  // (Otherwise, the request will only work if there are no child resources.)
  bool force = 2;
}

// Request message for ListApiSpecs.
message ListApiSpecsRequest {
  // Required. The parent, which owns this collection of specs.
  // Format: `projects/*/locations/*/apis/*/versions/*`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "apigeeregistry.googleapis.com/ApiSpec"
    }
  ];

  // The maximum number of specs to return.
  // The service may return fewer than this value.
  // If unspecified, at most 50 values will be returned.
  // The maximum is 1000; values above 1000 will be coerced to 1000.
  int32 page_size = 2;

  // A page token, received from a previous `ListApiSpecs` call.
  // Provide this to retrieve the subsequent page.
  //
  // When paginating, all other parameters provided to `ListApiSpecs` must match
  // the call that provided the page token.
  string page_token = 3;

  // An expression that can be used to filter the list. Filters use the Common
  // Expression Language and can refer to all message fields except contents.
  string filter = 4;
}

// Response message for ListApiSpecs.
message ListApiSpecsResponse {
  // The specs from the specified publisher.
  repeated ApiSpec api_specs = 1;

  // A token, which can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request message for GetApiSpec.
message GetApiSpecRequest {
  // Required. The name of the spec to retrieve.
  // Format: `projects/*/locations/*/apis/*/versions/*/specs/*`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "apigeeregistry.googleapis.com/ApiSpec"
    }
  ];
}

// Request message for GetApiSpecContents.
message GetApiSpecContentsRequest {
  // Required. The name of the spec whose contents should be retrieved.
  // Format: `projects/*/locations/*/apis/*/versions/*/specs/*`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "apigeeregistry.googleapis.com/ApiSpec"
    }
  ];
}

// Request message for CreateApiSpec.
message CreateApiSpecRequest {
  // Required. The parent, which owns this collection of specs.
  // Format: `projects/*/locations/*/apis/*/versions/*`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "apigeeregistry.googleapis.com/ApiSpec"
    }
  ];

  // Required. The spec to create.
  ApiSpec api_spec = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The ID to use for the spec, which will become the final component of
  // the spec's resource name.
  //
  // This value should be 4-63 characters, and valid characters
  // are /[a-z][0-9]-/.
  //
  // Following AIP-162, IDs must not have the form of a UUID.
  string api_spec_id = 3 [(google.api.field_behavior) = REQUIRED];
}

// Request message for UpdateApiSpec.
message UpdateApiSpecRequest {
  // Required. The spec to update.
  //
  // The `name` field is used to identify the spec to update.
  // Format: `projects/*/locations/*/apis/*/versions/*/specs/*`
  ApiSpec api_spec = 1 [(google.api.field_behavior) = REQUIRED];

  // The list of fields to be updated. If omitted, all fields are updated that
  // are set in the request message (fields set to default values are ignored).
  // If an asterisk "*" is specified, all fields are updated, including fields
  // that are unspecified/default in the request.
  google.protobuf.FieldMask update_mask = 2;

  // If set to true, and the spec is not found, a new spec will be created.
  // In this situation, `update_mask` is ignored.
  bool allow_missing = 3;
}

// Request message for DeleteApiSpec.
message DeleteApiSpecRequest {
  // Required. The name of the spec to delete.
  // Format: `projects/*/locations/*/apis/*/versions/*/specs/*`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "apigeeregistry.googleapis.com/ApiSpec"
    }
  ];

  // If set to true, any child resources will also be deleted.
  // (Otherwise, the request will only work if there are no child resources.)
  bool force = 2;
}

// Request message for TagApiSpecRevision.
message TagApiSpecRevisionRequest {
  // Required. The name of the spec to be tagged, including the revision ID.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "apigeeregistry.googleapis.com/ApiSpec"
    }
  ];

  // Required. The tag to apply.
  // The tag should be at most 40 characters, and match `[a-z][a-z0-9-]{3,39}`.
  string tag = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request message for ListApiSpecRevisions.
message ListApiSpecRevisionsRequest {
  // Required. The name of the spec to list revisions for.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "apigeeregistry.googleapis.com/ApiSpec"
    }
  ];

  // The maximum number of revisions to return per page.
  int32 page_size = 2;

  // The page token, received from a previous ListApiSpecRevisions call.
  // Provide this to retrieve the subsequent page.
  string page_token = 3;
}

// Response message for ListApiSpecRevisionsResponse.
message ListApiSpecRevisionsResponse {
  // The revisions of the spec.
  repeated ApiSpec api_specs = 1;

  // A token that can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request message for RollbackApiSpec.
message RollbackApiSpecRequest {
  // Required. The spec being rolled back.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "apigeeregistry.googleapis.com/ApiSpec"
    }
  ];

  // Required. The revision ID to roll back to.
  // It must be a revision of the same spec.
  //
  //   Example: `c7cfa2a8`
  string revision_id = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request message for DeleteApiSpecRevision.
message DeleteApiSpecRevisionRequest {
  // Required. The name of the spec revision to be deleted,
  // with a revision ID explicitly included.
  //
  // Example:
  // `projects/sample/locations/global/apis/petstore/versions/1.0.0/specs/openapi.yaml@c7cfa2a8`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "apigeeregistry.googleapis.com/ApiSpec"
    }
  ];
}

// Request message for ListApiDeployments.
message ListApiDeploymentsRequest {
  // Required. The parent, which owns this collection of deployments.
  // Format: `projects/*/locations/*/apis/*`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "apigeeregistry.googleapis.com/ApiDeployment"
    }
  ];

  // The maximum number of deployments to return.
  // The service may return fewer than this value.
  // If unspecified, at most 50 values will be returned.
  // The maximum is 1000; values above 1000 will be coerced to 1000.
  int32 page_size = 2;

  // A page token, received from a previous `ListApiDeployments` call.
  // Provide this to retrieve the subsequent page.
  //
  // When paginating, all other parameters provided to `ListApiDeployments` must
  // match the call that provided the page token.
  string page_token = 3;

  // An expression that can be used to filter the list. Filters use the Common
  // Expression Language and can refer to all message fields.
  string filter = 4;
}

// Response message for ListApiDeployments.
message ListApiDeploymentsResponse {
  // The deployments from the specified publisher.
  repeated ApiDeployment api_deployments = 1;

  // A token, which can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request message for GetApiDeployment.
message GetApiDeploymentRequest {
  // Required. The name of the deployment to retrieve.
  // Format: `projects/*/locations/*/apis/*/deployments/*`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "apigeeregistry.googleapis.com/ApiDeployment"
    }
  ];
}

// Request message for CreateApiDeployment.
message CreateApiDeploymentRequest {
  // Required. The parent, which owns this collection of deployments.
  // Format: `projects/*/locations/*/apis/*`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "apigeeregistry.googleapis.com/ApiDeployment"
    }
  ];

  // Required. The deployment to create.
  ApiDeployment api_deployment = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The ID to use for the deployment, which will become the final component of
  // the deployment's resource name.
  //
  // This value should be 4-63 characters, and valid characters
  // are /[a-z][0-9]-/.
  //
  // Following AIP-162, IDs must not have the form of a UUID.
  string api_deployment_id = 3 [(google.api.field_behavior) = REQUIRED];
}

// Request message for UpdateApiDeployment.
message UpdateApiDeploymentRequest {
  // Required. The deployment to update.
  //
  // The `name` field is used to identify the deployment to update.
  // Format: `projects/*/locations/*/apis/*/deployments/*`
  ApiDeployment api_deployment = 1 [(google.api.field_behavior) = REQUIRED];

  // The list of fields to be updated. If omitted, all fields are updated that
  // are set in the request message (fields set to default values are ignored).
  // If an asterisk "*" is specified, all fields are updated, including fields
  // that are unspecified/default in the request.
  google.protobuf.FieldMask update_mask = 2;

  // If set to true, and the deployment is not found, a new deployment will be
  // created. In this situation, `update_mask` is ignored.
  bool allow_missing = 3;
}

// Request message for DeleteApiDeployment.
message DeleteApiDeploymentRequest {
  // Required. The name of the deployment to delete.
  // Format: `projects/*/locations/*/apis/*/deployments/*`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "apigeeregistry.googleapis.com/ApiDeployment"
    }
  ];

  // If set to true, any child resources will also be deleted.
  // (Otherwise, the request will only work if there are no child resources.)
  bool force = 2;
}

// Request message for TagApiDeploymentRevision.
message TagApiDeploymentRevisionRequest {
  // Required. The name of the deployment to be tagged, including the revision ID.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "apigeeregistry.googleapis.com/ApiDeployment"
    }
  ];

  // Required. The tag to apply.
  // The tag should be at most 40 characters, and match `[a-z][a-z0-9-]{3,39}`.
  string tag = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request message for ListApiDeploymentRevisions.
message ListApiDeploymentRevisionsRequest {
  // Required. The name of the deployment to list revisions for.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "apigeeregistry.googleapis.com/ApiDeployment"
    }
  ];

  // The maximum number of revisions to return per page.
  int32 page_size = 2;

  // The page token, received from a previous ListApiDeploymentRevisions call.
  // Provide this to retrieve the subsequent page.
  string page_token = 3;
}

// Response message for ListApiDeploymentRevisionsResponse.
message ListApiDeploymentRevisionsResponse {
  // The revisions of the deployment.
  repeated ApiDeployment api_deployments = 1;

  // A token that can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request message for RollbackApiDeployment.
message RollbackApiDeploymentRequest {
  // Required. The deployment being rolled back.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "apigeeregistry.googleapis.com/ApiDeployment"
    }
  ];

  // Required. The revision ID to roll back to.
  // It must be a revision of the same deployment.
  //
  //   Example: `c7cfa2a8`
  string revision_id = 2 [(google.api.field_behavior) = REQUIRED];
}

// Request message for DeleteApiDeploymentRevision.
message DeleteApiDeploymentRevisionRequest {
  // Required. The name of the deployment revision to be deleted,
  // with a revision ID explicitly included.
  //
  // Example:
  // `projects/sample/locations/global/apis/petstore/deployments/prod@c7cfa2a8`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "apigeeregistry.googleapis.com/ApiDeployment"
    }
  ];
}

// Request message for ListArtifacts.
message ListArtifactsRequest {
  // Required. The parent, which owns this collection of artifacts.
  // Format: `{parent}`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "apigeeregistry.googleapis.com/Artifact"
    }
  ];

  // The maximum number of artifacts to return.
  // The service may return fewer than this value.
  // If unspecified, at most 50 values will be returned.
  // The maximum is 1000; values above 1000 will be coerced to 1000.
  int32 page_size = 2;

  // A page token, received from a previous `ListArtifacts` call.
  // Provide this to retrieve the subsequent page.
  //
  // When paginating, all other parameters provided to `ListArtifacts` must
  // match the call that provided the page token.
  string page_token = 3;

  // An expression that can be used to filter the list. Filters use the Common
  // Expression Language and can refer to all message fields except contents.
  string filter = 4;
}

// Response message for ListArtifacts.
message ListArtifactsResponse {
  // The artifacts from the specified publisher.
  repeated Artifact artifacts = 1;

  // A token, which can be sent as `page_token` to retrieve the next page.
  // If this field is omitted, there are no subsequent pages.
  string next_page_token = 2;
}

// Request message for GetArtifact.
message GetArtifactRequest {
  // Required. The name of the artifact to retrieve.
  // Format: `{parent}/artifacts/*`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "apigeeregistry.googleapis.com/Artifact"
    }
  ];
}

// Request message for GetArtifactContents.
message GetArtifactContentsRequest {
  // Required. The name of the artifact whose contents should be retrieved.
  // Format: `{parent}/artifacts/*`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "apigeeregistry.googleapis.com/Artifact"
    }
  ];
}

// Request message for CreateArtifact.
message CreateArtifactRequest {
  // Required. The parent, which owns this collection of artifacts.
  // Format: `{parent}`
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      child_type: "apigeeregistry.googleapis.com/Artifact"
    }
  ];

  // Required. The artifact to create.
  Artifact artifact = 2 [(google.api.field_behavior) = REQUIRED];

  // Required. The ID to use for the artifact, which will become the final component of
  // the artifact's resource name.
  //
  // This value should be 4-63 characters, and valid characters
  // are /[a-z][0-9]-/.
  //
  // Following AIP-162, IDs must not have the form of a UUID.
  string artifact_id = 3 [(google.api.field_behavior) = REQUIRED];
}

// Request message for ReplaceArtifact.
message ReplaceArtifactRequest {
  // Required. The artifact to replace.
  //
  // The `name` field is used to identify the artifact to replace.
  // Format: `{parent}/artifacts/*`
  Artifact artifact = 1 [(google.api.field_behavior) = REQUIRED];
}

// Request message for DeleteArtifact.
message DeleteArtifactRequest {
  // Required. The name of the artifact to delete.
  // Format: `{parent}/artifacts/*`
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "apigeeregistry.googleapis.com/Artifact"
    }
  ];
}
