/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

syntax = "proto3";

option java_multiple_files = true;
package org.apache.airavata.mft.storage.stubs.storagesecret;

import "CredCommon.proto";

message StorageSecret {
    string id = 1;
    string storageId = 2;
    string secretId = 3;
    enum StorageType {
        S3 = 0;
        SCP = 1;
        FTP = 2;
        LOCAL = 3;
        BOX = 4;
        DROPBOX = 5;
        GCS = 6;
        AZURE = 7;
        SWIFT = 8;
        ODATA = 9;
    }
    StorageType type = 4;
}

message StorageSecretCreateRequest {
    string storageId = 1;
    string secretId = 2;
    StorageSecret.StorageType type = 3;
    org.apache.airavata.mft.common.AuthToken authzToken = 4;
}

message StorageSecretDeleteRequest {
    string id =1;
    org.apache.airavata.mft.common.AuthToken authzToken = 2;
}

message StorageSecretDeleteResponse {
    bool status =1;
}

message StorageSecretUpdateRequest {
    StorageSecret storageSecret = 1;
    org.apache.airavata.mft.common.AuthToken authzToken = 2;
}

message StorageSecretUpdateResponse {
    StorageSecret storageSecret = 1;
}

message StorageSecretGetRequest {
    string id = 1;
    org.apache.airavata.mft.common.AuthToken authzToken = 2;
}

message StorageSecretSearchRequest {
    string storageId = 1;
    StorageSecret.StorageType type = 2;
    org.apache.airavata.mft.common.AuthToken authzToken = 3;
}

message StorageSecretSearchResponse {
    StorageSecret storageSecret = 1;
}

service StorageSecretService {
    rpc getStorageSecret (StorageSecretGetRequest) returns (StorageSecret);

    rpc searchStorageSecret (StorageSecretSearchRequest) returns (StorageSecretSearchResponse);

    rpc createStorageSecret (StorageSecretCreateRequest) returns (StorageSecret);

    rpc updateStorageSecret (StorageSecretUpdateRequest) returns (StorageSecretUpdateResponse);

    rpc deleteStorageSecret (StorageSecretDeleteRequest) returns (StorageSecretDeleteResponse);
}

