package virtdb.interface.pb;

// common  ---------------------------------------------------------- //
// reused in all replies

message Error {
  required   string   Msg = 1;
}

// cert store ------------------------------------------------------- //
message Certificate {
  required   string   ComponentName       = 1;
  required   string   PublicKey           = 2;
  required   bool     Approved            = 3; 
  optional   string   RequesterIP         = 4;
  optional   uint64   RequestedAtEpoch    = 5;
  optional   uint64   ExpireAtEpoch       = 6;
  optional   string   AuthCode            = 7;
}

message CertStoreRequest {
  enum RequestType {
    CREATE_TEMP_KEY   = 2;
    APPROVE_TEMP_KEY  = 3;
    LIST_KEYS         = 4;
    DELETE_KEY        = 5;
  }
  message CreateTempKey {
    required   Certificate  Cert = 1;
  }
  message ApproveTempKey {
    required   string       AuthCode        = 1;
    required   string       LoginToken      = 2;
    required   string       ComponentName   = 3;
  }
  message ListKeys {
    required   bool     TempKeys       = 1;
    required   bool     ApprovedKeys   = 2;
    optional   string   ComponentName  = 3;
  }
  message DeleteKey {
    required   Certificate   Cert         = 1;
    required   string        LoginToken   = 2;
  }
  required   RequestType      Type       = 1;
  optional   CreateTempKey    Create     = 2;
  optional   ApproveTempKey   Approve    = 3;
  optional   ListKeys         List       = 4;
  optional   DeleteKey        Del        = 5;
}

message CertStoreReply {
  enum ReplyType {
    CREATE_TEMP_KEY    = 2;
    APPROVE_TEMP_KEY   = 3;
    LIST_KEYS          = 4;
    DELETE_KEY         = 5;
    ERROR_MSG          = 14;
  }
  message CreateTempKey {
    required   string   AuthCode = 1;
  }
  message ListKeys {
    repeated   Certificate   Certs  = 1;
  }
  required   ReplyType       Type     = 1;
  optional   CreateTempKey   Create   = 2;
  optional   ListKeys        List     = 4;
  optional   Error           Err      = 14;
}

// user manager ----------------------------------------------------- //
message UserData {
  required   string   Name              = 1;
  optional   string   PassHash          = 2;
  optional   uint64   Salt              = 3;
  optional   bool     IsAdmin           = 4;
  repeated   string   LoginTokens       = 5;
  repeated   string   TableTokens       = 6;
  repeated   string   SourceSysTokens   = 7;
}

message UserManagerRequest {
  enum RequestType {
    CREATE_USER             = 2;
    DELETE_USER             = 3;
    LIST_USERS              = 4;
    UPDATE_USER             = 5;
    CREATE_LOGIN_TOKEN      = 6;
    CREATE_TABLE_TOKEN      = 7;
    CREATE_SOURCESYS_TOKEN  = 8;
    GET_SOURCESYS_TOKEN     = 9;
    DELETE_TOKEN            = 10;
  }
  message CreateUser {
    required   string   UserName    = 1;
    required   string   Password    = 2;
    required   bool     IsAdmin     = 3;
    required   string   LoginToken  = 4; // Creator user
  }
  message DeleteUser {
    required   string   UserName     = 1;
    required   string   LoginToken   = 2;
  }
  message ListUsers {
    required   string   LoginToken   = 1;
  }
  message UpdateUser {
    required   string   UserName    = 1;
    required   string   LoginToken  = 2;
    optional   string   Password    = 3;
    optional   bool     IsAdmin     = 4;
  }
  // used by the GUI
  message CreateLoginToken {
    required   string   UserName   = 1;
    required   string   Password   = 2;
  }
  // used by the GUI
  message CreateTableToken {
    required   string    LoginToken      = 1;
    required   string    SourceSysName   = 2;
  }
  // used by the GUI
  message CreateSourceSysToken {
    required   string    LoginToken      = 1;
    required   string    SourceSysName   = 2;
  }
  // used by the GUI and Data Providers
  message GetSourceSysToken {
    required   string   LoginOrTableToken  = 1;
    required   string   SourceSysName      = 2;
  }
  // used by the GUI
  message DeleteToken {
    required   string   LoginToken     = 1;
    required   string   AnyTokenValue  = 2;
  }
  required   RequestType            Type          = 1;
  optional   CreateUser             CrUser        = 2;
  optional   DeleteUser             DelUser       = 3;
  optional   ListUsers              LstUsers      = 4;
  optional   UpdateUser             UpdUser       = 5;
  optional   CreateLoginToken       CrLoginTok    = 6;
  optional   CreateTableToken       CrTabTok      = 7;
  optional   CreateSourceSysToken   CrSSTok       = 8;
  optional   GetSourceSysToken      GetSSTok      = 9;
  optional   DeleteToken            DelTok        = 10;
}

