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;
}