//create folder done public with sharing class GoogleDriveFeature extends CloudStorageBase { private static final String GOOGLE_DRIVE_API_URL = 'https://www.googleapis.com/drive/v3/files'; private static final String GOOGLE_API_URL = 'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart'; private static String externalStorage = 'GoogleDrive'; // public override OperationResult listFiles(Boolean isServiceMode, Boolean myDrive, String userId, Boolean isRootFolder, String folderId, String accessToken, String level){ public override OperationResult listFiles(Map params){ List> resultFiles = new List>(); OperationResult result; Boolean isServiceMode = (Boolean) params.get('isServiceMode'); Boolean myDrive = (Boolean) params.get('myDrive'); Boolean isRootFolder = (Boolean) params.get('isRootFolder'); String folderId = (String) params.get('folderId'); String accessToken = (String) params.get('accessToken'); String level = (String) params.get('level'); // Fetching userId from Apex instead of user sent parameter String userId; userId = SalesforceEnvironmentUtil.getUserId(); try { // Fetch access token // accessTokenMap = CloudStorageUtlilty.getAccessToken(isServiceMode, userId, externalStorage); System.debug('isServiceMode ' + isServiceMode); System.debug('accessToken ' + accessToken); String currentFolder = (String.isBlank(folderId) && isRootFolder) ? 'root' : folderId; Map headers = new Map{ 'Authorization' => 'Bearer ' + accessToken }; if(currentFolder != 'root'){ String checkerEndpoint = GOOGLE_DRIVE_API_URL +'/'+ currentFolder + '?fileds=id'; HttpResponse res = CloudStorageUtlilty.makeCallout(null, checkerEndpoint, headers, 'GET'); if(res.getStatusCode() != 200){ System.debug('You do not have access.: '+ res.getStatus()); return OperationResult.error('You do not have access'); } } String baseEndpoint; if (myDrive || !isRootFolder) { baseEndpoint = GOOGLE_DRIVE_API_URL + '?q=\'' + currentFolder + '\'+in+parents+and+trashed=false' + '&fields=nextPageToken,files(id,name,createdTime,owners,mimeType,webViewLink,parents,size,webContentLink)'; } else { baseEndpoint = GOOGLE_DRIVE_API_URL + '?q=sharedWithMe=true' + '&fields=nextPageToken,files(id,name,createdTime,owners,mimeType,webViewLink,parents,size,webContentLink)'; } String pageToken = null; Boolean morePages = true; List fileIdList = new list(); while (morePages) { String endpoint = baseEndpoint; if (pageToken != null) { endpoint += '&pageToken=' + pageToken; } HttpResponse res = CloudStorageUtlilty.makeCallout(null, endpoint, headers, 'GET'); System.debug('res.getBody() >>> ' + res.getBody()); System.debug('res.getStatusCode() >>> ' + res.getStatusCode()); if (res.getStatusCode() == 200) { String responseBody = res.getBody(); Map resultMap = (Map) JSON.deserializeUntyped(responseBody); List files = (List) resultMap.get('files'); //Loop to get the fileid to find out tag data for (Object file : files) { Map fileDetails = (Map) file; fileIdList.add((String) fileDetails.get('id')); } Map> fileIdVsTagListMap = new map>(); for(HIC_FilesME__Tags_Data__c tag :[select id,HIC_FilesME__Tags__c,HIC_FilesME__FileId__c from HIC_FilesME__Tags_Data__c where HIC_FilesME__FileId__c in:fileIdList AND HIC_FilesME__Tags__c != null]){ for(String tagValue : tag.HIC_FilesME__Tags__c.split(';')){ if(fileIdVsTagListMap.containsKey(tag.HIC_FilesME__FileId__c)){ List taglist = fileIdVsTagListMap.get(tag.HIC_FilesME__FileId__c); taglist.add(tagValue); fileIdVsTagListMap.put(tag.HIC_FilesME__FileId__c,taglist); }else{ List taglist = new list(); taglist.add(tagValue); fileIdVsTagListMap.put(tag.HIC_FilesME__FileId__c,taglist); } } } for (Object file : files) { Map fileDetails = (Map) file; Map fileData = new Map(); String fileId = (String) fileDetails.get('id'); fileData.put('id', fileId); fileData.put('name', (String) fileDetails.get('name')); fileData.put('createdTime', (String) fileDetails.get('createdTime')); fileData.put('webContentLink', (String) fileDetails.get('webContentLink')); //added fileData.put('iconName', getFileType( (String) fileDetails.get('name') )); fileData.put('mimeType', getFileType( (String) fileDetails.get('name') )); //added // if (type == 'folder') { // fileData.put('mimeType', 'doctype:folder'); // fileData.put('iconName', 'doctype:folder'); // } if(fileIdVsTagListMap.containsKey(fileId)){ fileData.put('tagData',fileIdVsTagListMap.get(fileId)); }else{ fileData.put('tagData',new list()); } if (fileDetails.containsKey('size')) { String fileSizeStr = (String) fileDetails.get('size'); String size = getSizeString(fileSizeStr); fileData.put('size', size); } if (fileDetails.containsKey('parents')) { List parents = (List) fileDetails.get('parents'); fileData.put('parents', !parents.isEmpty() ? (String) parents[0] : ''); } String mimeType = (String) fileDetails.get('mimeType'); fileData.put('mimeType', mimeType); List owners = (List) fileDetails.get('owners'); if (!owners.isEmpty()) { Map owner = (Map) owners[0]; fileData.put('createdBy', (String) owner.get('displayName')); } // fileData.put('url', 'https://drive.google.com/file/d/' + fileData.get('id') + '/view'); //only change to check fileData.put('url', (String) fileDetails.get('webViewLink')); fileData.put('iconName', (mimeType == 'application/vnd.google-apps.folder') ? 'doctype:folder' : 'doctype:unknown'); resultFiles.add(fileData); } pageToken = (String) resultMap.get('nextPageToken'); morePages = pageToken != null; result = OperationResult.success(resultFiles); } else { morePages = false; result = OperationResult.error('Error listing files'); FME_Logger.error('Failed to list files: ' + res.getBody(), 'GoogleDriveFeature', 'listFiles'); } } } catch (Exception e) { FME_Logger.error(e.getMessage(), 'GoogleDriveFeature' + e.getLineNumber(), 'listFiles'); result = OperationResult.error('Error listing files: ' + e.getMessage()); } return result; } //added to check // private method to get file type supported in salesforce private static String getFileType(String fileName) { if (fileName.endsWithIgnoreCase('.jpg') || fileName.endsWithIgnoreCase('.jpeg') ) { return 'doctype:image'; } if (fileName.endsWithIgnoreCase('.png') || fileName.endsWithIgnoreCase('.svg') || fileName.endsWithIgnoreCase('.bmp') ) { return 'doctype:image'; } if (fileName.endsWithIgnoreCase('.mp4') || fileName.endsWithIgnoreCase('.mkv') || fileName.endsWithIgnoreCase('.gif') || fileName.endsWithIgnoreCase('.ogg') ) { return 'doctype:video'; } if (fileName.endsWithIgnoreCase('.mp3') || fileName.endsWithIgnoreCase('.wav') ) { return 'doctype:audio'; } if (fileName.endsWithIgnoreCase('.docx') || fileName.endsWithIgnoreCase('.doc') || fileName.endsWithIgnoreCase('.word') ) { return 'doctype:document'; } if (fileName.endsWithIgnoreCase('.pdf') ) { return 'doctype:pdf'; } if (fileName.endsWithIgnoreCase('.txt') ) { return 'doctype:txt'; } if (fileName.endsWithIgnoreCase('.csv') ) { return 'doctype:csv'; } if (fileName.endsWithIgnoreCase('.ppt') || fileName.endsWithIgnoreCase('.pptx') ) { return 'doctype:ppt'; } return 'doctype:unknown'; } private static String getSizeString(String fileSizeStr){ Decimal fileSize = Decimal.valueOf(fileSizeStr); String size; if (fileSize < 1024 * 1000 && fileSize > 0) { size = String.valueOf(fileSize / 1024) + ' KB'; } else if (fileSize < 1024 * 1024 * 1000 && fileSize > 1024 * 1000) { size = String.valueOf(fileSize / (1024 * 1024)) + ' MB'; } else if (fileSize >= 1024 * 1024 * 1000) { size = String.valueOf(fileSize / (1024 * 1024 * 1024)) + ' GB'; } else { size = fileSizeStr + ' bytes'; } return size; } public override OperationResult createFolder(Map params) { Map resultMap = new Map(); OperationResult result; try { String parentFolderId = (String) params.get('parentFolderId'); Boolean isServiceMode = (Boolean) params.get('isServiceMode'); String folderName = (String) params.get('folderName'); String userId = (String) SalesforceEnvironmentUtil.getUserId(); String accessToken = (String) params.get('accessToken'); // Build metadata for folder creation String folderMetadata = '{' + '"name": "' + folderName + '",' + '"mimeType": "application/vnd.google-apps.folder"'; if (parentFolderId != null && parentFolderId != '') { folderMetadata += ',"parents": ["' + parentFolderId + '"]'; } folderMetadata += '}'; // Prepare headers Map headers = new Map{ 'Authorization' => 'Bearer ' + accessToken, 'Content-Type' => 'application/json' }; // Make callout HttpResponse res = CloudStorageUtlilty.makeCallout(folderMetadata, GOOGLE_DRIVE_API_URL, headers, 'POST'); if (res.getStatusCode() == 200) { String responseBody = res.getBody(); resultMap = (Map) JSON.deserializeUntyped(responseBody); resultMap.put('code', '200'); result = OperationResult.success(resultMap); // Adding audit log // String userName = UserInfo.getName(); // System.debug('username>>>' + userName); // String logMsg = userName + ' created folder "' + folderName + // (String.isNotBlank(parentFolderId) ? ('" under parentId ' + parentFolderId) : '" at root'); // System.debug('logmsg>>>.'+ logMsg); // FME_Logger.audit('Create Folder', logMsg, 'GoogleDriveFeature', 'createFolder'); } else if(res.getStatusCode() == 403) { System.debug('Failed to create folder: ' + res.getBody()); result = OperationResult.error(res.getBody()); } else { System.debug('Failed to create folder: ' + res.getBody()); result = OperationResult.error(res.getBody()); } } catch (Exception e) { FME_Logger.error(e.getMessage(), 'GoogleDriveFeature' + e.getLineNumber(), 'createFolder'); result = OperationResult.error('Error creating folder: ' + e.getMessage()); } System.debug('result create folder >>>>>' +result); return result; } // public override OperationResult renameFile(Map params) { // OperationResult result; // try { // String fileId = (String) params.get('fileId'); // Boolean isServiceMode = (Boolean) params.get('isServiceMode'); // String newFileName = (String) params.get('newFileName'); // String accessToken = (String) params.get('accessToken'); // String url = 'https://www.googleapis.com/drive/v3/files/' + fileId; // System.debug('url == ' + url); // System.debug('newFileName == ' + newFileName); // String body = '{"name": "' + newFileName + '"}'; // System.debug('body == ' + body); // Map headers = new Map(); // headers.put('Authorization', 'Bearer ' + accessToken); // headers.put('Content-Type', 'application/json'); // HttpResponse res = CloudStorageUtlilty.makeCallout(body, url, headers, 'PATCH'); // if (res.getStatusCode() == 200) { // System.debug('>>>> ' + res.getBody()); // System.debug('File renamed successfully.'); // result= OperationResult.success(res.getBody()); // // Add audit log // String userName = UserInfo.getName(); // String logMsg = userName + ' renamed file with Id ' + fileId + ' to "' + newFileName + '"'; // FME_Logger.audit('Rename', logMsg, 'GoogleDriveFeature', 'renameFile'); // } else { // System.debug('Failed to rename file: ' + res.getBody()); // result= OperationResult.error(res.getBody()); // } // } catch (Exception e) { // FME_Logger.error(e.getMessage(), 'GoogleDriveFeature' + e.getLineNumber(), 'renameFile'); // // throw new AuraHandledException(e.getMessage()); // } // return result; // } //also to update linkedfoldername public override OperationResult renameFile(Map params) { OperationResult result; try { String fileId = (String) params.get('fileId'); Boolean isServiceMode = (Boolean) params.get('isServiceMode'); String newFileName = (String) params.get('newFileName'); String accessToken = (String) params.get('accessToken'); String url = 'https://www.googleapis.com/drive/v3/files/' + fileId; String body = '{"name": "' + newFileName + '"}'; Map headers = new Map(); headers.put('Authorization', 'Bearer ' + accessToken); headers.put('Content-Type', 'application/json'); HttpResponse res = CloudStorageUtlilty.makeCallout(body, url, headers, 'PATCH'); if (res.getStatusCode() == 200) { // Update Salesforce Linked Folder record List folders = [ SELECT Id, HIC_FilesME__Folder_Name__c FROM HIC_FilesME__Linked_Folder__c WHERE HIC_FilesME__External_Folder_ID__c = :fileId ]; System.debug('rename folder name' + folders); for (HIC_FilesME__Linked_Folder__c f : folders) { f.HIC_FilesME__Folder_Name__c = newFileName; } System.debug('folders rename>>>>' + folders); if (!folders.isEmpty()) { update folders; } // Success result result = OperationResult.success(res.getBody()); // Audit Log String userName = UserInfo.getName(); String logMsg = userName + ' renamed file with Id ' + fileId + ' to "' + newFileName + '"'; FME_Logger.audit('Rename', logMsg, 'GoogleDriveFeature', 'renameFile'); } else if(res.getStatusCode() == 403) { System.debug('Failed to create folder: ' + res.getBody()); result = OperationResult.error(res.getBody()); } else { result = OperationResult.error(res.getBody()); } } catch (Exception e) { FME_Logger.error(e.getMessage(), 'GoogleDriveFeature' + e.getLineNumber(), 'renameFile'); result = OperationResult.error(e.getMessage()); } System.debug('result is >>>>>' + result); return result; } public override OperationResult moveFileAndFolder(Map params) { OperationResult result; try { String fileId = (String) params.get('fileId'); Boolean isServiceMode = (Boolean) params.get('isServiceMode'); String oldFolderId = (String) params.get('oldFolderId'); String newFolderId = (String) params.get('newFolderId'); String accessToken = (String) params.get('accessToken'); String userId = (String) SalesforceEnvironmentUtil.getUserId(); // Endpoint String endpoint = 'https://www.googleapis.com/drive/v3/files/' + fileId + '?addParents=' + newFolderId + '&removeParents=' + oldFolderId + '&fields=id,parents,name'; // Headers Map headers = new Map(); headers.put('Authorization', 'Bearer ' + accessToken); headers.put('Content-Type', 'application/json'); // Callout HttpResponse res = CloudStorageUtlilty.makeCallout(null, endpoint, headers, 'PATCH'); if (res.getStatusCode() == 200) { System.debug('>>>>' + res.getBody()); System.debug('File moved successfully.'); result = OperationResult.success(res.getBody()); //Add audit log // String userName = UserInfo.getName(); // String logMsg = userName + ' moved file/folder with Id ' + fileId + // ' from oldFolderId ' + oldFolderId + // ' to newFolderId ' + newFolderId; // FME_Logger.audit('Move', logMsg, 'GoogleDriveFeature', 'moveFileAndFolder'); } else if(res.getStatusCode() == 403) { System.debug('Failed to move folder: ' + res.getBody()); return OperationResult.error(res.getBody()); } else { System.debug('Failed to move file: ' + res.getBody()); result = OperationResult.error(res.getBody()); } } catch (Exception e) { FME_Logger.error(e.getMessage(), 'GoogleDriveFeature' + e.getLineNumber(), 'moveFileAndFolder'); result = OperationResult.error('Error moving file: ' + e.getMessage()); } return result; } public override OperationResult deleteFile(Map params) { try { String fileId = (String) params.get('fileId'); Boolean isServiceMode = (Boolean) params.get('isServiceMode'); String accessToken = (String) params.get('accessToken'); String userId = (String) SalesforceEnvironmentUtil.getUserId(); // Endpoint String endpoint = 'https://www.googleapis.com/drive/v2/files/' + fileId; System.debug('endpoint=' + endpoint); // Callout Map headers = new Map(); headers.put('Authorization', 'Bearer ' + accessToken); HttpResponse res = CloudStorageUtlilty.makeCallout(null, endpoint, headers, 'DELETE'); System.debug('>>>res=' + res.getBody()); System.debug('>>>res.getStatusCode()=' + res.getStatusCode()); // Handle response if (res.getStatusCode() == 204) { String userName = SalesforceEnvironmentUtil.getName(); String logMsg = userName + ' deleted file with Id "' + fileId + '"'; FME_Logger.audit('Delete', logMsg, 'GoogleDriveFeature', 'deleteFile'); return OperationResult.success(res.getBody()); } else if(res.getStatusCode() == 403) { System.debug('Failed to delete folder: ' + res.getBody()); return OperationResult.error(res.getBody()); } else { return OperationResult.error(res.getBody()); } } catch (Exception e) { FME_Logger.error(e.getMessage(), 'GoogleDriveFeature' + e.getLineNumber(), 'deleteFile'); return OperationResult.error('Error deleting file: ' + e.getMessage()); } } public override OperationResult emailFile(Map params) { OperationResult result; try { //maildetails Map mailDetails =(Map) JSON.deserializeUntyped(JSON.serialize(params.get('mailDetails'))); String fileId = (String) params.get('fileId'); String fileName = (String) params.get('fileName'); String mimeType = (String) params.get('toSendFileNameMimeType'); String senderId = (String) mailDetails.get('fromUser'); String toUser = (String) mailDetails.get('toUser'); String ccUser = (String) mailDetails.get('ccUser'); String bccUser = (String) mailDetails.get('bccUser'); String subject = (String) mailDetails.get('subject'); String body = (String) mailDetails.get('body'); Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage(); // Required mail.setToAddresses(new List{ toUser }); // Optional if (String.isNotBlank(ccUser)) mail.setCcAddresses(new List{ ccUser }); if (String.isNotBlank(bccUser)) mail.setBccAddresses(new List{ bccUser }); mail.setSubject(subject); // Remove HTML tags safely mail.setPlainTextBody(body != null ? body.replaceAll('<[^>]+>', '') : ''); if (String.isNotBlank(senderId) && senderId.startsWith('0D2')) { mail.setOrgWideEmailAddressId(senderId); } Map downloadParams = new Map(params); downloadParams.put('fileId', fileId); downloadParams.put('fileName', fileName); OperationResult op = downloadFile(downloadParams); if (op != null && op.data != null) { Blob fileBlob = EncodingUtil.base64Decode((String) op.data); Messaging.EmailFileAttachment attachment = new Messaging.EmailFileAttachment(); attachment.setFileName(fileName); attachment.setBody(fileBlob); attachment.setContentType(String.isNotBlank(mimeType) ? mimeType: 'application/octet-stream'); mail.setFileAttachments(new List{ attachment }); } Messaging.SendEmailResult[] results = Messaging.sendEmail( new List{ mail }); if (!results.isEmpty() && results[0].isSuccess()) { result = OperationResult.success(null); System.debug(' Email sent successfully'); } else { String errMsg = (!results.isEmpty() && results[0].getErrors().size() > 0)? results[0].getErrors()[0].getMessage(): 'Unknown send failure'; result = OperationResult.error(errMsg); } } catch (Exception e) { FME_Logger.error(e.getMessage(),'EmailFeature ' + e.getLineNumber(),'emailFile'); result = OperationResult.error('Error sending email: ' + e.getMessage()); } System.debug('result:' + result); return result; } public static Blob fetchFileAndConvertToBase64(Map params) { System.debug('fetchFileAndConvertToBase64'); Blob fileBlob; try { Boolean isServiceMode = (Boolean) params.get('isServiceMode'); String fileId = (String) params.get('fileId'); String fileName = (String) params.get('fileName'); String accessToken = (String) params.get('accessToken'); String userId = (String) SalesforceEnvironmentUtil.getUserId(); System.debug('accessToken: ' + accessToken); System.debug('userId: ' + userId); System.debug('isServiceMode: ' + isServiceMode); System.debug('fileId: ' + fileId); System.debug('fileName: ' + fileName); String metaUrl = 'https://www.googleapis.com/drive/v3/files/' + fileId + '?fields=mimeType'; System.debug('metaUrl: ' + metaUrl); System.debug('accessToken: ' + accessToken); Map headers = new Map{ 'Authorization' => 'Bearer ' + accessToken }; HttpResponse metaRes = CloudStorageUtlilty.makeCallout(null, metaUrl, headers, 'GET'); String mimeType = ''; if (metaRes.getStatusCode() == 200) { Map metadata = (Map) JSON.deserializeUntyped(metaRes.getBody()); mimeType = (String) metadata.get('mimeType'); } else { System.debug('Failed to fetch metadata: ' + metaRes.getStatus()); return null; } String downloadUrl; if (mimeType != null && mimeType.equals('application/vnd.google-apps.spreadsheet')) { downloadUrl = 'https://www.googleapis.com/drive/v3/files/' + fileId + '/export?mimeType=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'; } else if (mimeType != null && mimeType.equals('application/vnd.google-apps.document')) { downloadUrl = 'https://www.googleapis.com/drive/v3/files/' + fileId + '/export?mimeType=application/pdf'; } else { downloadUrl = 'https://www.googleapis.com/drive/v3/files/' + fileId + '?alt=media'; } HttpResponse fileRes = CloudStorageUtlilty.makeCallout(null, downloadUrl, headers, 'GET'); if (fileRes.getStatusCode() == 200) { fileBlob = fileRes.getBodyAsBlob(); } else { System.debug('Failed to fetch file: ' + fileRes.getStatus() + ', body: ' + fileRes.getBody()); } } catch (Exception e) { System.debug('Error in fetchFileAndConvertToBase64: ' + e.getMessage() + ' | Line: ' + e.getLineNumber()); FME_Logger.error(e.getMessage(), 'GoogleDriveFeature' + e.getLineNumber(), 'fetchFileAndConvertToBase64'); } System.debug('Blob received:-> '+ fileBlob); return fileBlob; } public override OperationResult downloadFile(Map params) { System.debug('GoogleDriveFeature.downloadFile'); OperationResult result; try { Blob fileBlob = fetchFileAndConvertToBase64(params); if (fileBlob != null) { result = OperationResult.success(EncodingUtil.base64Encode(fileBlob)); System.debug('File downloaded successfully.'); } else { result = OperationResult.error('Failed to download file'); } } catch (Exception e) { result = OperationResult.error('Error downloading file: ' + e.getMessage()); FME_Logger.error(e.getMessage(), 'GoogleDriveFeature' + e.getLineNumber(), 'downloadFile'); } System.debug('Resultindownloadfile:-> '+ result); return result; } // public override OperationResult linkFiles(String recordId) { // List> resultFiles = new List>(); // OperationResult result; // try { // List recordFiles = [SELECT Id,CreatedDate,CreatedBy.Name,HIC_FilesME__Linked_Entity_Id__c,HIC_FilesME__Linked_Entity_Name__c,HIC_FilesME__Linked_Mimetype__c,HIC_FilesME__Linked_Record_Id__c,HIC_FilesME__Linked_Storage_Type__c FROM HIC_FilesME__File_Link__c WHERE HIC_FilesME__Linked_Record_Id__c = :recordId]; // for (HIC_FilesME__File_Link__c file : recordFiles) { // String createDate = String.valueOf(file.CreatedDate); // Map fileData = new Map(); // fileData.put('id', (String) file.HIC_FilesME__Linked_Entity_Id__c); // fileData.put('recordId', (String) file.Id); // fileData.put('name', (String) file.HIC_FilesME__Linked_Entity_Name__c); // fileData.put('mimeType', (String) file.HIC_FilesME__Linked_Mimetype__c); // fileData.put('externalStorageType', (String) file.HIC_FilesME__Linked_Storage_Type__c); // fileData.put('createdTime', createDate); // fileData.put('createdBy', (String) file.CreatedBy.Name); // fileData.put('url', 'https://drive.google.com/file/d/' + fileData.get('id') + '/view'); // resultFiles.add(fileData); // } // return OperationResult.success(resultFiles); // } catch (Exception e) { // FME_Logger.error(e.getMessage(), 'GoogleDriveFeature' + e.getLineNumber(), 'linkFiles'); // return OperationResult.error('Failed to fetch linked files. ' + e.getMessage()); // } // } // public override OperationResult toLinkFiles(String recordId, String filesDetails, String providerType) { // OperationResult result; // try { // Map filesMap = (Map) JSON.deserializeUntyped(filesDetails); // System.debug('filesMap >>>> ' + filesMap); // HIC_FilesME__File_Link__c fileLink = new HIC_FilesME__File_Link__c(); // fileLink.HIC_FilesME__Linked_Record_Id__c = recordId; // // fileLink.HIC_FilesME__Linked_By__c = UserInfo.getUserId(); // fileLink.HIC_FilesME__Linked_Entity_Id__c = (String) filesMap.get('id'); // fileLink.HIC_FilesME__Linked_Entity_Name__c = (String) filesMap.get('name'); // fileLink.HIC_FilesME__Linked_Mimetype__c = (String) filesMap.get('mimetype'); // fileLink.HIC_FilesME__Linked_Storage_Type__c = providerType; // insert fileLink; // result = OperationResult.success(fileLink); // } catch (Exception e) { // result = OperationResult.error('Error linking file: ' + e.getMessage()); // FME_Logger.error(e.getMessage(), 'GoogleDriveFeature' + e.getLineNumber(), 'toLinkFiles'); // } // return result; // } // change custom object -- linkedFolder public override OperationResult linkFiles(String recordId) { List> resultFolders = new List>(); try { List linkedFolders = [ SELECT Id,Name,CreatedDate,CreatedBy.Name,HIC_FilesME__External_Folder_ID__c, HIC_FilesME__Folder_Name__c, HIC_FilesME__Folder_URL__c, HIC_FilesME__Storage_Provider__c, HIC_FilesME__Access_Level__c, HIC_FilesME__Connected_Username__c FROM HIC_FilesME__Linked_Folder__c WHERE HIC_FilesME__Linked_Record__c = :recordId AND HIC_FilesME__Is_Active__c = true ]; System.debug('linkedFolders in line 702 >>>> ' + linkedFolders); for (HIC_FilesME__Linked_Folder__c folder : linkedFolders) { Map folderData = new Map(); folderData.put('id', folder.HIC_FilesME__External_Folder_ID__c); folderData.put('recordId', folder.Id); folderData.put('name', folder.HIC_FilesME__Folder_Name__c); folderData.put('externalStorageType', folder.HIC_FilesME__Storage_Provider__c); folderData.put('accessLevel', folder.HIC_FilesME__Access_Level__c); folderData.put('createdTime', String.valueOf(folder.CreatedDate)); folderData.put('createdBy', folder.CreatedBy != null ? folder.CreatedBy.Name : '-'); folderData.put('linkedBy', folder.HIC_FilesME__Connected_Username__c); folderData.put('url', folder.HIC_FilesME__Folder_URL__c); resultFolders.add(folderData); } System.debug('resultFolders >>>> ' + resultFolders); return OperationResult.success(resultFolders); } catch (Exception e) {FME_Logger.error(e.getMessage(),'LinkedFolderFeature' + e.getLineNumber(),'linkFiles'); return OperationResult.error('Failed to fetch linked folders. ' + e.getMessage()); } } // change custom object -- linkedFolder multiplefolderlink public override OperationResult toLinkFiles(String recordId,String folderDetails,String providerType) { try { System.debug('providerType >>>> ' + providerType); System.debug('recordId >>>> ' + recordId); System.debug('JSON.deserializeUntyped folderDetails >>>> ' + JSON.deserializeUntyped(folderDetails)); Map folderMap = (Map) JSON.deserializeUntyped(folderDetails); HIC_FilesME__Linked_Folder__c linkedFolder = new HIC_FilesME__Linked_Folder__c(); linkedFolder.HIC_FilesME__Linked_Record__c = recordId; linkedFolder.HIC_FilesME__External_Folder_ID__c = (String) folderMap.get('id'); linkedFolder.HIC_FilesME__Folder_Name__c = (String) folderMap.get('name'); //add linkedFolder.HIC_FilesME__Created__c = UserInfo.getUserId(); linkedFolder.HIC_FilesME__Created_Date__c = System.now(); linkedFolder.HIC_FilesME__Connected_Username__c = (String) folderMap.get('linkedBy'); linkedFolder.HIC_FilesME__Folder_URL__c = (String) folderMap.get('url'); linkedFolder.HIC_FilesME__Storage_Provider__c = providerType; // linkedFolder.HIC_FilesME__Access_Level__c = (String) folderMap.get('accessLevel'); linkedFolder.HIC_FilesME__Is_Active__c = true; String key = providerType +' '+ recordId +' '+ (String) folderMap.get('id'); linkedFolder.HIC_FilesME__Key__c = key; upsert linkedFolder HIC_FilesME__Key__c; System.debug('linkedFolder >>>> ' + linkedFolder); return OperationResult.success(linkedFolder); } catch (Exception e) { FME_Logger.error(e.getMessage(),'LinkedFolderFeature' + e.getLineNumber(),'toLinkFiles' ); return OperationResult.error('Error linking folder: ' + e.getMessage()); } } public override OperationResult unlinkFiles(String recordId, String filesId, Boolean deleteFromDrive) { System.debug('recordId >>>> ' + recordId); System.debug('filesId >>>> ' + filesId); System.debug('deleteFromDrive >>>> ' + deleteFromDrive); OperationResult result; try { List fileLinks = [SELECT Id FROM HIC_FilesME__Linked_Folder__c WHERE HIC_FilesME__Linked_Record__c = :recordId AND HIC_FilesME__External_Folder_ID__c = :filesId]; if (fileLinks.size() > 0) { delete fileLinks; // if (deleteFromDrive) { // deleteFile(filesId, true, null); // } result = OperationResult.success(null); } else { result = OperationResult.error('No record found'); } } catch (Exception e) { result = OperationResult.error('Error unlinking file: ' + e.getMessage()); FME_Logger.error(e.getMessage(), 'GoogleDriveFeature' + e.getLineNumber(), 'unlinkFiles'); } return result; } // Method to fetch tags Data // @AuraEnabled // public static List fetchTagsData(String uniqueKey){ // try { // System.debug('Inside fetchTagsData'); // List tagsData = [ // SELECT Id,Name,CreatedDate, // HIC_FilesME__Tags__c // FROM HIC_FilesME__Tags_Data__c // WHERE HIC_FilesME__Key__c = :uniqueKey // ]; // List tags = new List(); // if(!tagsData.isEmpty()) { // tags = (List) tagsData[0].get(HIC_FilesME__Tags_Data__c); // } // return tags; // } catch (Exception e) { // throw new AuraHandledException(e.getMessage()); // } // } // Method to update tags Data @AuraEnabled public static Boolean updateTagsData(String details) { try { System.debug('Inside updateTagsData- '+details); Map res = (Map) JSON.deserializeUntyped(details); // List tags = new List(); String key = (String) res.get('key'); List rawTagList = (List) res.get('tags'); Set tags = new Set(); for(Object t : rawTagList) { tags.add(t); } // List rawTagList = (List) res.get('tags'); // for (Object o : rawTagList) { // Map tagMap = (Map) o; // String label = (String) tagMap.get('label'); // tags.add(label); // } // When tags is blank -> delete existing record if (tags.isEmpty()) { HIC_FilesME__Tags_Data__c existing = [SELECT Id FROM HIC_FilesME__Tags_Data__c WHERE HIC_FilesME__Key__c = :key LIMIT 1]; if (existing != null) { delete existing; } // returning true if either record is deleted or tags is blank (since we don't need to go further) return true; } // Build record HIC_FilesME__Tags_Data__c rec = new HIC_FilesME__Tags_Data__c(); rec.HIC_FilesME__ConnectedUser__c = (String) SalesforceEnvironmentUtil.getName(); rec.HIC_FilesME__FileId__c = (String) res.get('fileId'); rec.HIC_FilesME__Key__c = (String) key; rec.HIC_FilesME__LinkedFolderId__c= (String) res.get('linkedFolderId'); rec.HIC_FilesME__Provider__c = (String) res.get('provider'); rec.HIC_FilesME__RecordId__c = (String) res.get('recordId'); rec.HIC_FilesME__Tags__c = String.join(tags, ';'); // Upsert using Key as the external id field Schema.SObjectField extKey = HIC_FilesME__Tags_Data__c.Fields.HIC_FilesME__Key__c; Database.UpsertResult status = Database.upsert(rec, extKey, false); System.debug('upsert result in Tags Data:-> '+ status.isSuccess()); return status.isSuccess(); // for (Database.SaveResult sr : results) { // if (sr.isSuccess()) { // // Operation was successful for this specific record // System.debug('Successfully inserted account with ID: ' + sr.getId()); // } else { // // Operation failed for this specific record // for (Database.Error err : sr.getErrors()) { // System.debug('Error inserting account: ' + // err.getStatusCode() + ': ' + err.getMessage()); // // You can also get the field that caused the error: // System.debug('Fields that caused error: ' + err.getFields()); // } // } } catch (Exception e) { throw new AuraHandledException(e.getMessage()); } } }