Update Blog Post Job calling from RSS
@future(callout=true) static global void upsertContentMapping() { List<Dom.XMLNode> recentPosts = getRSSFeed('https://www.yoursite.com/resources/rss.xml'); List<BP_Content_Mapping__c> blogEntries = new List<BP_Content_Mapping__c>(); List<String> titles = new List<String>(); List<BP_Content_Mapping__c> entriesToAdd = new List<BP_Content_Mapping__c>(); String listOfBlogs = ''; System.Debug('# OF POSTS FOUND:' +recentPosts.size()); for(Dom.XMLNode post : recentPosts) { blogEntries.add(convertFeedToBlogPost(post)); } System.Debug('# OF ENTRIES FOUND:' +blogEntries.size()); for(BP_Content_Mapping__c bp : blogEntries) { titles.add(bp.Content_URL__c); } List<Attachment> blogAttachments = new List<Attachment>(); List<BP_Content_Mapping__c> blogs = [SELECT Id, GUID__c from BP_Content_Mapping__c WHERE Content_URL__c IN :titles]; Integer counter = 0 ; for(BP_Content_Mapping__c blogEntry : blogEntries) { if (counter < 10){ Boolean added = false; for(BP_Content_Mapping__c blog : blogs) { if(blog.GUID__c == blogEntry.GUID__c) { added = true; } } if(!added) { entriesToAdd.add(blogEntry); counter++; } } } Map<String, Attachment> attachments = createAttachments(entriesToAdd); System.Debug('# OF ENTRIES TO IMPORT:' + entriesToAdd.size() + ' ' + entriesToAdd); insert entriesToAdd; for (BP_Content_Mapping__c entry : entriesToAdd){ Attachment attachment = attachments.get(entry.GUID__c); attachment.ParentId = entry.Id; attachments.put(entry.GUID__c, attachment); } System.Debug('# OF ATTACHMENTS TO IMPORT:' + attachments.size() + ' ' + attachments); insert attachments.values(); }
Get RSS feed and return XMLNode
static global List<Dom.XMLNode> getRSSFeed(string URL) { Http h = new Http(); HttpRequest req = new HttpRequest(); // url that returns the XML in the response body req.setEndpoint(url); req.setMethod('GET'); HttpResponse res = h.send(req); Dom.Document doc = res.getBodyDocument(); Dom.XMLNode rss = doc.getRootElement(); System.debug('@@' + rss.getName()); List<Dom.XMLNode> rssList = new List<Dom.XMLNode>(); for(Dom.XMLNode child : rss.getChildren()) { System.debug('@@@' + child.getName()); for(Dom.XMLNode channel : child.getChildren()) { System.debug('@@@@' + channel.getName()); if(channel.getName() == 'item') { rssList.add(channel); } } } return rssList; }
Convert XMLNode to Blog Posts
static global BP_Content_Mapping__c convertFeedToBlogPost(Dom.XMLNode post) { BP_Content_Mapping__c bp = new BP_Content_Mapping__c(); Integer tagIndex = 0; for(Dom.XMLNode child : post.getChildren()) { if(child.getName() == 'title') { bp.Title__c = child.getText(); } if(child.getName() == 'guid') { bp.GUID__c = child.getText(); } if(child.getName() == 'pubDate') { bp.Effective_Date__c = convertRSSDateStringToDate(child.getText()); } if(child.getName() == 'link') { bp.Content_URL__c = child.getText(); } if(child.getName() == 'description') { String[] descriptionPipeSlit = child.getText().split('\\|',-1); if (descriptionPipeSlit.size() > 0){ bp.Summary__c = descriptionPipeSlit[0]; bp.Author__c = descriptionPipeSlit[1].remove('Author:'); bp.Blog_Category__c = descriptionPipeSlit[2].remove('Category:'); bp.Category_Color__c = descriptionPipeSlit[3].remove('Color:'); } } if ('content'.equals(child.getName())){ bp.Image_URL__c = child.getAttributeValue('url', null); } } return bp; }
Download blog images to attachment
static Map<String, Attachment> createAttachments(List<BP_Content_Mapping__c> contentMappings){ Map<String, Attachment> attachments = new Map<String, Attachment>(); for (BP_Content_Mapping__c contentMapping : contentMappings){ Attachment attachment = new Attachment(); attachment.Name = contentMapping.Title__c + '.jpg'; attachment.ContentType= 'image/jpg'; attachment.Body = downloadImagesToBlob(contentMapping.Image_URL__c); attachments.put(contentMapping.GUID__c, attachment); } return attachments; } static Blob downloadImagesToBlob(String imageUrl){ Http h = new Http(); HttpRequest req = new HttpRequest(); req.setEndpoint(imageUrl); req.setMethod('GET'); req.setHeader('Content-Type', 'image/jpg'); req.setCompressed(true); req.setTimeout(60000); HttpResponse res = null; res = h.send(req); Blob image = res.getBodyAsBlob(); return image; }