// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

syntax = "proto3";

package monorail.v3;

option go_package = "infra/monorailv2/api/v3/api_proto";

import "google/protobuf/field_mask.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "api/v3/api_proto/issue_objects.proto";

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

// Issues service includes all methods needed for managing Issues.
service Issues {
  // status: ALPHA
  // Returns the requested Issue.
  //
  // Raises:
  //   INVALID_ARGUMENT if `name` is formatted incorrectly.
  //   NOT_FOUND if the issue does not exist.
  //   PERMISSION_DENIED if the requester is not allowed to view the issue.
  rpc GetIssue (GetIssueRequest) returns (Issue) {}

  // status: ALPHA
  // Returns the requested Issues.
  //
  // Raises:
  //   INVALID_ARGUMENT if `names` is formatted incorrectly. Or if a parent
  //       collection in `names` does not match the value in `parent`.
  //   NOT_FOUND if any of the given issues do not exist.
  //   PERMISSION_DENIED if the requester does not have permission to view one
  //       (or more) of the given issues.
  rpc BatchGetIssues(BatchGetIssuesRequest) returns (BatchGetIssuesResponse) {}

  // status: ALPHA
  // Searches over issues within the specified projects.
  //
  // Raises:
  //   INVALID_ARGUMENT if project names or search query are invalid.
  rpc SearchIssues (SearchIssuesRequest) returns (SearchIssuesResponse) {}

  // status: ALPHA
  // Lists comments for an issue.
  //
  // Raises:
  //   INVALID_ARGUMENT if `parent` is formatted incorrectly or `page_size` < 0.
  //   NOT_FOUND if `parent` does not exist.
  //   PERMISSION_DENIED if the requester is not allowed to view `parent`.
  rpc ListComments (ListCommentsRequest) returns (ListCommentsResponse) {}

  // status: ALPHA
  // Modifies Issues and creates a new Comment for each.
  // Issues with NOOP changes and no comment_content will not be updated
  // and will not be included in the response.
  // We do not offer a standard UpdateIssue because every issue change
  // must result in the side-effect of creating a new Comment, and may result in
  // the side effect of sending a notification. We also want to allow for any
  // combination of issue changes to be made at once in a monolithic method.
  //
  // Raises:
  //   INVALID_ARGUMENT required fields are missing or fields are formatted
  //     incorrectly.
  //   NOT_FOUND if any specified issues are not found.
  //   PERMISSION_DENIED if the requester is not allowed to make the
  //     requested change.
  rpc ModifyIssues (ModifyIssuesRequest) returns (ModifyIssuesResponse) {}

  // status: ALPHA
  // Modifies ApprovalValues and creates a new Comment for each delta.
  // We do not offer a standard UpdateApprovalValue because changes result
  // in creating Comments on the parent Issue, and may have the side effect of
  // sending notifications. We also want to allow for any combination of
  // approval changes to be made at once in a monolithic method.
  // To modify owner add 'owner' to update_mask, though 'owner.user' works too.
  //
  // Raises:
  //   INVALID_ARGUMENT required fields are missing or fields are formatted
  //     incorrectly.
  //   NOT_FOUND if any specified ApprovalValues are not found.
  //   PERMISSION_DENIED if the requester is not allowed to make any of the
  //     requested changes.
  rpc ModifyIssueApprovalValues (ModifyIssueApprovalValuesRequest) returns
      (ModifyIssueApprovalValuesResponse) {}

  // status: ALPHA
  // Lists approval values for an issue.
  //
  // Raises:
  //   INVALID_ARGUMENT if request `parent` is formatted incorrectly.
  //   NOT_FOUND if the parent issue does not exist.
  //   PERMISSION_DENIED if the requester is not allowed to view parent issue.
  rpc ListApprovalValues (ListApprovalValuesRequest) returns
      (ListApprovalValuesResponse) {}

  // status: NOT READY
  // Changes state for a comment. Supported state transitions:
  //   - ACTIVE -> DELETED
  //   - ACTIVE -> SPAM
  //   - DELETED -> ACTIVE
  //   - SPAM -> ACTIVE
  //
  // Raises:
  //   TODO(crbug/monorail/7867): Document errors when implemented
  rpc ModifyCommentState (ModifyCommentStateRequest) returns
      (ModifyCommentStateResponse) {}

  // status: NOT READY
  // Makes an issue from an IssueTemplate and deltas.
  //
  // Raises:
  //   TODO(crbug/monorail/7197): Document errors when implemented
  rpc MakeIssueFromTemplate (MakeIssueFromTemplateRequest) returns (Issue) {}

  // status: ALPHA
  // Makes a basic issue, does not support phases, approvals, or approval
  // fields.
  // We do not offer a standard CreateIssue because Issue descriptions are
  // required, but not included in the Issue proto.
  //
  // Raises:
  //   INVALID_ARGUMENT if any given names does not have a valid format, if any
  //     fields in the requested issue were invalid, or if proposed values
  //     violates filter rules that should error.
  //   NOT_FOUND if no project exists with the given name.
  //   PERMISSION_DENIED if user lacks sufficient permissions.
  rpc MakeIssue (MakeIssueRequest) returns (Issue) {}
}


