public with sharing class SFTPFeature extends CloudStorageBase { public override OperationResult listFiles(Boolean isServiceMode, Boolean myDrive, String userId, Boolean isRootFolder, String folderId, String accessToken, String level) { List> resultFiles = new List>(); System.debug('Inside listFiles'); try { String user = 'Monika'; String hostname = '192.168.2.31'; String password = 'monika123'; String folderName = '/Monika'; String endpoint = 'https://hopelessly-upright-platypus.ngrok-free.app/api/v1/sftp'; System.debug('Endpoint: ' + endpoint); Map payload = new Map{ 'user' => user, 'hostname' => hostname, 'password' => password, 'encryptionType' => 'SFTP', 'folderName' => folderName }; System.debug('Payload: ' + JSON.serializePretty(payload)); String requestBody = JSON.serialize(payload); Map headers = new Map{ 'Content-Type' => 'application/json' }; HttpResponse res = CloudStorageUtlilty.makeCallout(requestBody, endpoint, headers, 'POST'); System.debug('Status Code: ' + res.getStatusCode()); System.debug('Response Body: ' + res.getBody()); if (res.getStatusCode() == 200) { List fileList = (List) JSON.deserializeUntyped(res.getBody()); processItems(fileList, resultFiles); } else { throw new AuraHandledException('Error from SFTP service: ' + res.getBody()); } } catch (Exception e) { throw new AuraHandledException('Exception: ' + e.getMessage()); } System.debug('Final resultFiles: ' + JSON.serializePretty(resultFiles)); return OperationResult.success(resultFiles); } private void processItems(List items, List> resultFiles) { for (Object item : items) { Map fileMap = (Map) item; String type = (String) fileMap.get('type'); Boolean isFolder = type != null && type.toLowerCase() == 'folder'; String iconName = isFolder ? 'doctype:folder' : 'doctype:txt'; Map fileData = new Map{ 'name' => (String) fileMap.get('name'), 'type' => (String) fileMap.get('type'), 'path' => (String) fileMap.get('path'), 'iconName' => iconName, 'isFolder' => String.valueOf(isFolder) }; System.debug('fileData: ' + fileData); resultFiles.add(fileData); if (fileMap.get('type') == 'folder' && fileMap.containsKey('children')) { List children = (List) fileMap.get('children'); if (children != null && !children.isEmpty()) { processItems(children, resultFiles); } } } } //to delete public override OperationResult deleteFile(String fileId, Boolean isServiceMode, String userId) { try { System.debug('>>>entered deleteFile SFTP'); System.debug('>>>fileId=' + fileId + '>>>userId=' + userId + '>>>isServiceMode=' + isServiceMode); String user = 'Monika'; String hostname = '192.168.2.31'; String password = 'monika123'; // String folderName = '/downloaded/sftp/New folder/'; String folderName = ''; String endpoint = 'https://hopelessly-upright-platypus.ngrok-free.app/api/v1/sftp'; Map sftpConnection = new Map{ 'user' => user, 'hostname' => hostname, 'password' => password, 'encryptionType' => 'FTP', 'folderName' => folderName }; Map requestBody = new Map{ 'targetPaths' => new List{ fileId }, 'sftpConnection' => sftpConnection }; String jsonBody = JSON.serialize(requestBody); System.debug('Create Request Body: ' + jsonBody); Map headers = new Map{ 'Content-Type' => 'application/json', 'accept' => '*/*' }; HttpResponse res = CloudStorageUtlilty.makeCallout(jsonBody, endpoint, headers, 'DELETE'); System.debug('>>>res=' + res.getBody()); System.debug('>>>res.getStatusCode()=' + res.getStatusCode()); if (res.getStatusCode() == 200 || res.getStatusCode() == 204) { return OperationResult.success(res.getBody()); } else { return OperationResult.error(res.getBody()); } } catch (Exception e) { System.debug('>>>error=' + e.getMessage()); throw new AuraHandledException(e.getMessage()); } } //to create public override OperationResult createFolder(String parentFolderId, Boolean isServiceMode, String folderName, String userId) { Map resultMap = new Map(); System.debug('resultMap' + resultMap); System.debug('Inside createFolder'); System.debug('Inside createFolder' + parentFolderId + '>>>' + isServiceMode + '>>>' + folderName + '>>>' + userId); try { String user = 'Monika'; String hostname = '192.168.2.31'; String password = 'monika123'; String encryptionType = 'SFTP'; String encodedFolderName = EncodingUtil.urlEncode(folderName, 'UTF-8'); String path = String.isBlank(parentFolderId) ? '/Monika' : parentFolderId; System.debug('>>>>path=' + path); String encodedPath = EncodingUtil.urlEncode(path, 'UTF-8'); String endpoint = 'https://hopelessly-upright-platypus.ngrok-free.app/api/v1/sftp/folder' + '?folderName=' + encodedFolderName + '&path=' + encodedPath; Map payload = new Map{ 'user' => user, 'hostname' => hostname, 'password' => password, 'encryptionType' => encryptionType, 'folderName' => folderName }; System.debug('Create Request Body: ' + JSON.serialize(payload)); String requestBody = JSON.serialize(payload); Map headers = new Map{ 'Content-Type' => 'application/json', 'accept' => '*/*' }; HttpResponse res = CloudStorageUtlilty.makeCallout(requestBody, endpoint, headers, 'POST'); if (res.getStatusCode() != 200) { return OperationResult.error('Error: ' + res.getStatusCode() + ' - ' + res.getBody()); } String responseBody = res.getBody(); resultMap = (Map) JSON.deserializeUntyped(responseBody); resultMap.put('code', '200'); return OperationResult.success(resultMap); } catch (Exception e) { throw new AuraHandledException('SFTP Folder Creation Failed: ' + e.getMessage()); } } //to upload }