syntax = "proto3";
package nexuscrm.runtime.v1;

import "common/v1/common.proto";

option go_package = "github.com/pingcap-inc/nexuscrm-contract/wire-go/gen/runtime/v1;runtimev1";
// ResourceAccessService administers resource ACLs. Authorized resource
// collection and point reads remain on Runtime Query/record authorization.
service ResourceAccessService {
  rpc AccessResource(AccessResourceRequest) returns (AccessResourceResponse);
}
enum ResourceAccessOperation {
  RESOURCE_ACCESS_OPERATION_UNSPECIFIED = 0;
  reserved 1;
  reserved "RESOURCE_ACCESS_OPERATION_LIST_VISIBLE_RESOURCES";
  RESOURCE_ACCESS_OPERATION_LIST_GRANTS = 2;
  RESOURCE_ACCESS_OPERATION_GET_GRANT = 3;
  RESOURCE_ACCESS_OPERATION_CREATE_GRANT = 4;
  RESOURCE_ACCESS_OPERATION_ENSURE_GRANT = 5;
  RESOURCE_ACCESS_OPERATION_REPLACE_GRANTS = 6;
  RESOURCE_ACCESS_OPERATION_UPDATE_GRANT = 7;
  RESOURCE_ACCESS_OPERATION_DELETE_GRANT = 8;
  RESOURCE_ACCESS_OPERATION_DELETE_PRINCIPAL_TYPE = 9;
  RESOURCE_ACCESS_OPERATION_TRANSFER_OWNERSHIP = 10;
}
message ResourceAccessGrantInput {
  string principal_id = 1;
  string principal_type = 2;
  string access_level = 3;
}
message ResourceAccessGrant {
  string id = 1;
  string resource_type = 2;
  string resource_id = 3;
  string principal_id = 4;
  string principal_type = 5;
  string access_level = 6;
}
message AccessResourceRequest {
  ResourceAccessOperation operation = 1;
  string resource_type = 2;
  string resource_id = 3;
  string grant_id = 4;
  ResourceAccessGrantInput grant = 5;
  repeated ResourceAccessGrantInput grants = 6;
  string access_level = 7;
  string principal_type = 8;
  string source_owner_id = 9;
  string target_owner_id = 10;
  optional uint64 min_catalog_revision = 11;
  // Required for mutations and absent for reads. Runtime binds it to a
  // capability-computed effect digest and durable terminal outcome.
  string command_id = 12;
}
message AccessResourceResponse {
  reserved 1, 4;
  reserved "resource_ids", "all_resources_visible";
  repeated ResourceAccessGrant grants = 2;
  nexuscrm.common.v1.ConsistencyReceipts receipts = 3;
  // Echoed for mutations and absent for reads.
  string command_id = 5;
  // Complete all-or-nothing population changed by TRANSFER_OWNERSHIP.
  uint32 affected_resources = 6;
}
