mirror of
https://github.com/discourse/discourse.git
synced 2024-11-24 05:50:14 +08:00
f517b6997c
The previous excerpt was a simple truncated raw message. Starting with this commit, the raw content of the draft is cooked and an excerpt is extracted from it. The logic for extracting the excerpt mimics the the `ExcerptParser` class, but does not implement all functionality, being a much simpler implementation. The two draft controllers have been merged into one and the /draft.json route has been changed to /drafts.json to be consistent with the other route names.
102 lines
2.8 KiB
Ruby
102 lines
2.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class DraftsController < ApplicationController
|
|
requires_login
|
|
|
|
skip_before_action :check_xhr, :preload_json
|
|
|
|
def index
|
|
params.permit(:offset)
|
|
params.permit(:limit)
|
|
|
|
stream = Draft.stream(
|
|
user: current_user,
|
|
offset: params[:offset],
|
|
limit: params[:limit]
|
|
)
|
|
|
|
render json: {
|
|
drafts: stream ? serialize_data(stream, DraftSerializer) : [],
|
|
no_results_help: I18n.t("user_activity.no_drafts.self")
|
|
}
|
|
end
|
|
|
|
def show
|
|
raise Discourse::NotFound.new if params[:id].blank?
|
|
|
|
seq = params[:sequence] || DraftSequence.current(current_user, params[:id])
|
|
render json: { draft: Draft.get(current_user, params[:id], seq), draft_sequence: seq }
|
|
end
|
|
|
|
def create
|
|
raise Discourse::NotFound.new if params[:draft_key].blank?
|
|
|
|
sequence =
|
|
begin
|
|
Draft.set(
|
|
current_user,
|
|
params[:draft_key],
|
|
params[:sequence].to_i,
|
|
params[:data],
|
|
params[:owner],
|
|
force_save: params[:force_save]
|
|
)
|
|
rescue Draft::OutOfSequence
|
|
|
|
begin
|
|
if !Draft.exists?(user_id: current_user.id, draft_key: params[:draft_key])
|
|
Draft.set(
|
|
current_user,
|
|
params[:draft_key],
|
|
DraftSequence.current(current_user, params[:draft_key]),
|
|
params[:data],
|
|
params[:owner]
|
|
)
|
|
else
|
|
raise Draft::OutOfSequence
|
|
end
|
|
|
|
rescue Draft::OutOfSequence
|
|
render_json_error I18n.t('draft.sequence_conflict_error.title'),
|
|
status: 409,
|
|
extras: {
|
|
description: I18n.t('draft.sequence_conflict_error.description')
|
|
}
|
|
return
|
|
end
|
|
end
|
|
|
|
json = success_json.merge(draft_sequence: sequence)
|
|
|
|
begin
|
|
data = JSON::parse(params[:data])
|
|
rescue JSON::ParserError
|
|
raise Discourse::InvalidParameters.new(:data)
|
|
end
|
|
|
|
if data.present?
|
|
# this is a bit of a kludge we need to remove (all the parsing) too many special cases here
|
|
# we need to catch action edit and action editSharedDraft
|
|
if data["postId"].present? && data["originalText"].present? && data["action"].to_s.start_with?("edit")
|
|
post = Post.find_by(id: data["postId"])
|
|
if post && post.raw != data["originalText"]
|
|
conflict_user = BasicUserSerializer.new(post.last_editor, root: false)
|
|
render json: json.merge(conflict_user: conflict_user)
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
render json: json
|
|
end
|
|
|
|
def destroy
|
|
begin
|
|
Draft.clear(current_user, params[:id], params[:sequence].to_i)
|
|
rescue Draft::OutOfSequence
|
|
# nothing really we can do here, if try clearing a draft that is not ours, just skip it.
|
|
end
|
|
render json: success_json
|
|
end
|
|
end
|