Adding repository support for SFTP Remotes
diff --git a/data-orchestrator/data-orchestrator-api/pom.xml b/data-orchestrator/data-orchestrator-api/pom.xml
index c840c04..e6433cb 100644
--- a/data-orchestrator/data-orchestrator-api/pom.xml
+++ b/data-orchestrator/data-orchestrator-api/pom.xml
@@ -41,6 +41,25 @@
 
         <dependency>
             <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+            <version>2.4.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>net.sf.dozer</groupId>
+            <artifactId>dozer</artifactId>
+            <version>5.5.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.h2database</groupId>
+            <artifactId>h2</artifactId>
+            <version>1.4.197</version>
+            <scope>runtime</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
             <exclusions>
diff --git a/data-orchestrator/data-orchestrator-api/src/main/java/org/apache/airavata/datalake/orchestrator/api/controller/remote/SFTPController.java b/data-orchestrator/data-orchestrator-api/src/main/java/org/apache/airavata/datalake/orchestrator/api/controller/remote/SFTPController.java
index 5492889..e7bced6 100644
--- a/data-orchestrator/data-orchestrator-api/src/main/java/org/apache/airavata/datalake/orchestrator/api/controller/remote/SFTPController.java
+++ b/data-orchestrator/data-orchestrator-api/src/main/java/org/apache/airavata/datalake/orchestrator/api/controller/remote/SFTPController.java
@@ -19,39 +19,61 @@
  */
 package org.apache.airavata.datalake.orchestrator.api.controller.remote;
 
-import org.apache.airavata.datalake.orchestrator.api.model.remote.SFTPCredential;
+import org.apache.airavata.datalake.orchestrator.api.db.entity.SFTPRemoteEntity;
+import org.apache.airavata.datalake.orchestrator.api.db.repo.SFTPRemoteRepository;
 import org.apache.airavata.datalake.orchestrator.api.model.remote.SFTPRemote;
+import org.dozer.DozerBeanMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.server.ResponseStatusException;
+
+import java.util.Optional;
 
 @RestController
 @RequestMapping(path = "/remotes/sftp")
 public class SFTPController {
 
+    @Autowired
+    private SFTPRemoteRepository sftpRemoteRepository;
+
     @GetMapping(value = "/{remoteId}", produces = "application/json")
     public SFTPRemote fetchSFTPRemote(@PathVariable(name = "remoteId") String remoteId) {
-        return new SFTPRemote()
-            .setHost("localhost")
-            .setPort(22)
-            .setCredential(
-                    new SFTPCredential()
-                        .setAuthMethod(SFTPCredential.AuthMethod.SSH_KEY)
-                        .setPrivateKey("")
-                        .setPublicKey(""));
+
+        Optional<SFTPRemoteEntity> entityOp = sftpRemoteRepository.findById(remoteId);
+        SFTPRemoteEntity sftpRemoteEntity = entityOp.orElseThrow(
+                                        () -> new ResponseStatusException(HttpStatus.NOT_FOUND, remoteId + " not found"));
+        DozerBeanMapper mapper = new DozerBeanMapper();
+        return mapper.map(sftpRemoteEntity, SFTPRemote.class);
     }
 
     @PostMapping(value = "")
     public String createSFTPRemote(@RequestBody SFTPRemote sftpRemote) {
-        return "Remote id";
+
+        DozerBeanMapper mapper = new DozerBeanMapper();
+        SFTPRemoteEntity sftpRemoteEntity = mapper.map(sftpRemote, SFTPRemoteEntity.class);
+        SFTPRemoteEntity saved = sftpRemoteRepository.save(sftpRemoteEntity);
+        return saved.getId();
     }
 
     @PutMapping(value = "/{remoteId}")
     public String updateSFTPRemote(@RequestBody SFTPRemote sftpRemote,
                                    @PathVariable(name = "remoteId") String remoteId) {
-        return "Remote id";
+
+        DozerBeanMapper mapper = new DozerBeanMapper();
+        SFTPRemoteEntity sftpRemoteEntity = mapper.map(sftpRemote, SFTPRemoteEntity.class);
+        sftpRemoteEntity.setId(remoteId);
+        SFTPRemoteEntity saved = sftpRemoteRepository.save(sftpRemoteEntity);
+        return saved.getId();
     }
 
     @DeleteMapping(value = "/{remoteId}")
     public String removeSFTPRemote(@PathVariable(name = "remoteId") String remoteId) {
-        return "Deleted";
+
+        if (! sftpRemoteRepository.existsById(remoteId)) {
+            throw new ResponseStatusException(HttpStatus.NOT_FOUND, remoteId + " not found");
+        }
+        sftpRemoteRepository.deleteById(remoteId);
+        return "Success";
     }
 }
