syntax = "proto3";

package yandex.cloud.serverless.mdbproxy.v1;

import "google/api/annotations.proto";
import "google/protobuf/field_mask.proto";
import "yandex/cloud/api/operation.proto";
import "yandex/cloud/access/access.proto";
import "yandex/cloud/serverless/mdbproxy/v1/proxy.proto";
import "yandex/cloud/operation/operation.proto";
import "yandex/cloud/validation.proto";

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

// A set of methods for managing serverless MDB proxy.
service ProxyService {
    // Returns the specified proxy.
    //
    // To get the list of all available proxies, make a [List] request.
    rpc Get (GetProxyRequest) returns (Proxy) {
        option (google.api.http) = { get: "/mdbproxy/v1/proxies/{proxy_id}" };
    }

    // Retrieves the list of proxies in the specified folder.
    rpc List (ListProxyRequest) returns (ListProxyResponse) {
        option (google.api.http) = { get: "/mdbproxy/v1/proxies" };
    }

    // Creates a proxy in the specified folder.
    rpc Create (CreateProxyRequest) returns (operation.Operation) {
        option (google.api.http) = { post: "/mdbproxy/v1/proxies" body: "*" };
        option (yandex.cloud.api.operation) = {
          metadata: "CreateProxyMetadata"
          response: "Proxy"
        };
    };

    // Updates the specified proxy.
    rpc Update (UpdateProxyRequest) returns (operation.Operation) {
        option (google.api.http) = { patch: "/mdbproxy/v1/proxies/{proxy_id}" body: "*" };
        option (yandex.cloud.api.operation) = {
          metadata: "UpdateProxyMetadata"
          response: "Proxy"
        };
    };

    // Deletes the specified proxy.
    rpc Delete (DeleteProxyRequest) returns (operation.Operation) {
        option (google.api.http) = { delete: "/mdbproxy/v1/proxies/{proxy_id}" };
        option (yandex.cloud.api.operation) = {
          metadata: "DeleteProxyMetadata"
          response: "google.protobuf.Empty"
        };
    };

    // Lists operations for the specified proxy.
    rpc ListOperations (ListProxyOperationsRequest) returns (ListProxyOperationsResponse) {
        option (google.api.http) = { get: "/mdbproxy/v1/proxies/{proxy_id}/operations" };
    }

    // Lists existing access bindings for the specified proxy.
    rpc ListAccessBindings (access.ListAccessBindingsRequest) returns (access.ListAccessBindingsResponse) {
        option (google.api.http) = { get: "/mdbproxy/v1/proxies/{resource_id}:listAccessBindings" };
    }

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

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

message GetProxyRequest {
    // ID of the proxy to return.
    //
    // To get a proxy ID make a [ProxyService.List] request.
    string proxy_id = 1 [(required) = true, (length) = "<=50"];
}

message ListProxyRequest {
    // ID of the folder to list proxies in.
    //
    // To get a folder ID make 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 `pageSize`, the service returns a [ListProxyResponse.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) = "0-1000"];

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

    // A filter expression that filters proxies listed in the response.
    //
    // The expression must specify:
    // 1. The field name. Currently filtering can only be applied to the [Proxy.name] field.
    // 2. A conditional operator. Can be either `=` or `!=` for single values, `IN` or `NOT IN`
    // for lists of values.
    // 3. The value. Must be 3-63 characters long and match the regular expression `^[a-z][-a-z0-9]{1,61}[a-z0-9]$`.
    // Example of a filter: `name=my-proxy`.
    string filter = 4 [(length) = "<=1000"];
}


message ListProxyResponse {
    // List of proxies in the specified folder.
    repeated Proxy proxies = 1;

    // Token for getting the next page of the list. If the number of results is greater than
    // the specified [ListProxyRequest.page_size], use `nextPageToken` as the value
    // for the [ListProxyRequest.page_token] parameter in the next list request.
    //
    // Each subsequent page will have its own `nextPageToken` to continue paging through the results.
    string next_page_token = 2 [(length) = "<=100"];
}

message CreateProxyRequest {
    // ID of the folder to create a proxy in.
    //
    // To get a folder ID make a [yandex.cloud.resourcemanager.v1.FolderService.List] request.
    string folder_id = 1 [(required) = true];

    // Name of the proxy.
    // The name must be unique within the folder.
    string name = 2 [(pattern) = "|[a-z][-a-z0-9]{1,61}[a-z0-9]"];

    // Description of the proxy.
    string description = 3 [(length) = "<=256"];

    // Resource labels as `key:value` pairs.
    map<string, string> labels = 4 [(size) = "<=64", (length) = "<=63", (pattern) = "[-_./\\@0-9a-z]*", (map_key).length = "1-63", (map_key).pattern = "[a-z][-_./\\@0-9a-z]*"];
    
    // Proxy target.
    Target target = 5 [(required) = true];
}

message CreateProxyMetadata {
    // ID of the proxy.
    string proxy_id = 1 [(length) = "<=50"];
}

message UpdateProxyRequest {
     // ID of the proxy to update.
    string proxy_id = 1 [(required) = true];

    // Field mask that specifies which attributes of the proxy should be updated.
    google.protobuf.FieldMask update_mask = 2;

    // New name for the proxy.
    // The name must be unique within the folder.
    string name = 3 [(pattern) = "|[a-z][-a-z0-9]{1,61}[a-z0-9]"];

    // New description for the proxy.
    string description = 4 [(length) = "<=256"];

    // Proxy labels as `key:value` pairs.
    map<string, string> labels = 5 [(size) = "<=64", (length) = "<=63", (pattern) = "[-_./\\@0-9a-z]*", (map_key).length = "1-63", (map_key).pattern = "[a-z][-_./\\@0-9a-z]*"];

    // Proxy target.
    Target target = 6;
}

message UpdateProxyMetadata {
    // ID of the proxy.
    string proxy_id = 1 [(required) = true, (length) = "<=50"];
}

message DeleteProxyRequest {
    // ID of the proxy.
    string proxy_id = 1 [(required) = true, (length) = "<=50"];
}

message DeleteProxyMetadata {
    // ID of the proxy.
    string proxy_id = 1 [(required) = true, (length) = "<=50"];
}

message ListProxyOperationsRequest {
    // ID of the proxy to list operations for.
    string proxy_id = 1 [(required) = true];

    // The maximum number of results per page that should be returned. If the number of available
    // results is larger than `pageSize`, the service returns a [ListProxyOperationsResponse.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) = "0-1000"];

    // Page token. To get the next page of results, set `pageToken` to the
    // [ListProxyOperationsResponse.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 filtering can be applied to the [operation.Operation.done], [operation.Operation.created_by] field.
    // 2. A conditional operator. Can be either `=` or `!=` for single values, `IN` or `NOT IN`
    // for lists of values.
    // 3. The value. Must be 3-63 characters long and match the regular expression `^[a-z][-a-z0-9]{1,61}[a-z0-9]$`.
    // Examples of a filter: `done=false`, `created_by='John.Doe'`.
    string filter = 4 [(length) = "<=1000"];
}

message ListProxyOperationsResponse {
    // List of operations for the specified proxy.
    repeated operation.Operation operations = 1;

    // Token for getting the next page of the list. If the number of results is greater than
    // the specified [ListProxyOperationsRequest.page_size], use `nextPageToken` as the value
    // for the [ListProxyOperationsRequest.page_token] parameter in the next list request.
    //
    // Each subsequent page will have its own `nextPageToken` to continue paging through the results.
    string next_page_token = 2;
}
