2019-09-16 18:02:52 +02:00
|
|
|
class CommentsController < ApplicationController
|
2022-06-22 10:17:42 +02:00
|
|
|
before_action :authenticate_user!, only: [:create, :update, :destroy]
|
2024-05-03 18:11:07 +02:00
|
|
|
before_action :check_tenant_subscription, only: [:create, :update, :destroy]
|
2021-01-29 00:49:27 +01:00
|
|
|
|
2019-09-16 18:02:52 +02:00
|
|
|
def index
|
|
|
|
|
comments = Comment
|
2019-09-30 23:28:52 +02:00
|
|
|
.select(
|
|
|
|
|
:id,
|
|
|
|
|
:body,
|
|
|
|
|
:parent_id,
|
2019-10-01 19:15:03 +02:00
|
|
|
:is_post_update,
|
2022-06-22 10:17:42 +02:00
|
|
|
:created_at,
|
2019-09-30 23:28:52 +02:00
|
|
|
:updated_at,
|
2025-01-03 18:09:03 +01:00
|
|
|
'users.id as user_id', # required for avatar_url
|
2019-09-30 23:28:52 +02:00
|
|
|
'users.full_name as user_full_name',
|
|
|
|
|
'users.email as user_email',
|
2024-02-14 19:40:39 +01:00
|
|
|
'users.role as user_role',
|
2019-09-30 23:28:52 +02:00
|
|
|
)
|
2019-09-16 18:02:52 +02:00
|
|
|
.where(post_id: params[:post_id])
|
|
|
|
|
.left_outer_joins(:user)
|
2022-06-22 10:17:42 +02:00
|
|
|
.order(created_at: :desc)
|
2025-01-03 18:09:03 +01:00
|
|
|
.includes(user: { avatar_attachment: :blob }) # Preload avatars
|
|
|
|
|
|
|
|
|
|
comments = comments.map do |comment|
|
2025-01-23 12:47:35 +01:00
|
|
|
user_avatar_url = comment.user.avatar.attached? ? comment.user.avatar.blob.url : nil
|
2025-02-05 15:36:47 +01:00
|
|
|
attachment_urls = comment.attachments.order(:created_at).map { |attachment| attachment.blob.url }
|
|
|
|
|
|
|
|
|
|
comment.attributes.merge(
|
|
|
|
|
attachment_urls: attachment_urls,
|
|
|
|
|
user_avatar: user_avatar_url
|
|
|
|
|
)
|
2025-01-03 18:09:03 +01:00
|
|
|
end
|
2019-09-16 18:02:52 +02:00
|
|
|
|
|
|
|
|
render json: comments
|
|
|
|
|
end
|
2019-09-17 11:33:18 +02:00
|
|
|
|
|
|
|
|
def create
|
2022-06-22 10:17:42 +02:00
|
|
|
@comment = Comment.new
|
|
|
|
|
@comment.assign_attributes(comment_create_params)
|
2019-09-17 11:33:18 +02:00
|
|
|
|
2025-02-05 15:36:47 +01:00
|
|
|
# handle attachments
|
|
|
|
|
if Current.tenant.tenant_setting.allow_attachment_upload && params[:comment][:attachments].present?
|
|
|
|
|
@comment.attachments.attach(params[:comment][:attachments])
|
|
|
|
|
end
|
|
|
|
|
|
2022-06-22 10:17:42 +02:00
|
|
|
if @comment.save
|
|
|
|
|
SendNotificationForCommentWorkflow.new(comment: @comment).run
|
2021-01-29 00:49:27 +01:00
|
|
|
|
2022-06-22 10:17:42 +02:00
|
|
|
render json: @comment.attributes.merge(
|
2025-01-09 10:55:44 +01:00
|
|
|
{
|
2025-02-05 15:36:47 +01:00
|
|
|
attachment_urls: @comment.attachments.order(:created_at).map { |attachment| attachment.blob.url },
|
2025-01-09 10:55:44 +01:00
|
|
|
user_full_name: current_user.full_name,
|
|
|
|
|
user_email: current_user.email,
|
2025-01-23 12:47:35 +01:00
|
|
|
user_avatar: current_user.avatar.attached? ? current_user.avatar.blob.url : nil,
|
2025-01-09 10:55:44 +01:00
|
|
|
user_role: current_user.role_before_type_cast
|
|
|
|
|
}
|
2019-09-30 23:28:52 +02:00
|
|
|
), status: :created
|
2019-09-17 11:33:18 +02:00
|
|
|
else
|
2019-09-18 13:40:00 +02:00
|
|
|
render json: {
|
2022-06-22 10:17:42 +02:00
|
|
|
error: @comment.errors.full_messages
|
2019-09-18 13:40:00 +02:00
|
|
|
}, status: :unprocessable_entity
|
2019-09-17 11:33:18 +02:00
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2019-10-02 16:43:13 +02:00
|
|
|
def update
|
2022-06-22 10:17:42 +02:00
|
|
|
@comment = Comment.find(params[:id])
|
|
|
|
|
authorize @comment
|
2019-10-02 16:43:13 +02:00
|
|
|
|
2025-02-05 22:53:22 +01:00
|
|
|
@comment.assign_attributes(comment_update_params)
|
|
|
|
|
|
|
|
|
|
# handle attachment deletion
|
|
|
|
|
if params[:comment][:attachments_to_delete].present? && @comment.attachments.attached?
|
|
|
|
|
@comment.attachments.order(:created_at).each_with_index do |attachment, index|
|
|
|
|
|
attachment.purge if params[:comment][:attachments_to_delete].include?(index.to_s)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
# handle attachments
|
|
|
|
|
if Current.tenant.tenant_setting.allow_attachment_upload && params[:comment][:attachments].present?
|
|
|
|
|
@comment.attachments.attach(params[:comment][:attachments])
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
if @comment.save
|
2022-06-22 10:17:42 +02:00
|
|
|
render json: @comment.attributes.merge(
|
2025-01-09 10:55:44 +01:00
|
|
|
{
|
2025-02-05 22:53:22 +01:00
|
|
|
attachment_urls: @comment.attachments.order(:created_at).map { |attachment| attachment.blob.url },
|
2025-01-09 10:55:44 +01:00
|
|
|
user_full_name: @comment.user.full_name,
|
|
|
|
|
user_email: @comment.user.email,
|
2025-01-23 12:47:35 +01:00
|
|
|
user_avatar: @comment.user.avatar.attached? ? @comment.user.avatar.blob.url : nil,
|
2025-01-09 10:55:44 +01:00
|
|
|
user_role: @comment.user.role_before_type_cast
|
|
|
|
|
}
|
2019-10-02 16:43:13 +02:00
|
|
|
)
|
|
|
|
|
else
|
|
|
|
|
render json: {
|
2022-06-22 10:17:42 +02:00
|
|
|
error: @comment.errors.full_messages
|
|
|
|
|
}, status: :unprocessable_entity
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
def destroy
|
|
|
|
|
@comment = Comment.find(params[:id])
|
|
|
|
|
authorize @comment
|
|
|
|
|
|
|
|
|
|
if @comment.destroy
|
|
|
|
|
render json: {
|
|
|
|
|
id: @comment.id,
|
|
|
|
|
}, status: :accepted
|
|
|
|
|
else
|
|
|
|
|
render json: {
|
|
|
|
|
error: @comment.errors.full_messages
|
2019-10-02 16:43:13 +02:00
|
|
|
}, status: :unprocessable_entity
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
2019-09-17 11:33:18 +02:00
|
|
|
private
|
2022-05-28 11:03:36 +02:00
|
|
|
|
2022-06-22 10:17:42 +02:00
|
|
|
def comment_create_params
|
2022-06-10 12:03:33 +02:00
|
|
|
params
|
|
|
|
|
.require(:comment)
|
2022-06-22 10:17:42 +02:00
|
|
|
.permit(policy(@comment).permitted_attributes_for_create)
|
2022-06-10 12:03:33 +02:00
|
|
|
.merge(
|
|
|
|
|
user_id: current_user.id,
|
|
|
|
|
post_id: params[:post_id]
|
|
|
|
|
)
|
2019-09-17 11:33:18 +02:00
|
|
|
end
|
2022-06-22 10:17:42 +02:00
|
|
|
|
|
|
|
|
def comment_update_params
|
|
|
|
|
params
|
|
|
|
|
.require(:comment)
|
|
|
|
|
.permit(policy(@comment).permitted_attributes_for_update)
|
|
|
|
|
end
|
2019-09-16 18:02:52 +02:00
|
|
|
end
|