mirror of
https://gh.wpcy.net/https://github.com/discourse/discourse.git
synced 2026-05-07 00:37:22 +08:00
Enhanced the `solved` plugin with comprehensive improvements to solution handling and UI components: - Use the `PostQuotedContent` core component for rendering accepted answers - Added `@tracked` state management for solution acceptance UI - Refactored `acceptPost` and `unacceptPost` functions with better error handling - Updated topic models to safely track accepted solutions - Added MessageBus integration for secure message publishing - Improved test coverage adding MessageBus verification and system tests for accepting/unaccepting answers.
48 lines
1.2 KiB
Ruby
48 lines
1.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class DiscourseSolved::AnswerController < ::ApplicationController
|
|
requires_plugin DiscourseSolved::PLUGIN_NAME
|
|
|
|
def accept
|
|
limit_accepts
|
|
|
|
post = Post.find(params[:id].to_i)
|
|
|
|
topic = post.topic
|
|
topic ||= Topic.with_deleted.find(post.topic_id) if guardian.is_staff?
|
|
|
|
guardian.ensure_can_accept_answer!(topic, post)
|
|
|
|
accepted_answer = DiscourseSolved.accept_answer!(post, current_user, topic: topic)
|
|
|
|
render_json_dump(accepted_answer)
|
|
end
|
|
|
|
def unaccept
|
|
limit_accepts
|
|
|
|
post = Post.find(params[:id].to_i)
|
|
|
|
topic = post.topic
|
|
topic ||= Topic.with_deleted.find(post.topic_id) if guardian.is_staff?
|
|
|
|
guardian.ensure_can_accept_answer!(topic, post)
|
|
|
|
DiscourseSolved.unaccept_answer!(post, topic: topic)
|
|
|
|
render json: success_json
|
|
end
|
|
|
|
def limit_accepts
|
|
return if current_user.staff?
|
|
run_rate_limiter =
|
|
DiscoursePluginRegistry.apply_modifier(
|
|
:solved_answers_controller_run_rate_limiter,
|
|
true,
|
|
current_user,
|
|
)
|
|
return if !run_rate_limiter
|
|
RateLimiter.new(nil, "accept-hr-#{current_user.id}", 20, 1.hour).performed!
|
|
RateLimiter.new(nil, "accept-min-#{current_user.id}", 4, 30.seconds).performed!
|
|
end
|
|
end
|