Project import generated by Copybara.

GitOrigin-RevId: d9e9e3fb4e31372ec1fb43b178994ca78fa8fe70
diff --git a/api/v3/api_proto/users.proto b/api/v3/api_proto/users.proto
new file mode 100644
index 0000000..7d8aa48
--- /dev/null
+++ b/api/v3/api_proto/users.proto
@@ -0,0 +1,161 @@
+// 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.
+
+syntax = "proto3";
+
+package monorail.v3;
+
+option go_package = "api/v3/api_proto";
+
+import "google/api/field_behavior.proto";
+import "google/api/resource.proto";
+import "api/v3/api_proto/user_objects.proto";
+import "google/protobuf/empty.proto";
+import "google/protobuf/field_mask.proto";
+
+// ***ONLY CALL rpcs WITH `status: {ALPHA|STABLE}`***
+// rpcs without `status` are not ready.
+
+// Users service includes all methods needed for managing Users.
+service Users {
+  // status: ALPHA
+  // Returns the requested User.
+  //
+  // Raises:
+  //   NOT_FOUND is the user is not found.
+  //   INVALID_ARGUMENT if the `name` is invalid.
+  rpc GetUser (GetUserRequest) returns (User) {}
+
+  // status: ALPHA
+  // Returns all of the requested Users.
+  //
+  // Raises:
+  //   NOT_FOUND if any users are not found.
+  //   INVALID_ARGUMENT if any `names` are invalid.
+  rpc BatchGetUsers (BatchGetUsersRequest) returns (BatchGetUsersResponse) {}
+
+  // status: NOT READY
+  // Updates a User.
+  //
+  // Raises:
+  //   NOT_FOUND if the user is not found.
+  //   PERMISSION_DENIED if the requester is not allowed to update the user.
+  //   INVALID_ARGUMENT if required fields are missing or fields are invalid.
+  rpc UpdateUser (UpdateUserRequest) returns (User) {}
+
+  // status: NOT READY
+  // Stars a given project for the requestor.
+  //
+  // Raises:
+  //   NOT_FOUND if the requested project is not found.
+  //   INVALID_ARGUMENT if the given `project` is not valid.
+  rpc StarProject (StarProjectRequest) returns (ProjectStar) {}
+
+  // status: NOT READY
+  // Unstars a given project for the requestor.
+  //
+  // Raises:
+  //   NOT_FOUND if the requested project is not found.
+  //   INVALID_ARGUMENT if the given `project` is not valid.
+  rpc UnStarProject (UnStarProjectRequest) returns (google.protobuf.Empty) {}
+
+  // status: NOT READY
+  // Lists all of a user's starred projects.
+  //
+  // Raises:
+  //   NOT_FOUND if the requested user is not found.
+  //   INVALID_ARGUMENT if the given `parent` is not valid.
+  rpc ListProjectStars (ListProjectStarsRequest) returns (ListProjectStarsResponse) {}
+}
+
+
+// The request message for Users.GetUser.
+// Next available tag: 2
+message GetUserRequest {
+  // The name of the user to request.
+  string name = 1 [
+      (google.api.resource_reference) = {type: "api.crbug.com/User"},
+      (google.api.field_behavior) = REQUIRED ];
+}
+
+
+// The request message for Users.BatchGetUsers.
+// Next available tag: 2
+message BatchGetUsersRequest {
+  // The name of the users to request. At most 100 may be requested.
+  repeated string names = 1 [
+      (google.api.resource_reference) = {type: "api.crbug.com/User"},
+      (google.api.field_behavior) = REQUIRED ];
+}
+
+
+// The response message for Users.BatchGetUsers.
+// Next available tag: 2
+message BatchGetUsersResponse {
+  // The users that were requested.
+  repeated User users = 1;
+}
+
+
+// The request message for Users.UpdateUser.
+// Next available tag: 3
+message UpdateUserRequest {
+  // The user's `name` field is used to identify the user to be updated.
+  User user = 1 [
+      (google.api.field_behavior) = REQUIRED,
+      (google.api.resource_reference) = {type: "api.crbug.com/User"} ];
+  // The list of fields to be updated.
+  google.protobuf.FieldMask update_mask = 2 [ (google.api.field_behavior) = REQUIRED ];
+}
+
+
+// The request message for Users.StarProject.
+// Next available tag: 2
+message StarProjectRequest {
+  // The resource name for the Project to star.
+  string project = 1 [
+      (google.api.resource_reference) = {type: "api.crbug.com/Project"},
+      (google.api.field_behavior) = REQUIRED ];
+}
+
+
+// The request message for Users.UnStarProject.
+// Next available tag: 2
+message UnStarProjectRequest {
+  // The resource name for the Project to unstar.
+  string project = 1 [
+      (google.api.resource_reference) = {type: "api.crbug.com/Project"},
+      (google.api.field_behavior) = REQUIRED ];
+}
+
+
+// The request message for Users.ListProjectStars.
+// Next available tag: 4
+message ListProjectStarsRequest {
+  // The resource name for the user having stars listed.
+  string parent = 1 [
+      (google.api.resource_reference) = {type: "api.crbug.com/User"},
+      (google.api.field_behavior) = REQUIRED ];
+  // The maximum number of items to return. The service may return fewer than
+  // this value.
+  // If unspecified, at most 1000 items will be returned.
+  int32 page_size = 2;
+  // A page token, received from a previous `ListProjectStars` call.
+  // Provide this to retrieve the subsequent page.
+  //
+  // When paginating, all other parameters provided to `ListProjectStars` must
+  // match the call that provided the page token.
+  string page_token = 3;
+}
+
+
+// The response message for Users.ListProjectStars.
+// Next available tag: 3
+message ListProjectStarsResponse {
+  // Data for each starred project.
+  repeated ProjectStar project_stars = 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;
+}