      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 the MetaWeblog XML-RPC API.
     28  * See http://www.xmlrpc.com/metaWeblogApi for further details.
     29  */
     30
     31 /** @namespace */
     32 Api.metaWeblog = {}
     33
     34 /**
     35  * @param {Story} story
     36  * @returns {Object}
     37  */
     38 Api.metaWeblog._getStruct = function(story) {
     39    return {
     40       userid: story.creator.name,
     41       postid: story._id,
     42       dateCreated: story.created,
     43       title: story.getTitle(),
     44       description: story.text,
     45       categories: story.getTags(),
     46       flNotOnHomePage: story.mode === Story.HIDDEN ? true : false,
     47       link: story.href(),
     48       permaLink: story.href(),
     49       mt_excerpt: null, // FIXME: What are these "mt_" prefixed properties?
     50       mt_text_more: null,
     51       mt_allow_comments: story.commentMode === Story.OPEN ? 1 : 0,
     52       mt_allow_pings: 0,
     53       mt_convert_breaks: null,
     54       mt_keywords: null,
     55       postSource: story.getMetadata('postSource')
     56    }
     57 }
     58
     59 /**
     60  *
     61  * @param {Number} id
     62  * @param {String} name
     63  * @param {String} password
     64  * @param {Number} limit
     65  * @throws {Error}
     66  * @returns {Object[]}
     67  */
     68 Api.metaWeblog.getRecentPosts = function(id, name, password, limit) {
     69    var site = Api.getSite(id);
     70    var user = Api.getUser(name, password);
     71
     72    Api.constrain(site, user);
     73    if (!site.stories.getPermission("main")) {
     74       throw Error("Permission denied for user " + user.name +
     75             " to get recent posts from site " + site.name);
     76    }
     77
     78    var result = [];
     79    var stories = res.handlers.membership.stories;
     80    var max = Math.min(stories.size(), Number(limit) || Infinity, 20);
     81    for each (var story in stories.list(0, max)) {
     82       result.push(Api.metaWeblog._getStruct(story));
     83    }
     84    return result;
     85 }
     86
     87 /**
     88  *
     89  * @param {Number} id
     90  * @param {String} name
     91  * @param {String} password
     92  * @throws {Error}
     93  * @returns {Object}
     94  */
     95 Api.metaWeblog.getPost = function(id, name, password) {
     96    var story = Api.getStory(id);
     97    var user = Api.getUser(name, password);
     98    Api.constrain(story.site, user);
     99    if (!story.getPermission("main")) {
    100       throw Error("Permission denied for user " + name +
    101             " to get post #" + id);
    102    }
    103    return Api.metaWeblog._getStruct(story);
    104 }
    105
    106 /**
    107  *
    108  * @param {Number} id
    109  * @param {String} name
    110  * @param {String} password
    111  * @param {String} content
    112  * @param {Boolean} publish
    113  * @throws {Error}
    114  * @returns {Number}
    115  */
    116 Api.metaWeblog.newPost = function(id, name, password, content, publish) {
    117    var site = Api.getSite(id);
    118    var user = Api.getUser(name, password);
    119
    120    Api.constrain(site, user);
    121    if (!site.stories.getPermission("create")) {
    122       throw Error("Permission denied for user " + user.name +
    123             " to add a post to site " + site.name);
    124    }
    125
    126    var story = Story.add({
    127       title: content.title,
    128       text: content.description,
    129       status: publish ? Story.PUBLIC : Story.CLOSED,
    130       mode: content.flNotOnHomePage ? Story.HIDDEN : Story.FEATURED,
    131       commentMode: content.discussions === 0 ? Story.CLOSED : Story.OPEN,
    132       tags: content.categories
    133    }, site, user);
    134
    135    story.setMetadata('postSource', content.postSource);
    136    return story._id;
    137 }
    138
    139 /**
    140  *
    141  * @param {Number} id
    142  * @param {String} name
    143  * @param {String} password
    144  * @param {String} content
    145  * @param {Boolean} publish
    146  * @throws {Error}
    147  * @returns {Boolean}
    148  */
    149 Api.metaWeblog.editPost = function(id, name, password, content, publish) {
    150    var story = Api.getStory(id);
    151    var user = Api.getUser(name, password);
    152
    153    Api.constrain(story.site, user);
    154    if (!story.getPermission("edit")) {
    155       throw Error("Permission denied for user " + name +
    156             " to edit post #" + id);
    157    }
    158
    159    story.update({
    160       title: content.title,
    161       text: content.description,
    162       status: publish ? Story.PUBLIC : Story.CLOSED,
    163       mode: content.flNotOnHomePage ? Story.HIDDEN : Story.FEATURED,
    164       commentMode: content.discussions || content.mt_allow_comments ?
    165             Story.OPEN : Story.CLOSED,
    166       tags: content.categories
    167    });
    168
    169    story.setMetadata('postSource', content.postSource);
    170    return true;
    171 }
    172
    173 /**
    174  *
    175  * @param {Number} id
    176  * @param {String} name
    177  * @param {String} password
    178  * @throws {Error}
    179  * @returns {Object[]}
    180  */
    181 Api.metaWeblog.getCategories = function(id, name, password) {
    182    var site = Api.getSite(id);
    183    var user = Api.getUser(name, password);
    184
    185    Api.constrain(site, user);
    186    if (!site.stories.getPermission("main")) {
    187       throw Error("Permission denied for user " + user.name +
    188             " to get categories from site " + site.name);
    189    }
    190
    191    var result = [];
    192    var tags = site.getTags("tags", Tags.ALL).list();
    193    for each (var tag in tags) {
    194      result.push({
    195         description: tag.name,
    196         htmlUrl: tag.href(),
    197         rssUrl: tag.href("rss")
    198      });
    199    }
    200    return result;
    201 }
    202
    203 /**
    204  *
    205  * @param {Number} id
    206  * @param {String} name
    207  * @param {String} password
    208  * @param {String} media
    209  * @throws {Error}
    210  * @returns {Object}
    211  */
    212 Api.metaWeblog.newMediaObject = function(id, name, password, media) {
    213    var site = Api.getSite(id);
    214    var user = Api.getUser(name, password);
    215
    216    Api.constrain(site, user);
    217
    218    var result = {};
    219    var data = {};
    220    if (media.type && media.type.toLowerCase().startsWith("image/")) {
    221       if (!site.images.getPermission("create")) {
    222          throw Error("Permission denied for user " + user.name +
    223                " to add a media object to site " + site.name);
    224       }
    225       data.file = new Packages.helma.util.MimePart(media.name,
    226             media.bits, media.type);
    227       data.file_origin = media.name;
    228       data.description = media.description;
    229       if (media.maxWidth) {
    230           data.maxWidth = media.maxWidth;
    231       }
    232       if (media.maxHeight) {
    233           data.maxHeight = media.maxHeight;
    234       }
    235       result.url = Image.add(data, site, user).getUrl();
    236    } else {
    237       if (!site.files.getPermission("create")) {
    238          throw Error("Permission denied for user " + user.name +
    239                " to add a media object to site " + site.name);
    240       }
    241       data.file = new Packages.helma.util.MimePart(media.name,
    242             media.bits, media.type);
    243       data.file_origin = media.name;
    244       data.description = media.description;
    245       result.url = File.add(data, site, user).getUrl();
    246    }
    247
    248    return result;
    249 }
    250