      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 Movable Type's XML-RPC API.
     28  * See http://www.sixapart.com/pronet/breese/xmlrpc/movable_type_api/ for details.
     29  */
     30
     31 /** @namespace */
     32 Api.mt = {};
     33
     34 /**
     35  *
     36  * @param {Number} id
     37  * @param {String} name
     38  * @param {String} password
     39  * @param {Number} limit
     40  * @throws {Error}
     41  * @returns {Object[]}
     42  */
     43 Api.mt.getRecentPostTitles = function(id, name, password, limit) {
     44    var site = Api.getSite(id);
     45    var user = Api.getUser(name, password);
     46
     47    Api.constrain(site, user);
     48    if (!site.stories.getPermission("main")) {
     49       throw Error("Permission denied for user " + user.name +
     50             " to get recent post titles from site " + site.name);
     51    }
     52
     53    var result = [];
     54    var stories = res.handlers.membership.stories;
     55    var max = Math.min(stories.size(), Number(limit) || Infinity, 20);
     56    for each (var story in stories.list(0, max)) {
     57       result.push({
     58          postid: story._id,
     59          username: story.creator.name,
     60          dateCreated: story.created,
     61          title: story.getTitle()
     62       });
     63    }
     64    return result;
     65 }
     66
     67 /**
     68  *
     69  * @param {Number} id
     70  * @param {String} name
     71  * @param {String} password
     72  * @throws {Error}
     73  * @returns {Object[]}
     74  */
     75 Api.mt.getCategoryList = function(id, name, password) {
     76    var site = Api.getSite(id);
     77    var user = Api.getUser(name, password);
     78
     79    Api.constrain(site, user);
     80    if (!site.stories.getPermission("main")) {
     81       throw Error("Permission denied for user " + user.name +
     82             " to access site " + site.name);
     83    }
     84
     85    var result = [];
     86    var tags = site.getTags("tags", Tags.ALL).list();
     87    for each (var tag in tags) {
     88      result.push({
     89         categoryId: tag.name, // FIXME: tag._id,
     90         categoryName: tag.name
     91      });
     92    }
     93    return result;
     94 }
     95
     96 /**
     97  *
     98  * @param {Number} id
     99  * @param {String} name
    100  * @param {String} password
    101  * @throws {Error}
    102  * @returns {Object[]}
    103  */
    104 Api.mt.getPostCategories = function(id, name, password) {
    105    var story = Api.getStory(id);
    106    var user = Api.getUser(name, password);
    107
    108    Api.constrain(story.site, user);
    109    if (!story.getPermission("main")) {
    110       throw Error("Permission denied for user " + name +
    111             " to access story #" + id);
    112    }
    113
    114    var result = [];
    115    for each (var tag in story.getTags()) {
    116       result.push({
    117          categoryId: tag,
    118          categoryName: tag,
    119          isPrimary: true
    120       });
    121    }
    122    return result;
    123 }
    124
    125 // FIXME: How do I post a new story?
    126 /**
    127  *
    128  * @param {Number} id
    129  * @param {String} name
    130  * @param {String} password
    131  * @throws {Error}
    132  * @returns {Boolean}
    133  */
    134 Api.mt.publishPost = function(id, name, password) {
    135    var story = Api.getStory(id);
    136    var user = Api.getUser(name, password);
    137
    138    Api.constrain(story.site, user);
    139    if (!story.getPermission("edit")) {
    140       throw Error("Permission denied for user " + name +
    141             " to edit story #" + id);
    142    }
    143
    144    story.mode = Story.FEATURED;
    145    return true;
    146 }
    147
    148 /**
    149  *
    150  * @param {Number} id
    151  * @param {String} name
    152  * @param {String} password
    153  * @param {String[]} categories
    154  * @throws {Error}
    155  * @returns {Boolean}
    156  */
    157 Api.mt.setPostCategories = function(id, name, password, categories) {
    158    if (!categories || !categories.length) {
    159       return;
    160    }
    161
    162    var story = Api.getStory(id);
    163    var user = Api.getUser(name, password);
    164
    165    Api.constrain(story.site, user);
    166    if (!story.getPermission("edit")) {
    167       throw Error("Permission denied for user " + name +
    168             " to edit story #" + id);
    169    }
    170
    171    story.setTags(categories);
    172    return true;
    173 }
    174
    175 /**
    176  *
    177  * @returns {Array}
    178  */
    179 Api.mt.supportedTextFilters = function() {
    180    return [];
    181 }
    182
    183 /**
    184  *
    185  * @returns {Array}
    186  */
    187 Api.mt.getTrackbackPings = function() {
    188    return [];
    189 }
    190
    191 /**
    192  *
    193  * @returns {String[]}
    194  */
    195 Api.mt.supportedMethods = function() {
    196    var result = [];
    197    for (var method in Api.mt) {
    198       result.push(method);
    199    }
    200    return result.sort();
    201 }
    202