2019-05-03 06:17:27 +08:00
# frozen_string_literal: true
2013-02-06 03:16:51 +08:00
require 'image_sizer'
module Jobs
2019-10-02 12:01:53 +08:00
class ProcessPost < :: Jobs :: Base
2013-02-06 03:16:51 +08:00
2013-02-26 00:42:20 +08:00
def execute ( args )
2020-04-03 20:29:42 +08:00
DistributedMutex . synchronize ( " process_post_ #{ args [ :post_id ] } " , validity : 10 . minutes ) do
2020-03-07 20:36:54 +08:00
post = Post . find_by ( id : args [ :post_id ] )
# two levels of deletion
return unless post . present? && post . topic . present?
orig_cooked = post . cooked
recooked = nil
if args [ :cook ] . present?
cooking_options = args [ :cooking_options ] || { }
cooking_options [ :topic_id ] = post . topic_id
recooked = post . cook ( post . raw , cooking_options . symbolize_keys )
post . update_columns ( cooked : recooked , baked_at : Time . zone . now , baked_version : Post :: BAKED_VERSION )
end
2013-02-06 03:16:51 +08:00
2020-03-07 20:36:54 +08:00
cp = CookedPostProcessor . new ( post , args )
2020-04-21 09:48:19 +08:00
cp . post_process ( new_post : args [ :new_post ] )
2013-02-06 03:16:51 +08:00
2020-03-07 20:36:54 +08:00
# If we changed the document, save it
cooked = cp . html
2014-12-07 13:39:15 +08:00
2020-03-07 20:36:54 +08:00
if cooked != ( recooked || orig_cooked )
if orig_cooked . present? && cooked . blank?
# TODO stop/restart the worker if needed, let's gather a few here first
Rails . logger . warn ( " Cooked post processor in FATAL state, bypassing. You need to urgently restart sidekiq \n orig: #{ orig_cooked } \n recooked: #{ recooked } \n cooked: #{ cooked } \n post id: #{ post . id } " )
else
post . update_column ( :cooked , cp . html )
2021-03-11 01:07:13 +08:00
post . topic . update_excerpt ( post . excerpt_for_topic ) if post . is_first_post?
2020-03-07 20:36:54 +08:00
extract_links ( post )
2021-03-03 16:53:38 +08:00
auto_tag ( post ) if SiteSetting . tagging_enabled? && post . post_number == 1
2020-03-07 20:36:54 +08:00
post . publish_change_to_clients! :revised
end
2014-12-07 13:39:15 +08:00
end
2017-06-29 04:56:44 +08:00
2020-03-07 20:36:54 +08:00
if ! post . user & . staff? && ! post . user & . staged?
2020-06-23 02:48:06 +08:00
s = post . raw
2020-03-07 20:36:54 +08:00
s << " #{ post . topic . title } " if post . post_number == 1
if ! args [ :bypass_bump ] && WordWatcher . new ( s ) . should_flag?
2020-06-02 23:49:02 +08:00
PostActionCreator . create (
Discourse . system_user ,
post ,
:inappropriate ,
reason : :watched_word
)
2020-03-07 20:36:54 +08:00
end
2017-06-29 04:56:44 +08:00
end
end
2013-02-06 03:16:51 +08:00
end
2017-01-30 16:42:05 +08:00
# onebox may have added some links, so extract them now
def extract_links ( post )
TopicLink . extract_from ( post )
QuotedPost . extract_from ( post )
end
2021-03-03 16:53:38 +08:00
def auto_tag ( post )
word_watcher = WordWatcher . new ( post . raw )
old_tags = post . topic . tags . pluck ( :name ) . to_set
new_tags = old_tags . dup
WordWatcher . words_for_action ( :tag ) . each do | word , tags |
new_tags += tags . split ( " , " ) if word_watcher . matches? ( word )
end
if old_tags != new_tags
post . revise (
Discourse . system_user ,
tags : new_tags . to_a ,
edit_reason : I18n . t ( :watched_words_auto_tag )
)
end
end
2013-02-06 03:16:51 +08:00
end
end