@@ -77,6 +77,7 @@ class Engine < ::Rails::Engine
77
77
AUTO_CLOSE_TOPIC_TIMER_CUSTOM_FIELD = "solved_auto_close_topic_timer_id"
78
78
ACCEPTED_ANSWER_POST_ID_CUSTOM_FIELD = "accepted_answer_post_id"
79
79
ENABLE_ACCEPTED_ANSWERS_CUSTOM_FIELD = "enable_accepted_answers"
80
+ IS_ACCEPTED_ANSWER_CUSTOM_FIELD = "is_accepted_answer"
80
81
81
82
def self . accept_answer! ( post , acting_user , topic : nil )
82
83
topic ||= post . topic
@@ -86,7 +87,7 @@ def self.accept_answer!(post, acting_user, topic: nil)
86
87
87
88
if accepted_id > 0
88
89
if p2 = Post . find_by ( id : accepted_id )
89
- p2 . custom_fields . delete ( "is_accepted_answer" )
90
+ p2 . custom_fields . delete ( IS_ACCEPTED_ANSWER_CUSTOM_FIELD )
90
91
p2 . save!
91
92
92
93
if defined? ( UserAction ::SOLVED )
@@ -95,7 +96,7 @@ def self.accept_answer!(post, acting_user, topic: nil)
95
96
end
96
97
end
97
98
98
- post . custom_fields [ "is_accepted_answer" ] = "true"
99
+ post . custom_fields [ IS_ACCEPTED_ANSWER_CUSTOM_FIELD ] = "true"
99
100
topic . custom_fields [ ACCEPTED_ANSWER_POST_ID_CUSTOM_FIELD ] = post . id
100
101
101
102
if defined? ( UserAction ::SOLVED )
@@ -173,7 +174,7 @@ def self.unaccept_answer!(post, topic: nil)
173
174
topic ||= post . topic
174
175
175
176
DistributedMutex . synchronize ( "discourse_solved_toggle_answer_#{ topic . id } " ) do
176
- post . custom_fields . delete ( "is_accepted_answer" )
177
+ post . custom_fields . delete ( IS_ACCEPTED_ANSWER_CUSTOM_FIELD )
177
178
topic . custom_fields . delete ( ACCEPTED_ANSWER_POST_ID_CUSTOM_FIELD )
178
179
179
180
if timer_id = topic . custom_fields [ AUTO_CLOSE_TOPIC_TIMER_CUSTOM_FIELD ]
@@ -240,6 +241,7 @@ def unaccept
240
241
guardian . ensure_can_accept_answer! ( topic , post )
241
242
242
243
DiscourseSolved . unaccept_answer! ( post , topic : topic )
244
+
243
245
render json : success_json
244
246
end
245
247
@@ -257,12 +259,18 @@ def limit_accepts
257
259
258
260
Discourse ::Application . routes . append { mount ::DiscourseSolved ::Engine , at : "solution" }
259
261
262
+ on ( :post_destroyed ) do |post |
263
+ if post . custom_fields [ ::DiscourseSolved ::IS_ACCEPTED_ANSWER_CUSTOM_FIELD ] == "true"
264
+ ::DiscourseSolved . unaccept_answer! ( post )
265
+ end
266
+ end
267
+
260
268
add_api_key_scope (
261
269
:solved ,
262
270
{ answer : { actions : %w[ discourse_solved/answer#accept discourse_solved/answer#unaccept ] } } ,
263
271
)
264
272
265
- topic_view_post_custom_fields_allowlister { [ "is_accepted_answer" ] }
273
+ topic_view_post_custom_fields_allowlister { [ :: DiscourseSolved :: IS_ACCEPTED_ANSWER_CUSTOM_FIELD ] }
266
274
267
275
def get_schema_text ( post )
268
276
post . excerpt ( nil , keep_onebox_body : true ) . presence ||
@@ -450,29 +458,27 @@ def accepted_answer
450
458
end
451
459
452
460
def accepted_answer_post_info
453
- # TODO: we may already have it in the stream ... so bypass query here
454
- postInfo =
455
- Post
456
- . where ( id : accepted_answer_post_id , topic_id : object . topic . id )
457
- . joins ( :user )
458
- . pluck ( "post_number" , "username" , "cooked" , "name" )
459
- . first
460
-
461
- if postInfo
462
- postInfo [ 2 ] = if SiteSetting . solved_quote_length > 0
463
- PrettyText . excerpt ( postInfo [ 2 ] , SiteSetting . solved_quote_length , keep_emoji_images : true )
461
+ post_info =
462
+ if post = object . posts . find { |p | p . post_number == accepted_answer_post_id }
463
+ [ post . post_number , post . user . username , post . cooked , post . user . name ]
464
+ else
465
+ Post
466
+ . where ( id : accepted_answer_post_id , topic_id : object . topic . id )
467
+ . joins ( :user )
468
+ . pluck ( "post_number" , "username" , "cooked" , "name" )
469
+ . first
470
+ end
471
+
472
+ if post_info
473
+ post_info [ 2 ] = if SiteSetting . solved_quote_length > 0
474
+ PrettyText . excerpt ( post_info [ 2 ] , SiteSetting . solved_quote_length , keep_emoji_images : true )
464
475
else
465
476
nil
466
477
end
467
478
468
- postInfo [ 3 ] = (
469
- if SiteSetting . enable_names && SiteSetting . display_name_on_posts
470
- postInfo [ 3 ]
471
- else
472
- nil
473
- end
474
- )
475
- postInfo
479
+ post_info [ 3 ] = nil if !SiteSetting . enable_names || !SiteSetting . display_name_on_posts
480
+
481
+ post_info
476
482
end
477
483
end
478
484
@@ -543,32 +549,28 @@ def can_accept_answer?(topic, post)
543
549
end
544
550
545
551
require_dependency "post_serializer"
552
+
546
553
class ::PostSerializer
547
554
attributes :can_accept_answer , :can_unaccept_answer , :accepted_answer , :topic_accepted_answer
548
555
549
556
def can_accept_answer
550
- if topic = ( topic_view && topic_view . topic ) || object . topic
551
- return scope . can_accept_answer? ( topic , object ) && object . post_number > 1 && !accepted_answer
552
- end
553
-
554
- false
557
+ scope . can_accept_answer? ( topic , object ) && object . post_number > 1 && !accepted_answer
555
558
end
556
559
557
560
def can_unaccept_answer
558
- if topic = ( topic_view && topic_view . topic ) || object . topic
559
- scope . can_accept_answer? ( topic , object ) &&
560
- ( post_custom_fields [ "is_accepted_answer" ] == "true" )
561
- end
561
+ scope . can_accept_answer? ( topic , object ) && accepted_answer
562
562
end
563
563
564
564
def accepted_answer
565
- post_custom_fields [ "is_accepted_answer" ] == "true"
565
+ post_custom_fields [ :: DiscourseSolved :: IS_ACCEPTED_ANSWER_CUSTOM_FIELD ] == "true"
566
566
end
567
567
568
568
def topic_accepted_answer
569
- if topic = ( topic_view && topic_view . topic ) || object . topic
570
- topic . custom_fields [ ::DiscourseSolved ::ACCEPTED_ANSWER_POST_ID_CUSTOM_FIELD ] . present?
571
- end
569
+ topic &.custom_fields [ ::DiscourseSolved ::ACCEPTED_ANSWER_POST_ID_CUSTOM_FIELD ] . present?
570
+ end
571
+
572
+ def topic
573
+ topic_view &.topic || object . topic
572
574
end
573
575
end
574
576
@@ -682,7 +684,7 @@ class ::ListableTopicSerializer
682
684
end
683
685
684
686
if CategoryList . respond_to? ( :preloaded_topic_custom_fields )
685
- CategoryList . preloaded_topic_custom_fields << "accepted_answer_post_id"
687
+ CategoryList . preloaded_topic_custom_fields << :: DiscourseSolved :: ACCEPTED_ANSWER_POST_ID_CUSTOM_FIELD
686
688
end
687
689
688
690
on ( :filter_auto_bump_topics ) { |_category , filters | filters . push ( -> ( r ) { r . where ( <<~SQL ) } ) }
0 commit comments