// The request message for Issues.GetIssue.
// Next available tag: 2
message GetIssueRequest {
  // The name of the issue to request.
  string name = 1 [
      (google.api.resource_reference) = {type: "api.crbug.com/Issue"},
      (google.api.field_behavior) = REQUIRED ];
}

// The request message for Issues.BatchGetIssues.
// Next available tag: 3
message BatchGetIssuesRequest {
  // The project name from which to batch get issues. If included, the parent
  // of all the issues specified in `names` must match this field.
  string parent = 1 [
    (google.api.resource_reference) = {type: "api.crbug.com/Project"} ];
  // The issues to request. Maximum of 100 can be retrieved.
  repeated string names = 2 [
      (google.api.resource_reference) = {type: "api.crbug.com/Issue"} ];
}

// The response message for Issues.BatchGetIssues.
// Next available tag: 2
message BatchGetIssuesResponse {
  // Issues matching the given request.
  repeated Issue issues = 1;
}

// The request message for Issues.SearchIssues.
// Next available tag: 6
message SearchIssuesRequest {
  // The names of Projects in which to search issues.
  repeated string projects = 1 [
    (google.api.resource_reference) = {type: "api.crbug.com/Project"},
    (google.api.field_behavior) = REQUIRED ];
  // The query string can contain any number of free text and
  // field search expressions.
  // Please see https://bugs.chromium.org/p/chromium/issues/searchtips for more
  // details of how the query string works.
  //
  // Canned queries have been deprecated in v3 in favor of search scoping using
  // parentheses support.
  // For clients who previously used canned queries, we're providing the
  // mapping of legacy canned query IDs to Monorail search syntax:
  //   - Format: (can_id, description, query_string)
  //   - (1, 'All issues', '')
  //   - (2, 'Open issues', 'is:open')
  //   - (3, 'Open and owned by me', 'is:open owner:me')
  //   - (4, 'Open and reported by me', 'is:open reporter:me')
  //   - (5, 'Open and starred by me', 'is:open is:starred')
  //   - (6, 'New issues', 'status:new')
  //   - (7, 'Issues to verify', 'status=fixed,done')
  //   - (8, 'Open with comment by me', 'is:open commentby:me')
  string query = 2;
  // The maximum number of items to return. The service may return fewer than
  // this value.
  // If unspecified, at most 100 items will be returned.
  // The maximum value is 100; values above 100 will be coerced to 100.
  int32 page_size = 3;
  // A page token, received from a previous `SearchIssues` call.
  // Provide this to retrieve the subsequent page.
  //
  // When paginating, all other parameters provided to `SearchIssues` must match
  // the call that provided the page token.
  string page_token = 4;
  // The string of comma separated field names used to order the items.
  // Adding '-' before a field, reverses the sort order.
  // E.g. 'stars,-status' sorts the items by number of stars, high to low,
  // then by status, low to high.
  string order_by = 5;
}

// The response message for Issues.SearchIssues.
// Next available tag: 3
message SearchIssuesResponse {
  // Issues matching the given request.
  repeated Issue issues = 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;
}

