Browse Source

Add Conversation#show and Message#create actions

Frans Bergman 7 years ago
parent
commit
c4969c6d56

+ 3 - 0
app/assets/javascripts/conversations.coffee

@@ -0,0 +1,3 @@
+# Place all the behaviors and hooks related to the matching controller here.
+# All this logic will automatically be available in application.js.
+# You can use CoffeeScript in this file: http://coffeescript.org/

+ 3 - 0
app/assets/javascripts/messages.coffee

@@ -0,0 +1,3 @@
+# Place all the behaviors and hooks related to the matching controller here.
+# All this logic will automatically be available in application.js.
+# You can use CoffeeScript in this file: http://coffeescript.org/

+ 7 - 0
app/assets/stylesheets/conversations.scss

@@ -0,0 +1,7 @@
+// Place all the styles related to the Conversations controller here.
+// They will automatically be included in application.css.
+// You can use Sass (SCSS) here: http://sass-lang.com/
+
+.message-feed:first-child {
+  margin-top: 25px;
+}

+ 3 - 0
app/assets/stylesheets/messages.scss

@@ -0,0 +1,3 @@
+// Place all the styles related to the Messages controller here.
+// They will automatically be included in application.css.
+// You can use Sass (SCSS) here: http://sass-lang.com/

+ 24 - 0
app/controllers/conversations_controller.rb

@@ -0,0 +1,24 @@
+class ConversationsController < ApplicationController
+
+  before_action :set_conversation, only: [:show]
+  before_action :check_permission, only: [:show]
+
+  def show
+  end
+
+  private
+    def set_conversation
+      @conversation = Conversation.find(params[:id])
+    end
+
+    def check_permission
+      unless current_user.conversations.include? @conversation
+        flash[:danger] = "You are not part of this conversation"
+        redirect_to root_path
+      end
+    end
+
+    def conversation_params
+      params.require(:conversation).permit(:name, messages_attributes: [:content])
+    end
+end

+ 24 - 0
app/controllers/messages_controller.rb

@@ -0,0 +1,24 @@
+class MessagesController < ApplicationController
+
+  def create
+    @conversation = Conversation.find(params[:conversation_id])
+    if current_user.conversations.include? @conversation
+      @message = current_user.messages.build(message_params)
+      @message.conversation = @conversation
+      if @message.save
+        flash[:success] = "Message posted successfully"
+        redirect_to @conversation
+      else
+        render @conversation
+      end
+    else
+      flash[:danger] = "You are not part of this conversation"
+      redirect_to root_path
+    end
+  end
+
+  private
+    def message_params
+      params.require(:message).permit(:content)
+    end
+end

+ 2 - 0
app/helpers/conversations_helper.rb

@@ -0,0 +1,2 @@
+module ConversationsHelper
+end

+ 2 - 0
app/helpers/messages_helper.rb

@@ -0,0 +1,2 @@
+module MessagesHelper
+end

+ 25 - 0
app/views/conversations/show.html.erb

@@ -0,0 +1,25 @@
+<% provide(:title, @conversation.name) %>
+<div class="row">
+  <div class="col-md-6 message-feed">
+    <%= render @conversation.messages %>
+    <%= bootstrap_form_for(current_user.messages.build) do |f| %>
+      <%= render 'shared/error_messages', object: f.object %>
+
+      <%= hidden_field_tag :conversation_id, @conversation.id %>
+      <%= f.text_area :content, label: "New message" %>
+
+      <%= f.submit "Send message", class: "btn btn-primary" %>
+    <% end %>
+  </div>
+  <div class="col-md-6">
+    <h1><%= @conversation.name %></h1>
+    <h3>Users</h3>
+    <ul>
+      <% for user in @conversation.users %>
+        <li>
+          <%= render user %>
+        </li>
+      <% end %>
+    </ul>
+  </div>
+</div>

+ 11 - 0
app/views/messages/_message.html.erb

@@ -0,0 +1,11 @@
+<div class="panel panel-default">
+  <div class="panel-heading">
+    <%= render message.user %>
+  </div>
+  <div class="panel-body">
+    <%= message.content %>
+  </div>
+  <div class="panel-footer">
+    Posted at: <%= message.created_at %>
+  </div>
+</div>

+ 2 - 0
config/routes.rb

@@ -9,4 +9,6 @@ Rails.application.routes.draw do
   delete '/logout',  to: 'sessions#destroy'
 
   resources :users
+  resources :conversations
+  resources :messages
 end

+ 14 - 0
test/controllers/conversations_controller_test.rb

@@ -0,0 +1,14 @@
+require 'test_helper'
+
+class ConversationsControllerTest < ActionDispatch::IntegrationTest
+  def setup
+    @user = users(:daniel)
+    @other_user = users(:ben)
+    log_in_as @user
+  end
+
+  test "should redirect conversation which user is not participating in" do
+    get conversation_path conversations(:two)
+    assert_redirected_to root_path
+  end
+end

+ 25 - 0
test/controllers/messages_controller_test.rb

@@ -0,0 +1,25 @@
+require 'test_helper'
+
+class MessagesControllerTest < ActionDispatch::IntegrationTest
+  def setup
+    @user = users(:daniel)
+    @conversation = conversations(:one)
+    @unallowed_conversation = conversations(:two)
+    log_in_as @user
+  end
+
+  test "should create valid message" do
+    get conversation_path(@conversation)
+    assert_response :success
+    assert_difference '@user.messages.count', 1 do
+      post messages_path, params: { message: { content: "Content" },
+                                    conversation_id: @conversation.id }
+    end
+  end
+
+  test "should redirect create message in unallowed conversation" do
+    post messages_path, params: { message: { content: "Message content" },
+                                  conversation_id: @unallowed_conversation.id }
+    assert_redirected_to root_path
+  end
+end