166 lines
6.5 KiB
Ruby
166 lines
6.5 KiB
Ruby
class FeedsController < ApplicationController
|
|
skip_before_action :verify_authenticity_token
|
|
def notify_change
|
|
feed = SiteFeed.where(:feed_uid=>params[:uid]).first
|
|
feed_annc = SiteFeedAnnc.where(:feed_id=>feed.id).first
|
|
if feed_annc
|
|
feeds_model = feed.feeds_model
|
|
if feeds_model.present?
|
|
feeds_model = feeds_model.constantize
|
|
end
|
|
feed_id = feed.id
|
|
feeds_uid_field = feed.feeds_uid_field rescue nil
|
|
feeds_update_callback = feed.feeds_update_callback rescue nil
|
|
feeds_time_field = feed.feeds_time_field
|
|
feeds_finish_callback = feed.feeds_finish_callback
|
|
category_id = feed.merge_with_category
|
|
can_create_record = feeds_model && feeds_uid_field && feeds_update_callback
|
|
locales = Site.first.in_use_locales rescue I18n.available_locales
|
|
locales.map!{|l| l.to_s}
|
|
site_root_url = Site.first.root_url rescue ""
|
|
main_directory = File.join("#{Rails.root}","public","site_feeds")
|
|
feed_directory = File.join(main_directory.to_s, feed.id.to_s)
|
|
feed_data = JSON.parse(File.read(File.join(feed_directory.to_s, feed.feed_uid + ".json")))
|
|
channel_key_pluralize = feed_annc.channel_key.pluralize
|
|
need_write = true
|
|
if params[:type] == 'create'
|
|
trans = {}
|
|
locales.each do |locale|
|
|
trans[locale] = {}
|
|
I18n.with_locale(locale) do
|
|
trans[locale]['top'] = I18n.t(:top)
|
|
trans[locale]['hot'] = I18n.t(:hot)
|
|
trans[locale]['more_plus'] = I18n.t("feed.more")
|
|
end
|
|
end
|
|
params[:data].each do |a|
|
|
a = JSON.parse(a)
|
|
a["category_id"] = category_id
|
|
locales.each do |locale|
|
|
locale_sym = locale.to_sym
|
|
time_field_value = Time.parse(a[feeds_time_field]) rescue a[feeds_time_field]
|
|
if feed_annc[:all_contents_for_feed][locale_sym].index{|aa| aa["id"] == a["id"]}
|
|
next
|
|
end
|
|
insert_idx = 0
|
|
if time_field_value
|
|
insert_idx = feed_annc[:all_contents_for_feed][locale_sym].index{|aa| (aa["org_is_top"] < a["org_is_top"] rescue false) || ((aa["org_is_top"] == a["org_is_top"]) && (aa[feeds_time_field] <= time_field_value))}
|
|
if insert_idx.nil?
|
|
insert_idx = ((a["org_is_top"] == 1) ? 0 : -1)
|
|
end
|
|
end
|
|
feed_annc.all_contents_for_feed_will_change!
|
|
feed_annc[:all_contents_for_feed][locale_sym].insert(insert_idx, feed_annc.process_tmp(a,locale,trans,site_root_url))
|
|
feed_data[channel_key_pluralize].insert(insert_idx, a)
|
|
end
|
|
if can_create_record
|
|
record = feeds_model.where(feeds_uid_field=>a["id"], :site_feed_id=>feed_id).first
|
|
if record.nil?
|
|
record = feeds_model.new
|
|
record.instance_variable_set(:@skip_callback, true)
|
|
record[feeds_uid_field] = a["id"]
|
|
record[:site_feed_id] = feed_id
|
|
record.save
|
|
record.instance_variable_set(:@skip_callback, true)
|
|
end
|
|
record.send(feeds_update_callback, a)
|
|
end
|
|
end
|
|
feed_annc.instance_variable_set(:@skip_callback, true)
|
|
feed_annc.save!
|
|
elsif params[:type] == 'update'
|
|
trans = {}
|
|
locales.each do |locale|
|
|
trans[locale] = {}
|
|
I18n.with_locale(locale) do
|
|
trans[locale]['top'] = I18n.t(:top)
|
|
trans[locale]['hot'] = I18n.t(:hot)
|
|
trans[locale]['more_plus'] = I18n.t("feed.more")
|
|
end
|
|
end
|
|
params[:data].each do |a|
|
|
a = JSON.parse(a)
|
|
a["category_id"] = category_id
|
|
locales.each do |locale|
|
|
locale_sym = locale.to_sym
|
|
time_field_value = Time.parse(a[feeds_time_field]) rescue a[feeds_time_field]
|
|
has_create = false
|
|
feed_annc[:all_contents_for_feed][locale_sym].each_with_index do |aa, i|
|
|
if aa["id"] == a["id"]
|
|
feed_annc.all_contents_for_feed_will_change!
|
|
feed_annc[:all_contents_for_feed][locale_sym][i] = feed_annc.process_tmp(a,locale,trans,site_root_url)
|
|
feed_data[channel_key_pluralize][i] = a
|
|
has_create = true
|
|
break
|
|
end
|
|
end
|
|
unless has_create
|
|
insert_idx = 0
|
|
if time_field_value
|
|
insert_idx = feed_annc[:all_contents_for_feed][locale_sym].index{|aa| (aa["org_is_top"] < a["org_is_top"] rescue false) || ((aa["org_is_top"] == a["org_is_top"]) && (aa[feeds_time_field] <= time_field_value))}
|
|
if insert_idx.nil?
|
|
insert_idx = ((a["org_is_top"] == 1) ? 0 : -1)
|
|
end
|
|
end
|
|
feed_annc.all_contents_for_feed_will_change!
|
|
feed_annc[:all_contents_for_feed][locale_sym].insert(insert_idx, feed_annc.process_tmp(a,locale,trans,site_root_url))
|
|
feed_data[channel_key_pluralize].insert(insert_idx, a)
|
|
end
|
|
end
|
|
if can_create_record
|
|
record = feeds_model.where(feeds_uid_field=>a["id"], :site_feed_id=>feed_id).first
|
|
if record.nil?
|
|
record = feeds_model.new
|
|
record.instance_variable_set(:@skip_callback, true)
|
|
record[feeds_uid_field] = a["id"]
|
|
record[:site_feed_id] = feed_id
|
|
record.save
|
|
record.instance_variable_set(:@skip_callback, true)
|
|
end
|
|
record.send(feeds_update_callback, a)
|
|
end
|
|
end
|
|
feed_annc.instance_variable_set(:@skip_callback, true)
|
|
feed_annc.save!
|
|
elsif params[:type] == 'destroy'
|
|
locales.each do |locale|
|
|
locale_sym = locale.to_sym
|
|
feed_annc.all_contents_for_feed_will_change!
|
|
feed_annc[:all_contents_for_feed][locale_sym].reject!{|a| params[:data].include?(a["id"]) }
|
|
feed_data[channel_key_pluralize].reject!{|a| params[:data].include?(a["id"]) }
|
|
end
|
|
feed_annc.instance_variable_set(:@skip_callback, true)
|
|
feed_annc.save!
|
|
if can_create_record
|
|
feeds_model.where(feeds_uid_field.to_sym.in =>params[:data].map{|a| a["id"]}, :site_feed_id=>feed_id).destroy
|
|
end
|
|
elsif params[:type] == 'update_all'
|
|
feed_data = params[:data]
|
|
FileUtils.mkdir_p(feed_directory) if !File.exists?(feed_directory)
|
|
File.open(File.join(feed_directory.to_s,feed.feed_uid + ".json"),"w") do |file|
|
|
feed_data.force_encoding("utf-8")
|
|
file.write(feed_data)
|
|
end
|
|
need_write = false
|
|
feed_annc.all_contents_for_feed_will_change!
|
|
feed_annc[:all_contents_for_feed] = feed_annc.cache_annc
|
|
feed_annc.save!
|
|
if feeds_finish_callback
|
|
feeds_model.send(feeds_finish_callback, 'update_all', {"data"=>feed.get_annc(false),"feed_id"=>feed.id,"category_id"=>feed.merge_with_category})
|
|
end
|
|
end
|
|
if need_write
|
|
feed_data = feed_data.to_json
|
|
FileUtils.mkdir_p(feed_directory) if !File.exists?(feed_directory)
|
|
File.open(File.join(feed_directory.to_s,feed.feed_uid + ".json"),"w") do |file|
|
|
feed_data.force_encoding("utf-8")
|
|
file.write(feed_data)
|
|
end
|
|
if feeds_finish_callback
|
|
feeds_model.send(feeds_finish_callback, params[:type])
|
|
end
|
|
end
|
|
end
|
|
render :json => {success: true}
|
|
end
|
|
end |