require 'mongo' require 'open-uri' require 'json' require 'date' @db = Mongo::Connection.new("localhost", 27017).db("fgu_new") @coll_bulletin = @db["bulletins"] @bulletin_links = @db["bulletin_links"] @coll_cat = @db["categories"] @updated_bulletins = Array.new bulletin_module_id = @db["module_apps"].find(key: "announcement").first coll_bulletin = @db["bulletins"] @coll_buffer_cat = @db["buffer_categories"] coll_cat = @db["categories"] coll_bulletin_cat = @db["categories"].find(module_app_id: bulletin_module_id["_id"]) @categories = coll_bulletin_cat.find().to_a.inject({}) do |categories, category| categories[category['key']] = category['_id'] categories end # @categories = @coll_cat.find().to_a.inject({}) do |categories, category| # categories[category['key']] = category['_id'] # categories # end def save_bulletin_links bulletin_id, title, url, c_time title = "Link" if title == '' bulletin_link = { title: {"zh_tw" => title, "en" => title }, url: url, bulletin_id: bulletin_id, created_at: c_time, updated_at: c_time } @bulletin_links.save(bulletin_link) end def get_remote_bulletins_json(url) data = "" open(url){|f| f.each_line {|line| data << line} } bulletins = JSON.parse data bulletins.each do |b| lang = b[1]=='zh-tw' ? "zh_tw".to_sym : "en".to_sym next if b[2]=="" next if @categories["#{b[7]}"].nil? if b[5]=="" and b[4]!="" b[5]=b[4] b[4]="" end bulletin = { _type: "Bulletin", postdate: Time.parse(b[8]), created_at: Time.parse(b[8]), updated_at: Time.parse(b[8]), is_checked: true, is_pending: false, is_rejected: false, category_id: @categories["#{b[7]}"], title: {lang => b[2]}, subtitle: {lang => b[4]}, text: {lang => b[5]}, available_for_zh_tw: true, available_for_en: true, create_user_id: "", public: true, sn: b[0], site: b[9], site_id: b[10], is_top: false, is_hot: false, is_hidden: false } this_bulletin = @coll_bulletin.find_one(:$and => [{ :sn => bulletin[:sn]},{ :site => bulletin[:site]}]) @updated_bulletins.push({:sn => bulletin[:sn],:site => bulletin[:site] }) # p bulletin unless this_bulletin bs = @coll_bulletin.save(bulletin) buffer_cat = { _type: "BufferCategory", category_id: @categories["#{b[7]}"], categorizable_type: "Bulletin", categorizable_id: bs } @coll_buffer_cat.save(buffer_cat) #files (10..14).each do |i| ta = i + 5 save_bulletin_links( bulletin[:_id], b[ta], b[i], bulletin[:created_at] ) if b[i] != '' end #url save_bulletin_links( bulletin[:_id], '', b[20], bulletin[:created_at] ) if b[20] != '' # puts "Inserted "+lang.to_s+" "+bulletin[:title][lang] # p bulletin else @coll_bulletin.update( {"_id"=>this_bulletin["_id"]}, { :_type => "Bulletin", :postdate => bulletin[:postdate], :created_at => bulletin[:created_at], :updated_at => bulletin[:updated_at], :is_checked => this_bulletin["is_checked"], :is_pending => this_bulletin["is_pending"], :is_rejected => this_bulletin["is_rejected"], :category_id => bulletin[:category_id], :title => bulletin[:title], :subtitle => bulletin[:subtitle], :text => bulletin[:text], :available_for_zh_tw => this_bulletin["available_for_zh_tw"], :available_for_en => this_bulletin["available_for_en"], :create_user_id => "", :public => this_bulletin["public"], :sn => bulletin[:sn], :site => bulletin[:site], :site_id => bulletin[:site_id], :is_top => this_bulletin["is_top"], :is_hot => this_bulletin["is_hot"], :is_hidden => this_bulletin["is_hidden"] }) @coll_buffer_cat.remove(categorizable_id: BSON::ObjectId(this_bulletin["_id"].to_s) ) buffer_cat = { _type: "BufferCategory", category_id: bulletin[:category_id], categorizable_type: "Bulletin", categorizable_id: this_bulletin["_id"] } @coll_buffer_cat.save(buffer_cat) @bulletin_links.remove(bulletin_id: BSON::ObjectId(this_bulletin["_id"].to_s) ) #files (10..14).each do |i| ta = i + 5 save_bulletin_links( this_bulletin["_id"], b[ta], b[i], this_bulletin["created_at"] ) if b[i] != '' end #url save_bulletin_links( this_bulletin["_id"], '', b[20], bulletin[:created_at] ) if b[20] != '' # puts "Updated "+lang.to_s+" "+bulletin[:title][lang] # p this_bulletin["_id"] end end end get_remote_bulletins_json("http://president.fgu.edu.tw/remote_annoucement/get_news2.php") get_remote_bulletins_json("http://car.fgu.edu.tw/remote_annoucement/get_news2.php") # Delete bulletins that had been removed form remote sites # Find all remote bulletins on server local_bulletins = @coll_bulletin.find({ site: { :$exists => true } }) # Check if each remote bulletins on server exist in the updated bulletins local_bulletins.each do |local_bulletin| result = @updated_bulletins.select {|remote_bulletin| remote_bulletin[:sn] == local_bulletin["sn"] and remote_bulletin[:site] == local_bulletin["site"]} if result.length == 0 @coll_bulletin.remove(:$and => [{ :sn => local_bulletin["sn"]},{ :site => local_bulletin["site"]}]) p "Delete: "+local_bulletin["site"]+"-"+local_bulletin["sn"] end end