syntax = "proto3";

package yandex.cloud.containerregistry.v1;

import "yandex/cloud/api/operation.proto";
import "yandex/cloud/access/access.proto";
import "yandex/cloud/containerregistry/v1/registry.proto";
import "yandex/cloud/containerregistry/v1/ip_permission.proto";
import "yandex/cloud/operation/operation.proto";
import "yandex/cloud/validation.proto";
import "google/protobuf/field_mask.proto";

import "google/api/annotations.proto";

option go_package = "github.com/yandex-cloud/go-genproto/yandex/cloud/containerregistry/v1;containerregistry";
option java_package = "yandex.cloud.api.containerregistry.v1";

// A set of methods for managing Registry resources.
service RegistryService {
  // Returns the specified Registry resource.
  //
  // To get the list of available Registry resources, make a [List] request.
  rpc Get (GetRegistryRequest) returns (Registry) {
    option (google.api.http) = { get: "/container-registry/v1/registries/{registry_id}" };
  };

  // Retrieves the list of Registry resources in the specified folder.
  rpc List (ListRegistriesRequest) returns (ListRegistriesResponse) {
    option (google.api.http) = { get: "/container-registry/v1/registries" };
  };

  // Creates a registry in the specified folder.
  rpc Create (CreateRegistryRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/container-registry/v1/registries" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "CreateRegistryMetadata"
      response: "Registry"
    };
  };

  // Updates the specified registry.
  rpc Update (UpdateRegistryRequest) returns (operation.Operation) {
    option (google.api.http) = { patch: "/container-registry/v1/registries/{registry_id}" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "UpdateRegistryMetadata"
      response: "Registry"
    };
  };

  // Deletes the specified registry.
  rpc Delete (DeleteRegistryRequest) returns (operation.Operation) {
    option (google.api.http) = { delete: "/container-registry/v1/registries/{registry_id}" };
    option (yandex.cloud.api.operation) = {
      metadata: "DeleteRegistryMetadata"
      response: "google.protobuf.Empty"
    };
  }

  //access

  // Lists access bindings for the specified registry.
  rpc ListAccessBindings (access.ListAccessBindingsRequest) returns (access.ListAccessBindingsResponse) {
    option (google.api.http) = { get: "/container-registry/v1/registries/{resource_id}:listAccessBindings" };
  }

  // Sets access bindings for the specified registry.
  rpc SetAccessBindings (access.SetAccessBindingsRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/container-registry/v1/registries/{resource_id}:setAccessBindings" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "access.SetAccessBindingsMetadata"
      response: "google.protobuf.Empty"
    };
  }

  // Updates access bindings for the specified registry.
  rpc UpdateAccessBindings (access.UpdateAccessBindingsRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/container-registry/v1/registries/{resource_id}:updateAccessBindings" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "access.UpdateAccessBindingsMetadata"
      response: "google.protobuf.Empty"
    };
  }

  //ip permissions
  
  // List ip permissions for the specified registry.
  rpc ListIpPermission (ListIpPermissionRequest) returns (ListIpPermissionsResponse){
    option (google.api.http) = { get: "/container-registry/v1/registries/{registry_id}:listIpPermission" };
  }

  // Set ip permissions for the specified registry.
  rpc SetIpPermission (SetIpPermissionRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/container-registry/v1/registries/{registry_id}:setIpPermission" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "SetIpPermissionMetadata"
      response: "google.protobuf.Empty"
    };
  }

  // Update ip permissions for the specified registry.
  rpc UpdateIpPermission (UpdateIpPermissionRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/container-registry/v1/registries/{registry_id}:updateIpPermission" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "UpdateIpPermissionMetadata"
      response: "google.protobuf.Empty"
    };
  }
}

message GetRegistryRequest {
  // ID of the Registry resource to return.
  //
  // To get the registry ID use a [RegistryService.List] request.
  string registry_id = 1 [(required) = true, (length) = "<=50"];
}

