Fixes #2379 - Zammad ignores group mapping on Telegram if same sending user.

This commit is contained in:
Denny Bresch 2019-07-30 15:47:53 +02:00 committed by Thorsten Eckel
parent 68c56c7b87
commit 1db27646d5
6 changed files with 102 additions and 14 deletions

View file

@ -57,7 +57,7 @@ class ChannelsTelegramController < ApplicationController
end
def webhook
raise Exceptions::UnprocessableEntity, 'bot param missing' if params['bid'].blank?
raise Exceptions::UnprocessableEntity, 'bot params missing' if params['bid'].blank?
channel = Telegram.bot_by_bot_id(params['bid'])
raise Exceptions::UnprocessableEntity, 'bot not found' if !channel

View file

@ -9,7 +9,7 @@ class Channel::Driver::Telegram
{
adapter: 'telegram',
auth: {
api_key: api_key
api_key: api_key
},
},
telegram_attributes,

View file

@ -24,7 +24,7 @@ check token and return bot attributes of token
=begin
set webhool for bot
set webhook for bot
success = Telegram.set_webhook('token', callback_url)
@ -80,7 +80,7 @@ returns
raise 'Group invalid!'
end
# generate randam callback token
# generate random callback token
callback_token = if Rails.env.test?
'callback_token'
else
@ -312,10 +312,11 @@ returns
end
# find ticket or create one
state_ids = Ticket::State.where(name: %w[closed merged removed]).pluck(:id)
ticket = Ticket.where(customer_id: user.id).where.not(state_id: state_ids).order(:updated_at).first
if ticket
state_ids = Ticket::State.where(name: %w[closed merged removed]).pluck(:id)
possible_tickets = Ticket.where(customer_id: user.id).where.not(state_id: state_ids).order(:updated_at)
ticket = possible_tickets.find_each.find { |possible_ticket| possible_ticket.preferences[:channel_id] == channel.id }
if ticket
# check if title need to be updated
if ticket.title == '-'
ticket.title = title
@ -628,7 +629,7 @@ returns
params.delete(:edited_channel_post) # discard unused :edited_channel_post hash
end
# prevent multible update
# prevent multiple update
if !params[:edited_message]
return if Ticket::Article.find_by(message_id: Telegram.message_id(params))
end

View file

