// Copyright 2017 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

syntax = "proto3";

package google.devtools.sourcerepo.v1;

import "google/api/annotations.proto";
import "google/api/auth.proto";
import "google/iam/v1/iam_policy.proto";
import "google/iam/v1/policy.proto";
import "google/protobuf/empty.proto";

option go_package = "google.golang.org/genproto/googleapis/devtools/sourcerepo/v1;sourcerepo";
option java_multiple_files = true;
option java_outer_classname = "SourceRepoProto";
option java_package = "com.google.devtools.sourcerepo.v1";


// The Source Repo API service.
service SourceRepo {
  // Returns all repos belonging to a project.
  rpc ListRepos(ListReposRequest) returns (ListReposResponse) {
    option (google.api.http) = { get: "/v1/{name=projects/*}/repos" };
  }

  // Returns information about a repo.
  rpc GetRepo(GetRepoRequest) returns (Repo) {
    option (google.api.http) = { get: "/v1/{name=projects/*/repos/**}" };
  }

  // Creates a repo in the given project with the given name..
  //
  // If the named repository already exists, `CreateRepo` returns
  // `ALREADY_EXISTS`.
  rpc CreateRepo(CreateRepoRequest) returns (Repo) {
    option (google.api.http) = { post: "/v1/{parent=projects/*}/repos" body: "repo" };
  }

  // Deletes a repo.
  rpc DeleteRepo(DeleteRepoRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = { delete: "/v1/{name=projects/*/repos/**}" };
  }

  // Sets the access control policy on the specified resource. Replaces any
  // existing policy.
  rpc SetIamPolicy(google.iam.v1.SetIamPolicyRequest) returns (google.iam.v1.Policy) {
    option (google.api.http) = { post: "/v1/{resource=projects/*/repos/**}:setIamPolicy" body: "*" };
  }

  // Gets the access control policy for a resource.
  // Returns an empty policy if the resource exists and does not have a policy
  // set.
  rpc GetIamPolicy(google.iam.v1.GetIamPolicyRequest) returns (google.iam.v1.Policy) {
    option (google.api.http) = { get: "/v1/{resource=projects/*/repos/**}:getIamPolicy" };
  }

  // Returns permissions that a caller has on the specified resource.
  // If the resource does not exist, this will return an empty set of
  // permissions, not a NOT_FOUND error.
  rpc TestIamPermissions(google.iam.v1.TestIamPermissionsRequest) returns (google.iam.v1.TestIamPermissionsResponse) {
    option (google.api.http) = { post: "/v1/{resource=projects/*/repos/**}:testIamPermissions" body: "*" };
  }
}

// A repository (or repo) is a Git repository storing versioned source content.
message Repo {
  // Resource name of the repository, of the form
  // `projects/<project>/repos/<repo>`.
  string name = 1;

  // The size in bytes of the repo.
  int64 size = 2;

  // URL to clone the repository from Google Cloud Source Repositories.
  string url = 3;

  // How this repository mirrors a repository managed by another service.
  MirrorConfig mirror_config = 4;
}

// Configuration to automatically mirror a repository from another
// hosting service, for example GitHub or BitBucket.
message MirrorConfig {
  // URL of the main repository at the other hosting service.
  string url = 1;

  // ID of the webhook listening to updates to trigger mirroring.
  // Removing this webook from the other hosting service will stop
  // Google Cloud Source Repositories from receiving notifications,
  // and thereby disabling mirroring.
  string webhook_id = 2;

  // ID of the SSH deploy key at the other hosting service.
  // Removing this key from the other service would deauthorize
  // Google Cloud Source Repositories from mirroring.
  string deploy_key_id = 3;
}

// Request for GetRepo.
message GetRepoRequest {
  // The name of the requested repository. Values are of the form
  // `projects/<project>/repos/<repo>`.
  string name = 1;
}

// Request for ListRepos.
message ListReposRequest {
  // The project ID whose repos should be listed. Values are of the form
  // `projects/<project>`.
  string name = 1;
}

// Response for ListRepos.
message ListReposResponse {
  // The listed repos.
  repeated Repo repos = 1;
}

// Request for CreateRepo
message CreateRepoRequest {
  // The project in which to create the repo. Values are of the form
  // `projects/<project>`.
  string parent = 1;

  // The repo to create.  Only name needs to be set; all other fields
  // are currently ignored.
  Repo repo = 2;
}

// Request for DeleteRepo.
message DeleteRepoRequest {
  // The name of the repo to delete. Values are of the form
  // `projects/<project>/repos/<repo>`.
  string name = 1;
}
