Add notify remote.

This commit is contained in:
邱博亞 2024-09-16 19:15:10 +08:00
parent ab902a8c04
commit fd4555a8d0
5 changed files with 158 additions and 0 deletions

View File

@ -307,6 +307,9 @@ class Admin::EventNewsController < OrbitAdminController
event_news.save event_news.save
build_email(event_news,I18n.locale) build_email(event_news,I18n.locale)
Thread.new do
event_news.notify_feed("create")
end
redirect_to params['referer_url'] redirect_to params['referer_url']
end end
@ -393,6 +396,9 @@ class Admin::EventNewsController < OrbitAdminController
event_news.save event_news.save
end end
build_email(event_news,I18n.locale) build_email(event_news,I18n.locale)
Thread.new do
event_news.notify_feed("update")
end
now_event_news_page = EventNews.where(:title.ne => "",:is_preview.in=>[false,nil]) now_event_news_page = EventNews.where(:title.ne => "",:is_preview.in=>[false,nil])
.order_by(sort).map(&:id).map.with_index.select{|v,i| v==event_news.id}[0][1] rescue nil .order_by(sort).map(&:id).map.with_index.select{|v,i| v==event_news.id}[0][1] rescue nil
now_event_news_page = now_event_news_page.nil? ? 0 : ((now_event_news_page+1).to_f/10).ceil now_event_news_page = now_event_news_page.nil? ? 0 : ((now_event_news_page+1).to_f/10).ceil
@ -401,12 +407,18 @@ class Admin::EventNewsController < OrbitAdminController
def destroy def destroy
@event_news.destroy @event_news.destroy
Thread.new do
@event_news.notify_feed("destroy")
end
redirect_to "/admin/event_news" redirect_to "/admin/event_news"
end end
def delete def delete
if params[:ids] if params[:ids]
EventNews.any_in(:uid => params[:ids]).destroy_all EventNews.any_in(:uid => params[:ids]).destroy_all
Thread.new do
EventNews.notify_feed_delete(params[:ids])
end
end end
redirect_to "/admin/event_news" redirect_to "/admin/event_news"
end end

View File

@ -1,6 +1,27 @@
require "rss" require "rss"
class EventNewsFeedsController < ApplicationController class EventNewsFeedsController < ApplicationController
include Admin::EventNewsHelper include Admin::EventNewsHelper
def feed_add_remote
if params[:url].present?
uid = params[:uid].to_s
event_news_feed = EventNewsFeed.where(uid: uid).first
if !(event_news_feed.remote_urls.include?(params[:url]))
event_news_feed.remote_urls << params[:url]
event_news_feed.save
end
end
render :json => {success: true}
end
def feed_remove_remote
if params[:url].present?
uid = params[:uid].to_s
event_news_feed = EventNewsFeed.where(uid: uid).first
if event_news_feed.remote_urls.delete(params[:url])
event_news_feed.save
end
end
render :json => {success: true}
end
def feed def feed
uid = params[:uid].to_s uid = params[:uid].to_s
startdt = params[:start].blank? ? nil : params[:start] startdt = params[:start].blank? ? nil : params[:start]

View File

