meta_weblog_service.rb
上传用户:netsea168
上传日期:2022-07-22
资源大小:4652k
文件大小:6k
源码类别:

Ajax

开发平台:

Others

  1. module MetaWeblogStructs
  2.   class Article < ActionWebService::Struct
  3.     member :description,        :string
  4.     member :title,              :string
  5.     member :postid,             :string
  6.     member :url,                :string
  7.     member :link,               :string
  8.     member :permaLink,          :string
  9.     member :categories,         [:string]
  10.     member :mt_text_more,       :string
  11.     member :mt_excerpt,         :string
  12.     member :mt_keywords,        :string
  13.     member :mt_allow_comments,  :int
  14.     member :mt_allow_pings,     :int
  15.     member :mt_convert_breaks,  :string
  16.     member :mt_tb_ping_urls,    [:string]
  17.     member :dateCreated,        :time
  18.   end
  19.   class MediaObject < ActionWebService::Struct
  20.     member :bits, :string
  21.     member :name, :string
  22.     member :type, :string
  23.   end
  24.   class Url < ActionWebService::Struct
  25.     member :url, :string
  26.   end
  27. end
  28. class MetaWeblogApi < ActionWebService::API::Base
  29.   inflect_names false
  30.   api_method :getCategories,
  31.     :expects => [ {:blogid => :string}, {:username => :string}, {:password => :string} ],
  32.     :returns => [[:string]]
  33.   api_method :getPost,
  34.     :expects => [ {:postid => :string}, {:username => :string}, {:password => :string} ],
  35.     :returns => [MetaWeblogStructs::Article]
  36.   api_method :getRecentPosts,
  37.     :expects => [ {:blogid => :string}, {:username => :string}, {:password => :string}, {:numberOfPosts => :int} ],
  38.     :returns => [[MetaWeblogStructs::Article]]
  39.   api_method :deletePost,
  40.     :expects => [ {:appkey => :string}, {:postid => :string}, {:username => :string}, {:password => :string}, {:publish => :int} ],
  41.     :returns => [:bool]
  42.   api_method :editPost,
  43.     :expects => [ {:postid => :string}, {:username => :string}, {:password => :string}, {:struct => MetaWeblogStructs::Article}, {:publish => :int} ],
  44.     :returns => [:bool]
  45.   api_method :newPost,
  46.     :expects => [ {:blogid => :string}, {:username => :string}, {:password => :string}, {:struct => MetaWeblogStructs::Article}, {:publish => :int} ],
  47.     :returns => [:string]
  48.   api_method :newMediaObject,
  49.     :expects => [ {:blogid => :string}, {:username => :string}, {:password => :string}, {:data => MetaWeblogStructs::MediaObject} ],
  50.     :returns => [MetaWeblogStructs::Url]
  51. end
  52. class MetaWeblogService < TypoWebService
  53.   web_service_api MetaWeblogApi
  54.   before_invocation :authenticate
  55.   def getCategories(blogid, username, password)
  56.     Category.find(:all).collect { |c| c.name }
  57.   end
  58.   def getPost(postid, username, password)
  59.     article = Article.find(postid)
  60.     article_dto_from(article)
  61.   end
  62.   def getRecentPosts(blogid, username, password, numberOfPosts)
  63.     Article.find(:all, :order => "created_at DESC", :limit => numberOfPosts).collect{ |c| article_dto_from(c) }
  64.   end
  65.   def newPost(blogid, username, password, struct, publish)
  66.     article = Article.new
  67.     article.body        = struct['description'] || ''
  68.     article.title       = struct['title'] || ''
  69.     article.author      = username
  70.     article.published_at = struct['dateCreated'].to_time.getlocal rescue Time.now
  71.     article.published   = publish
  72.     article.user        = @user
  73.     # Movable Type API support
  74.     article.allow_comments = struct['mt_allow_comments']  || this_blog.default_allow_comments
  75.     article.allow_pings    = struct['mt_allow_pings']     || this_blog.default_allow_pings
  76.     article.extended       = struct['mt_text_more']       || ''
  77.     article.excerpt        = struct['mt_excerpt']         || ''
  78.     article.text_filter    = TextFilter.find_by_name(struct['mt_convert_breaks'] || this_blog.text_filter)
  79.     article.keywords       = struct['mt_keywords']        || ''
  80.     if !article.save
  81.       raise article.errors.full_messages * ", "
  82.     end
  83.     if struct['categories']
  84.       Category.find(:all).each do |c|
  85.         article.categories << c if struct['categories'].include?(c.name)
  86.       end
  87.     end
  88.     article.id.to_s
  89.   end
  90.   def deletePost(appkey, postid, username, password, publish)
  91.     Article.destroy(postid)
  92.     true
  93.   end
  94.   def editPost(postid, username, password, struct, publish)
  95.     article = Article.find(postid)
  96.     article.body        = struct['description'] || ''
  97.     article.title       = struct['title'] || ''
  98.     article.published   = publish
  99.     article.author      = username
  100.     article.published_at  = struct['dateCreated'].to_time.getlocal unless struct['dateCreated'].blank?
  101.     # Movable Type API support
  102.     article.allow_comments = struct['mt_allow_comments'] || this_blog.default_allow_comments
  103.     article.allow_pings    = struct['mt_allow_pings']    || this_blog.default_allow_pings
  104.     article.extended       = struct['mt_text_more']      || ''
  105.     article.excerpt        = struct['mt_excerpt']        || ''
  106.     article.keywords       = struct['mt_keywords']       || ''
  107.     article.text_filter    = TextFilter.find_by_name(struct['mt_convert_breaks'] || this_blog.text_filter)
  108.     if struct['categories']
  109.       article.categorizations.clear
  110.       Category.find(:all).each do |c|
  111.         article.categories << c if struct['categories'].include?(c.name)
  112.       end
  113.     end
  114.     
  115.     RAILS_DEFAULT_LOGGER.info(struct['mt_tb_ping_urls'])
  116.     article.save
  117.     true
  118.   end
  119.   def newMediaObject(blogid, username, password, data)
  120.     resource = Resource.create(:filename => data['name'], :mime => data['type'], :created_at => Time.now)
  121.     resource.write_to_disk(data['bits'])
  122.     MetaWeblogStructs::Url.new("url" => this_blog.file_url(resource.filename))
  123.   end
  124.   def article_dto_from(article)
  125.     MetaWeblogStructs::Article.new(
  126.       :description       => article.body,
  127.       :title             => article.title,
  128.       :postid            => article.id.to_s,
  129.       :url               => article.permalink_url(only_path=false),
  130.       :link              => article.permalink_url(only_path=false),
  131.       :permaLink         => article.permalink_url(only_path=false),
  132.       :categories        => article.categories.collect { |c| c.name },
  133.       :mt_text_more      => article.extended.to_s,
  134.       :mt_excerpt        => article.excerpt.to_s,
  135.       :mt_keywords       => article.tags.collect { |p| p.name }.join(', '),
  136.       :mt_allow_comments => article.allow_comments? ? 1 : 0,
  137.       :mt_allow_pings    => article.allow_pings? ? 1 : 0,
  138.       :mt_convert_breaks => (article.text_filter.name.to_s rescue ''),
  139.       :mt_tb_ping_urls   => article.pings.collect { |p| p.url },
  140.       :dateCreated       => (article.published_at.utc rescue '')
  141.       )
  142.   end
  143. end