2015-07-07 11:51:56 +00:00
|
|
|
class Admin::FeedsController < OrbitAdminController
|
2020-04-05 14:36:09 +00:00
|
|
|
layout :compute_layout
|
2020-07-22 06:04:27 +00:00
|
|
|
helper_method :search_all_words
|
2020-04-05 14:36:09 +00:00
|
|
|
def compute_layout
|
2021-10-21 02:55:01 +00:00
|
|
|
if action_name== 'annc_content'
|
2022-09-25 11:34:29 +00:00
|
|
|
false
|
2021-10-21 02:55:01 +00:00
|
|
|
else
|
2022-09-25 11:34:29 +00:00
|
|
|
'back_end'
|
2021-10-21 02:55:01 +00:00
|
|
|
end
|
|
|
|
end
|
2015-07-07 11:51:56 +00:00
|
|
|
def index
|
|
|
|
@site_feeds = SiteFeed.all.group_by(&:remote_site_url)
|
|
|
|
@school_urls = @site_feeds.keys
|
|
|
|
redirect_to new_admin_feed_path and return if @site_feeds.count == 0
|
|
|
|
end
|
|
|
|
|
2021-12-30 09:46:30 +00:00
|
|
|
def settings
|
|
|
|
@setting = SiteFeedSetting.first
|
|
|
|
end
|
|
|
|
|
|
|
|
def update_settings
|
|
|
|
@setting = SiteFeedSetting.first
|
|
|
|
p = params.require(:site_feed_setting).permit!
|
|
|
|
@setting.update_attributes(p)
|
|
|
|
Thread.new do
|
|
|
|
sleep 3
|
2022-09-25 11:34:29 +00:00
|
|
|
content = "UNICORN_PID=\"`fuser tmp/pids/unicorn.sock tmp/sockets/unicorn.sock tmp/unicorn.sock` `cat tmp/pids/unicorn.pid `\" && kill -s USR2 $UNICORN_PID ; n=20; while (kill -0 $UNICORN_PID > /dev/null 2>&1) && test $n -ge 0; do printf '.' && sleep 1 && n=$(( $n - 1 )); done ; if test $n -lt 0; then kill -s TERM $UNICORN_PID; sleep 3; bundle exec unicorn_rails -c config/unicorn.rb -D -E #{Rails.env}; else kill -s QUIT $UNICORN_PID; fi"
|
|
|
|
system(content)
|
2021-12-30 09:46:30 +00:00
|
|
|
end
|
|
|
|
redirect_to admin_feeds_settings_path
|
|
|
|
end
|
|
|
|
|
2015-07-07 11:51:56 +00:00
|
|
|
def new
|
|
|
|
|
|
|
|
end
|
2020-04-05 14:36:09 +00:00
|
|
|
def annc_content
|
|
|
|
site_feed_annc = SiteFeedAnnc.where(id: params['feed_annc_id']).first
|
|
|
|
@annc = site_feed_annc.get_annc(params['annc_uid'].to_s) rescue {}
|
|
|
|
end
|
|
|
|
def process_annc
|
|
|
|
now_process = params['process']
|
|
|
|
annc_uid = params['annc_uid'].to_s
|
|
|
|
site_feed_annc = SiteFeedAnnc.where(id: params['feed_annc_id']).first
|
|
|
|
if !site_feed_annc.nil?
|
|
|
|
case now_process
|
|
|
|
when /is_top|is_hot/
|
|
|
|
cmd = now_process.split(':')
|
|
|
|
f = cmd[0]=='is_top' ? 'top_list' : 'hot_list'
|
|
|
|
if cmd[1] == 'enable'
|
|
|
|
if site_feed_annc[f].exclude?(annc_uid)
|
|
|
|
tmp = site_feed_annc.send(f)
|
|
|
|
tmp << annc_uid
|
|
|
|
site_feed_annc.update_attributes(f.to_sym => tmp)
|
|
|
|
end
|
|
|
|
else
|
|
|
|
if site_feed_annc[f].include?(annc_uid)
|
|
|
|
tmp = site_feed_annc.send(f)
|
|
|
|
tmp -= [annc_uid]
|
|
|
|
site_feed_annc.update_attributes(f.to_sym => tmp)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
when /hidden|display/
|
|
|
|
if now_process == 'hidden'
|
|
|
|
if site_feed_annc[:hidden_annc].exclude?(annc_uid)
|
|
|
|
tmp = site_feed_annc.hidden_annc
|
|
|
|
tmp << annc_uid
|
|
|
|
site_feed_annc.update_attributes(:hidden_annc =>tmp)
|
|
|
|
end
|
|
|
|
else
|
|
|
|
if site_feed_annc[:hidden_annc].include?(annc_uid)
|
|
|
|
tmp = site_feed_annc.hidden_annc
|
|
|
|
tmp -= [annc_uid]
|
|
|
|
site_feed_annc.update_attributes(:hidden_annc =>tmp)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2022-05-22 10:36:26 +00:00
|
|
|
feeds_model = site_feed_annc.feeds_model
|
|
|
|
feeds_uid_field = site_feed_annc.feeds_uid_field
|
|
|
|
feeds_update_statuses_callback = site_feed_annc.feeds_update_statuses_callback
|
|
|
|
if feeds_model && feeds_uid_field
|
|
|
|
feeds_model = feeds_model.constantize
|
|
|
|
feeds_record = feeds_model.where(feeds_uid_field=>params['feed_annc_id']).first
|
|
|
|
if feeds_record
|
|
|
|
status_data = {}
|
|
|
|
cmd = now_process.split(':')
|
|
|
|
if now_process == "is_top"
|
|
|
|
status_data[:is_top] = (cmd[1] == 'enable')
|
|
|
|
elsif now_process == "is_hot"
|
|
|
|
status_data[:is_hot] = (cmd[1] == 'enable')
|
|
|
|
elsif status_data == "hidden"
|
|
|
|
status_data[:is_hidden] = true
|
|
|
|
elsif status_data == "display"
|
|
|
|
status_data[:is_hidden] = false
|
|
|
|
end
|
|
|
|
if feeds_update_statuses_callback
|
|
|
|
feeds_record.send(feeds_update_statuses_callback, status_data)
|
|
|
|
else
|
|
|
|
feeds_record.update(status_data)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2020-04-05 14:36:09 +00:00
|
|
|
end
|
2023-09-20 00:07:58 +00:00
|
|
|
render :plain => 'success'
|
2020-04-05 14:36:09 +00:00
|
|
|
end
|
|
|
|
def announcements
|
2020-07-22 06:04:27 +00:00
|
|
|
@filter_fields = {}
|
2020-07-31 06:50:17 +00:00
|
|
|
@filter_fields['feed.source'] = SiteFeed.all.pluck(:channel_title,:remote_site_url).collect do |a,b|
|
2020-07-22 06:04:27 +00:00
|
|
|
tp = (a.blank? || a[I18n.locale].blank?) ? b.gsub(/http:\/\/|https:\/\//,'').gsub(/\./,'-') : a[I18n.locale]
|
2022-06-21 08:04:17 +00:00
|
|
|
tp
|
|
|
|
end.uniq.map{|tp| {:title => tp,:id => tp}}
|
2022-09-25 11:34:29 +00:00
|
|
|
@filter_fields['feed.module_name'] = SiteFeed.all.map{|s| s.channel_key}.uniq.map do |key|
|
|
|
|
{:title => I18n.t("module_name.#{key}"),:id => key}
|
|
|
|
end
|
|
|
|
@max_content_count = 100
|
|
|
|
@page_no = params[:page].to_i
|
|
|
|
@page_no = 1 if @page_no==0
|
|
|
|
@skip_count = (@page_no-1)*@max_content_count
|
|
|
|
@module_name = params[:filters][:module_name].to_a rescue []
|
|
|
|
@module_name = SiteFeed.all.map{|s| s.channel_key}.uniq if @module_name == []
|
2022-11-04 02:22:41 +00:00
|
|
|
@all_feed_annc = SiteFeedAnnc.where(:channel_key.in => @module_name).order(id: 1).to_a rescue []
|
2022-09-25 11:34:29 +00:00
|
|
|
@source = params[:filters][:source] rescue []
|
|
|
|
@keywords = params[:keywords] rescue nil
|
2020-07-22 06:04:27 +00:00
|
|
|
if request.xhr?
|
2022-09-25 11:34:29 +00:00
|
|
|
render :partial => "announcements"
|
|
|
|
end
|
2020-04-05 14:36:09 +00:00
|
|
|
end
|
2015-07-07 11:51:56 +00:00
|
|
|
def get_category_list
|
|
|
|
app_key = params[:channel]
|
|
|
|
ma = ModuleApp.find_by_key(app_key) rescue nil
|
|
|
|
categories = []
|
|
|
|
if !ma.nil?
|
|
|
|
ma.categories.each do |category|
|
|
|
|
cat = {}
|
|
|
|
cat["title"] = category.title
|
|
|
|
cat["id"] = category.id.to_s
|
|
|
|
categories << cat
|
|
|
|
end
|
|
|
|
end
|
|
|
|
render :json => {"categories" => categories}.to_json
|
|
|
|
end
|
|
|
|
|
|
|
|
def get_channel_list
|
2020-07-31 06:50:17 +00:00
|
|
|
url = URI.decode(params['url']).chomp("/") + "/feeds/channel_lists"
|
2022-09-25 11:34:29 +00:00
|
|
|
uri = URI(URI.decode(url).encode)
|
|
|
|
res_net = http_request(uri) rescue nil
|
|
|
|
res = res_net ? res_net.body : nil
|
|
|
|
data = {}
|
|
|
|
if res_net && res_net['Content-Type'].split(";")[0]=="application/json"
|
|
|
|
data = JSON.parse(res) rescue {}
|
|
|
|
else
|
|
|
|
uri = URI(params['url'])
|
|
|
|
body = http_request(uri).body
|
|
|
|
links = get_rss_link(params['url'], body)
|
|
|
|
if links.length > 0
|
|
|
|
data = {channels: [{title: "Announcement",
|
|
|
|
key: "announcement",
|
|
|
|
url: params['url'],
|
|
|
|
feeds: links,
|
|
|
|
app_icon: "icons-megaphone"}]}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
render :json => data.to_json
|
2015-07-07 11:51:56 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
def get_feed_list
|
2022-09-25 11:34:29 +00:00
|
|
|
data_to_send = {}
|
|
|
|
if params['feeds']
|
|
|
|
data = {"feeds"=> JSON.parse(params[:feeds])}
|
|
|
|
else
|
|
|
|
url = params['url'].chomp("/") + params[:feed_list_url]
|
|
|
|
uri = URI.parse(url)
|
|
|
|
begin
|
|
|
|
res = http_request(uri)
|
|
|
|
res = res.code=='200' ? res.body : nil
|
|
|
|
rescue
|
|
|
|
res = nil
|
|
|
|
puts uri.to_s
|
|
|
|
puts uri.hostname
|
|
|
|
end
|
|
|
|
data = JSON.parse(res) rescue {}
|
|
|
|
end
|
|
|
|
data_to_send["feeds"] = []
|
|
|
|
Array(data["feeds"]).each do |feed|
|
|
|
|
sf = SiteFeed.find_by(:feed_uid => feed["uid"]) rescue nil
|
|
|
|
if !sf.nil?
|
|
|
|
feed["subscribed"] = true
|
|
|
|
else
|
|
|
|
feed["subscribed"] = false
|
|
|
|
end
|
|
|
|
data_to_send["feeds"] << feed
|
|
|
|
end
|
|
|
|
render :json => data_to_send.to_json
|
2015-07-07 11:51:56 +00:00
|
|
|
end
|
|
|
|
|
2015-11-09 17:38:30 +00:00
|
|
|
def channel_title
|
2022-06-21 10:10:50 +00:00
|
|
|
Thread.new do
|
|
|
|
site_feeds = SiteFeed.where(:remote_site_url => params["url"])
|
|
|
|
site_feeds.each do |sf|
|
|
|
|
sf.channel_title_translations = params["channel_title_translations"]
|
|
|
|
sf.instance_variable_set(:@skip_callback, true)
|
|
|
|
sf.save
|
|
|
|
sf.sync_data_to_annc
|
|
|
|
sf.update_channel_title
|
|
|
|
end
|
2015-11-09 17:38:30 +00:00
|
|
|
end
|
|
|
|
render :json => {"success" => true, "title" => params["channel_title_translations"][I18n.locale.to_s]}.to_json
|
|
|
|
end
|
|
|
|
|
2015-07-07 11:51:56 +00:00
|
|
|
def subscribe
|
|
|
|
site_feed = SiteFeed.new
|
2022-09-25 11:34:29 +00:00
|
|
|
uri = URI(params[:url])
|
|
|
|
site_feed.remote_site_url = uri.to_s[/\A.*(?=#{uri.path}\z)/]
|
2015-07-07 11:51:56 +00:00
|
|
|
site_feed.merge_with_category = params[:category]
|
|
|
|
site_feed.channel_name = params[:channel]
|
|
|
|
site_feed.channel_key = params[:channel_key]
|
|
|
|
site_feed.feed_uid = params[:feed][:uid]
|
|
|
|
site_feed.feed_name_translations = params[:feed][:title_translations]
|
|
|
|
site_feed.disabled = false
|
|
|
|
site_feed.feed_url = params[:feed][:url]
|
2022-09-25 11:34:29 +00:00
|
|
|
if params[:feed][:is_rss]
|
|
|
|
site_feed.is_rss = params[:feed][:is_rss]
|
|
|
|
end
|
2022-06-21 10:10:50 +00:00
|
|
|
uri = URI(site_feed.remote_site_url)
|
|
|
|
site_host = uri.host
|
|
|
|
other_site_feeds = SiteFeed.where(:remote_site_url=>/:\/\/#{::Regexp.escape(site_host)}/)
|
|
|
|
other_site_feed = other_site_feeds.first
|
2022-05-24 09:17:26 +00:00
|
|
|
site_feed.channel_title_translations = other_site_feed.channel_title_translations if other_site_feed
|
2022-09-01 03:13:01 +00:00
|
|
|
other_scheme = URI(other_site_feed.remote_site_url).scheme rescue nil
|
2022-06-21 10:10:50 +00:00
|
|
|
site_scheme = uri.scheme
|
|
|
|
if (['http','https'] & [other_scheme, site_scheme]).count == 2
|
|
|
|
if site_scheme == 'http'
|
|
|
|
site_feed.remote_site_url = site_feed.remote_site_url.sub('http://','https://')
|
|
|
|
else
|
|
|
|
remote_site_url = site_feed.remote_site_url
|
|
|
|
other_site_feeds.update_all(:remote_site_url=>remote_site_url)
|
|
|
|
site_feed_anncs = SiteFeedAnnc.where(:feed_id.in=>other_site_feeds.pluck(:id))
|
|
|
|
site_feed_anncs.update_all(:remote_site_url=>remote_site_url)
|
|
|
|
site_feed_anncs.each{|sfa| sfa.update_remote_site_url}
|
|
|
|
end
|
|
|
|
end
|
2022-05-24 09:57:55 +00:00
|
|
|
module_app = ModuleApp.where(:key=>site_feed.channel_key).first
|
|
|
|
if module_app.feeds_model
|
|
|
|
sync_fields_data = SiteFeed::ModuleAppSyncFields.map{|f| [f, module_app[f]] }.to_h
|
|
|
|
site_feed.update(sync_fields_data)
|
|
|
|
end
|
2015-07-07 11:51:56 +00:00
|
|
|
site_feed.save
|
|
|
|
render :json => {"success" => true}.to_json
|
|
|
|
end
|
|
|
|
|
|
|
|
def disable
|
|
|
|
feed = SiteFeed.find(params[:feed_id]) rescue nil
|
|
|
|
if !feed.nil?
|
|
|
|
feed.disabled = params[:disable]
|
|
|
|
feed.save
|
|
|
|
end
|
|
|
|
render :json => {"success" => true}.to_json
|
|
|
|
end
|
|
|
|
|
|
|
|
def unsubscribe
|
|
|
|
sf = SiteFeed.find_by(:feed_uid => params[:feed_uid]) rescue nil
|
|
|
|
if !sf.nil?
|
|
|
|
sf.destroy
|
|
|
|
end
|
|
|
|
render :json => {"success" => true}.to_json
|
|
|
|
end
|
2021-09-15 08:43:19 +00:00
|
|
|
|
|
|
|
def force_refresh
|
|
|
|
sf = SiteFeed.find_by(:feed_uid => params[:feed_uid]) rescue nil
|
|
|
|
if !sf.nil?
|
2021-09-15 16:06:43 +00:00
|
|
|
FeedModel::Cache.recreate_annc_cache(sf)
|
2021-09-15 08:43:19 +00:00
|
|
|
end
|
|
|
|
render :json => {"success" => true}.to_json
|
|
|
|
end
|
|
|
|
|
2020-07-22 06:04:27 +00:00
|
|
|
def search_all_words(target, word)
|
2022-09-25 11:34:29 +00:00
|
|
|
target = target.upcase
|
|
|
|
words = word.upcase.split(' ')
|
|
|
|
words.select { |value| target.include? value } == words
|
2020-07-22 06:04:27 +00:00
|
|
|
end
|
2022-09-25 11:34:29 +00:00
|
|
|
private
|
|
|
|
def http_request(uri, open_timeout=10)
|
|
|
|
Net::HTTP.start(uri.host, uri.port,
|
|
|
|
:use_ssl => uri.scheme == 'https',
|
|
|
|
open_timeout: open_timeout,read_timeout: 60,
|
|
|
|
verify_mode: OpenSSL::SSL::VERIFY_NONE) do |http|
|
|
|
|
req = Net::HTTP::Get.new(uri)
|
|
|
|
req['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36'
|
|
|
|
http.request(req)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
def get_rss_link(url, body)
|
|
|
|
html = Nokogiri::HTML(body)
|
|
|
|
html.search('.data_midlle_rss a').map{|v|
|
|
|
|
href = URI.join(url, v.attr('href')).to_s
|
|
|
|
uid = href.split("?n=")[-1]
|
|
|
|
title = v.text()
|
|
|
|
title_translations = I18n.available_locales.collect{|v| [v, title]}.to_h
|
|
|
|
{
|
|
|
|
url: href,
|
|
|
|
xml_url: href,
|
|
|
|
uid: uid,
|
|
|
|
title_translations: title_translations,
|
|
|
|
tags: title_translations,
|
|
|
|
is_rss: true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
end
|
2015-07-07 11:51:56 +00:00
|
|
|
end
|
|
|
|
|