diaspora/app/controllers/conversations_controller.rb
2016-11-26 02:22:07 +01:00

125 lines
4.6 KiB
Ruby

class ConversationsController < ApplicationController
before_action :authenticate_user!
respond_to :html, :mobile, :json, :js
def index
@visibilities = ConversationVisibility.includes(:conversation)
.order("conversations.updated_at DESC")
.where(person_id: current_user.person_id)
.paginate(page: params[:page], per_page: 15)
if params[:conversation_id]
@conversation = Conversation.joins(:conversation_visibilities)
.where(conversation_visibilities: {
person_id: current_user.person_id,
conversation_id: params[:conversation_id]
}).first
if @conversation
@first_unread_message_id = @conversation.first_unread_message(current_user).try(:id)
@conversation.set_read(current_user)
end
end
gon.contacts = contacts_data
respond_with do |format|
format.html { render "index", locals: {no_contacts: current_user.contacts.mutual.empty?} }
format.json { render json: @visibilities.map(&:conversation), status: 200 }
end
end
def create
# Contacts autocomplete does not work the same way on mobile and desktop
# Mobile returns contact ids array while desktop returns person id
# This will have to be removed when mobile autocomplete is ported to Typeahead
recipients_param, column = [%i(contact_ids id), %i(person_ids person_id)].find {|param, _| params[param].present? }
if recipients_param
person_ids = current_user.contacts.mutual.where(column => params[recipients_param].split(",")).pluck(:person_id)
end
unless person_ids.present?
render text: I18n.t("javascripts.conversation.create.no_recipient"), status: 422
return
end
opts = params.require(:conversation).permit(:subject)
opts[:participant_ids] = person_ids
opts[:message] = { text: params[:conversation][:text] }
@conversation = current_user.build_conversation(opts)
if @conversation.save
Diaspora::Federation::Dispatcher.defer_dispatch(current_user, @conversation)
flash[:notice] = I18n.t("conversations.create.sent")
render json: {id: @conversation.id}
else
render text: I18n.t("conversations.create.fail"), status: 422
end
end
def show
respond_to do |format|
format.html do
redirect_to conversations_path(conversation_id: params[:id])
return
end
if @conversation = current_user.conversations.where(id: params[:id]).first
@first_unread_message_id = @conversation.first_unread_message(current_user).try(:id)
@conversation.set_read(current_user)
format.json { render :json => @conversation, :status => 200 }
else
redirect_to conversations_path
end
end
end
def raw
@conversation = current_user.conversations.where(id: params[:conversation_id]).first
if @conversation
@first_unread_message_id = @conversation.first_unread_message(current_user).try(:id)
@conversation.set_read(current_user)
render partial: "conversations/show", locals: {conversation: @conversation}
else
render nothing: true, status: 404
end
end
def new
if !params[:modal] && !session[:mobile_view] && request.format.html?
redirect_to conversations_path
return
end
if session[:mobile_view] == true && request.format.html?
@contacts_json = contacts_data.to_json
@contact_ids = if params[:contact_id]
current_user.contacts.find(params[:contact_id]).id
elsif params[:aspect_id]
current_user.aspects.find(params[:aspect_id]).contacts.pluck(:id).join(",")
end
render :layout => true
else
if params[:contact_id]
gon.push conversation_prefill: [current_user.contacts.find(params[:contact_id]).person.as_json]
elsif params[:aspect_id]
gon.push conversation_prefill: current_user.aspects
.find(params[:aspect_id]).contacts.map {|c| c.person.as_json }
end
render :layout => false
end
end
private
def contacts_data
current_user.contacts.mutual.joins(person: :profile)
.pluck(*%w(contacts.id profiles.first_name profiles.last_name people.diaspora_handle))
.map {|contact_id, *name_attrs|
{value: contact_id, name: ERB::Util.h(Person.name_from_attrs(*name_attrs)) }
}
end
end