Merge branch 'develop' of github.com:martini/zammad into develop

This commit is contained in:
Martin Edenhofer 2015-07-18 01:27:40 +02:00
commit bf26b19e98
5 changed files with 201 additions and 23 deletions

View file

@ -7,7 +7,7 @@ class Channel::Facebook
def fetch (channel) def fetch (channel)
@channel = channel @channel = channel
@facebook = Facebook.new( @channel[:options][:auth] ) @facebook = Facebook.new( @channel[:options] )
@sync = @channel[:options][:sync] @sync = @channel[:options][:sync]
Rails.logger.debug 'facebook fetch started' Rails.logger.debug 'facebook fetch started'
@ -22,7 +22,7 @@ class Channel::Facebook
def send(article, _notification = false) def send(article, _notification = false)
@channel = Channel.find_by( area: 'Facebook::Inbound', active: true ) @channel = Channel.find_by( area: 'Facebook::Inbound', active: true )
@facebook = Facebook.new( @channel[:options][:auth] ) @facebook = Facebook.new( @channel[:options] )
tweet = @facebook.from_article(article) tweet = @facebook.from_article(article)
disconnect disconnect

View file

@ -0,0 +1,17 @@
class FacebookArticleTypes < ActiveRecord::Migration
def up
facebook_at = Ticket::Article::Type.find_by( name: 'facebook' )
return if !facebook_at
facebook_at.name = 'facebook feed post'
facebook_at.save
Ticket::Article::Type.create(
name: 'facebook feed comment',
communication: true,
updated_by_id: 1,
created_by_id: 1
)
end
end

View file

