go.chromium.org/luci@v0.0.0-20240309015107-7cdc2e660f33/analysis/internal/bugs/monorail/api_proto/issues.proto (about)

     1  // Copyright 2020 The Chromium Authors
     2  // Use of this source code is governed by a BSD-style license that can be
     3  // found in the LICENSE file.
     4  
     5  syntax = "proto3";
     6  
     7  package monorail.v3;
     8  
     9  option go_package = "go.chromium.org/luci/analysis/internal/bugs/monorail/api_proto";
    10  
    11  import "google/protobuf/field_mask.proto";
    12  import "google/api/field_behavior.proto";
    13  import "google/api/resource.proto";
    14  import "go.chromium.org/luci/analysis/internal/bugs/monorail/api_proto/issue_objects.proto";
    15  
    16  // ***ONLY CALL rpcs WITH `status: {ALPHA|STABLE}`***
    17  // rpcs without `status` are not ready.
    18  
    19  // Issues service includes all methods needed for managing Issues.
    20  service Issues {
    21    // status: ALPHA
    22    // Returns the requested Issue.
    23    //
    24    // Raises:
    25    //   INVALID_ARGUMENT if `name` is formatted incorrectly.
    26    //   NOT_FOUND if the issue does not exist.
    27    //   PERMISSION_DENIED if the requester is not allowed to view the issue.
    28    rpc GetIssue (GetIssueRequest) returns (Issue) {}
    29  
    30    // status: ALPHA
    31    // Returns the requested Issues.
    32    //
    33    // Raises:
    34    //   INVALID_ARGUMENT if `names` is formatted incorrectly. Or if a parent
    35    //       collection in `names` does not match the value in `parent`.
    36    //   NOT_FOUND if any of the given issues do not exist.
    37    //   PERMISSION_DENIED if the requester does not have permission to view one
    38    //       (or more) of the given issues.
    39    rpc BatchGetIssues(BatchGetIssuesRequest) returns (BatchGetIssuesResponse) {}
    40  
    41    // status: ALPHA
    42    // Searches over issues within the specified projects.
    43    //
    44    // Raises:
    45    //   INVALID_ARGUMENT if project names or search query are invalid.
    46    rpc SearchIssues (SearchIssuesRequest) returns (SearchIssuesResponse) {}
    47  
    48    // status: ALPHA
    49    // Lists comments for an issue.
    50    //
    51    // Raises:
    52    //   INVALID_ARGUMENT if `parent` is formatted incorrectly or `page_size` < 0.
    53    //   NOT_FOUND if `parent` does not exist.
    54    //   PERMISSION_DENIED if the requester is not allowed to view `parent`.
    55    rpc ListComments (ListCommentsRequest) returns (ListCommentsResponse) {}
    56  
    57    // status: ALPHA
    58    // Modifies Issues and creates a new Comment for each.
    59    // Issues with NOOP changes and no comment_content will not be updated
    60    // and will not be included in the response.
    61    // We do not offer a standard UpdateIssue because every issue change
    62    // must result in the side-effect of creating a new Comment, and may result in
    63    // the side effect of sending a notification. We also want to allow for any
    64    // combination of issue changes to be made at once in a monolithic method.
    65    //
    66    // Raises:
    67    //   INVALID_ARGUMENT required fields are missing or fields are formatted
    68    //     incorrectly.
    69    //   NOT_FOUND if any specified issues are not found.
    70    //   PERMISSION_DENIED if the requester is not allowed to make the
    71    //     requested change.
    72    rpc ModifyIssues (ModifyIssuesRequest) returns (ModifyIssuesResponse) {}
    73  
    74    // status: ALPHA
    75    // Modifies ApprovalValues and creates a new Comment for each delta.
    76    // We do not offer a standard UpdateApprovalValue because changes result
    77    // in creating Comments on the parent Issue, and may have the side effect of
    78    // sending notifications. We also want to allow for any combination of
    79    // approval changes to be made at once in a monolithic method.
    80    // To modify owner add 'owner' to update_mask, though 'owner.user' works too.
    81    //
    82    // Raises:
    83    //   INVALID_ARGUMENT required fields are missing or fields are formatted
    84    //     incorrectly.
    85    //   NOT_FOUND if any specified ApprovalValues are not found.
    86    //   PERMISSION_DENIED if the requester is not allowed to make any of the
    87    //     requested changes.
    88    rpc ModifyIssueApprovalValues (ModifyIssueApprovalValuesRequest) returns
    89        (ModifyIssueApprovalValuesResponse) {}
    90  
    91    // status: ALPHA
    92    // Lists approval values for an issue.
    93    //
    94    // Raises:
    95    //   INVALID_ARGUMENT if request `parent` is formatted incorrectly.
    96    //   NOT_FOUND if the parent issue does not exist.
    97    //   PERMISSION_DENIED if the requester is not allowed to view parent issue.
    98    rpc ListApprovalValues (ListApprovalValuesRequest) returns
    99        (ListApprovalValuesResponse) {}
   100  
   101    // status: NOT READY
   102    // Changes state for a comment. Supported state transitions:
   103    //   - ACTIVE -> DELETED
   104    //   - ACTIVE -> SPAM
   105    //   - DELETED -> ACTIVE
   106    //   - SPAM -> ACTIVE
   107    //
   108    // Raises:
   109    //   TODO(crbug/monorail/7867): Document errors when implemented
   110    rpc ModifyCommentState (ModifyCommentStateRequest) returns
   111        (ModifyCommentStateResponse) {}
   112  
   113    // status: NOT READY
   114    // Makes an issue from an IssueTemplate and deltas.
   115    //
   116    // Raises:
   117    //   TODO(crbug/monorail/7197): Document errors when implemented
   118    rpc MakeIssueFromTemplate (MakeIssueFromTemplateRequest) returns (Issue) {}
   119  
   120    // status: ALPHA
   121    // Makes a basic issue, does not support phases, approvals, or approval
   122    // fields.
   123    // We do not offer a standard CreateIssue because Issue descriptions are
   124    // required, but not included in the Issue proto.
   125    //
   126    // Raises:
   127    //   INVALID_ARGUMENT if any given names does not have a valid format, if any
   128    //     fields in the requested issue were invalid, or if proposed values
   129    //     violates filter rules that should error.
   130    //   NOT_FOUND if no project exists with the given name.
   131    //   PERMISSION_DENIED if user lacks sufficient permissions.
   132    rpc MakeIssue (MakeIssueRequest) returns (Issue) {}
   133  }
   134  
   135  
   136  // The request message for Issues.GetIssue.
   137  // Next available tag: 2
   138  message GetIssueRequest {
   139    // The name of the issue to request.
   140    string name = 1 [
   141        (google.api.resource_reference) = {type: "api.crbug.com/Issue"},
   142        (google.api.field_behavior) = REQUIRED ];
   143  }
   144  
   145  // The request message for Issues.BatchGetIssues.
   146  // Next available tag: 3
   147  message BatchGetIssuesRequest {
   148    // The project name from which to batch get issues. If included, the parent
   149    // of all the issues specified in `names` must match this field.
   150    string parent = 1 [
   151      (google.api.resource_reference) = {type: "api.crbug.com/Project"} ];
   152    // The issues to request. Maximum of 100 can be retrieved.
   153    repeated string names = 2 [
   154        (google.api.resource_reference) = {type: "api.crbug.com/Issue"} ];
   155  }
   156  
   157  // The response message for Issues.BatchGetIssues.
   158  // Next available tag: 2
   159  message BatchGetIssuesResponse {
   160    // Issues matching the given request.
   161    repeated Issue issues = 1;
   162  }
   163  
   164  // The request message for Issues.SearchIssues.
   165  // Next available tag: 6
   166  message SearchIssuesRequest {
   167    // The names of Projects in which to search issues.
   168    repeated string projects = 1 [
   169      (google.api.resource_reference) = {type: "api.crbug.com/Project"},
   170      (google.api.field_behavior) = REQUIRED ];
   171    // The query string can contain any number of free text and
   172    // field search expressions.
   173    // Please see https://bugs.chromium.org/p/chromium/issues/searchtips for more
   174    // details of how the query string works.
   175    //
   176    // Canned queries have been deprecated in v3 in favor of search scoping using
   177    // parentheses support.
   178    // For clients who previously used canned queries, we're providing the
   179    // mapping of legacy canned query IDs to Monorail search syntax:
   180    //   - Format: (can_id, description, query_string)
   181    //   - (1, 'All issues', '')
   182    //   - (2, 'Open issues', 'is:open')
   183    //   - (3, 'Open and owned by me', 'is:open owner:me')
   184    //   - (4, 'Open and reported by me', 'is:open reporter:me')
   185    //   - (5, 'Open and starred by me', 'is:open is:starred')
   186    //   - (6, 'New issues', 'status:new')
   187    //   - (7, 'Issues to verify', 'status=fixed,done')
   188    //   - (8, 'Open with comment by me', 'is:open commentby:me')
   189    string query = 2;
   190    // The maximum number of items to return. The service may return fewer than
   191    // this value.
   192    // If unspecified, at most 100 items will be returned.
   193    // The maximum value is 100; values above 100 will be coerced to 100.
   194    int32 page_size = 3;
   195    // A page token, received from a previous `SearchIssues` call.
   196    // Provide this to retrieve the subsequent page.
   197    //
   198    // When paginating, all other parameters provided to `SearchIssues` must match
   199    // the call that provided the page token.
   200    string page_token = 4;
   201    // The string of comma separated field names used to order the items.
   202    // Adding '-' before a field, reverses the sort order.
   203    // E.g. 'stars,-status' sorts the items by number of stars, high to low,
   204    // then by status, low to high.
   205    string order_by = 5;
   206  }
   207  
   208  // The response message for Issues.SearchIssues.
   209  // Next available tag: 3
   210  message SearchIssuesResponse {
   211    // Issues matching the given request.
   212    repeated Issue issues = 1;
   213    // A token, which can be sent as `page_token` to retrieve the next page.
   214    // If this field is omitted, there are no subsequent pages.
   215    string next_page_token = 2;
   216  }
   217  
   218  // The request message for Issues.ListComments.
   219  // Next available tag: 5
   220  message ListCommentsRequest {
   221    // The name of the issue for which to list comments.
   222    string parent = 1 [
   223      (google.api.resource_reference) = {type: "api.crbug.com/Issue"},
   224      (google.api.field_behavior) = REQUIRED ];
   225    // The maximum number of items to return. The service may return fewer than
   226    // this value.
   227    // If unspecified, at most 100 items will be returned.
   228    // The maximum value is 100; values above 100 will be coerced to 100.
   229    int32 page_size = 2;
   230    // A page token, received from a previous `ListComments` call.
   231    // Provide this to retrieve the subsequent page.
   232    //
   233    // When paginating, all other parameters provided to `ListComments` must
   234    // match the call that provided the page token.
   235    string page_token = 3;
   236    // For our initial release this filter only supports filtering to comments
   237    // related to a specific approval.
   238    // For example `approval = "projects/monorail/approvalDefs/1"`,
   239    // Note that no further logical or comparison operators are supported
   240    string filter = 4;
   241  }
   242  
   243  // The response message for Issues.ListComments
   244  // Next available tag: 3
   245  message ListCommentsResponse {
   246    // The comments from the specified issue.
   247    repeated Comment comments = 1;
   248    // A token, which can be sent as `page_token` to retrieve the next page.
   249    // If this field is omitted, there are no subsequent pages.
   250    string next_page_token = 2;
   251  }
   252  
   253  // An attachment to upload to a comment or description.
   254  // Next available tag: 3
   255  message AttachmentUpload {
   256    string filename = 1 [ (google.api.field_behavior) = REQUIRED ];
   257    bytes content = 2 [ (google.api.field_behavior) = REQUIRED ];
   258  }
   259  
   260  // Holds changes to one issue, used in ModifyIssuesRequest.
   261  // Next available tag: 9
   262  message IssueDelta {
   263    // The issue's `name` field is used to identify the issue to be
   264    // updated. `issue.name` must always be filled.
   265    //
   266    // Values with rule-based Derivation within `issue` and in `field_vals_remove`
   267    // will be ignored.
   268    Issue issue = 1 [
   269        (google.api.field_behavior) = REQUIRED ];
   270    // The list of fields in `issue` to be updated.
   271    //
   272    // Repeated fields set on `issue` will be appended to.
   273    //
   274    // Non-repeated fields (e.g. `owner`) can be set with `issue.owner` set and
   275    // either 'owner' or 'owner.user' added to `update_mask`.
   276    // To unset non-repeated fields back to their default value, `issue.owner`
   277    // must contain the default value and `update_mask` must include 'owner.user'
   278    // NOT 'owner'.
   279    //
   280    // Its `field_values`, however, are a special case. Fields can be specified as
   281    // single-value or multi-value in their FieldDef.
   282    //
   283    // Single-value Field: if there is preexisting FieldValue with the same
   284    // `field` and `phase`, it will be REPLACED.
   285    //
   286    // Multi-value Field: a new value will be appended, unless the same `field`,
   287    // `phase`, `value` combination already exists. In that case, the FieldValue
   288    // will be ignored. In other words, duplicate values are ignored.
   289    // (With the exception of crbug.com/monorail/8137 until it is fixed).
   290    google.protobuf.FieldMask update_mask = 2 [
   291        (google.api.field_behavior) = REQUIRED ];
   292  
   293    // Values to remove from the repeated fields of the issue.
   294  
   295    // Cc's to remove.
   296    repeated string ccs_remove = 3 [
   297        (google.api.resource_reference) = {type: "api.crbug.com/User"}];
   298    // Blocked_on issues to remove.
   299    repeated IssueRef blocked_on_issues_remove = 4;
   300    // Blocking issues to remove.
   301    repeated IssueRef blocking_issues_remove = 5;
   302    // Components to remove.
   303    repeated string components_remove = 6 [
   304        (google.api.resource_reference) = {type: "api.crbug.com/ComponentDef"}];
   305    // Labels to remove.
   306    repeated string labels_remove = 7;
   307    // FieldValues to remove. Any values that did not already exist will be
   308    // ignored e.g. if you append a FieldValue in issue and remove it here, it
   309    // will still be added.
   310    repeated FieldValue field_vals_remove = 8;
   311  
   312    // TODO(crbug.com/monorail/8019): add Attachment uploading and removing.
   313  }
   314  
   315  // Changes to make to an ApprovalValue. Used to ModifyIssueApprovalValues or
   316  // to MakeIssueFromTemplate.
   317  //
   318  // NOTE: The same handling of FieldValues discussed in IssueDelta applies here.
   319  // Next available tag: 6
   320  message ApprovalDelta {
   321    // The ApprovalValue we want to update. `approval_value.name` must always be
   322    // set.
   323    ApprovalValue approval_value = 1;
   324    // Repeated fields found in `update_mask` will be appended to.
   325    google.protobuf.FieldMask update_mask = 2 [
   326        (google.api.field_behavior) = REQUIRED ];
   327    // Resource names of the approvers we want to remove.
   328    repeated string approvers_remove = 3 [
   329        (google.api.resource_reference) = { type: "api.crbug.com/User" }
   330    ];
   331    // FieldValues that do not belong to `approval_value` will trigger error.
   332    repeated FieldValue field_vals_remove = 5;
   333    // TODO(crbug.com/monorail/8019): add Attachment uploading and removing.
   334  }
   335  
   336  
   337  // The type of notification a change should trigger.
   338  // See monorail/doc/userguide/email.md
   339  // Next available tag: 2
   340  enum NotifyType {
   341    // The default value. This value is unused.
   342    NOTIFY_TYPE_UNSPECIFIED = 0;
   343    // An email notification should be sent.
   344    EMAIL = 1;
   345    // No notifcation should be triggered at all.
   346    NO_NOTIFICATION = 2;
   347  }
   348  
   349  
   350  // The request message for Issues.ModifyIssues.
   351  // Next available tag: 5
   352  message ModifyIssuesRequest {
   353    // The issue changes to make. A maximum of 100 issue changes can be requested.
   354    // There is also a constraint of 50 additional 'impacted issues' per
   355    // ModifyIssuesRequest. 'Impacted issues' are issues that are adding/removing
   356    // `blocked_on`, `blocking`, or `merge`
   357    // If you encounter this error, consider significantly smaller batches.
   358    repeated IssueDelta deltas = 1;
   359    // The type of notification the modifications should trigger.
   360    NotifyType notify_type = 2;
   361    // The comment text that should be added to each issue in delta.
   362    // Max length is 51200 characters.
   363    string comment_content = 3;
   364    // The attachment that will be to each comment for each issue in delta.
   365    repeated AttachmentUpload uploads = 4;
   366  }
   367  
   368  
   369  // The response message for Issues.ModifyIssues.
   370  // Next available tag: 2
   371  message ModifyIssuesResponse {
   372    // The updated issues.
   373    repeated Issue issues = 1;
   374  }
   375  
   376  // The request message for Issues.ModifyIssueApprovalValues.
   377  // Next available tag: 4
   378  message ModifyIssueApprovalValuesRequest {
   379    // The ApprovalValue changes to make. Maximum of 100 deltas can be requested.
   380    repeated ApprovalDelta deltas = 1;
   381    // The type of notification the modifications should trigger.
   382    NotifyType notify_type = 2;
   383    // The `content` of the Comment created for each change in `deltas`.
   384    // Max length is 51200 characters.
   385    string comment_content = 3;
   386  }
   387  
   388  // The response message for Issues.ModifyIssueApprovalValuesRequest.
   389  // Next available tag: 2
   390  message ModifyIssueApprovalValuesResponse {
   391    // The updated ApprovalValues.
   392    repeated ApprovalValue approval_values = 1;
   393  }
   394  
   395  // The request message for Issue.ListApprovalValues.
   396  // Next available tag: 2
   397  message ListApprovalValuesRequest {
   398    // The name of the issue for which to list approval values.
   399    string parent = 1 [
   400      (google.api.resource_reference) = {type: "api.crbug.com/Issue"},
   401      (google.api.field_behavior) = REQUIRED ];
   402  }
   403  
   404  // The response message for Issues.ListApprovalValues.
   405  // Next available tag: 2
   406  message ListApprovalValuesResponse {
   407    // The approval values from the specified issue.
   408    repeated ApprovalValue approval_values = 1;
   409  }
   410  
   411  // The request message for Issues.ModifyCommentState.
   412  // Next available tag: 3
   413  message ModifyCommentStateRequest {
   414    // Resource name of the comment to modify state.
   415    string name = 1 [
   416      (google.api.resource_reference) = {type: "api.crbug.com/Comment"},
   417      (google.api.field_behavior) = REQUIRED ];
   418    // Requested state.
   419    IssueContentState state = 2;
   420  }
   421  
   422  // The response message for Issues.ModifyCommentState.
   423  // Next available tag: 2
   424  message ModifyCommentStateResponse {
   425    // The updated comment after modifying state.
   426    Comment comment = 1;
   427  }
   428  
   429  // The request message for MakeIssueFromTemplate.
   430  // Next available tag: 5
   431  message MakeIssueFromTemplateRequest {
   432    // Resource name of the template to use for filling in default values
   433    // and adding approvals and phases.
   434    string template = 1 [
   435        (google.api.resource_reference) = { type: "api.crbug.com/Template" }
   436    ];
   437    // The issue differences relative to the `template.issue` default.
   438    IssueDelta template_issue_delta = 2;
   439    // Changes to fields belonging to approvals relative to template default.
   440    // While ApprovalDelta can hold additional information, this method only
   441    // allows adding and removing field values, all other deltas will be ignored.
   442    repeated ApprovalDelta template_approval_deltas = 3;
   443    // The issue description, will be saved as the first comment.
   444    string description = 4;
   445  }
   446  
   447  // The request message for MakeIssue.
   448  // Next available tag: 6
   449  message MakeIssueRequest {
   450    // The name of the project the issue should belong to.
   451    string parent = 1 [
   452      (google.api.resource_reference) = {type: "api.crbug.com/Project"},
   453      (google.api.field_behavior) = REQUIRED ];
   454    // The issue to be created.
   455    Issue issue = 2;
   456    // The issue description.
   457    string description = 3;
   458    // The type of notification the creation should trigger.
   459    NotifyType notify_type = 4;
   460    // The attachment that will be attached to each new issue.
   461    repeated AttachmentUpload uploads = 5;
   462  }