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

// Synchronous tenant-current configuration. No publication/status lifecycle.
service ApplicationNavigationService {
  rpc Read(ApplicationNavigationServiceReadRequest) returns (ApplicationNavigationServiceReadResponse);
  rpc Resolve(ApplicationNavigationServiceResolveRequest) returns (ApplicationNavigationServiceResolveResponse);
  rpc Save(ApplicationNavigationServiceSaveRequest) returns (ApplicationNavigationServiceSaveResponse);
}
message ApplicationNavigationResourceTarget {
  string resource_type = 1;
  string resource_id = 2;
}

// Page paths are resolved by the application release from the stable identity.
message ApplicationNavigationPageTarget {
  string id = 1;
  reserved 2;
  reserved "path";
}
message ApplicationNavigationItem {
  string id = 1;
  string label = 2;
  string icon = 3;
  oneof target {
    ApplicationNavigationResourceTarget resource = 4;
    ApplicationNavigationPageTarget page = 5;
    string url = 6;
  }
}

// The wrapper distinguishes omitted items from a deliberate empty document.
message ApplicationNavigationItems {
  repeated ApplicationNavigationItem values = 1;
}
message ApplicationNavigationDocument {
  string application_id = 1;
  uint64 revision = 2;
  ApplicationNavigationItems items = 3;
}
message ApplicationNavigationServiceReadRequest {
  string application_id = 1;
}
message ApplicationNavigationServiceReadResponse {
  ApplicationNavigationDocument document = 1;
  nexuscrm.common.v1.ConsistencyReceipts receipts = 2;
}
message ApplicationNavigationServiceResolveRequest {
  repeated string application_ids = 1;
}
message ApplicationNavigationServiceResolveResponse {
  repeated ApplicationNavigationDocument documents = 1;
  nexuscrm.common.v1.ConsistencyReceipts receipts = 2;
}
message ApplicationNavigationServiceSaveRequest {
  string application_id = 1;
  uint64 expected_revision = 2;
  string idempotency_key = 3;
  ApplicationNavigationItems items = 4;
}
message ApplicationNavigationServiceSaveResponse {
  ApplicationNavigationDocument document = 1;
  bool changed = 2;
  nexuscrm.common.v1.ConsistencyReceipts receipts = 3;
}
