1 // The Antville Project 2 // http://code.google.com/p/antville 3 // 4 // Copyright 2007-2011 by Tobi Schäfer. 5 // 6 // Copyright 2001–2007 Robert Gaggl, Hannes Wallnöfer, Tobi Schäfer, 7 // Matthias & Michael Platzer, Christoph Lincke. 8 // 9 // Licensed under the Apache License, Version 2.0 (the ``License''); 10 // you may not use this file except in compliance with the License. 11 // You may obtain a copy of the License at 12 // 13 // http://www.apache.org/licenses/LICENSE-2.0 14 // 15 // Unless required by applicable law or agreed to in writing, software 16 // distributed under the License is distributed on an ``AS IS'' BASIS, 17 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 // See the License for the specific language governing permissions and 19 // limitations under the License. 20 // 21 // $Revision$ 22 // $Author$ 23 // $Date$ 24 // $URL$ 25 26 /** 27 * @fileOverview Methods that implement Blogger's XML-RPC API. 28 * See http://goo.gl/u8lZZ for further details. 29 * The blogger.getTemplate and blogger.setTemplate methods are not supported 30 */ 31 32 /** @namespace */ 33 Api.blogger = {}; 34 35 /** 36 * 37 * @param {String} content 38 */ 39 Api.blogger._getContentParts = function(content) { 40 content && (content = content.trim()); 41 content || (content = String.EMPTY); 42 var result = {}; 43 if (!content.startsWith("<title>")) { 44 result.text = content; 45 } else { 46 var pos = content.lastIndexOf("</title>"); 47 if (pos > 0) { 48 result.title = content.substring(7, pos); 49 result.text = content.substring (pos + 8); 50 } else { 51 result.text = content; 52 } 53 } 54 return result; 55 } 56 57 /** 58 * 59 * @param {String} appKey 60 * @param {String} name 61 * @param {String} password 62 * @throws {Error} 63 * @returns {Object} Properties: userid, nickname and url 64 */ 65 Api.blogger.getUserInfo = function(appKey, name, password) { 66 var user = User.getByName(name); 67 if (!user) { 68 throw Error("User " + name + " does not exist on this server"); 69 } 70 return { 71 userid: name, 72 nickname: name, 73 url: user.url 74 } 75 } 76 77 /** 78 * 79 * @param {String} appKey 80 * @param {String} name 81 * @param {String} password 82 * @returns {Object[]} A list of objects with the properties blogid, blogName and 83 * url 84 */ 85 Api.blogger.getUsersBlogs = function(appKey, name, password) { 86 var user = Api.getUser(name, password); 87 var result = []; 88 user.forEach(function() { 89 Api.constrain(this.site, user); 90 if (this.site.stories.getPermission("create")) { 91 result.push({ 92 blogid: this.site.name, 93 blogName: this.site.title, 94 url: this.site.href() 95 }); 96 } 97 return; 98 }); 99 return result; 100 } 101 102 /** 103 * 104 * @param {String} appKey 105 * @param {Number} id 106 * @param {String} name 107 * @param {String} password 108 * @param {Number} limit 109 * @throws {Error} 110 * @returns {Object[]} A list of objects with the properties postid, userid, 111 * dateCreated and content 112 */ 113 Api.blogger.getRecentPosts = function(appKey, id, name, password, limit) { 114 var site = Api.getSite(id); 115 var user = Api.getUser(name, password); 116 117 Api.constrain(site, user); 118 if (!site.stories.getPermission("main")) { 119 throw Error("Permission denied for user " + user.name + 120 " to get recent posts of site " + site.name); 121 } 122 123 var result = []; 124 var stories = res.handlers.membership.stories; 125 var max = Math.min(stories.size(), Number(limit) || Infinity, 20); 126 for each (var story in stories.list(0, max)) { 127 result.push({ 128 postid: story._id, 129 userid: story.creator.name, 130 dateCreated: story.created, 131 content: story.title ? "<title>" + story.title + 132 "</title>" + story.text : story.text 133 }); 134 } 135 return result; 136 } 137 138 /** 139 * 140 * @param {String} appKey 141 * @param {Number} id 142 * @param {String} name 143 * @param {String} password 144 * @throws {Error} 145 * @returns {Object} Properties: content, userid, postid, dateCreated 146 */ 147 Api.blogger.getPost = function(appKey, id, name, password) { 148 var story = Api.getStory(id); 149 var user = Api.getUser(name, password); 150 151 Api.constrain(story.site, user); 152 if (!story.getPermission("main")) { 153 throw Error("Permission denied for user " + name + 154 " to get post #" + id); 155 } 156 157 return { 158 content: story.title ? html.elementAsString("title", story.title) + 159 story.text : story.text, 160 userid: story.creator.name, 161 postid: story._id, 162 dateCreated: story.created 163 } 164 } 165 166 /** 167 * 168 * @param {String} appKey 169 * @param {Number} id 170 * @param {String} name 171 * @param {String} password 172 * @param {String} content 173 * @param {Boolean} publish 174 * @throws {Error} 175 * @returns {Number} The ID of the new story 176 */ 177 Api.blogger.newPost = function(appKey, id, name, password, content, publish) { 178 var site = Api.getSite(id); 179 var user = Api.getUser(name, password); 180 181 Api.constrain(site, user); 182 if (!site.stories.getPermission("create")) { 183 throw Error("Permission denied for user " + user.name + 184 " to add a post to site " + site.name); 185 } 186 187 var parts = Api.blogger._getContentParts(content); 188 189 var story = Story.add({ 190 title: parts.title, 191 text: parts.text, 192 status: publish ? Story.PUBLIC : Story.CLOSED, 193 mode: Story.FEATURED 194 }, site, user); 195 196 return story._id; 197 } 198 199 /** 200 * 201 * @param {String} appKey 202 * @param {Number} id 203 * @param {String} name 204 * @param {String} password 205 * @param {String} content 206 * @param {Boolean} publish 207 * @throws {Error} 208 * @returns {Boolean} Always true 209 */ 210 Api.blogger.editPost = function(appkey, id, name, password, content, publish) { 211 var story = Api.getStory(id); 212 var user = Api.getUser(name, password); 213 214 Api.constrain(story.site, user); 215 if (!story.getPermission("edit")) { 216 throw Error("Permission denied for user " + name + 217 " to edit post #" + id); 218 } 219 220 var parts = Api.blogger._getContentParts(content); 221 story.update({ 222 title: parts.title, 223 text: parts.text, 224 status: publish ? Story.PUBLIC : Story.CLOSED, 225 modifier: user, 226 modified: new Date 227 }); 228 return true; 229 } 230 231 /** 232 * 233 * @param {String} appKey 234 * @param {Number} id 235 * @param {String} name 236 * @param {String} password 237 * @throws {Error} 238 * @returns {Boolean} Always true 239 */ 240 Api.blogger.deletePost = function(appKey, id, name, password) { 241 var story = Api.getStory(id); 242 var user = Api.getUser(name, password); 243 244 Api.constrain(story.site, user); 245 if (!story.getPermission("delete")) { 246 throw Error("Permission denied for user " + name + 247 " to delete story #" + id); 248 } 249 250 Story.remove.call(story); 251 return true; 252 } 253