Class: Decidim::UserConversationsController

Inherits:
ApplicationController show all
Includes:
FormFactory, Messaging::ConversationHelper, Paginable, UserGroups
Defined in:
app/controllers/decidim/user_conversations_controller.rb

Overview

The controller to show all the conversations for a user or group This controller places conversations in the public profile page. Only for groups at the moment but it will make conversations_controller obsolete in the future

Constant Summary

Constants included from Paginable

Paginable::OPTIONS

Instance Method Summary collapse

Methods included from Messaging::ConversationHelper

#conversation_between, #conversation_between_multiple, #current_or_new_conversation_path_with, #current_or_new_conversation_path_with_multiple, #link_to_current_or_new_conversation_with, #username_list

Methods included from UserGroups

#enforce_user_groups_enabled

Methods included from NeedsSnippets

#snippets

Methods included from HttpCachingDisabler

#disable_http_caching

Methods included from RegistersPermissions

register_permissions

Methods included from NeedsOrganization

enhance_controller, extended, included

Instance Method Details

#createObject



71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'app/controllers/decidim/user_conversations_controller.rb', line 71

def create
  @form = form(Messaging::ConversationForm).from_params(params, sender: user)
  @conversation = new_conversation(@form.recipient)

  enforce_permission_to :create, :conversation, interlocutor: user, conversation: @conversation

  # do not allow to create multiple conversation to the same actors if already started
  if @conversation.id
    flash[:alert] = I18n.t("user_conversations.create.existing_error", scope: "decidim")
    return redirect_to profile_conversation_path(nickname: user.nickname, id: @conversation.id)
  end
  Messaging::StartConversation.call(@form) do
    on(:ok) do |_conversation|
      flash[:notice] = I18n.t("user_conversations.create.success", scope: "decidim")
      return redirect_to profile_conversations_path(nickname: user.nickname)
    end
    on(:invalid) do
      flash[:alert] = I18n.t("user_conversations.create.error", scope: "decidim")
      render action: :show
    end
  end
end

#indexObject



23
24
25
# File 'app/controllers/decidim/user_conversations_controller.rb', line 23

def index
  enforce_permission_to :list, :conversation, interlocutor: user
end

#newObject

Shows the form to initiate a conversation with one or more users/groups (the recipients) recipients are passed via GET parameters:

- if no recipient are valid, redirects back to the users profile page
- if the user already has a conversation with the user(s), redirects to the initiated conversation


56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'app/controllers/decidim/user_conversations_controller.rb', line 56

def new
  @form = form(Messaging::ConversationForm).from_params(params, sender: user)

  return redirect_back(fallback_location: profile_path(user.nickname)) if @form.recipient.empty?

  @conversation = new_conversation(@form.recipient)

  # redirect to existing conversation if already started
  return redirect_to profile_conversation_path(nickname: user.nickname, id: @conversation.id) if @conversation.id

  enforce_permission_to :create, :conversation, interlocutor: user, conversation: @conversation

  render :show
end

#showObject

shows a conversation thread and presents a form to reply in ajax



28
29
30
31
32
# File 'app/controllers/decidim/user_conversations_controller.rb', line 28

def show
  enforce_permission_to :show, :conversation, interlocutor: user, conversation: conversation

  conversation.mark_as_read(current_user)
end

#updateObject

receive replies in ajax, messages are returned through the view update.js.erb and printed over the form instead of using flash messages



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'app/controllers/decidim/user_conversations_controller.rb', line 36

def update
  enforce_permission_to :update, :conversation, interlocutor: user, conversation: conversation

  @form = form(Messaging::MessageForm).from_params(params, sender: user)

  Messaging::ReplyToConversation.call(conversation, @form) do
    on(:ok) do |message|
      render action: :update, locals: { message: message }
    end

    on(:invalid) do
      render_unprocessable_entity I18n.t("user_conversations.update.error", scope: "decidim")
    end
  end
end