11class Channel ::Driver ::Sms ::Seven < Channel ::Driver ::Sms ::Base
22 NAME = 'sms/seven' . freeze
33
4+ def fetchable? ( _channel )
5+ false
6+ end
7+
48 def deliver ( options , attr , _notification = false )
59 Rails . logger . info "Sending SMS to recipient #{ attr [ :recipient ] } "
610
@@ -9,14 +13,14 @@ def deliver(options, attr, _notification = false)
913 Rails . logger . info "Backend sending seven SMS to #{ attr [ :recipient ] } "
1014 begin
1115 url = 'https://gateway.seven.io/api/sms?' + URI . encode_www_form ( {
12- p : options [ :api_key ] ,
13- text : attr [ :message ] ,
14- to : attr [ :recipient ] ,
15- from : options [ :from ] ,
16- sendWith : 'zammad' ,
16+ p : options [ :api_key ] ,
17+ text : attr [ :message ] ,
18+ to : attr [ :recipient ] ,
19+ from : options [ :from ] ,
20+ sendWith : 'zammad' ,
1721 } )
1822
19- if Setting . get ( 'developer_mode' ) != true
23+ if Setting . get ( 'developer_mode' ) != false
2024 response = Faraday . get ( url ) . body
2125 raise response if '100' != response
2226 end
@@ -28,14 +32,84 @@ def deliver(options, attr, _notification = false)
2832 end
2933 end
3034
35+ def process ( _options , attr , channel )
36+ from = attr [ 'data' ] [ 'sender' ]
37+
38+ Rails . logger . info "Receiving SMS from recipient #{ from } "
39+
40+ if from . sub ( '+' , '' ) . scan ( /^\d +$/ ) . empty?
41+ Rails . logger . info "Skipping inbound SMS because the sender is not a valid phone number: #{ from } "
42+ return [ :json , { } ]
43+ end
44+
45+ # prevent already created articles
46+ if Ticket ::Article . exists? ( message_id : attr [ 'data' ] [ 'id' ] )
47+ return [ :json , { } ]
48+ end
49+
50+ # find sender
51+ user = user_by_mobile ( from )
52+ UserInfo . current_user_id = user . id
53+
54+ process_ticket ( attr , channel , user )
55+
56+ [ :json , { } ]
57+ end
58+
59+ def create_ticket ( attr , channel , user )
60+ title = cut_title ( attr [ 'data' ] [ 'text' ] )
61+ ticket = Ticket . new (
62+ group_id : channel . group_id ,
63+ title : title ,
64+ state_id : Ticket ::State . find_by ( default_create : true ) . id ,
65+ priority_id : Ticket ::Priority . find_by ( default_create : true ) . id ,
66+ customer_id : user . id ,
67+ preferences : {
68+ channel_id : channel . id ,
69+ sms : {
70+ originator : attr [ 'data' ] [ 'sender' ] ,
71+ recipient : attr [ 'data' ] [ 'system' ] ,
72+ }
73+ }
74+ )
75+ ticket . save!
76+ ticket
77+ end
78+
79+ def create_article ( attr , channel , ticket )
80+ Ticket ::Article . create! (
81+ ticket_id : ticket . id ,
82+ type : article_type_sms ,
83+ sender : Ticket ::Article ::Sender . find_by ( name : 'Customer' ) ,
84+ body : attr [ 'data' ] [ 'text' ] ,
85+ from : attr [ 'data' ] [ 'sender' ] ,
86+ to : attr [ 'data' ] [ 'system' ] ,
87+ message_id : attr [ 'data' ] [ 'id' ] ,
88+ content_type : 'text/plain' ,
89+ preferences : {
90+ channel_id : channel . id ,
91+ sms : {
92+ From : attr [ 'data' ] [ 'sender' ] ,
93+ To : attr [ 'data' ] [ 'system' ] ,
94+ } ,
95+ }
96+ )
97+ end
98+
3199 def self . definition
32100 {
33- name : 'seven' ,
34- adapter : 'sms/seven' ,
35- notification : [
36- { name : 'options::api_key' , display : 'API Key' , tag : 'input' , type : 'text' , limit : 64 , null : false , placeholder : 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' } ,
37- { name : 'options::from' , display : 'From' , tag : 'input' , type : 'text' , limit : 16 , null : true , placeholder : '00491710000000' } ,
38- ]
101+ name : 'seven' ,
102+ adapter : 'sms/seven' ,
103+ account : [
104+ { name : 'options::webhook_token' , display : __ ( 'Webhook Token' ) , tag : 'input' , type : 'text' , limit : 200 , null : false , default : Digest ::MD5 . hexdigest ( SecureRandom . uuid ) , disabled : true , readonly : true } ,
105+ { name : 'options::api_key' , display : 'API Key' , tag : 'input' , type : 'text' , limit : 64 , null : false , placeholder : 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' } ,
106+ { name : 'options::from' , display : 'From' , tag : 'input' , type : 'text' , limit : 16 , null : true , placeholder : '00491710000000' } ,
107+ { name : 'group_id' , display : __ ( 'Destination Group' ) , tag : 'tree_select' , null : false , relation : 'Group' , nulloption : true , filter : { active : true } } ,
108+ ] ,
109+ notification : [
110+ { name : 'options::api_key' , display : 'API Key' , tag : 'input' , type : 'text' , limit : 64 , null : false , placeholder : 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' } ,
111+ { name : 'options::from' , display : 'From' , tag : 'input' , type : 'text' , limit : 16 , null : true , placeholder : '00491710000000' } ,
112+ ]
39113 }
40114 end
41- end
115+ end
0 commit comments