syntax = "proto3";

package culprit.v1;

option go_package = "go.skia.org/infra/perf/go/culprit/proto/v1";


// Handles all culprit related actions.
service CulpritService {
  // Stores commits identified as culprits in persistent storage.
  rpc PersistCulprit(PersistCulpritRequest) returns (PersistCulpritResponse) {
  }
  // Fetches a given culprit by id
  rpc GetCulprit(GetCulpritRequest) returns (GetCulpritResponse) {
  }
  // Takes necessary actions to inform users about the regression.
  rpc NotifyUser(NotifyUserRequest) returns (NotifyUserResponse) {
  }
}


// Request object for PersistCulprit rpc.
message PersistCulpritRequest {
  // List of commits identified as culprits.
  repeated Commit commits = 1;
  // ID of the anomaly group corresponding to the bisection.
  string anomaly_group_id = 2;
}


// Response object for PersistCulprit rpc.
message PersistCulpritResponse {
  // List of culprit ids created.
  repeated string culprit_ids = 1;
}

// Request object for GetCulprit rpc.
message GetCulpritRequest {
  repeated string culprit_ids = 1;
}

// Response object for GetCulprit rpc.
message GetCulpritResponse {
  repeated Culprit culprits = 1;
}

// Request object for NotifyUser rpc.
message NotifyUserRequest {
  // List of culprit ids.
  repeated string culprit_ids = 1;
  // ID of the anomaly group corresponding to the bisection.
  string anomaly_group_id = 2;
}


// Response object for NotifyUser rpc.
message NotifyUserResponse {
  // List of issue ids created
  repeated string issue_ids = 1;
}


// Represents the change which has been identified as a culprit.
message Culprit {
  string id = 1;
  Commit commit = 2;
  repeated string anomaly_group_ids = 3;
  repeated string issue_ids = 4;
}


// Represents a commit which has been identified as a culprit.
message Commit {
  // Repo host e.g. chromium.googlesource.com
  string host  = 1;
  // Project inside the repo e.g. chromium/src
  string project = 2;
  // Repo ref e.g. "refs/heads/main
  string ref = 3;
  // Commit Hash
  string revision = 4;
}
