// 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
  // 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 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;
}
