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