syntax = "proto3";

package olivetin.api.v1;

option go_package = "github.com/OliveTin/OliveTin/gen/olivetin/api/v1;apiv1";

message Action {
	string binding_id = 1;
	string title = 2;
	string icon = 3;
	bool can_exec = 4;
	repeated ActionArgument arguments = 5;
	string popup_on_start = 6;
	int32 order = 7;
	int32 timeout = 8;
}

message ActionArgument {
	string name = 1;
	string title = 2;
	string type = 3;
	string default_value = 4;

	repeated ActionArgumentChoice choices = 5;

	string description = 6;
	map<string, string> suggestions = 7;
}

message ActionArgumentChoice {
	string value = 1;
	string title = 2;
}

message Entity {
	string title = 1;
    string unique_key = 2;
    string type = 3;
}

message GetDashboardResponse {
	string title = 1;

	Dashboard dashboard = 4;
}

message EffectivePolicy {
	bool show_diagnostics = 1;
	bool show_log_list = 2;
}

message GetDashboardRequest {
	string title = 1;
}

message Dashboard {
	string title = 1;
	repeated DashboardComponent contents = 2;
}

message DashboardComponent {
	string title = 1;
	string type = 2;
	repeated DashboardComponent contents = 3;
	string icon = 4;
	string css_class = 5;
	Action action = 6;
}

message StartActionRequest {
	string binding_id = 1;

	repeated StartActionArgument arguments = 2;

	string unique_tracking_id = 3;
}

message StartActionArgument {
	string name = 1;
	string value = 2;
}

message StartActionResponse {
	string execution_tracking_id = 2;
}

message StartActionAndWaitRequest {
	string action_id = 1;

	repeated StartActionArgument arguments = 2;
}

message StartActionAndWaitResponse {
	LogEntry log_entry = 1;
}

message StartActionByGetRequest {
	string action_id = 1;
}

message StartActionByGetResponse {
	string execution_tracking_id = 2;
}

message StartActionByGetAndWaitRequest {
	string action_id = 1;
}

message StartActionByGetAndWaitResponse {
	LogEntry log_entry = 1;
}

message GetLogsRequest{
  int64 start_offset = 1;
};

message LogEntry {
	string datetime_started = 1;
	string action_title = 2;
	string output = 3;
	bool timed_out = 5;
	int32 exit_code = 6;
	string user = 7;
	string user_class = 8;
	string action_icon = 9;
	repeated string tags = 10;
	string execution_tracking_id = 11;
	string datetime_finished = 12;
	string action_id = 13;
	bool execution_started = 14;
	bool execution_finished = 15;
	bool blocked = 16;
	int64 datetime_index = 17;
	bool can_kill = 18;
}

message GetLogsResponse {
	repeated LogEntry logs = 1;
	int64 count_remaining = 2;
	int64 page_size = 3;
	int64 total_count = 4;
	int64 start_offset = 5;
}

message GetActionLogsRequest {
	string action_id = 1;
	int64 start_offset = 2;
}

message GetActionLogsResponse {
	repeated LogEntry logs = 1;
	int64 count_remaining = 2;
	int64 page_size = 3;
	int64 total_count = 4;
	int64 start_offset = 5;
}

message ValidateArgumentTypeRequest {
	string value = 1;
	string type = 2;
}

message ValidateArgumentTypeResponse {
	bool valid = 1;
	string description = 2;
}

message WatchExecutionRequest {
	string execution_tracking_id = 1;
}

message WatchExecutionUpdate {
	string update = 1;
}

message ExecutionStatusRequest {
	string execution_tracking_id = 1;
	string action_id = 2;
}

message ExecutionStatusResponse {
	LogEntry log_entry = 1;
}

message WhoAmIRequest {}

message WhoAmIResponse {
	string authenticated_user = 1;
    string usergroup = 2;
    string provider = 3;

    repeated string acls = 4;

    string sid = 5;
}

message SosReportRequest {}

message SosReportResponse {
	string alert = 1;
}

message DumpVarsRequest {}

message DumpVarsResponse {
	string alert = 1;
	map<string, string> contents = 2;
}

message ActionEntityPair {
	string action_title = 1;
	string entity_prefix = 2;
}

message DumpPublicIdActionMapRequest {}
message DumpPublicIdActionMapResponse {
	string alert = 1;
	map<string, ActionEntityPair> contents = 2;
}

message GetReadyzRequest {}

message GetReadyzResponse {
	string status = 1;
}

message EventStreamRequest {
}

message EventStreamResponse {
  oneof event {
    EventEntityChanged entity_changed = 2;
    EventConfigChanged config_changed = 3;
    EventExecutionFinished execution_finished = 4;
    EventExecutionStarted execution_started = 5;
    EventOutputChunk output_chunk = 6;
  }
}

message EventOutputChunk {
	string execution_tracking_id = 1;

	string output = 2;
}

