syntax = "proto3";
package coda.datasources.v1;

import "google/protobuf/timestamp.proto";
import "coda/common/v1/types.proto";

service DatasourceService {
  rpc ListDatasources(ListDatasourcesRequest) returns (ListDatasourcesResponse);
  rpc GetDatasource(GetDatasourceRequest) returns (GetDatasourceResponse);
  rpc CreateDatasource(CreateDatasourceRequest) returns (CreateDatasourceResponse);
  rpc UpdateDatasource(UpdateDatasourceRequest) returns (UpdateDatasourceResponse);
  rpc DeleteDatasource(DeleteDatasourceRequest) returns (DeleteDatasourceResponse);
  rpc RefreshDatasource(RefreshDatasourceRequest) returns (RefreshDatasourceResponse);
  rpc GetRefreshStatus(GetRefreshStatusRequest) returns (GetRefreshStatusResponse);
  rpc GetSchema(GetSchemaRequest) returns (GetSchemaResponse);
}

enum DatasourceType {
  DATASOURCE_TYPE_UNSPECIFIED = 0;
  DATASOURCE_TYPE_SNOWFLAKE = 1;
  DATASOURCE_TYPE_GRAPHQL = 2;
}

enum RefreshStatus {
  REFRESH_STATUS_UNSPECIFIED = 0;
  REFRESH_STATUS_PENDING = 1;
  REFRESH_STATUS_RUNNING = 2;
  REFRESH_STATUS_COMPLETE = 3;
  REFRESH_STATUS_FAILED = 4;
}

message Datasource {
  string id = 1;
  string tenant_id = 2;
  string name = 3;
  DatasourceType type = 4;
  google.protobuf.Timestamp created_at = 5;
  google.protobuf.Timestamp updated_at = 6;
  optional google.protobuf.Timestamp last_refreshed_at = 7;
}

message ListDatasourcesRequest { string tenant_id = 1; coda.common.v1.PageRequest page = 2; }
message ListDatasourcesResponse { repeated Datasource datasources = 1; coda.common.v1.PageInfo page = 2; }

message GetDatasourceRequest { string datasource_id = 1; }
message GetDatasourceResponse { Datasource datasource = 1; }

message CreateDatasourceRequest { string tenant_id = 1; string name = 2; DatasourceType type = 3; }
message CreateDatasourceResponse { Datasource datasource = 1; }

message UpdateDatasourceRequest { string datasource_id = 1; optional string name = 2; }
message UpdateDatasourceResponse { Datasource datasource = 1; }

message DeleteDatasourceRequest { string datasource_id = 1; }
message DeleteDatasourceResponse {}

message RefreshDatasourceRequest { string datasource_id = 1; }
message RefreshDatasourceResponse { string refresh_id = 1; }

message GetRefreshStatusRequest { string refresh_id = 1; }
message GetRefreshStatusResponse {
  RefreshStatus status = 1;
  optional int64 row_count = 2;
  optional int64 byte_size = 3;
  optional string error_message = 4;
}

message GetSchemaRequest { string datasource_id = 1; }
message GetSchemaResponse { repeated SchemaTable tables = 1; }

message SchemaTable { string name = 1; repeated SchemaColumn columns = 2; }
message SchemaColumn { string name = 1; string data_type = 2; bool nullable = 3; optional string description = 4; }
