accelerate feed

This commit is contained in:
邱博亞 2021-11-09 18:11:11 +08:00
parent 98e6860af2
commit ed065e5cb3
3 changed files with 166 additions and 116 deletions

View File

@ -15,15 +15,25 @@ class SiteFeedAnnc
def get_annc(annc_uid) def get_annc(annc_uid)
Array(self[:all_contents_for_feed]).select{|v| v['id']==annc_uid}[0] rescue {} Array(self[:all_contents_for_feed]).select{|v| v['id']==annc_uid}[0] rescue {}
end end
def all_contents_for_feed(site_source=nil,locale=I18n.locale.to_s,is_widget=false) before_save do
cat = self.category_title if self.top_list_changed? || self.hot_list_changed? || self.hidden_annc_changed? || self.category_title_changed?
Array(self[:all_contents_for_feed]).collect do |v| self[:all_contents_for_feed] = self.cache_annc
tmp = v
if hidden_annc.exclude?(v['id']) && !tmp["title_translations"][locale].blank?
if self.channel_key == "announcement"
if (!tmp["postdate"].blank? && tmp["postdate"].to_time>Time.now)
next
end end
end
def cache_annc(force_refresh=false)
feed = SiteFeed.find(self.feed_id)
anns = feed.get_annc(force_refresh)
cat = self.category_title
locales = Site.first.in_use_locales rescue I18n.available_locales
cache_data = {}
locales.each do |locale|
locale = locale.to_s
data_for_locale = I18n.with_locale(locale) do
anns.collect do |a|
tmp = a.deep_dup
tmp[:is_hidden] = self.hidden_annc.include?(tmp['id'])
if self.channel_key == "announcement"
tmp["postdate"] = tmp["postdate"].blank? ? nil : tmp["postdate"].to_time
tmp['statuses'] = [] tmp['statuses'] = []
if self[:top_list].count == 0 || self[:top_list].exclude?(tmp['id']) if self[:top_list].count == 0 || self[:top_list].exclude?(tmp['id'])
tmp[:is_top] = false tmp[:is_top] = false
@ -47,7 +57,6 @@ class SiteFeedAnnc
tmp["source-site"] = self.remote_site_url tmp["source-site"] = self.remote_site_url
tmp["source-site-title"] = (self[:channel_title][locale] rescue "") tmp["source-site-title"] = (self[:channel_title][locale] rescue "")
tmp["params"] = tmp["params"].to_s + "_" + self.feed_id.to_s + "h" tmp["params"] = tmp["params"].to_s + "_" + self.feed_id.to_s + "h"
next if !site_source.nil? && site_source != tmp["source-site-title"]
if !tmp["source-site-title"].blank? if !tmp["source-site-title"].blank?
tmp['statuses'] << { tmp['statuses'] << {
"status" => "<a href='#{tmp["source-site"]}' target='_blank' class='feed-source'>#{tmp["source-site-title"]}</a>", "status" => "<a href='#{tmp["source-site"]}' target='_blank' class='feed-source'>#{tmp["source-site-title"]}</a>",
@ -63,15 +72,7 @@ class SiteFeedAnnc
tmp["subtitle"] = tmp["subtitle_translations"][locale] tmp["subtitle"] = tmp["subtitle_translations"][locale]
tmp["source-site-link"] = tmp["source-site"] tmp["source-site-link"] = tmp["source-site"]
tmp["source-site"] = "<a href='#{tmp["source-site"]}' target='_blank' class='feed-source'>#{tmp["source-site-title"]}</a>" tmp["source-site"] = "<a href='#{tmp["source-site"]}' target='_blank' class='feed-source'>#{tmp["source-site-title"]}</a>"
if !tmp["external_link"].blank? tmp["link_to_show"] = !tmp["external_link"].blank? ? tmp["external_link"] : nil
tmp["link_to_show"] = tmp["external_link"]
else
if !is_widget
tmp["link_to_show"] = OrbitHelper.url_to_show(tmp["params"]) rescue ''
else
tmp["link_to_show"] = OrbitHelper.widget_item_url(tmp["params"]) rescue ''
end
end
tmp["target"] = "_self" tmp["target"] = "_self"
tmp["img_src"] = tmp["image"]["thumb"] || "/assets/announcement-default.jpg" tmp["img_src"] = tmp["image"]["thumb"] || "/assets/announcement-default.jpg"
tmp["img_description"] = tmp["image_description_translations"][locale] tmp["img_description"] = tmp["image_description_translations"][locale]
@ -101,18 +102,12 @@ class SiteFeedAnnc
tmp["source-site"] = self.remote_site_url tmp["source-site"] = self.remote_site_url
tmp["source-site-title"] = (self[:channel_title][locale] rescue "") tmp["source-site-title"] = (self[:channel_title][locale] rescue "")
tmp["params"] = tmp["params"].to_s + "_" + self.feed_id.to_s + "h" tmp["params"] = tmp["params"].to_s + "_" + self.feed_id.to_s + "h"
next if !site_source.nil? && site_source != tmp["source-site-title"]
tmp['statuses'] << { tmp['statuses'] << {
"status" => "<a href='#{tmp["source-site"]}' target='_blank' class='feed-source'>#{tmp["source-site-title"]}</a>", "status" => "<a href='#{tmp["source-site"]}' target='_blank' class='feed-source'>#{tmp["source-site-title"]}</a>",
"status-class" => "status-source" "status-class" => "status-source"
} }
tmp["source-site-link"] = tmp["source-site"] tmp["source-site-link"] = tmp["source-site"]
tmp["source-site"] = "<a href='#{tmp["source-site"]}' target='_blank' class='feed-source'>#{tmp["source-site-title"]}</a>" tmp["source-site"] = "<a href='#{tmp["source-site"]}' target='_blank' class='feed-source'>#{tmp["source-site-title"]}</a>"
if !is_widget
tmp["link_to_show"] = OrbitHelper.url_to_show(tmp["params"]) rescue ''
else
tmp["link_to_show"] = OrbitHelper.widget_item_url(tmp["params"]) rescue ''
end
tmp["target"] = "_self" tmp["target"] = "_self"
tmp["more"] = I18n.t(:more_plus) tmp["more"] = I18n.t(:more_plus)
tmp["view_count"] = "" tmp["view_count"] = ""
@ -138,8 +133,63 @@ class SiteFeedAnnc
end end
tmp = BSON::Document.new(new_tmp) tmp = BSON::Document.new(new_tmp)
end end
tmp
end
end
cache_data[locale.to_s] = data_for_locale
end
cache_data
end
def self.get_feed_cache(channel_key,merge_with_category=nil,site_source=nil,locale=I18n.locale.to_s,is_widget=false,max_len=nil)
match_cond = {"channel_key"=>channel_key}
if !merge_with_category.blank? && merge_with_category.exclude?('all')
match_cond["merge_with_category"] = {"$in"=>merge_with_category}
end
if site_source
match_cond["channel_title.#{locale}"] = site_source
end
pipeline = [
{"$match"=>match_cond},
{"$project"=>{"data"=>"$all_contents_for_feed.#{locale}"}},
{"$unwind"=>"$data"},
{"$match"=>{"data.is_hidden"=>{"$ne"=>true},
"data.postdate"=>{"$lte"=>Time.now},
"data.title" => {"$gt"=>""}
}
},
{"$sort"=>{"data.is_top"=>-1,"data.postdate"=>-1}}
]
if max_len
pipeline << {"$limit"=> max_len}
end
self.collection.aggregate(pipeline).collect do |data|
tmp = data['data']
if tmp["link_to_show"].nil?
if !is_widget
tmp["link_to_show"] = OrbitHelper.url_to_show(tmp["params"]) rescue ''
else else
tmp = nil tmp["link_to_show"] = OrbitHelper.widget_item_url(tmp["params"]) rescue ''
end
end
tmp
end
end
def all_contents_for_feed(site_source=nil,locale=I18n.locale.to_s,is_widget=false)
if !site_source.nil? && site_source != self[:channel_title][locale]
return []
end
time_now = Time.now
Array(self[:all_contents_for_feed][locale.to_s]).collect do |v|
tmp = v
next if tmp["is_hidden"] || (!tmp["postdate"].nil? && tmp["postdate"]<Time.now) || tmp['title'].blank?
if tmp["link_to_show"].nil?
if !is_widget
tmp["link_to_show"] = OrbitHelper.url_to_show(tmp["params"]) rescue ''
else
tmp["link_to_show"] = OrbitHelper.widget_item_url(tmp["params"]) rescue ''
end
end end
tmp tmp
end.compact end.compact

View File

@ -12,12 +12,12 @@ module FeedModel
tmp = SiteFeedAnnc.new(feed_id: feed.id) tmp = SiteFeedAnnc.new(feed_id: feed.id)
end end
tmp[:feed_name] = feed[:feed_name] tmp[:feed_name] = feed[:feed_name]
tmp.all_contents_for_feed = feed.get_annc(true)
tmp.merge_with_category = feed.merge_with_category tmp.merge_with_category = feed.merge_with_category
tmp.channel_key = feed.channel_key tmp.channel_key = feed.channel_key
tmp.category_title = feed.category[:title] rescue {} tmp.category_title = feed.category[:title] rescue {}
tmp.remote_site_url = feed.remote_site_url tmp.remote_site_url = feed.remote_site_url
tmp.channel_title = feed.channel_title_for_cache tmp.channel_title = feed.channel_title_for_cache
tmp.all_contents_for_feed = tmp.cache_annc(true)
tmp.save tmp.save
end end
def do_before_save def do_before_save

View File

@ -12,13 +12,13 @@ module Feeds
if tmp.nil? if tmp.nil?
tmp = SiteFeedAnnc.new(feed_id: site_feed.id) tmp = SiteFeedAnnc.new(feed_id: site_feed.id)
end end
tmp.all_contents_for_feed = site_feed.get_annc
tmp[:feed_name] = site_feed[:feed_name] tmp[:feed_name] = site_feed[:feed_name]
tmp.merge_with_category = site_feed.merge_with_category tmp.merge_with_category = site_feed.merge_with_category
tmp.channel_key = site_feed.channel_key tmp.channel_key = site_feed.channel_key
tmp.category_title = site_feed.category[:title] rescue {} tmp.category_title = site_feed.category[:title] rescue {}
tmp.remote_site_url = site_feed.remote_site_url tmp.remote_site_url = site_feed.remote_site_url
tmp.channel_title = site_feed.channel_title_for_cache tmp.channel_title = site_feed.channel_title_for_cache
tmp.all_contents_for_feed = tmp.cache_annc
tmp.save tmp.save
elsif !tmp.nil? elsif !tmp.nil?
tmp.destroy tmp.destroy