syntax = "proto3";

package yandex.cloud.mdb.sqlserver.v1;

import "google/api/annotations.proto";
import "google/protobuf/timestamp.proto";
import "yandex/cloud/api/operation.proto";
import "yandex/cloud/operation/operation.proto";
import "yandex/cloud/validation.proto";
import "yandex/cloud/mdb/sqlserver/v1/database.proto";

option go_package = "github.com/yandex-cloud/go-genproto/yandex/cloud/mdb/sqlserver/v1;sqlserver";
option java_outer_classname = "PSDS";
option java_package = "yandex.cloud.api.mdb.sqlserver.v1";

// A set of methods for managing SQL Server databases.
service DatabaseService {
  // Returns the specified SQL Server database.
  //
  // To get the list of available SQL Server databases, make a [List] request.
  rpc Get (GetDatabaseRequest) returns (Database) {
    option (google.api.http) = { get: "/mdb/sqlserver/v1/clusters/{cluster_id}/databases/{database_name}" };
  }

  // Retrieves the list of SQL Server databases in the specified cluster.
  rpc List (ListDatabasesRequest) returns (ListDatabasesResponse) {
    option (google.api.http) = { get: "/mdb/sqlserver/v1/clusters/{cluster_id}/databases" };
  }

  // Creates a new SQL Server database in the specified cluster.
  rpc Create (CreateDatabaseRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/mdb/sqlserver/v1/clusters/{cluster_id}/databases" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "CreateDatabaseMetadata"
      response: "Database"
    };
  }

  // Creates a new SQL Server database in the specified cluster from a backup
  rpc Restore (RestoreDatabaseRequest) returns (operation.Operation) {
    option (google.api.http) = { post: "/mdb/sqlserver/v1/clusters/{cluster_id}/databases:restore" body: "*" };
    option (yandex.cloud.api.operation) = {
      metadata: "RestoreDatabaseMetadata"
      response: "Database"
      };
  }

  // Deletes the specified SQL Server database.
  rpc Delete (DeleteDatabaseRequest) returns (operation.Operation) {
    option (google.api.http) = { delete: "/mdb/sqlserver/v1/clusters/{cluster_id}/databases/{database_name}" };
    option (yandex.cloud.api.operation) = {
      metadata: "DeleteDatabaseMetadata"
      response: "google.protobuf.Empty"
    };
  }
}

message GetDatabaseRequest {
  // ID of the SQL Server cluster the database belongs to.
  //
  // To get the cluster ID, use a [ClusterService.List] request.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];

  // Name of the SQL Server database to return.
  //
  // To get the name of the database use a [DatabaseService.List] request.
  string database_name = 2 [(required) = true, (length) = "<=63", (pattern) = "[a-zA-Z0-9_-]*"];
}

message ListDatabasesRequest {
  // ID of the SQL Server cluster to list databases in.
  //
  // To get the cluster ID, use a [ClusterService.List] request.
  string cluster_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 [ListDatabasesResponse.next_page_token]
  // that can be used to get the next page of results in subsequent list requests.
  int64 page_size = 2 [(value) = "0-1000"];

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

message ListDatabasesResponse {
  // List of SQL Server databases.
  repeated Database databases = 1;

  // Token that allows you to get the next page of results for list requests. If the number of results
  // is larger than [ListDatabasesRequest.page_size], use the `next_page_token` as the value
  // for the [ListDatabasesRequest.page_token] 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 CreateDatabaseRequest {
  // ID of the SQL Server cluster to create a database in.
  //
  // To get the cluster ID, use a [ClusterService.List] request.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];

  // Configuration of the database to create.
  DatabaseSpec database_spec = 2 [(required) = true];
}

message CreateDatabaseMetadata {
  // ID of the SQL Server cluster where the database is being created.
  string cluster_id = 1;

  // Name of the SQL Server database being created.
  string database_name = 2;
}

message RestoreDatabaseMetadata {
  // ID of the SQLServer cluster where a database is being created.
  string cluster_id = 1 [(required) = true];

  // Name of the SQLServer database that is being created.
  string database_name = 2 [(required) = true];

  //name of the database which backup will be used to restore the database
  string from_database = 3 [(required) = true];

  //ID of a backup to be used
  string backup_id = 4 [(required) = true];
}

message DeleteDatabaseRequest {
  // ID of the SQL Server cluster to delete a database in.
  //
  // To get the cluster ID, use a [ClusterService.List] request.
  string cluster_id = 1 [(required) = true, (length) = "<=50"];

  // Name of the database to delete.
  //
  // To get the name of the database, use a [DatabaseService.List] request.
  string database_name = 2 [(required) = true, (length) = "<=63", (pattern) = "[a-zA-Z0-9_-]*"];
}

message DeleteDatabaseMetadata {
  // ID of the SQL Server cluster where the database is being deleted.
  string cluster_id = 1;

  // Name of the SQL Server database being deleted.
  string database_name = 2;
}

message RestoreDatabaseRequest {
  //Required. ID of the SQL Server cluster to restore a database in.
  // To get the cluster ID, use a [ClusterService.List] request
  string cluster_id = 1 [(required) = true, (length) = "<=50"];

  // Name of the SQLServer database that is being restored.
  string database_name = 2 [(required) = true];

  //name of the database which backup will be used to restore the database
  string from_database = 3 [(required) = true];

  //ID of a backup to be used
  string backup_id = 4 [(required) = true];

  //Timestamp which is used for Point-in-Time recovery
  google.protobuf.Timestamp time = 6 [(required) = true];

}
