From c5801ffb375186bc0a7c808c2c2d1d507f4238e4 Mon Sep 17 00:00:00 2001 From: danielvincent Date: Fri, 25 Feb 2011 15:02:54 -0800 Subject: [PATCH] basic views / controller actions for private messages --- .../private_messages_controller.rb | 36 ++++++++++ app/controllers/status_messages_controller.rb | 2 +- app/models/private_message.rb | 9 ++- app/views/private_messages/index.haml | 12 ++++ app/views/private_messages/new.haml | 2 +- app/views/private_messages/show.haml | 24 +++++++ .../private_messages_controller_spec.rb | 65 +++++++++++++++++++ spec/models/private_message_spec.rb | 1 - 8 files changed, 147 insertions(+), 4 deletions(-) diff --git a/app/controllers/private_messages_controller.rb b/app/controllers/private_messages_controller.rb index 8e74aa974..4128faa14 100644 --- a/app/controllers/private_messages_controller.rb +++ b/app/controllers/private_messages_controller.rb @@ -1,2 +1,38 @@ class PrivateMessagesController < ApplicationController + before_filter :authenticate_user! + + respond_to :html + + def index + @messages = PrivateMessage.joins(:private_message_visibilities).where( + :private_message_visibilities => {:person_id => current_user.person.id}).all + end + + def create + person_ids = Contact.where(:id => params[:private_message][:contact_ids]).map! do |contact| + contact.person_id + end + + person_ids = person_ids | [current_user.person.id] + + @message = PrivateMessage.new( :author => current_user.person, :participant_ids => person_ids, :message => params[:private_message][:message] ) + + if @message.save + Rails.logger.info("event=create type=private_message chars=#{params[:private_message][:message].length}") + end + + respond_with @message + end + + def show + @message = PrivateMessage.joins(:private_message_visibilities).where(:id => params[:id], + :private_message_visibilities => {:person_id => current_user.person.id}).first + + if @message + respond_with @message + else + redirect_to private_messages_path + end + end + end diff --git a/app/controllers/status_messages_controller.rb b/app/controllers/status_messages_controller.rb index 77a6b3e5a..278068671 100644 --- a/app/controllers/status_messages_controller.rb +++ b/app/controllers/status_messages_controller.rb @@ -80,7 +80,7 @@ class StatusMessagesController < ApplicationController def show @status_message = current_user.find_visible_post_by_id params[:id] - if @status_message + if @status_messag @object_aspect_ids = @status_message.aspects.map{|a| a.id} # mark corresponding notification as read diff --git a/app/models/private_message.rb b/app/models/private_message.rb index bf8079fe3..899e55784 100644 --- a/app/models/private_message.rb +++ b/app/models/private_message.rb @@ -1,5 +1,12 @@ class PrivateMessage < ActiveRecord::Base + include ROXML + include Diaspora::Guid + belongs_to :author, :class_name => 'Person' has_many :private_message_visibilities - has_many :recipients, :class_name => 'Person', :through => :private_message_visibilities, :source => :person + has_many :participants, :class_name => 'Person', :through => :private_message_visibilities, :source => :person + + def recipients + self.participants - [self.author] + end end diff --git a/app/views/private_messages/index.haml b/app/views/private_messages/index.haml index 7fae50376..57780c302 100644 --- a/app/views/private_messages/index.haml +++ b/app/views/private_messages/index.haml @@ -3,3 +3,15 @@ -# the COPYRIGHT file. += link_to 'new message', new_private_message_path + +%br +%br +%br + +- for message in @messages + %b + = message.author.name + %br + = link_to message.message, message + %hr diff --git a/app/views/private_messages/new.haml b/app/views/private_messages/new.haml index ae2a260f6..ccc945125 100644 --- a/app/views/private_messages/new.haml +++ b/app/views/private_messages/new.haml @@ -9,7 +9,7 @@ = form_for PrivateMessage.new do |private_message| %h4 to - = private_message.text_field :recipients + = text_field_tag "private_message[contact_ids]" %h4 message diff --git a/app/views/private_messages/show.haml b/app/views/private_messages/show.haml index 7fae50376..b80ca5e12 100644 --- a/app/views/private_messages/show.haml +++ b/app/views/private_messages/show.haml @@ -2,4 +2,28 @@ -# licensed under the Affero General Public License version 3 or later. See -# the COPYRIGHT file. += link_to 'back', private_messages_path +%br +%br +%br +%br + +%h4 + from += @message.author.name + +%br +%br + +%h4 + to +- for recipient in @message.recipients + = recipient.name + +%br +%br + +%h4 + message += @message.message diff --git a/spec/controllers/private_messages_controller_spec.rb b/spec/controllers/private_messages_controller_spec.rb index 26bf32521..4c30bc1ad 100644 --- a/spec/controllers/private_messages_controller_spec.rb +++ b/spec/controllers/private_messages_controller_spec.rb @@ -1,5 +1,70 @@ require 'spec_helper' describe PrivateMessagesController do + render_views + before do + @user1 = alice + sign_in :user, @user1 + end + + describe '#new' do + it 'succeeds' do + get :new + response.should be_success + end + end + + describe '#index' do + it 'succeeds' do + get :index + response.should be_success + end + + it 'retrieves all messages for a user' do + @create_hash = { :participant_ids => [@user1.contacts.first.person.id, @user1.person.id], + :author => @user1.person, :message => "cool stuff" } + 3.times do + PrivateMessage.create(@create_hash) + end + + get :index + assigns[:messages].count.should == 3 + end + end + + describe '#create' do + it 'creates a private message' do + message_hash = {:private_message => { + :contact_ids => [@user1.contacts.first.id], + :message => "secret stuff"}} + + + lambda { + post :create, message_hash + }.should change(PrivateMessage, :count).by(1) + end + end + + describe '#show' do + before do + @create_hash = { :participant_ids => [@user1.contacts.first.person.id, @user1.person.id], + :author => @user1.person, :message => "cool stuff" } + @message = PrivateMessage.create(@create_hash) + end + + it 'succeeds' do + get :show, :id => @message.id + response.should be_success + assigns[:message].should == @message + end + + it 'does not let you access messages where you are not a recipient' do + user2 = eve + sign_in :user, user2 + + get :show, :id => @message.id + response.code.should == '302' + end + end end diff --git a/spec/models/private_message_spec.rb b/spec/models/private_message_spec.rb index 983209dae..b37a57fbe 100644 --- a/spec/models/private_message_spec.rb +++ b/spec/models/private_message_spec.rb @@ -1,5 +1,4 @@ require 'spec_helper' describe PrivateMessage do - pending "add some examples to (or delete) #{__FILE__}" end