Newer
Older
dmpopidor / app / controllers / notes_controller.rb
# frozen_string_literal: true

class NotesController < ApplicationController

  prepend Dmpopidor::Controllers::Notes
  include ConditionalUserMailer
  require "pp"
  after_action :verify_authorized
  respond_to :html

  # SEE MODULE
  def create
    @note = Note.new
    @note.user_id = note_params[:user_id]
    # ensure user has access to plan BEFORE creating/finding answer
    unless Plan.find_by(id: note_params[:plan_id]).readable_by?(@note.user_id)
      raise Pundit::NotAuthorizedError
    end
    Answer.transaction do
      @answer = Answer.find_by(
        plan_id: note_params[:plan_id],
        question_id: note_params[:question_id]
      )
      if @answer.blank?
        @answer             = Answer.new
        @answer.plan_id     = note_params[:plan_id]
        @answer.question_id = note_params[:question_id]
        @answer.user_id     = @note.user_id
        @answer.save!
      end
    end

    @note.answer = @answer
    @note.text = note_params[:text]

    authorize @note

    @plan = @answer.plan

    @question = Question.find(note_params[:question_id])

    if @note.save
      @status = true
      answer = @note.answer
      plan = answer.plan
      owner = plan.owner
      deliver_if(recipients: owner, key: "users.new_comment") do |r|
        UserMailer.new_comment(current_user, plan, answer).deliver_now()
      end
      @notice = success_message(@note, _("created"))
      render(json: {
        "notes" => {
          "id" => note_params[:question_id],
          "html" => render_to_string(partial: "layout", locals: {
            plan: @plan,
            question: @question,
            answer: @answer
          }, formats: [:html])
        },
        "title" => {
          "id" => note_params[:question_id],
          "html" => render_to_string(partial: "title", locals: {
            answer: @answer
          }, formats: [:html])
        }
      }.to_json, status: :created)
    else
      @status = false
      @notice = failure_message(@note, _("create"))
      render json: {
        "msg" => @notice
      }.to_json, status: :bad_request
    end
  end

  # SEE MODULE
  def update
    @note = Note.find(params[:id])
    authorize @note
    @note.text = note_params[:text]

    @answer = @note.answer
    @question = @answer.question
    @plan = @answer.plan

    question_id = @note.answer.question_id.to_s

    if @note.update(note_params)
      @notice = success_message(@note, _("saved"))
      render(json: {
        "notes" => {
          "id" => question_id,
          "html" => render_to_string(partial: "layout", locals: {
            plan: @plan,
            question: @question,
            answer: @answer
          }, formats: [:html])
        },
        "title" => {
          "id" => question_id,
          "html" => render_to_string(partial: "title", locals: {
            answer: @answer
          }, formats: [:html])
        }
      }.to_json, status: :ok)
    else
      @notice = failure_message(@note, _("save"))
      render json: {
        "msg" => @notice
      }.to_json, status: :bad_request
    end
  end

  # SEE MODULE
  def archive
    @note = Note.find(params[:id])
    authorize @note
    @note.archived = true
    @note.archived_by = params[:note][:archived_by]

    @answer = @note.answer
    @question = @answer.question
    @plan = @answer.plan

    question_id = @note.answer.question_id.to_s

    if @note.update(note_params)
      @notice = success_message(@note, _("removed"))
      render(json: {
        "notes" => {
          "id" => question_id,
          "html" => render_to_string(partial: "layout", locals: {
            plan: @plan,
            question: @question,
            answer: @answer
          }, formats: [:html])
        },
        "title" => {
          "id" => question_id,
          "html" => render_to_string(partial: "title", locals: {
            answer: @answer
          }, formats: [:html])
        }
      }.to_json, status: :ok)
    else
      @notice = failure_message(@note, _("remove"))
      render json: {
        "msg" => @notice
      }.to_json, status: :bad_request
    end
  end

  private

  def note_params
    params.require(:note)
          .permit(:text, :archived_by, :user_id, :answer_id, :plan_id,
                  :question_id, :research_output_id)
  end

end