// The request message for Issues.ListComments.
// Next available tag: 5
message ListCommentsRequest {
  // The name of the issue for which to list comments.
  string parent = 1 [
    (google.api.resource_reference) = {type: "api.crbug.com/Issue"},
    (google.api.field_behavior) = REQUIRED ];
  // The maximum number of items to return. The service may return fewer than
  // this value.
  // If unspecified, at most 100 items will be returned.
  // The maximum value is 100; values above 100 will be coerced to 100.
  int32 page_size = 2;
  // A page token, received from a previous `ListComments` call.
  // Provide this to retrieve the subsequent page.
  //
  // When paginating, all other parameters provided to `ListComments` must
  // match the call that provided the page token.
  string page_token = 3;
  // For our initial release this filter only supports filtering to comments
  // related to a specific approval.
  // For example `approval = "projects/monorail/approvalDefs/1"`,
  // Note that no further logical or comparison operators are supported
  string filter = 4;
}

// The response message for Issues.ListComments
// Next available tag: 3
message ListCommentsResponse {
  // The comments from the specified issue.
  repeated Comment comments = 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;
}

// An attachment to upload to a comment or description.
// Next available tag: 3
message AttachmentUpload {
  string filename = 1 [ (google.api.field_behavior) = REQUIRED ];
  bytes content = 2 [ (google.api.field_behavior) = REQUIRED ];
}

// Holds changes to one issue, used in ModifyIssuesRequest.
// Next available tag: 9
message IssueDelta {
  // The issue's `name` field is used to identify the issue to be
  // updated. `issue.name` must always be filled.
  //
  // Values with rule-based Derivation within `issue` and in `field_vals_remove`
  // will be ignored.
  Issue issue = 1 [
      (google.api.field_behavior) = REQUIRED ];
  // The list of fields in `issue` to be updated.
  //
  // Repeated fields set on `issue` will be appended to.
  //
  // Non-repeated fields (e.g. `owner`) can be set with `issue.owner` set and
  // either 'owner' or 'owner.user' added to `update_mask`.
  // To unset non-repeated fields back to their default value, `issue.owner`
  // must contain the default value and `update_mask` must include 'owner.user'
  // NOT 'owner'.
  //
  // Its `field_values`, however, are a special case. Fields can be specified as
  // single-value or multi-value in their FieldDef.
  //
  // Single-value Field: if there is preexisting FieldValue with the same
  // `field` and `phase`, it will be REPLACED.
  //
  // Multi-value Field: a new value will be appended, unless the same `field`,
  // `phase`, `value` combination already exists. In that case, the FieldValue
  // will be ignored. In other words, duplicate values are ignored.
  // (With the exception of crbug.com/monorail/8137 until it is fixed).
  google.protobuf.FieldMask update_mask = 2 [
      (google.api.field_behavior) = REQUIRED ];

  // Values to remove from the repeated fields of the issue.

  // Cc's to remove.
  repeated string ccs_remove = 3 [
      (google.api.resource_reference) = {type: "api.crbug.com/User"}];
  // Blocked_on issues to remove.
  repeated IssueRef blocked_on_issues_remove = 4;
  // Blocking issues to remove.
  repeated IssueRef blocking_issues_remove = 5;
  // Components to remove.
  repeated string components_remove = 6 [
      (google.api.resource_reference) = {type: "api.crbug.com/ComponentDef"}];
  // Labels to remove.
  repeated string labels_remove = 7;
  // FieldValues to remove. Any values that did not already exist will be
  // ignored e.g. if you append a FieldValue in issue and remove it here, it
  // will still be added.
  repeated FieldValue field_vals_remove = 8;

  // TODO(crbug.com/monorail/8019): add Attachment uploading and removing.
}

// Changes to make to an ApprovalValue. Used to ModifyIssueApprovalValues or
// to MakeIssueFromTemplate.
//
// NOTE: The same handling of FieldValues discussed in IssueDelta applies here.
// Next available tag: 6
message ApprovalDelta {
  // The ApprovalValue we want to update. `approval_value.name` must always be
  // set.
  ApprovalValue approval_value = 1;
  // Repeated fields found in `update_mask` will be appended to.
  google.protobuf.FieldMask update_mask = 2 [
      (google.api.field_behavior) = REQUIRED ];
  // Resource names of the approvers we want to remove.
  repeated string approvers_remove = 3 [
      (google.api.resource_reference) = { type: "api.crbug.com/User" }
  ];
  // FieldValues that do not belong to `approval_value` will trigger error.
  repeated FieldValue field_vals_remove = 5;
  // TODO(crbug.com/monorail/8019): add Attachment uploading and removing.
}


