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";

// RecycleBinReadService returns one bounded caller-visible deleted-record
// listing. Product route grammar and response aliases remain caller-owned.
service RecycleBinReadService {
  rpc ListRecycleBin(ListRecycleBinRequest) returns (ListRecycleBinResponse);
}

enum RecycleBinScope {
  RECYCLE_BIN_SCOPE_UNSPECIFIED = 0;
  RECYCLE_BIN_SCOPE_MINE = 1;
  RECYCLE_BIN_SCOPE_ALL = 2;
}

// Identity and authority are authenticated transport context. They are never
// caller-selected semantic request fields.
message ListRecycleBinRequest {
  RecycleBinScope scope = 1;
  optional uint64 min_catalog_revision = 2;
}

message RecycleBinItem {
  string record_id = 1;
  string record_name = 2;
  string object_id = 3;
  string deleted_by = 4;
  string deleted_date = 5;
  string created_date = 6;
  string last_modified_date = 7;
}

enum RecycleBinObjectFailureCode {
  RECYCLE_BIN_OBJECT_FAILURE_CODE_UNSPECIFIED = 0;
  RECYCLE_BIN_OBJECT_FAILURE_CODE_UNKNOWN = 1;
  RECYCLE_BIN_OBJECT_FAILURE_CODE_FORBIDDEN = 2;
  RECYCLE_BIN_OBJECT_FAILURE_CODE_INVALID_REQUEST = 3;
  RECYCLE_BIN_OBJECT_FAILURE_CODE_INTERNAL = 4;
}

message RecycleBinObjectFailure {
  string object_id = 1;
  RecycleBinObjectFailureCode code = 2;
  string message = 3;
}

message ListRecycleBinResponse {
  repeated RecycleBinItem items = 1;
  repeated RecycleBinObjectFailure failed_objects = 2;
  nexuscrm.common.v1.ConsistencyReceipts receipts = 3;
}