message ListRegistriesRequest {
  // ID of the folder to list registries in.
  //
  // To get the folder ID use a [yandex.cloud.resourcemanager.v1.FolderService.List] request.
  string folder_id = 1 [(required) = true, (length) = "<=50"];

  // The maximum number of results per page to return. If the number of available
  // results is larger than [page_size],
  // the service returns a [ListRegistriesResponse.next_page_token]
  // that can be used to get the next page of results in subsequent list requests.
  // Default value: 100.
  int64 page_size = 2 [(value) = "<=1000"];

  // Page token. To get the next page of results, set [page_token] to the
  // [ListRegistriesResponse.next_page_token] returned by a previous list request.
  string page_token = 3 [(length) = "<=100"];

  // A filter expression that filters resources listed in the response.
  // The expression must specify:
  // 1. The field name. Currently you can use filtering only on [Registry.name] field.
  // 2. An operator. Can be either `=` or `!=` for single values, `IN` or `NOT IN` for lists of values.
  // 3. Value or a list of values to compare against the values of the field.
  string filter = 4 [(length) = "<=1000"];
}

message ListRegistriesResponse {
  // List of Registry resources.
  repeated Registry registries = 1;

  // This token allows you to get the next page of results for list requests. If the number of results
  // is larger than [ListRegistriesRequest.page_size], use
  // the [next_page_token] as the value
  // for the [ListRegistriesRequest.page_token] query parameter
  // in the next list request. Each subsequent list request will have its own
  // [next_page_token] to continue paging through the results.
  string next_page_token = 2;
}

message CreateRegistryRequest {
  // ID of the folder to create a registry in.
  //
  // To get the folder ID, use a [yandex.cloud.resourcemanager.v1.FolderService.List] request.
  string folder_id = 1 [(required) = true, (length) = "<=50"];

  // Name of the registry.
  //
  // There may be only one registry per folder.
  string name = 2 [(pattern) = "|[a-z][-a-z0-9]{1,61}[a-z0-9]"];

  // Resource labels as `key:value` pairs.
  map<string, string> labels = 3 [(yandex.cloud.size) = "<=64", (length) = "<=63", (pattern) = "[-_0-9a-z]*", (map_key).length = "1-63", (map_key).pattern = "[a-z][-_0-9a-z]*"];
}

message CreateRegistryMetadata {
  // ID of the registry that is being created.
  string registry_id = 1;
}

message UpdateRegistryRequest {
  // ID of the Registry resource to update.
  //
  // To get the registry ID use a [RegistryService.List] request.
  string registry_id = 1 [(required) = true, (length) = "<=50"];

  // Field mask that specifies which fields of the Registry resource are going to be updated.
  google.protobuf.FieldMask update_mask = 2;

  // Name of the registry.
  //
  // There may be only one registry per folder.
  string name = 3 [(pattern) = "|[a-z][-a-z0-9]{1,61}[a-z0-9]"];

  // Resource labels as `key:value` pairs.
  //
  // Existing set of `labels` is completely replaced by the provided set.
  map<string, string> labels = 4 [(yandex.cloud.size) = "<=64", (length) = "<=63", (pattern) = "[-_0-9a-z]*", (map_key).length = "1-63", (map_key).pattern = "[a-z][-_0-9a-z]*"];
}

message UpdateRegistryMetadata {
  // ID of the Registry resource that is being updated.
  string registry_id = 1;
}

message DeleteRegistryRequest {
  // ID of the registry to delete.
  string registry_id = 1 [(required) = true, (length) = "<=50"];
}

message DeleteRegistryMetadata {
  // ID of the registry that is being deleted.
  string registry_id = 1;
}

message SetIpPermissionRequest {
  // ID of the registry for which ip permissions are being set.
  string registry_id = 1 [(required) = true, (length) = "<=50"];

  // IP permission to be set.
  repeated IpPermission ip_permission = 2;
}

message UpdateIpPermissionRequest {
  // ID of the registry for which ip permissions are being updated.
  string registry_id = 1 [(required) = true, (length) = "<=50"];

  // Updates to IP permissions.
  repeated IpPermissionDelta ip_permission_deltas = 2;
}

message ListIpPermissionRequest {
  // ID of the Registry to return ip permission list.
  string registry_id = 1 [(required) = true, (length) = "<=50"];
}

message ListIpPermissionsResponse {
  // List of ip permissions for registry
  repeated IpPermission permissions = 1;
}

message SetIpPermissionMetadata {
  // ID of the registry that ip permission is being set.
  string registry_id = 1;
}

message UpdateIpPermissionMetadata {
  // ID of the registry that ip permission is being updated.
  string registry_id = 1;
}
