syntax = "proto3";

import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";
import "google/api/resource.proto";
import "google/longrunning/operations.proto";
import "google/protobuf/empty.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";

package animeshon.resourcemanager.v1alpha1;

option go_package = "github.com/animeapis/go-genproto/resourcemanager/v1alpha1;resourcemanager";
option java_package = "com.animeshon.resourcemanager.v1alpha1";
option java_multiple_files = true;
option ruby_package = "Animeshon::ResourceManager::v1Alpha1";

service ResourceManager {
  option (google.api.default_host) = "resourcemanager.animeapis.com";

  rpc GetOrganization(GetOrganizationRequest) returns (Organization) {
    option (google.api.http) = {
      get: "/v1alpha1/{name=organizations/*}"
    };
  }

  rpc ListOrganizations(ListOrganizationsRequest) returns (ListOrganizationsResponse) {
    option (google.api.http) = {
      get: "/v1alpha1/organizations"
    };
  }

  rpc CreateOrganization(CreateOrganizationRequest) returns (Organization) {
    option (google.api.http) = {
      post: "/v1alpha1/organizations"
      body: "*"
    };
  }

  rpc UpdateOrganization(UpdateOrganizationRequest) returns (Organization) {
    option (google.api.http) = {
      patch: "/v1alpha1/{organization.name=organizations/*}"
      body: "*"
    };
  }

  rpc DeleteOrganization(DeleteOrganizationRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1alpha1/{name=organizations/*}"
    };
  }

  rpc GetTeam(GetTeamRequest) returns (Team) {
    option (google.api.http) = {
      get: "/v1alpha1/{name=teams/*}"
    };
  }

  rpc ListTeams(ListTeamsRequest) returns (ListTeamsResponse) {
    option (google.api.http) = {
      get: "/v1alpha1/teams"
    };
  }

  rpc CreateTeam(CreateTeamRequest) returns (Team) {
    option (google.api.http) = {
      post: "/v1alpha1/teams"
      body: "*"
    };
  }

  rpc UpdateTeam(UpdateTeamRequest) returns (Team) {
    option (google.api.http) = {
      patch: "/v1alpha1/{team.name=teams/*}"
      body: "*"
    };
  }

  rpc DeleteTeam(DeleteTeamRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete: "/v1alpha1/{name=teams/*}"
    };
  }
}

message Organization {
  string name = 1;
}

message Team {
  string name = 1;
}

message GetOrganizationRequest {
  // The name of the organization to retrieve.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "resourcemanager.animeapis.com/Organization"
    }
  ];
}

message ListOrganizationsRequest {
  // If unspecified, server will pick an appropriate default.
  int32 page_size = 1;

  // The value returned from the previous call.
  string page_token = 2;

  // A filter to be applied to results.
  string filter = 3;
}

message ListOrganizationsResponse {
  // The list of organizations.
  repeated Organization organizations = 1;

  // A token to retrieve next page of results.
  string next_page_token = 2;
}

message CreateOrganizationRequest {
  // The organization to create.
  Organization organization = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "resourcemanager.animeapis.com/Organization"
    }
  ];
}

message UpdateOrganizationRequest {
  // The organization to update.
  Organization organization = 1 [(google.api.field_behavior) = REQUIRED];

  // The field mask to determine which fields are to be updated. If empty, the
  // server will assume all fields are to be updated.
  google.protobuf.FieldMask update_mask = 2;
}

message DeleteOrganizationRequest {
  // The name of the organization to delete.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "resourcemanager.animeapis.com/Organization"
    }
  ];
}

message GetTeamRequest {
  // The name of the team to retrieve.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "resourcemanager.animeapis.com/Team"
    }
  ];
}

message ListTeamsRequest {
  // If unspecified, server will pick an appropriate default.
  int32 page_size = 1;

  // The value returned from the previous call.
  string page_token = 2;

  // A filter to be applied to results.
  string filter = 3;
}

message ListTeamsResponse {
  // The list of teams.
  repeated Team teams = 1;

  // A token to retrieve next page of results.
  string next_page_token = 2;
}

message CreateTeamRequest {
  // The team to create.
  Team team = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "resourcemanager.animeapis.com/Team"
    }
  ];
}

message UpdateTeamRequest {
  // The team to update.
  Team team = 1 [(google.api.field_behavior) = REQUIRED];

  // The field mask to determine which fields are to be updated. If empty, the
  // server will assume all fields are to be updated.
  google.protobuf.FieldMask update_mask = 2;
}

message DeleteTeamRequest {
  // The name of the team to delete.
  string name = 1 [
    (google.api.field_behavior) = REQUIRED,
    (google.api.resource_reference) = {
      type: "resourcemanager.animeapis.com/Team"
    }
  ];
}
