blob: 39301436c5389662ba8ee19de03e25287de3361e [file] [log] [blame]
// 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 = "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;
}