message UserManagerReply {
  enum ReplyType {
    CREATE_USER             = 2;
    DELETE_USER             = 3;
    LIST_USERS              = 4;
    UPDATE_USER             = 5;
    CREATE_LOGIN_TOKEN      = 6;
    CREATE_TABLE_TOKEN      = 7;
    CREATE_SOURCESYS_TOKEN  = 8;
    GET_SOURCESYS_TOKEN     = 9;
    DELETE_TOKEN            = 11;
    ERROR_MSG               = 14;
  }
  message ListUsers {
    repeated   UserData   Users   = 1;
  }
  message CreateLoginToken {
    required  string    LoginToken   = 1;
    required  UserData  Data         = 2;
  }
  message CreateTableToken {
    required   string   TableToken   = 1;
  }
  message CreateSourceSysToken {
    required   string   SourceSysToken   = 1;
  }
  message GetSourceSysToken {
    required   string   SourceSysToken   = 1;
  }
  required   ReplyType              Type          = 1;
  optional   ListUsers              LstUsers      = 4;
  optional   CreateLoginToken       CrLoginTok    = 6;
  optional   CreateTableToken       CrTabTok      = 7;
  optional   CreateSourceSysToken   CrSSTok       = 8;
  optional   GetSourceSysToken      GetSSTok      = 9;
  optional   Error                  Err           = 14;
}

// source system credentials ---------------------------------------- //
message FieldTemplate {
  enum FieldType {
    STRING    = 1;
    EMAIL     = 2;
    PASSWORD  = 3;
    BOOLEAN   = 4;
    NUMBER    = 5;
  }
  required   string     Name   = 1;
  required   FieldType  Type   = 2;
}

message CredentialValues {
  message NamedValue {
    required   string   Name   = 1;
    required   string   Value  = 2;
  }
  repeated   NamedValue  NamedValues  = 1;
}

message SourceSystemCredentialRequest {
  enum RequestType {
    SET_CREDENTIAL       = 2;
    GET_CREDENTIAL       = 3;
    DELETE_CREDENTIAL    = 4;
    SET_TEMPLATE         = 5;
    GET_TEMPLATE         = 6;
  }
  // used by the GUI
  message SetCredential {
    required   string             SourceSysName    = 1;
    required   string             SourceSysToken   = 2;
    required   CredentialValues   Creds            = 3;
  }
  // used by the Data Providers
  message GetCredential {
    required   string   SourceSysName    = 1;
    required   string   SourceSysToken   = 2;
  }
  // used by the GUI
  message DeleteCredential {
    required   string   SourceSysName    = 1;
    required   string   SourceSysToken   = 2;
  }
  // used by the Data Providers
  message SetTemplate {
    required   string         SourceSysName   = 1;
    repeated   FieldTemplate  Templates       = 2;
  }
  // used by the GUI
  message GetTemplate {
    required   string   SourceSysName    = 1;
  }
  required   RequestType        Type      = 1;
  optional   SetCredential      SetCred   = 2;
  optional   GetCredential      GetCred   = 3;
  optional   DeleteCredential   DelCred   = 4;
  optional   SetTemplate        SetTmpl   = 5;
  optional   GetTemplate        GetTmpl   = 6;
}

message SourceSystemCredentialReply {
  enum ReplyType {
    SET_CREDENTIAL       = 2;
    GET_CREDENTIAL       = 3;
    DELETE_CREDENTIAL    = 4;
    SET_TEMPLATE         = 5;
    GET_TEMPLATE         = 6;
    ERROR_MSG            = 14;
  }
  message GetCredential {
    optional   CredentialValues   Creds   = 1;
  }
  message GetTemplate {
    repeated   FieldTemplate   Templates  = 1;
  }
  required   ReplyType       Type     = 1;
  optional   GetCredential   GetCred  = 3;
  optional   GetTemplate     GetTmpl  = 6;
  optional   Error           Err      = 14;
}

