// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd

syntax = "proto3";

package monorail.v3;

option go_package = "api/v3/api_proto";

import "google/protobuf/empty.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "api/v3/api_proto/project_objects.proto";

// ***ONLY CALL rpcs WITH `status: {ALPHA|STABLE}`***
// rpcs without `status` are not ready.

// Projects service includes all methods needed for managing Projects.
service Projects {
  // status: NOT READY
  // Creates a new FieldDef (custom field).
  //
  // Raises:
  //   NOT_FOUND if some given users do not exist.
  //   ALREADY_EXISTS if a field with the same name owned by the project
  //   already exists.
  //   INVALID_INPUT if there was a problem with the input.
  //   PERMISSION_DENIED if the user cannot edit the project.
  rpc CreateFieldDef (CreateFieldDefRequest) returns (FieldDef) {}

  // status: ALPHA
  // Gets a ComponentDef given the reference.
  //
  // Raises:
  //   INVALID_INPUT if the request is invalid.
  //   NOT_FOUND if the parent project or the component is not found.
  rpc GetComponentDef (GetComponentDefRequest) returns (ComponentDef) {}

  // status: ALPHA
  // Creates a new ComponentDef.
  //
  // Raises:
  //   INVALID_INPUT if the request is invalid.
  //   ALREADY_EXISTS if the component already exists.
  //   PERMISSION_DENIED if the user is not allowed to create a/this component.
  //   NOT_FOUND if the parent project or a component cc or admin is not found.
  rpc CreateComponentDef (CreateComponentDefRequest) returns (ComponentDef) {}

  // status: ALPHA
  // Deletes a ComponentDef.
  //
  // Raises:
  //   INVALID_INPUT if the request is invalid.
  //   PERMISSION_DENIED if the user is not allowed to delete a/this component.
  //   NOT_FOUND if the component or project is not found.
  rpc DeleteComponentDef (DeleteComponentDefRequest) returns (google.protobuf.Empty) {}

  // status: NOT READY
  // Returns all templates for specified project.
  //
  // Raises:
  //   NOT_FOUND if the requested parent project is not found.
  //   INVALID_ARGUMENT if the given `parent` is not valid.
  rpc ListIssueTemplates (ListIssueTemplatesRequest) returns (ListIssueTemplatesResponse) {}

  // status: ALPHA
  // Returns all field defs for specified project.
  //
  // Raises:
  //   NOT_FOUND if the request arent project is not found.
  //   INVALID_ARGUMENT if the given `parent` is not valid.
  rpc ListComponentDefs (ListComponentDefsRequest) returns (ListComponentDefsResponse) {}

  // status: NOT READY
  // Returns all projects hosted on Monorail.
  rpc ListProjects (ListProjectsRequest) returns (ListProjectsResponse) {}
}

// Request message for CreateFieldDef method.
// Next available tag: 3
message CreateFieldDefRequest {
  // The project resource where this field will be created.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {type: "api.crbug.com/Project" }];
  // The field to create.
  // It must have a display_name and a type with its corresponding settings.
  FieldDef fielddef = 2 [ (google.api.field_behavior) = REQUIRED ];
}

// Request message for GetComponentDef method.
// Next available tag: 2
message GetComponentDefRequest {
  string name = 1 [
    (google.api.resource_reference) = { type: "api.crbug.com/ComponentDef" },
    (google.api.field_behavior) = REQUIRED ];
}

// Request message for CreateComponentDef method.
// Next available tag: 3
message CreateComponentDefRequest {
  // The project resource where this component will be created.
  string parent = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {type: "api.crbug.com/Project" }];
  // The component to create.
  ComponentDef component_def = 2 [ (google.api.field_behavior) = REQUIRED ];
}

// Request message for DeleteComponentDef method.
// Next available tag: 2
message DeleteComponentDefRequest {
  // The component to delete.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {type: "api.crbug.com/ComponentDef"}];
}

// Request message for ListIssueTemplates
// Next available tag: 4
message ListIssueTemplatesRequest {
  // The name of the project these templates belong to.
  string parent = 1 [
    (google.api.resource_reference) = {type: "api.crbug.com/Project"},
    (google.api.field_behavior) = REQUIRED ];
  // The maximum number of items to return. The service may return fewer than
  // this value.
  int32 page_size = 2;
  // A page token, received from a previous `ListIssueTemplates` call.
  // Provide this to retrieve the subsequent page.
  // When paginating, all other parameters provided to
  // `ListIssueTemplatesRequest` must match the call that provided the token.
  string page_token = 3;
}

// Response message for ListIssueTemplates
// Next available tag: 3
message ListIssueTemplatesResponse {
  // Templates matching the given request.
  repeated IssueTemplate templates = 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 ListComponentDefs
// Next available tag: 4
message ListComponentDefsRequest {
  // The name of the parent project.
  string parent = 1 [
    (google.api.resource_reference) = {type: "api.crbug.com/Project"},
    (google.api.field_behavior) = REQUIRED ];
  // The maximum number of items to return. The service may return fewer than
  // this value.
  int32 page_size = 2;
  // A page token, received from a previous `ListComponentDefs` call.
  // Provide this to retrieve the subsequent page.
  // When paginating, all other parameters provided to
  // `ListComponentDefsRequest` must match the call that provided the token.
  string page_token = 3;
}

// Response message for ListComponentDefs
// Next available tag: 3
message ListComponentDefsResponse {
  // Component defs matching the given request.
  repeated ComponentDef component_defs = 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 ListProjects
// Next available tag: 3
message ListProjectsRequest {
  // The maximum number of items to return. The service may return fewer than
  // this value.
  int32 page_size = 1;
  // A page token, received from a previous `ListProjects` call.
  // Provide this to retrieve the subsequent page.
  string page_token = 2;
}

// Response message for ListProjects
// Next available tag: 3
message ListProjectsResponse {
  // Projects matching the given request.
  repeated Project projects = 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;
}