@ -495,4 +495,126 @@ class EventNews
end end
return a return a
end end
def get_related_feeds
@category_id ||= self.category_id
@tag_ids ||= self.tag_ids
related_feeds = EventNewsFeed.any_of({:category_ids=>@category_id.to_s}, {:tag_ids.in=>@tag_ids.map(&:to_s)}).to_a
end
def notify_feed(type="create")
if @is_hidden_changed
if self.is_hidden
if type == 'create'
return []
else
type = 'destroy'
end
else
type = 'create'
end
elsif self.is_hidden
return []
end
related_feeds = self.get_related_feeds.select{|feed| feed.remote_urls.count != 0}
if related_feeds.count != 0
bulletin_data = self.get_data
if type == "destroy"
tmp_data = {'type'=>'destroy', 'data'=>[self.uid]}
else
tmp_data = {'type'=>type, 'data'=>[bulletin_data.to_json]}
end
request = Net::HTTP::Post.new('/xhr/feeds/notify_change', 'Content-Type' => 'application/json')
related_feeds.each do |feed|
tmp_data['uid'] = feed.uid
request.body = tmp_data.to_json
feed.remote_urls.each do |remote_url|
uri = URI(remote_url)
http_req = Net::HTTP.new(uri.host, uri.port)
if remote_url.include?('https')
http_req.use_ssl = true
end
response = self.class.http_request( http_req , request )
end
end
end
end
def self.notify_all_feed(force_update=false)
related_feeds = EventNewsFeed.where(:remote_urls.nin=>[nil, []]).to_a
related_feeds.each do |feed|
uid = feed.uid
startdt = nil
enddt = nil
dt = nil
feed_cache = EventNewsFeedCache.where(uid: uid, start: startdt, end: enddt, date: dt)
if force_update
feed_cache = nil
else
feed_cache_old = feed_cache.all_of([{:invalid_date.ne=>nil},{:invalid_date.lte => Time.now}]).last
feed_cache.all_of([{:invalid_date.ne=>nil},{:invalid_date.lte => Time.now}]).destroy
count = feed_cache.count
if count > 1
feed_cache.limit(count-1).destroy
end
feed_cache = feed_cache.first
anns = ''
end
if feed_cache.nil?
anns = feed.generate_one_cache_timeout(startdt: startdt,enddt: enddt,dt: dt,timeout: 20)
anns = (feed_cache_old.content rescue "") if anns.nil?
else
anns = feed_cache.content
end
request = Net::HTTP::Post.new('/xhr/feeds/notify_change', 'Content-Type' => 'application/json')
tmp_data = {'type'=>'update_all', 'uid'=> uid, 'data'=>anns}
request.body = tmp_data.to_json
feed.remote_urls.each do |remote_url|
uri = URI(remote_url)
http_req = Net::HTTP.new(uri.host, uri.port)
if remote_url.include?('https')
http_req.use_ssl = true
end
response = self.http_request( http_req , request )
end
end
end
def self.notify_feed_delete(ids)
all_feeds = EventNewsFeed.all.select{|feed| feed.remote_urls.count != 0}
if all_feeds.count != 0
tmp_data = {'type'=>'destroy'}
request = Net::HTTP::Post.new('/xhr/feeds/notify_change', 'Content-Type' => 'application/json')
all_feeds.each do |feed|
feed_uid = feed.uid
feed_cache = EventNewsFeedCache.where(:uid=>feed_uid).first
if feed_cache
tmp_data['uid'] = feed_uid
tmp_data['data'] = ids & JSON.parse(feed_cache.content)["announcements"].map{|a| a["id"]}
request.body = tmp_data.to_json
if tmp_data['data'].count != 0
feed.remote_urls.each do |remote_url|
uri = URI(remote_url)
http_req = Net::HTTP.new(uri.host, uri.port)
if remote_url.include?('https')
http_req.use_ssl = true
end
response = self.http_request( http_req , request )
end
end
end
end
end
end
def self.http_request(http, request)
response = http.request(request)
if response.code.to_i == 301 || response.code.to_i == 302
location = response["location"]
new_uri = URI(location)
http = Net::HTTP.new(new_uri.host, new_uri.port)
if location.include?('https')
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
end
request.instance_variable_set(:@path, new_uri.path)
response = self.http_request(http, request)
end
response
end
end end

View File

@ -6,6 +6,7 @@ class EventNewsFeed
field :title, as: :slug_title, type: String, localize: true field :title, as: :slug_title, type: String, localize: true
field :tag_ids, type: Array, default: [] field :tag_ids, type: Array, default: []
field :category_ids, type: Array, default: [] field :category_ids, type: Array, default: []
field :remote_urls, type: Array, default: []
before_save do before_save do
EventNewsFeedCache.where(uid: self.uid).each do |cache| EventNewsFeedCache.where(uid: self.uid).each do |cache|
cache.regenerate cache.regenerate

View File

@ -43,6 +43,8 @@ Rails.application.routes.draw do
get ':slug_title-:uid', to: 'event_news_mods#show', as: :display get ':slug_title-:uid', to: 'event_news_mods#show', as: :display
end end
end end
post "/xhr/event_news_mods/feed_add_remote/:uid" => "event_news_feeds#feed_add_remote"
post "/xhr/event_news_mods/feed_remove_remote/:uid" => "event_news_feeds#feed_remove_remote"
get '/xhr/event_news/agenda' => 'event_news_mods#agenda' get '/xhr/event_news/agenda' => 'event_news_mods#agenda'
get "/xhr/event_news/feed/:uid" => "event_news_feeds#feed" get "/xhr/event_news/feed/:uid" => "event_news_feeds#feed"
get "/xhr/event_news/rssfeed/:uid" => "event_news_feeds#rssfeed" get "/xhr/event_news/rssfeed/:uid" => "event_news_feeds#rssfeed"