// The type of notification a change should trigger.
// See monorail/doc/userguide/email.md
// Next available tag: 2
enum NotifyType {
  // The default value. This value is unused.
  NOTIFY_TYPE_UNSPECIFIED = 0;
  // An email notification should be sent.
  EMAIL = 1;
  // No notifcation should be triggered at all.
  NO_NOTIFICATION = 2;
}


// The request message for Issues.ModifyIssues.
// Next available tag: 5
message ModifyIssuesRequest {
  // The issue changes to make. A maximum of 100 issue changes can be requested.
  // There is also a constraint of 50 additional 'impacted issues' per
  // ModifyIssuesRequest. 'Impacted issues' are issues that are adding/removing
  // `blocked_on`, `blocking`, or `merge`
  // If you encounter this error, consider significantly smaller batches.
  repeated IssueDelta deltas = 1;
  // The type of notification the modifications should trigger.
  NotifyType notify_type = 2;
  // The comment text that should be added to each issue in delta.
  // Max length is 51200 characters.
  string comment_content = 3;
  // The attachment that will be to each comment for each issue in delta.
  repeated AttachmentUpload uploads = 4;
}


// The response message for Issues.ModifyIssues.
// Next available tag: 2
message ModifyIssuesResponse {
  // The updated issues.
  repeated Issue issues = 1;
}

// The request message for Issues.ModifyIssueApprovalValues.
// Next available tag: 4
message ModifyIssueApprovalValuesRequest {
  // The ApprovalValue changes to make. Maximum of 100 deltas can be requested.
  repeated ApprovalDelta deltas = 1;
  // The type of notification the modifications should trigger.
  NotifyType notify_type = 2;
  // The `content` of the Comment created for each change in `deltas`.
  // Max length is 51200 characters.
  string comment_content = 3;
}

// The response message for Issues.ModifyIssueApprovalValuesRequest.
// Next available tag: 2
message ModifyIssueApprovalValuesResponse {
  // The updated ApprovalValues.
  repeated ApprovalValue approval_values = 1;
}

// The request message for Issue.ListApprovalValues.
// Next available tag: 2
message ListApprovalValuesRequest {
  // The name of the issue for which to list approval values.
  string parent = 1 [
    (google.api.resource_reference) = {type: "api.crbug.com/Issue"},
    (google.api.field_behavior) = REQUIRED ];
}

// The response message for Issues.ListApprovalValues.
// Next available tag: 2
message ListApprovalValuesResponse {
  // The approval values from the specified issue.
  repeated ApprovalValue approval_values = 1;
}

// The request message for Issues.ModifyCommentState.
// Next available tag: 3
message ModifyCommentStateRequest {
  // Resource name of the comment to modify state.
  string name = 1 [
    (google.api.resource_reference) = {type: "api.crbug.com/Comment"},
    (google.api.field_behavior) = REQUIRED ];
  // Requested state.
  IssueContentState state = 2;
}

// The response message for Issues.ModifyCommentState.
// Next available tag: 2
message ModifyCommentStateResponse {
  // The updated comment after modifying state.
  Comment comment = 1;
}

// The request message for MakeIssueFromTemplate.
// Next available tag: 5
message MakeIssueFromTemplateRequest {
  // Resource name of the template to use for filling in default values
  // and adding approvals and phases.
  string template = 1 [
      (google.api.resource_reference) = { type: "api.crbug.com/Template" }
  ];
  // The issue differences relative to the `template.issue` default.
  IssueDelta template_issue_delta = 2;
  // Changes to fields belonging to approvals relative to template default.
  // While ApprovalDelta can hold additional information, this method only
  // allows adding and removing field values, all other deltas will be ignored.
  repeated ApprovalDelta template_approval_deltas = 3;
  // The issue description, will be saved as the first comment.
  string description = 4;
}

// The request message for MakeIssue.
// Next available tag: 6
message MakeIssueRequest {
  // The name of the project the issue should belong to.
  string parent = 1 [
    (google.api.resource_reference) = {type: "api.crbug.com/Project"},
    (google.api.field_behavior) = REQUIRED ];
  // The issue to be created.
  Issue issue = 2;
  // The issue description.
  string description = 3;
  // The type of notification the creation should trigger.
  NotifyType notify_type = 4;
  // The attachment that will be attached to each new issue.
  repeated AttachmentUpload uploads = 5;
}