diff --git a/data-orchestrator/data-orchestrator-api/src/main/java/org/apache/airavata/datalake/orchestrator/api/db/entity/SFTPCredentialEntity.java b/data-orchestrator/data-orchestrator-api/src/main/java/org/apache/airavata/datalake/orchestrator/api/db/entity/SFTPCredentialEntity.java
new file mode 100644
index 0000000..6b5a294
--- /dev/null
+++ b/data-orchestrator/data-orchestrator-api/src/main/java/org/apache/airavata/datalake/orchestrator/api/db/entity/SFTPCredentialEntity.java
@@ -0,0 +1,140 @@
+/*
+ *
+ * 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.
+ */
+package org.apache.airavata.datalake.orchestrator.api.db.entity;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+import java.util.List;
+
+@Entity
+public class SFTPCredentialEntity {
+
+    @Id
+    @GeneratedValue(generator = "uuid")
+    @GenericGenerator(name = "uuid", strategy = "uuid2")
+    @Column(name = "ID")
+    private String id;
+
+    @Column(name = "USER_NAME")
+    private String userName;
+
+    @Column(name = "EXISTING_KEY_ID")
+    private String existingKeyId;
+
+    @Column(name = "PUBLIC_KEY")
+    private String publicKey;
+
+    @Column(name = "PRIVATE_KEY")
+    private String privateKey;
+
+    @Column(name = "PASSPHRASE")
+    private String passphrase;
+
+    @Column(name = "PASSWORD")
+    private String password;
+
+    @Column(name = "AUTH_METHOD")
+    private String authMethod;
+
+    @OneToMany(mappedBy = "credential", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+    private List<SFTPRemoteEntity> sftpRemotes;
+
+    public String getId() {
+        return id;
+    }
+
+    public SFTPCredentialEntity setId(String id) {
+        this.id = id;
+        return this;
+    }
+
+    public String getUserName() {
+        return userName;
+    }
+
+    public SFTPCredentialEntity setUserName(String userName) {
+        this.userName = userName;
+        return this;
+    }
+
+    public String getExistingKeyId() {
+        return existingKeyId;
+    }
+
+    public SFTPCredentialEntity setExistingKeyId(String existingKeyId) {
+        this.existingKeyId = existingKeyId;
+        return this;
+    }
+
+    public String getPublicKey() {
+        return publicKey;
+    }
+
+    public SFTPCredentialEntity setPublicKey(String publicKey) {
+        this.publicKey = publicKey;
+        return this;
+    }
+
+    public String getPrivateKey() {
+        return privateKey;
+    }
+
+    public SFTPCredentialEntity setPrivateKey(String privateKey) {
+        this.privateKey = privateKey;
+        return this;
+    }
+
+    public String getPassphrase() {
+        return passphrase;
+    }
+
+    public SFTPCredentialEntity setPassphrase(String passphrase) {
+        this.passphrase = passphrase;
+        return this;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public SFTPCredentialEntity setPassword(String password) {
+        this.password = password;
+        return this;
+    }
+
+    public String getAuthMethod() {
+        return authMethod;
+    }
+
+    public SFTPCredentialEntity setAuthMethod(String authMethod) {
+        this.authMethod = authMethod;
+        return this;
+    }
+
+    public List<SFTPRemoteEntity> getSftpRemotes() {
+        return sftpRemotes;
+    }
+
+    public SFTPCredentialEntity setSftpRemotes(List<SFTPRemoteEntity> sftpRemotes) {
+        this.sftpRemotes = sftpRemotes;
+        return this;
+    }
+}
diff --git a/data-orchestrator/data-orchestrator-api/src/main/java/org/apache/airavata/datalake/orchestrator/api/db/entity/SFTPRemoteEntity.java b/data-orchestrator/data-orchestrator-api/src/main/java/org/apache/airavata/datalake/orchestrator/api/db/entity/SFTPRemoteEntity.java
new file mode 100644
index 0000000..2ab128b
--- /dev/null
+++ b/data-orchestrator/data-orchestrator-api/src/main/java/org/apache/airavata/datalake/orchestrator/api/db/entity/SFTPRemoteEntity.java
@@ -0,0 +1,92 @@
+/*
+ *
+ * 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.
+ */
+package org.apache.airavata.datalake.orchestrator.api.db.entity;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+
+@Entity
+public class SFTPRemoteEntity {
+
+    @Id
+    @GeneratedValue(generator = "uuid")
+    @GenericGenerator(name = "uuid", strategy = "uuid2")
+    @Column(name = "ID")
+    private String id;
+
+    @Column(name = "NAME")
+    private String name;
+
+    @Column(name = "HOST")
+    private String host;
+
+    @Column(name = "PORT")
+    private Integer port;
+
+    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
+    @JoinColumn(name = "CREDENTIAL_ID")
+    private SFTPCredentialEntity credential;
+
+    public String getId() {
+        return id;
+    }
+
+    public SFTPRemoteEntity setId(String id) {
+        this.id = id;
+        return this;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public SFTPRemoteEntity setName(String name) {
+        this.name = name;
+        return this;
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    public SFTPRemoteEntity setHost(String host) {
+        this.host = host;
+        return this;
+    }
+
+    public Integer getPort() {
+        return port;
+    }
+
+    public SFTPRemoteEntity setPort(Integer port) {
+        this.port = port;
+        return this;
+    }
+
+    public SFTPCredentialEntity getCredential() {
+        return credential;
+    }
+
+    public SFTPRemoteEntity setCredential(SFTPCredentialEntity credential) {
+        this.credential = credential;
+        return this;
+    }
+}
diff --git a/data-orchestrator/data-orchestrator-api/src/main/java/org/apache/airavata/datalake/orchestrator/api/db/repo/SFTPCredentialRepository.java b/data-orchestrator/data-orchestrator-api/src/main/java/org/apache/airavata/datalake/orchestrator/api/db/repo/SFTPCredentialRepository.java
new file mode 100644
index 0000000..7548008
--- /dev/null
+++ b/data-orchestrator/data-orchestrator-api/src/main/java/org/apache/airavata/datalake/orchestrator/api/db/repo/SFTPCredentialRepository.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * 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.
+ */
+package org.apache.airavata.datalake.orchestrator.api.db.repo;
+
+import org.apache.airavata.datalake.orchestrator.api.db.entity.SFTPCredentialEntity;
+import org.springframework.data.repository.CrudRepository;
+
+public interface SFTPCredentialRepository extends CrudRepository<SFTPCredentialEntity, String> {
+}
diff --git a/data-orchestrator/data-orchestrator-api/src/main/java/org/apache/airavata/datalake/orchestrator/api/db/repo/SFTPRemoteRepository.java b/data-orchestrator/data-orchestrator-api/src/main/java/org/apache/airavata/datalake/orchestrator/api/db/repo/SFTPRemoteRepository.java
new file mode 100644
index 0000000..04aa5bb
--- /dev/null
+++ b/data-orchestrator/data-orchestrator-api/src/main/java/org/apache/airavata/datalake/orchestrator/api/db/repo/SFTPRemoteRepository.java
@@ -0,0 +1,26 @@
+/*
+ *
+ * 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.
+ */
+package org.apache.airavata.datalake.orchestrator.api.db.repo;
+
+import org.apache.airavata.datalake.orchestrator.api.db.entity.SFTPRemoteEntity;
+import org.springframework.data.repository.CrudRepository;
+
+public interface SFTPRemoteRepository extends CrudRepository<SFTPRemoteEntity, String> {
+}