@ -1501,9 +1501,10 @@ Ticket::Article::Type.create_if_not_exists( id: 4, name: 'fax', communication: t
Ticket::Article::Type.create_if_not_exists( id: 5, name: 'phone', communication: true ) Ticket::Article::Type.create_if_not_exists( id: 5, name: 'phone', communication: true )
Ticket::Article::Type.create_if_not_exists( id: 6, name: 'twitter status', communication: true ) Ticket::Article::Type.create_if_not_exists( id: 6, name: 'twitter status', communication: true )
Ticket::Article::Type.create_if_not_exists( id: 7, name: 'twitter direct-message', communication: true ) Ticket::Article::Type.create_if_not_exists( id: 7, name: 'twitter direct-message', communication: true )
Ticket::Article::Type.create_if_not_exists( id: 8, name: 'facebook', communication: true ) Ticket::Article::Type.create_if_not_exists( id: 8, name: 'facebook feed post', communication: true )
Ticket::Article::Type.create_if_not_exists( id: 9, name: 'note', communication: false ) Ticket::Article::Type.create_if_not_exists( id: 9, name: 'facebook feed comment', communication: true )
Ticket::Article::Type.create_if_not_exists( id: 10, name: 'web', communication: true ) Ticket::Article::Type.create_if_not_exists( id: 10, name: 'note', communication: false )
Ticket::Article::Type.create_if_not_exists( id: 11, name: 'web', communication: true )
Ticket::Article::Sender.create_if_not_exists( id: 1, name: 'Agent' ) Ticket::Article::Sender.create_if_not_exists( id: 1, name: 'Agent' )
Ticket::Article::Sender.create_if_not_exists( id: 2, name: 'Customer' ) Ticket::Article::Sender.create_if_not_exists( id: 2, name: 'Customer' )

View file

@ -130,18 +130,19 @@ class Facebook
ticket.save ticket.save
end end
user = to_user(comment) user = to_user(post)
return if !user return if !user
feed_post = { feed_post = {
from: user.name, from: "#{user.firstname} #{user.lastname}",
body: post['message'], body: post['message'],
message_id: post['id'], message_id: post['id'],
type: Ticket::Article::Type.find_by( name: 'facebook feed post' ), type_id: Ticket::Article::Type.find_by( name: 'facebook feed post' ).id,
} }
articles = [] articles = []
articles.push( feed_post ) articles.push( feed_post )
if post['comments']
post['comments']['data'].each { |comment| post['comments']['data'].each { |comment|
user = to_user(comment) user = to_user(comment)
@ -149,18 +150,21 @@ class Facebook
next if !user next if !user
post_comment = { post_comment = {
from: user.name, from: "#{user.firstname} #{user.lastname}",
body: comment['message'], body: comment['message'],
message_id: comment['id'], message_id: comment['id'],
type: Ticket::Article::Type.find_by( name: 'facebook feed comment' ), type_id: Ticket::Article::Type.find_by( name: 'facebook feed comment' ).id,
} }
articles.push( post_comment ) articles.push( post_comment )
# TODO: sub-comments # TODO: sub-comments
# comment_data = @client.get_object( comment['id'] ) # comment_data = @client.get_object( comment['id'] )
} }
end
articles.invert.each { |article| inverted_articles = articles.reverse
inverted_articles.each { |article|
break if Ticket::Article.find_by( message_id: article[:message_id] ) break if Ticket::Article.find_by( message_id: article[:message_id] )
@ -168,6 +172,9 @@ class Facebook
to: @account['name'], to: @account['name'],
ticket_id: ticket.id, ticket_id: ticket.id,
internal: false, internal: false,
sender_id: Ticket::Article::Sender.lookup( name: 'Customer' ).id,
created_by_id: 1,
updated_by_id: 1,
}.merge( article ) }.merge( article )
Ticket::Article.create( article ) Ticket::Article.create( article )
@ -204,12 +211,11 @@ class Facebook
def from_article(article) def from_article(article)
post = nil post = nil
# TODO: article[:type] == 'facebook feed post'
if article[:type] == 'facebook feed comment' if article[:type] == 'facebook feed comment'
Rails.logger.debug 'Create feed comment from article...' Rails.logger.debug 'Create feed comment from article...'
post = @client.put_wall_post(article[:body], {}, article[:in_reply_to]) post = @client.put_comment(article[:in_reply_to], article[:body])
else else
fail "Can't handle unknown facebook article type '#{article[:type]}'." fail "Can't handle unknown facebook article type '#{article[:type]}'."
end end

View file

@ -0,0 +1,154 @@
# encoding: utf-8
require 'integration_test_helper'
class FacebookTest < ActiveSupport::TestCase
# set system mode to done / to activate
Setting.set('system_init_done', true)
# needed to check correct behavior
Group.create_if_not_exists(
id: 2,
name: 'Facebook',
note: 'All Facebook feed posts.',
updated_by_id: 1,
created_by_id: 1
)
provider_key = 'CAACEdEose0cBAC56WJvrGb5avKbTlH0c7P4xZCZBfT8zG4nkgEWeFKGnnpNZC8xeedXzmqZCxEUrAumX245T4MborvAmRW52PSpuDiXwXXSMjYaZCJOih5v6CsP3xrZAfGxhPWBbI8dSoquBv8eRbUAMSir9SDSoDeKJSdSfhuytqx5wfveE8YibzT2ZAwYz0d7d2QZAN4b10d9j9UpBhXCCCahj4hyk9JQZD'
consumer_key = 'CAACEdEose0cBAHZCXAQ68snZBf2C7jT6G7pVXaWajbZCZAZAFWRZAVUb9FAMXHZBQECZBX0iL5qOeTsZA0mnR0586XTq9vYiWP8Y3qCzftrd9hnsP7J9VB6APnR67NEdY8SozxIFtctQA9Xp4Lb8lbxBmig2v5oXRIH513kImPYXJoCFUlQs0aJeZBCtRG6BekfPs5GPZB8tieQE3yGgtZBTZA3HI2TtQLZBNXyLAZD'
provider_page_name = 'Hansi Merkurs Hutfabrik'
provider_options = {
auth: {
access_token: provider_key
},
sync: {
page: provider_page_name,
group_id: 2,
limit: 1,
}
}
# add channel
current = Channel.where( adapter: 'Facebook' )
current.each(&:destroy)
Channel.create(
adapter: 'Facebook',
area: 'Facebook::Inbound',
options: provider_options,
active: true,
created_by_id: 1,
updated_by_id: 1,
)
test 'pages' do
provider_options_clone = provider_options
provider_options_clone[:sync].delete(:page)
facebook = Facebook.new( provider_options_clone )
pages = facebook.pages
page_found = false
pages.each { |page|
next if page[:name] != provider_page_name
page_found = true
}
assert( page_found, "Page lookup for '#{provider_page_name}'" )
end
test 'feed post to ticket' do
consumer_client = Koala::Facebook::API.new( consumer_key )
feed_post = "I've got an issue with my hat, serial number ##{rand(9999)}"
facebook = Facebook.new( provider_options )
post = consumer_client.put_wall_post(feed_post, {}, facebook.account['id'])
# fetch check system account
Channel.fetch
# check if first article has been created
article = Ticket::Article.find_by( message_id: post['id'] )
assert( article, "article post '#{post['id']}' imported" )
assert_equal( article.body, feed_post, 'ticket article inbound body' )
assert_equal( 1, article.ticket.articles.count, 'ticket article inbound count' )
assert_equal( feed_post, article.ticket.articles.last.body, 'ticket article inbound body' )
post_comment = "Any updates yet? It's urgent. I love my hat."
comment = consumer_client.put_comment(post['id'], post_comment)
# fetch check system account
Channel.fetch
# check if second article has been created
article = Ticket::Article.find_by( message_id: comment['id'] )
assert( article, "article comment '#{comment['id']}' imported" )
assert_equal( article.body, post_comment, 'ticket article inbound body' )
assert_equal( 2, article.ticket.articles.count, 'ticket article inbound count' )
assert_equal( post_comment, article.ticket.articles.last.body, 'ticket article inbound body' )
end
test 'feed post and comment reply' do
consumer_client = Koala::Facebook::API.new( consumer_key )
feed_post = "I've got an issue with my hat, serial number ##{rand(9999)}"
facebook = Facebook.new( provider_options )
post = consumer_client.put_wall_post(feed_post, {}, facebook.account['id'])
# fetch check system account
Channel.fetch
# check if first article has been created
article = Ticket::Article.find_by( message_id: post['id'] )
reply_text = "What's your issue Bernd?"
# reply via ticket
outbound_article = Ticket::Article.create(
ticket_id: article.ticket.id,
body: reply_text,
in_reply_to: post['id'],
type: Ticket::Article::Type.find_by( name: 'facebook feed comment' ),
sender: Ticket::Article::Sender.find_by( name: 'Agent' ),
internal: false,
updated_by_id: 1,
created_by_id: 1,
)
assert( outbound_article, 'outbound article created' )
assert_equal( outbound_article.ticket.articles.count, 2, 'ticket article outbound count' )
post_comment = 'The peacock feather is fallen off.'
comment = consumer_client.put_comment(post['id'], post_comment)
# fetch check system account
Channel.fetch
reply_text = "Please send it to our address and add the ticket number #{article.ticket.number}."
# reply via ticket
outbound_article = Ticket::Article.create(
ticket_id: article.ticket.id,
body: reply_text,
in_reply_to: comment['id'],
type: Ticket::Article::Type.find_by( name: 'facebook feed comment' ),
sender: Ticket::Article::Sender.find_by( name: 'Agent' ),
internal: false,
updated_by_id: 1,
created_by_id: 1,
)
assert( outbound_article, 'outbound article created' )
assert_equal( outbound_article.ticket.articles.count, 4, 'ticket article outbound count' )
end
end