message EventEntityChanged {}
message EventConfigChanged {}
message EventExecutionFinished {
	LogEntry log_entry = 1;
}

message EventExecutionStarted {
  LogEntry log_entry = 1;
}

message KillActionRequest {
	string execution_tracking_id = 1;
}

message KillActionResponse {
	string execution_tracking_id = 1;
	bool killed = 2;
	bool already_completed = 3;
	bool found = 4;
}

message LocalUserLoginRequest {
    string username = 1;
    string password = 2;
}

message LocalUserLoginResponse {
    bool success = 1;
}

message PasswordHashRequest {
    string password = 1;
}

message PasswordHashResponse {
    string hash = 1;
}

message LogoutRequest {}

message LogoutResponse {
}

message GetDiagnosticsRequest {
}

message GetDiagnosticsResponse {
	string SshFoundKey = 1;
	string SshFoundConfig = 2;
}

message InitRequest {}

message InitResponse {
	bool showFooter = 1;
	bool showNavigation = 2;
	bool showNewVersions = 3;
	string availableVersion = 4;
	string currentVersion = 5;
	string pageTitle = 6;
	string sectionNavigationStyle = 7;
	string defaultIconForBack = 8;
	bool enableCustomJs = 9;
	string authLoginUrl = 10;
	bool authLocalLogin = 11;
	repeated string styleMods = 12;
	repeated OAuth2Provider oAuth2Providers = 13;
	repeated AdditionalLink additionalLinks = 14;
	repeated string rootDashboards = 15;
	string authenticated_user = 16;
    string authenticated_user_provider = 17;
	EffectivePolicy effective_policy = 18;
    string banner_message = 19;
    string banner_css = 20;
	bool show_diagnostics = 21;
	bool show_log_list = 22;
	bool login_required = 23;
}

message AdditionalLink {
	string title = 1;
	string url = 2;
}

message OAuth2Provider {
	string title = 1;
	string url = 2;
	string icon = 3;
}

message GetActionBindingRequest {
	string binding_id = 1;
}

message GetActionBindingResponse {
	Action action = 1;
}

message GetEntitiesRequest {
}

message GetEntitiesResponse {
  repeated EntityDefinition entity_definitions = 1;
}

message EntityDefinition {
  string title = 1;
  repeated Entity instances = 2;
  repeated string used_on_dashboards = 3;
}

message GetEntityRequest {
  string unique_key = 1;
  string type = 2;
}

message RestartActionRequest {
    string execution_tracking_id = 1;
}

service OliveTinApiService {
	rpc GetDashboard(GetDashboardRequest) returns (GetDashboardResponse) {}

	rpc StartAction(StartActionRequest) returns (StartActionResponse) {}

	rpc StartActionAndWait(StartActionAndWaitRequest) returns (StartActionAndWaitResponse) {}

	rpc StartActionByGet(StartActionByGetRequest) returns (StartActionByGetResponse) {}

	rpc StartActionByGetAndWait(StartActionByGetAndWaitRequest) returns (StartActionByGetAndWaitResponse) {}

    rpc RestartAction(RestartActionRequest) returns (StartActionResponse) {}

	rpc KillAction(KillActionRequest) returns (KillActionResponse) {}

	rpc ExecutionStatus(ExecutionStatusRequest) returns (ExecutionStatusResponse) {}

	rpc GetLogs(GetLogsRequest) returns (GetLogsResponse) {}
	
	rpc GetActionLogs(GetActionLogsRequest) returns (GetActionLogsResponse) {}

	rpc ValidateArgumentType(ValidateArgumentTypeRequest) returns (ValidateArgumentTypeResponse) {}

	rpc WhoAmI(WhoAmIRequest) returns (WhoAmIResponse) {}

	rpc SosReport(SosReportRequest) returns (SosReportResponse) {}

	rpc DumpVars(DumpVarsRequest) returns (DumpVarsResponse) {}

	rpc DumpPublicIdActionMap(DumpPublicIdActionMapRequest) returns (DumpPublicIdActionMapResponse) {}

	rpc GetReadyz(GetReadyzRequest) returns (GetReadyzResponse) {}

    rpc LocalUserLogin(LocalUserLoginRequest) returns (LocalUserLoginResponse) {}

    rpc PasswordHash(PasswordHashRequest) returns (PasswordHashResponse) {}

    rpc Logout(LogoutRequest) returns (LogoutResponse) {}

    rpc EventStream(EventStreamRequest) returns (stream EventStreamResponse) {}

	rpc GetDiagnostics(GetDiagnosticsRequest) returns (GetDiagnosticsResponse) {}

	rpc Init(InitRequest) returns (InitResponse) {}

	rpc GetActionBinding(GetActionBindingRequest) returns (GetActionBindingResponse) {}

    rpc GetEntities(GetEntitiesRequest) returns (GetEntitiesResponse) {}

    rpc GetEntity(GetEntityRequest) returns (Entity) {}
}