@ -8,8 +8,8 @@ RSpec.describe 'Telegram', type: :request do
Ticket.destroy_all
# configure telegram channel
token = 'valid_token'
bot_id = 123_456_789
token = 'valid_token'
bot_id = 123_456_789
group_id = Group.find_by(name: 'Users').id
UserInfo.current_user_id = 1
@ -76,7 +76,7 @@ RSpec.describe 'Telegram', type: :request do
post '/api/v1/channels_telegram_webhook/not_existing', params: read_message('personal1_message_start'), as: :json
expect(response).to have_http_status(:unprocessable_entity)
expect(json_response['error']).to eq('bot param missing')
expect(json_response['error']).to eq('bot params missing')
callback_url = "/api/v1/channels_telegram_webhook/not_existing?bid=#{channel.options[:bot][:id]}"
post callback_url, params: read_message('personal1_message_start'), as: :json
@ -240,7 +240,7 @@ RSpec.describe 'Telegram', type: :request do
expect(ticket.articles.last.content_type).to eq('text/html')
expect(ticket.articles.last.attachments.count).to eq(1)
# isend channel message 2
# send channel message 2
post callback_url, params: read_message('channel1_message_content2'), as: :json
expect(response).to have_http_status(:ok)
expect(Ticket.count).to eq(3)
@ -360,6 +360,93 @@ RSpec.describe 'Telegram', type: :request do
expect(ticket.articles.last.attachments.count).to eq(0)
end
it 'with two bots and different groups' do
Ticket.destroy_all
# configure telegram channel
token1 = 'valid_token1'
token2 = 'valid_token2'
bot_id1 = 123_456_789
bot_id2 = 987_654_321
group1 = create(:group)
group2 = create(:group)
UserInfo.current_user_id = 1
Channel.where(area: 'Telegram::Bot').destroy_all
Setting.set('http_type', 'https')
Setting.set('fqdn', 'example.com')
# channel 1 - try valid token
stub_request(:post, "https://api.telegram.org/bot#{token1}/getMe")
.to_return(status: 200, body: "{\"ok\":true,\"result\":{\"id\":#{bot_id1},\"first_name\":\"Chrispresso Customer Service\",\"username\":\"ChrispressoBot1\"}}", headers: {})
bot1 = Telegram.check_token(token1)
expect(bot1['id']).to eq(bot_id1)
# channel 1 - valid token, host and port
stub_request(:post, "https://api.telegram.org:443/bot#{token1}/setWebhook")
.with(body: { 'url' => "https://example.com/api/v1/channels_telegram_webhook/callback_token?bid=#{bot_id1}" })
.to_return(status: 200, body: '{"ok":true,"result":true,"description":"Webhook was set"}', headers: {})
channel1 = Telegram.create_or_update_channel(token1, { group_id: group1.id, welcome: 'hi!' })
# start communication #1
callback_url1 = "/api/v1/channels_telegram_webhook/#{channel1.options[:callback_token]}?bid=#{channel1.options[:bot][:id]}"
post callback_url1, params: read_message('personal1_message_start'), as: :json
expect(response).to have_http_status(:ok)
# send message1
post callback_url1, params: read_message('personal1_message_content1'), as: :json
expect(response).to have_http_status(:ok)
expect(Ticket.count).to eq(1)
ticket1 = Ticket.last
expect(ticket1.title).to eq('Hello, I need your Help')
expect(ticket1.state.name).to eq('new')
expect(ticket1.articles.count).to eq(1)
expect(ticket1.articles.first.body).to eq('Hello, I need your Help')
expect(ticket1.articles.first.content_type).to eq('text/plain')
expect(ticket1.articles.first.from).to eq('Test Firstname Test Lastname')
expect(ticket1.articles.first.to).to eq('@ChrispressoBot1')
# channel 2 - try valid token
UserInfo.current_user_id = 1
stub_request(:post, "https://api.telegram.org/bot#{token2}/getMe")
.to_return(status: 200, body: "{\"ok\":true,\"result\":{\"id\":#{bot_id2},\"first_name\":\"Chrispresso Customer Service\",\"username\":\"ChrispressoBot2\"}}", headers: {})
bot2 = Telegram.check_token(token2)
expect(bot2['id']).to eq(bot_id2)
# channel 2 - valid token, host and port
stub_request(:post, "https://api.telegram.org:443/bot#{token2}/setWebhook")
.with(body: { 'url' => "https://example.com/api/v1/channels_telegram_webhook/callback_token?bid=#{bot_id2}" })
.to_return(status: 200, body: '{"ok":true,"result":true,"description":"Webhook was set"}', headers: {})
channel2 = Telegram.create_or_update_channel(token2, { group_id: group2.id, welcome: 'hi!' })
# start communication #1
callback_url2 = "/api/v1/channels_telegram_webhook/#{channel2.options[:callback_token]}?bid=#{channel2.options[:bot][:id]}"
post callback_url2, params: read_message('personal3_message_start'), as: :json
expect(response).to have_http_status(:ok)
# send message2
post callback_url2, params: read_message('personal3_message_content1'), as: :json
expect(response).to have_http_status(:ok)
expect(Ticket.count).to eq(2)
ticket2 = Ticket.last
expect(ticket2.title).to eq('Can you help me with my feature?')
expect(ticket2.state.name).to eq('new')
expect(ticket2.articles.count).to eq(1)
expect(ticket2.articles.first.body).to eq('Can you help me with my feature?')
expect(ticket2.articles.first.content_type).to eq('text/plain')
expect(ticket2.articles.first.from).to eq('Test Firstname2 Test Lastname2')
expect(ticket2.articles.first.to).to eq('@ChrispressoBot2')
end
def read_message(file)
JSON.parse(File.read(Rails.root.join('test', 'data', 'telegram', "#{file}.json")))
end

View file

@ -15,7 +15,7 @@
"entities": [
{"offset": 0,
"length": 6,
"type": "bot_command"
"type": "bot_command"
}
]
}

View file

@ -15,7 +15,7 @@
"entities": [
{"offset": 0,
"length": 6,
"type": "bot_command"
"type": "bot_command"
}
]
}