Project import generated by Copybara.

GitOrigin-RevId: d9e9e3fb4e31372ec1fb43b178994ca78fa8fe70
diff --git a/api/v3/api_proto/projects.proto b/api/v3/api_proto/projects.proto
new file mode 100644
index 0000000..d902067
--- /dev/null
+++ b/api/v3/api_proto/projects.proto
@@ -0,0 +1,178 @@
+// 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 = "api/v3/api_proto";
+
+import "google/protobuf/empty.proto";
+import "google/api/field_behavior.proto";
+import "google/api/resource.proto";
+import "api/v3/api_proto/project_objects.proto";
+
+// ***ONLY CALL rpcs WITH `status: {ALPHA|STABLE}`***
+// rpcs without `status` are not ready.
+
+// Projects service includes all methods needed for managing Projects.
+service Projects {
+  // status: NOT READY
+  // Creates a new FieldDef (custom field).
+  //
+  // Raises:
+  //   NOT_FOUND if some given users do not exist.
+  //   ALREADY_EXISTS if a field with the same name owned by the project
+  //   already exists.
+  //   INVALID_INPUT if there was a problem with the input.
+  //   PERMISSION_DENIED if the user cannot edit the project.
+  rpc CreateFieldDef (CreateFieldDefRequest) returns (FieldDef) {}
+
+  // status: ALPHA
+  // Creates a new ComponentDef.
+  //
+  // Raises:
+  //   INVALID_INPUT if the request is invalid.
+  //   ALREADY_EXISTS if the component already exists.
+  //   PERMISSION_DENIED if the user is not allowed to create a/this component.
+  //   NOT_FOUND if the parent project or a component cc or admin is not found.
+  rpc CreateComponentDef (CreateComponentDefRequest) returns (ComponentDef) {}
+
+  // status: ALPHA
+  // Deletes a ComponentDef.
+  //
+  // Raises:
+  //   INVALID_INPUT if the request is invalid.
+  //   PERMISSION_DENIED if the user is not allowed to delete a/this component.
+  //   NOT_FOUND if the component or project is not found.
+  rpc DeleteComponentDef (DeleteComponentDefRequest) returns (google.protobuf.Empty) {}
+
+  // status: NOT READY
+  // Returns all templates for specified project.
+  //
+  // Raises:
+  //   NOT_FOUND if the requested parent project is not found.
+  //   INVALID_ARGUMENT if the given `parent` is not valid.
+  rpc ListIssueTemplates (ListIssueTemplatesRequest) returns (ListIssueTemplatesResponse) {}
+
+  // status: ALPHA
+  // Returns all field defs for specified project.
+  //
+  // Raises:
+  //   NOT_FOUND if the request arent project is not found.
+  //   INVALID_ARGUMENT if the given `parent` is not valid.
+  rpc ListComponentDefs (ListComponentDefsRequest) returns (ListComponentDefsResponse) {}
+
+  // status: NOT READY
+  // Returns all projects hosted on Monorail.
+  rpc ListProjects (ListProjectsRequest) returns (ListProjectsResponse) {}
+}
+
+// Request message for CreateFieldDef method.
+// Next available tag: 3
+message CreateFieldDefRequest {
+  // The project resource where this field will be created.
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {type: "api.crbug.com/Project" }];
+  // The field to create.
+  // It must have a display_name and a type with its corresponding settings.
+  FieldDef fielddef = 2 [ (google.api.field_behavior) = REQUIRED ];
+}
+
+// Request message for CreateComponentDef method.
+// Next available tag: 3
+message CreateComponentDefRequest {
+  // The project resource where this component will be created.
+  string parent = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {type: "api.crbug.com/Project" }];
+  // The component to create.
+  ComponentDef component_def = 2 [ (google.api.field_behavior) = REQUIRED ];
+}
+
+// Request message for DeleteComponentDef method.
+// Next available tag: 2
+message DeleteComponentDefRequest {
+  // The component to delete.
+  string name = 1 [
+    (google.api.field_behavior) = REQUIRED,
+    (google.api.resource_reference) = {type: "api.crbug.com/ComponentDef"}];
+}
+
+// Request message for ListIssueTemplates
+// Next available tag: 4
+message ListIssueTemplatesRequest {
+  // The name of the project these templates belong to.
+  string parent = 1 [
+    (google.api.resource_reference) = {type: "api.crbug.com/Project"},
+    (google.api.field_behavior) = REQUIRED ];
+  // The maximum number of items to return. The service may return fewer than
+  // this value.
+  int32 page_size = 2;
+  // A page token, received from a previous `ListIssueTemplates` call.
+  // Provide this to retrieve the subsequent page.
+  // When paginating, all other parameters provided to
+  // `ListIssueTemplatesRequest` must match the call that provided the token.
+  string page_token = 3;
+}
+
+// Response message for ListIssueTemplates
+// Next available tag: 3
+message ListIssueTemplatesResponse {
+  // Templates matching the given request.
+  repeated IssueTemplate templates = 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;
+}
+
+// Request message for ListComponentDefs
+// Next available tag: 4
+message ListComponentDefsRequest {
+  // The name of the parent project.
+  string parent = 1 [
+    (google.api.resource_reference) = {type: "api.crbug.com/Project"},
+    (google.api.field_behavior) = REQUIRED ];
+  // The maximum number of items to return. The service may return fewer than
+  // this value.
+  int32 page_size = 2;
+  // A page token, received from a previous `ListComponentDefs` call.
+  // Provide this to retrieve the subsequent page.
+  // When paginating, all other parameters provided to
+  // `ListComponentDefsRequest` must match the call that provided the token.
+  string page_token = 3;
+}
+
+// Response message for ListComponentDefs
+// Next available tag: 3
+message ListComponentDefsResponse {
+  // Component defs matching the given request.
+  repeated ComponentDef component_defs = 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;
+}
+
+// Request message for ListProjects
+// Next available tag: 3
+message ListProjectsRequest {
+  // The maximum number of items to return. The service may return fewer than
+  // this value.
+  int32 page_size = 1;
+  // A page token, received from a previous `ListProjects` call.
+  // Provide this to retrieve the subsequent page.
+  string page_token = 2;
+}
+
+// Response message for ListProjects
+// Next available tag: 3
+message ListProjectsResponse {
+  // Projects matching the given request.
+  repeated Project projects = 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;
+}