anthonymidili/Bullhorn

View on GitHub
app/controllers/messages_controller.rb

Summary

Maintainability
A
0 mins
Test Coverage
class MessagesController < ApplicationController
  before_action :authenticate_user!
  before_action :set_direct
  before_action :set_message, only: %i[ show edit update destroy ]
  before_action :deny_access!, only: [:edit, :update, :destroy],
  unless:  -> { correct_user?(@message.created_by) }

  def show
    # Calls messages/message_frame to include current_user.
    @direct.read_user_notifications(current_user)
    respond_to do |format|
      format.turbo_stream do
        render turbo_stream: [
          turbo_stream.replace("unread_messages_count", partial: "messages/count", 
          locals: { user: current_user })
        ]
      end
      format.html
    end
  end

  # GET /messages or /messages.json
  # GET /messages/new
  def new
    @message = @direct.messages.build
  end

  # GET /messages/1/edit
  def edit
  end

  # POST /messages or /messages.json
  def create
    @message = @direct.messages.build(message_params)
    @message.created_by = current_user

    respond_to do |format|
      if @message.save
        @message.broadcast_prepend_to(@direct, target: "messages", partial: "messages/message_frame", 
        locals: { message: @message })
        format.turbo_stream do
          render turbo_stream: [
            # turbo_stream.prepend("messages", partial: "messages/message", 
            # locals: { message: @message }),
            turbo_stream.replace("form_message", partial: "messages/form", 
            locals: { direct: @direct, message: @direct.messages.build })
          ]
        end
        format.html { redirect_to direct_url(@direct), notice: "Message was successfully created." }
        format.json { render :show, status: :created, location: @direct }
      else
        format.turbo_stream do
          render turbo_stream: [
            turbo_stream.replace("form_message", partial: "messages/form", 
            locals: { direct: @direct, message: @message })
          ]
        end
        format.html { render :new, status: :unprocessable_entity }
        format.json { render json: @message.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /messages/1 or /messages/1.json
  def update
    respond_to do |format|
      if @message.update(message_params)
        @message.broadcast_replace_to(@direct, target: @message, partial: "messages/message_frame", 
        locals: { message: @message })
        format.turbo_stream do
          render turbo_stream: [
            # turbo_stream.replace(@message, partial: "messages/message", 
            # locals: { message: @message })
          ]
        end
        format.html { redirect_to direct_url(@direct), notice: "Message was successfully updated." }
        format.json { render :show, status: :ok, location: @direct }
      else
        format.turbo_stream do
          render turbo_stream: [
            turbo_stream.replace(helpers.dom_id(@message, "form"), 
            partial: "messages/form",
            locals: { direct: @direct, message: @message })
          ]
        end
        format.html { render :edit, status: :unprocessable_entity }
        format.json { render json: @message.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /messages/1 or /messages/1.json
  def destroy
    @message.destroy

    respond_to do |format|
      @message.broadcast_remove_to(@direct, target: @message)
      format.turbo_stream { 
        # render turbo_stream: turbo_stream.remove(@message) 
      }
      format.html { redirect_to messages_url, notice: "Message was successfully destroyed." }
      format.json { head :no_content }
    end
  end

private
  # Use callbacks to share common setup or constraints between actions.
  def set_direct
    @direct = current_user.directs.find_by(id: params[:direct_id])
  end

  def set_message
    @message = @direct.messages.find_by(id: params[:id])
  end

  # Only allow a list of trusted parameters through.
  def message_params
    params.require(:message).permit(:body)
  end
end