docbrown/app/controllers/comments_controller.rb
Mac Siri 4bc9020956 Implement comment preview feature (#223)
* Create #preview endpoint for CommentController

* Create comment preview button WIP

* Implement preview feature for reply comment W

* Style preview button CSS WIP

* Style preview button CSS WIP

* Tweak markdown toggle logic and add styling

* Update comment feature spec

* Add error handling for comment preview & fix lint

* Extract handleCommentPreview into it's own file

* Adjust functionality for comment preview [WIP]

* Modify comment preview functionality and CSS

* Adjust code style based on linter
2018-04-24 14:30:52 -04:00

164 lines
5.5 KiB
Ruby

class CommentsController < ApplicationController
before_action :set_comment, only: %i[update destroy]
before_action :set_cache_control_headers, only: [:index]
before_action :raise_banned, only: %i[create update]
before_action :authenticate_user!, only: %i[preview create]
# GET /comments
# GET /comments.json
def index
@on_comments_page = true
@comment = Comment.new
@podcast = Podcast.find_by_slug(params[:username])
if params[:id_code].present?
@root_comment = Comment.find(params[:id_code].to_i(26))
end
if @podcast
@user = @podcast
(@commentable = @user.podcast_episodes.find_by_slug(params[:slug])) || not_found
else
@user = User.find_by_username(params[:username]) ||
Organization.find_by_slug(params[:username]) ||
not_found
@commentable = @root_comment&.commentable ||
@user.articles.find_by_slug(params[:slug]) ||
not_found
@article = @commentable
end
@commentable_type = @commentable.class.name
if params[:id_code].present?
@root_comment = Comment.find(params[:id_code].to_i(26))
end
set_surrogate_key_header "comments-for-#{@commentable.id}-#{@commentable_type}"
end
# GET /comments/1
# GET /comments/1.json
# def show
# @comment = Comment.find_by_id_code(params[:id_code])
# end
# GET /comments/1/edit
def edit
@comment = Comment.find(params[:id_code].to_i(26))
not_found unless current_user && current_user.id == @comment.user_id
@parent_comment = @comment.parent
@commentable = @comment.commentable
end
# POST /comments
# POST /comments.json
def create
raise if RateLimitChecker.new(current_user).limit_by_situation("comment_creation")
@comment = Comment.new(comment_params)
@comment.user_id = current_user.id
if @comment.save
if params[:checked_code_of_conduct].present? && !current_user.checked_code_of_conduct
current_user.update(checked_code_of_conduct: true)
end
Mention.create_all(@comment)
if @comment.invalid?
@comment.destroy
render json: { status: "comment already exists" }
return
end
render json: { status: "created",
css: @comment.custom_css,
depth: @comment.depth,
url: @comment.path,
readable_publish_date: @comment.readable_publish_date,
body_html: @comment.processed_html,
id: @comment.id,
id_code: @comment.id_code_generated,
newly_created: true,
user: {
id: current_user.id,
username: current_user.username,
name: current_user.name,
profile_pic: ProfileImage.new(current_user).get(50),
twitter_username: current_user.twitter_username,
github_username: current_user.github_username,
} }
elsif @comment = Comment.where(body_markdown: @comment.body_markdown,
commentable_id: @comment.commentable.id,
ancestry: @comment.ancestry)[1]
@comment.destroy
render json: { status: "comment already exists" }
return
else
render json: { status: "errors" }
return
end
end
# PATCH/PUT /comments/1
# PATCH/PUT /comments/1.json
def update
raise unless @comment.user_id == current_user.id
if @comment.update(comment_update_params.merge(edited_at: DateTime.now))
Mention.create_all(@comment)
redirect_to "#{@comment.commentable.path}/comments/#{@comment.id_code_generated}", notice: "Comment was successfully updated."
else
@commentable = @comment.commentable
render :edit
end
end
# DELETE /comments/1
# DELETE /comments/1.json
def destroy
raise unless @comment.user_id == current_user.id
@commentable_path = @comment.commentable.path
if @comment.is_childless?
@comment.destroy
else
@comment.deleted = true
@comment.save!
end
redirect_to @commentable_path, notice: "Comment was successfully deleted."
end
def delete_confirm
unless current_user && Comment.where(id: params[:id_code].to_i(26), user_id: current_user.id).first
@comment = Comment.find(params[:id_code].to_i(26))
redirect_to @comment.path
return
end
@comment = Comment.where(id: params[:id_code].to_i(26), user_id: current_user.id).first
end
def preview
begin
fixed_body_markdown = MarkdownFixer.fix_for_preview(comment_params[:body_markdown])
parsed_markdown = MarkdownParser.new(fixed_body_markdown)
processed_html = parsed_markdown.finalize
rescue StandardError => e
processed_html = "<p>😔 There was a error in your markdown</p><hr><p>#{e}</p>"
end
respond_to do |format|
format.json { render json: { processed_html: processed_html }, status: 200 }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_comment
@comment = Comment.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def comment_params
params.require(:comment).permit(:body_markdown,
:commentable_id,
:commentable_type,
:parent_id)
end
def comment_update_params
params.require(:comment).permit(:body_markdown)
end
end