iletimerkezi_sdk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE.md +21 -0
- data/README.md +74 -0
- data/lib/iletimerkezi_sdk/client.rb +54 -0
- data/lib/iletimerkezi_sdk/http/http_client.rb +66 -0
- data/lib/iletimerkezi_sdk/http/http_client_interface.rb +25 -0
- data/lib/iletimerkezi_sdk/http/net_http_client.rb +50 -0
- data/lib/iletimerkezi_sdk/models/summary_report.rb +57 -0
- data/lib/iletimerkezi_sdk/models/webhook_report.rb +31 -0
- data/lib/iletimerkezi_sdk/responses/account_response.rb +24 -0
- data/lib/iletimerkezi_sdk/responses/base_response.rb +50 -0
- data/lib/iletimerkezi_sdk/responses/blacklist_response.rb +31 -0
- data/lib/iletimerkezi_sdk/responses/report_response.rb +98 -0
- data/lib/iletimerkezi_sdk/responses/sender_response.rb +26 -0
- data/lib/iletimerkezi_sdk/responses/sms_response.rb +17 -0
- data/lib/iletimerkezi_sdk/responses/summary_response.rb +45 -0
- data/lib/iletimerkezi_sdk/services/account_service.rb +26 -0
- data/lib/iletimerkezi_sdk/services/blacklist_service.rb +84 -0
- data/lib/iletimerkezi_sdk/services/report_service.rb +41 -0
- data/lib/iletimerkezi_sdk/services/sender_service.rb +25 -0
- data/lib/iletimerkezi_sdk/services/sms_service.rb +57 -0
- data/lib/iletimerkezi_sdk/services/summary_service.rb +43 -0
- data/lib/iletimerkezi_sdk/services/webhook_service.rb +35 -0
- data/lib/iletimerkezi_sdk/version.rb +5 -0
- data/lib/iletimerkezi_sdk.rb +26 -0
- data/spec/iletimerkezi_sdk_spec.rb +11 -0
- data/spec/spec_helper.rb +15 -0
- metadata +101 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f51ebe956450adb4050042689e9689f0919f4412cab70e39f23597ff5bc558d5
|
4
|
+
data.tar.gz: 579bcb924270d076611afa5adf3790f277ae6e0461ddc866d5c54c9e2822781a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a733c1dee333e33f4222449bc84676d9a9528e6fc71a9181af3178b918e3d755b89a32d5ad445a19b327d7868154df0843df2f876df74f1b4f41f1ca6ee3e824
|
7
|
+
data.tar.gz: 4b0e2b4df3133f1a7fb55e8db5aed885dfb418ca330dcbeedcd02a76a1fc6e601052ebf558ed929ccbdf0c797776d7cc2f1cf69837ed58d307b959a58d188d92
|
data/LICENSE.md
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2024 iletiMerkezi
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
# İleti Merkezi Ruby SDK
|
2
|
+
|
3
|
+
Bu SDK, İleti Merkezi API'si ile etkileşimde bulunmak için Ruby dilinde yazılmış bir istemci sağlar.
|
4
|
+
|
5
|
+
## Kurulum
|
6
|
+
|
7
|
+
Bu SDK'yı kullanmak için Ruby 2.6 veya daha üst bir sürümüne sahip olmalısınız. Aşağıdaki adımları izleyerek SDK'yı kurabilirsiniz:
|
8
|
+
|
9
|
+
### Gemfile Kullanarak Kurulum
|
10
|
+
|
11
|
+
Eğer Bundler kullanıyorsanız, Gemfile dosyanıza aşağıdaki satırı ekleyin:
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
gem 'iletimerkezi_sdk', git: 'https://github.com/iletimerkezi/iletimerkezi-ruby.git'
|
15
|
+
```
|
16
|
+
|
17
|
+
Ardından terminalde aşağıdaki komutu çalıştırın:
|
18
|
+
|
19
|
+
```bash
|
20
|
+
bundle install
|
21
|
+
```
|
22
|
+
|
23
|
+
### Manuel Kurulum
|
24
|
+
Eğer Bundler kullanmıyorsanız, gem'i manuel olarak kurabilirsiniz:
|
25
|
+
|
26
|
+
```bash
|
27
|
+
gem install iletimerkezi_sdk
|
28
|
+
```
|
29
|
+
|
30
|
+
### Kullanım
|
31
|
+
SDK'yı kullanmaya başlamak için aşağıdaki örneği inceleyebilirsiniz:
|
32
|
+
|
33
|
+
İleti Merkezi İstemcisini Başlatın
|
34
|
+
|
35
|
+
```ruby
|
36
|
+
require 'iletimerkezi_sdk'
|
37
|
+
|
38
|
+
client = IletiMerkeziSdk◊::Client.new(
|
39
|
+
api_key: 'YOUR_API_KEY',
|
40
|
+
api_hash: 'YOUR_API_HASH',
|
41
|
+
default_sender: 'YOUR_DEFAULT_SENDER'
|
42
|
+
)
|
43
|
+
```
|
44
|
+
|
45
|
+
SMS Gönderme Örneği
|
46
|
+
|
47
|
+
```ruby
|
48
|
+
response = client.sms.send('50570xxxxx', 'Merhaba Dünya!')
|
49
|
+
if response.ok?
|
50
|
+
puts "SMS başarıyla gönderildi! Sipariş ID: #{response.order_id}"
|
51
|
+
else
|
52
|
+
puts "Hata: #{response.error_message}"
|
53
|
+
end
|
54
|
+
```
|
55
|
+
|
56
|
+
Rapor Alma Örneği
|
57
|
+
|
58
|
+
```ruby
|
59
|
+
response = client.report.get(order_id: 'ORDER_ID')
|
60
|
+
if response.ok?
|
61
|
+
puts "Rapor başarıyla alındı!"
|
62
|
+
puts "Durum: #{response.status}"
|
63
|
+
else
|
64
|
+
puts "Hata: #{response.error_message}"
|
65
|
+
end
|
66
|
+
```
|
67
|
+
|
68
|
+
### Desteklenen Versiyonlar
|
69
|
+
Bu SDK, aşağıdaki Ruby sürümlerini desteklemektedir:
|
70
|
+
|
71
|
+
- Ruby 2.6
|
72
|
+
- Ruby 2.7
|
73
|
+
- Ruby 3.0
|
74
|
+
- Ruby 3.1
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module IletimerkeziSdk
|
2
|
+
class Client
|
3
|
+
attr_reader :http_client
|
4
|
+
|
5
|
+
def initialize(api_key, api_hash, default_sender = nil, http_client = nil)
|
6
|
+
@api_key = api_key
|
7
|
+
@api_hash = api_hash
|
8
|
+
@default_sender = default_sender
|
9
|
+
@http_client = http_client || default_http_client
|
10
|
+
end
|
11
|
+
|
12
|
+
def sms
|
13
|
+
@sms ||= Services::SmsService.new(@http_client, @api_key, @api_hash, @default_sender)
|
14
|
+
end
|
15
|
+
|
16
|
+
def account
|
17
|
+
@account ||= Services::AccountService.new(@http_client, @api_key, @api_hash)
|
18
|
+
end
|
19
|
+
|
20
|
+
def report
|
21
|
+
@report ||= Services::ReportService.new(@http_client, @api_key, @api_hash)
|
22
|
+
end
|
23
|
+
|
24
|
+
def summary
|
25
|
+
@summary ||= Services::SummaryService.new(@http_client, @api_key, @api_hash)
|
26
|
+
end
|
27
|
+
|
28
|
+
def sender
|
29
|
+
@sender ||= Services::SenderService.new(@http_client, @api_key, @api_hash)
|
30
|
+
end
|
31
|
+
|
32
|
+
def blacklist
|
33
|
+
@blacklist ||= Services::BlacklistService.new(@http_client, @api_key, @api_hash)
|
34
|
+
end
|
35
|
+
|
36
|
+
def webhook
|
37
|
+
@webhook ||= Services::WebhookService.new
|
38
|
+
end
|
39
|
+
|
40
|
+
def debug
|
41
|
+
JSON.pretty_generate({
|
42
|
+
payload: JSON.parse(@http_client.get_payload),
|
43
|
+
response: JSON.parse(@http_client.get_body),
|
44
|
+
status: @http_client.get_status_code
|
45
|
+
})
|
46
|
+
end
|
47
|
+
|
48
|
+
private
|
49
|
+
|
50
|
+
def default_http_client
|
51
|
+
Http::NetHttpClient.new
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module IletimerkeziSdk
|
2
|
+
module Http
|
3
|
+
class HttpClient < HttpClientInterface
|
4
|
+
VERSION = '1.0.0'.freeze
|
5
|
+
BASE_URL = 'https://api.iletimerkezi.com/v1'.freeze
|
6
|
+
USER_AGENT = "iletimerkezi-ruby/#{VERSION}".freeze
|
7
|
+
|
8
|
+
def initialize
|
9
|
+
@last_payload = nil
|
10
|
+
@last_response_body = nil
|
11
|
+
@last_status_code = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def get_payload
|
15
|
+
@last_payload
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_body
|
19
|
+
@last_response_body
|
20
|
+
end
|
21
|
+
|
22
|
+
def get_status_code
|
23
|
+
@last_status_code
|
24
|
+
end
|
25
|
+
|
26
|
+
protected
|
27
|
+
|
28
|
+
def build_url(endpoint)
|
29
|
+
"#{BASE_URL}/#{endpoint}"
|
30
|
+
end
|
31
|
+
|
32
|
+
def handle_response(response)
|
33
|
+
@last_response_body = response.body
|
34
|
+
@last_status_code = response.status
|
35
|
+
|
36
|
+
{
|
37
|
+
status: response.status,
|
38
|
+
body: parse_response_body(response.body)
|
39
|
+
}
|
40
|
+
end
|
41
|
+
|
42
|
+
def store_request_payload(payload)
|
43
|
+
@last_payload = payload
|
44
|
+
end
|
45
|
+
|
46
|
+
def default_headers
|
47
|
+
{
|
48
|
+
'User-Agent' => USER_AGENT,
|
49
|
+
'Content-Type' => 'application/json'
|
50
|
+
}
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def parse_response_body(body)
|
56
|
+
return {} if body.nil? || body.empty?
|
57
|
+
|
58
|
+
begin
|
59
|
+
JSON.parse(body)
|
60
|
+
rescue JSON::ParserError
|
61
|
+
{}
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module IletimerkeziSdk
|
2
|
+
module Http
|
3
|
+
class HttpClientInterface
|
4
|
+
def post(endpoint, options = {})
|
5
|
+
raise NotImplementedError, "#{self.class} must implement post method"
|
6
|
+
end
|
7
|
+
|
8
|
+
def get(endpoint, options = {})
|
9
|
+
raise NotImplementedError, "#{self.class} must implement get method"
|
10
|
+
end
|
11
|
+
|
12
|
+
def get_payload
|
13
|
+
raise NotImplementedError, "#{self.class} must implement get_payload method"
|
14
|
+
end
|
15
|
+
|
16
|
+
def get_body
|
17
|
+
raise NotImplementedError, "#{self.class} must implement get_body method"
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_status_code
|
21
|
+
raise NotImplementedError, "#{self.class} must implement get_status_code method"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'uri'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module IletimerkeziSdk
|
6
|
+
module Http
|
7
|
+
class NetHttpClient < HttpClient
|
8
|
+
def post(endpoint, options = {})
|
9
|
+
uri = URI(build_url(endpoint))
|
10
|
+
request = Net::HTTP::Post.new(uri)
|
11
|
+
request['Content-Type'] = 'application/json'
|
12
|
+
request.body = options[:json].to_json if options[:json]
|
13
|
+
|
14
|
+
store_request_payload(request.body)
|
15
|
+
|
16
|
+
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
|
17
|
+
http.request(request)
|
18
|
+
end
|
19
|
+
|
20
|
+
handle_response(response)
|
21
|
+
end
|
22
|
+
|
23
|
+
def get(endpoint, options = {})
|
24
|
+
uri = URI(build_url(endpoint))
|
25
|
+
uri.query = URI.encode_www_form(options[:params]) if options[:params]
|
26
|
+
|
27
|
+
request = Net::HTTP::Get.new(uri)
|
28
|
+
request['Content-Type'] = 'application/json'
|
29
|
+
|
30
|
+
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == 'https') do |http|
|
31
|
+
http.request(request)
|
32
|
+
end
|
33
|
+
|
34
|
+
handle_response(response)
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def handle_response(response)
|
40
|
+
@last_response_body = response.body
|
41
|
+
@last_status_code = response.code.to_i
|
42
|
+
|
43
|
+
{
|
44
|
+
status: response.code.to_i,
|
45
|
+
body: parse_response_body(response.body)
|
46
|
+
}
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module IletimerkeziSdk
|
2
|
+
module Models
|
3
|
+
class SummaryReport
|
4
|
+
attr_reader :raw_data
|
5
|
+
|
6
|
+
ORDER_STATUS_MESSAGES = {
|
7
|
+
113 => 'SENDING',
|
8
|
+
114 => 'COMPLETED',
|
9
|
+
115 => 'CANCELED'
|
10
|
+
}.freeze
|
11
|
+
|
12
|
+
def initialize(data)
|
13
|
+
@raw_data = data
|
14
|
+
end
|
15
|
+
|
16
|
+
def order_id
|
17
|
+
@raw_data['id']
|
18
|
+
end
|
19
|
+
|
20
|
+
def status_code
|
21
|
+
@raw_data['status']
|
22
|
+
end
|
23
|
+
|
24
|
+
def status
|
25
|
+
ORDER_STATUS_MESSAGES[@raw_data['status']] || 'Unknown Status'
|
26
|
+
end
|
27
|
+
|
28
|
+
def total
|
29
|
+
@raw_data['total']
|
30
|
+
end
|
31
|
+
|
32
|
+
def delivered
|
33
|
+
@raw_data['delivered']
|
34
|
+
end
|
35
|
+
|
36
|
+
def undelivered
|
37
|
+
@raw_data['undelivered']
|
38
|
+
end
|
39
|
+
|
40
|
+
def waiting
|
41
|
+
@raw_data['waiting']
|
42
|
+
end
|
43
|
+
|
44
|
+
def submit_at
|
45
|
+
@raw_data['submitAt']
|
46
|
+
end
|
47
|
+
|
48
|
+
def sent_at
|
49
|
+
@raw_data['sentAt']
|
50
|
+
end
|
51
|
+
|
52
|
+
def sender
|
53
|
+
@raw_data['sender']
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module IletimerkeziSdk
|
2
|
+
module Models
|
3
|
+
class WebhookReport
|
4
|
+
attr_reader :raw_data
|
5
|
+
|
6
|
+
def initialize(data)
|
7
|
+
@raw_data = data
|
8
|
+
end
|
9
|
+
|
10
|
+
def message_id
|
11
|
+
@raw_data['message_id']
|
12
|
+
end
|
13
|
+
|
14
|
+
def status
|
15
|
+
@raw_data['status']
|
16
|
+
end
|
17
|
+
|
18
|
+
def status_message
|
19
|
+
@raw_data['status_message']
|
20
|
+
end
|
21
|
+
|
22
|
+
def operator
|
23
|
+
@raw_data['operator']
|
24
|
+
end
|
25
|
+
|
26
|
+
def phone_number
|
27
|
+
@raw_data['phone_number']
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module IletimerkeziSdk
|
2
|
+
module Responses
|
3
|
+
class AccountResponse < BaseResponse
|
4
|
+
attr_reader :amount, :sms
|
5
|
+
|
6
|
+
def amount
|
7
|
+
@amount
|
8
|
+
end
|
9
|
+
|
10
|
+
def credits
|
11
|
+
@sms
|
12
|
+
end
|
13
|
+
|
14
|
+
protected
|
15
|
+
|
16
|
+
def customize_data
|
17
|
+
balance = @data['balance'] || {}
|
18
|
+
@amount = balance['amount'] || '0'
|
19
|
+
@sms = balance['sms'] || '0'
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module IletimerkeziSdk
|
2
|
+
module Responses
|
3
|
+
class BaseResponse
|
4
|
+
attr_reader :status_code, :message, :data
|
5
|
+
|
6
|
+
def initialize(response_body, http_status_code)
|
7
|
+
@status_code = http_status_code
|
8
|
+
@message = response_body.dig('response', 'status', 'message') || 'Unknown error'
|
9
|
+
@data = response_body['response'] || {}
|
10
|
+
@successful = http_status_code == 200
|
11
|
+
|
12
|
+
customize_data
|
13
|
+
end
|
14
|
+
|
15
|
+
def ok?
|
16
|
+
@successful
|
17
|
+
end
|
18
|
+
|
19
|
+
def get_status_code
|
20
|
+
@status_code
|
21
|
+
end
|
22
|
+
|
23
|
+
def get_message
|
24
|
+
@message
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_data
|
28
|
+
@data
|
29
|
+
end
|
30
|
+
|
31
|
+
protected
|
32
|
+
|
33
|
+
def customize_data
|
34
|
+
# Override this method in child classes to customize
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def method_missing(method_name, *args)
|
40
|
+
key = method_name.to_s
|
41
|
+
return @data[key] if @data.key?(key)
|
42
|
+
super
|
43
|
+
end
|
44
|
+
|
45
|
+
def respond_to_missing?(method_name, include_private = false)
|
46
|
+
@data.key?(method_name.to_s) || super
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module IletimerkeziSdk
|
2
|
+
module Responses
|
3
|
+
class BlacklistResponse < BaseResponse
|
4
|
+
include Enumerable
|
5
|
+
|
6
|
+
def initialize(response_body, http_status_code)
|
7
|
+
@numbers = []
|
8
|
+
@position = 0
|
9
|
+
super(response_body, http_status_code)
|
10
|
+
end
|
11
|
+
|
12
|
+
def each(&block)
|
13
|
+
@numbers.each(&block)
|
14
|
+
end
|
15
|
+
|
16
|
+
def count
|
17
|
+
(@data.dig('blacklist', 'count') || 0).to_i
|
18
|
+
end
|
19
|
+
|
20
|
+
def numbers
|
21
|
+
@numbers
|
22
|
+
end
|
23
|
+
|
24
|
+
protected
|
25
|
+
|
26
|
+
def customize_data
|
27
|
+
@numbers = @data.dig('blacklist', 'number') || []
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module IletimerkeziSdk
|
2
|
+
module Responses
|
3
|
+
class ReportResponse < BaseResponse
|
4
|
+
include Enumerable
|
5
|
+
|
6
|
+
ORDER_STATUS_MESSAGES = {
|
7
|
+
113 => 'SENDING',
|
8
|
+
114 => 'COMPLETED',
|
9
|
+
115 => 'CANCELED'
|
10
|
+
}.freeze
|
11
|
+
|
12
|
+
MESSAGE_STATUS_MESSAGES = {
|
13
|
+
110 => 'WAITING',
|
14
|
+
111 => 'DELIVERED',
|
15
|
+
112 => 'UNDELIVERED'
|
16
|
+
}.freeze
|
17
|
+
|
18
|
+
def initialize(response_body, http_status_code, current_page = 1)
|
19
|
+
@messages = []
|
20
|
+
@current_page = current_page
|
21
|
+
super(response_body, http_status_code)
|
22
|
+
end
|
23
|
+
|
24
|
+
def each(&block)
|
25
|
+
@messages.each(&block)
|
26
|
+
end
|
27
|
+
|
28
|
+
def order_id
|
29
|
+
@data.dig('order', 'id') || ''
|
30
|
+
end
|
31
|
+
|
32
|
+
def order_status
|
33
|
+
status = @data.dig('order', 'status') || ''
|
34
|
+
ORDER_STATUS_MESSAGES[status] || status
|
35
|
+
end
|
36
|
+
|
37
|
+
def order_status_code
|
38
|
+
(@data.dig('order', 'status') || 0).to_i
|
39
|
+
end
|
40
|
+
|
41
|
+
def total
|
42
|
+
(@data.dig('order', 'total') || 0).to_i
|
43
|
+
end
|
44
|
+
|
45
|
+
def delivered
|
46
|
+
@data.dig('order', 'delivered') || 0
|
47
|
+
end
|
48
|
+
|
49
|
+
def undelivered
|
50
|
+
@data.dig('order', 'undelivered') || 0
|
51
|
+
end
|
52
|
+
|
53
|
+
def waiting
|
54
|
+
@data.dig('order', 'waiting') || 0
|
55
|
+
end
|
56
|
+
|
57
|
+
def submit_at
|
58
|
+
@data.dig('order', 'submitAt') || ''
|
59
|
+
end
|
60
|
+
|
61
|
+
def sent_at
|
62
|
+
@data.dig('order', 'sendAt') || ''
|
63
|
+
end
|
64
|
+
|
65
|
+
def sender
|
66
|
+
@data.dig('order', 'sender') || ''
|
67
|
+
end
|
68
|
+
|
69
|
+
def messages
|
70
|
+
@messages
|
71
|
+
end
|
72
|
+
|
73
|
+
def total_pages
|
74
|
+
(Float(total) / 1000.0).ceil
|
75
|
+
end
|
76
|
+
|
77
|
+
def current_page
|
78
|
+
@current_page
|
79
|
+
end
|
80
|
+
|
81
|
+
def has_more_pages?
|
82
|
+
@current_page < total_pages
|
83
|
+
end
|
84
|
+
|
85
|
+
protected
|
86
|
+
|
87
|
+
def customize_data
|
88
|
+
@messages = @data.dig('order', 'message') || []
|
89
|
+
|
90
|
+
@messages.each do |message|
|
91
|
+
status_code = message['status']
|
92
|
+
message['status'] = MESSAGE_STATUS_MESSAGES[status_code] || 'Unknown Status'
|
93
|
+
message['statusCode'] = status_code
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module IletimerkeziSdk
|
2
|
+
module Responses
|
3
|
+
class SenderResponse < BaseResponse
|
4
|
+
include Enumerable
|
5
|
+
|
6
|
+
def initialize(response_body, http_status_code)
|
7
|
+
@senders = []
|
8
|
+
super(response_body, http_status_code)
|
9
|
+
end
|
10
|
+
|
11
|
+
def each(&block)
|
12
|
+
@senders.each(&block)
|
13
|
+
end
|
14
|
+
|
15
|
+
def senders
|
16
|
+
@senders
|
17
|
+
end
|
18
|
+
|
19
|
+
protected
|
20
|
+
|
21
|
+
def customize_data
|
22
|
+
@senders = @data.dig('senders', 'sender') || []
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module IletimerkeziSdk
|
2
|
+
module Responses
|
3
|
+
class SmsResponse < BaseResponse
|
4
|
+
def order_id
|
5
|
+
@data['id']
|
6
|
+
end
|
7
|
+
|
8
|
+
protected
|
9
|
+
|
10
|
+
def customize_data
|
11
|
+
if @data.dig('order', 'id')
|
12
|
+
@data['id'] = @data['order']['id']
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module IletimerkeziSdk
|
2
|
+
module Responses
|
3
|
+
class SummaryResponse < BaseResponse
|
4
|
+
include Enumerable
|
5
|
+
|
6
|
+
def initialize(response_body, http_status_code, page)
|
7
|
+
@orders = []
|
8
|
+
@current_page = page
|
9
|
+
super(response_body, http_status_code)
|
10
|
+
end
|
11
|
+
|
12
|
+
def each(&block)
|
13
|
+
@orders.each(&block)
|
14
|
+
end
|
15
|
+
|
16
|
+
def orders
|
17
|
+
@orders
|
18
|
+
end
|
19
|
+
|
20
|
+
def count
|
21
|
+
@data.dig('count') || 0
|
22
|
+
end
|
23
|
+
|
24
|
+
def total_pages
|
25
|
+
(count / 30).ceil
|
26
|
+
end
|
27
|
+
|
28
|
+
def current_page
|
29
|
+
@current_page
|
30
|
+
end
|
31
|
+
|
32
|
+
def has_more_pages?
|
33
|
+
@current_page < total_pages
|
34
|
+
end
|
35
|
+
|
36
|
+
protected
|
37
|
+
|
38
|
+
def customize_data
|
39
|
+
@orders = (@data.dig('orders') || []).map do |order|
|
40
|
+
Models::SummaryReport.new(order)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module IletimerkeziSdk
|
2
|
+
module Services
|
3
|
+
class AccountService
|
4
|
+
def initialize(http_client, api_key, api_hash)
|
5
|
+
@http_client = http_client
|
6
|
+
@api_key = api_key
|
7
|
+
@api_hash = api_hash
|
8
|
+
end
|
9
|
+
|
10
|
+
def balance
|
11
|
+
payload = {
|
12
|
+
request: {
|
13
|
+
authentication: {
|
14
|
+
key: @api_key,
|
15
|
+
hash: @api_hash
|
16
|
+
}
|
17
|
+
}
|
18
|
+
}
|
19
|
+
|
20
|
+
response = @http_client.post('get-balance/json', json: payload)
|
21
|
+
|
22
|
+
Responses::AccountResponse.new(response[:body], response[:status])
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module IletimerkeziSdk
|
2
|
+
module Services
|
3
|
+
class BlacklistService
|
4
|
+
def initialize(http_client, api_key, api_hash)
|
5
|
+
@http_client = http_client
|
6
|
+
@api_key = api_key
|
7
|
+
@api_hash = api_hash
|
8
|
+
@last_start_date = nil
|
9
|
+
@last_end_date = nil
|
10
|
+
@last_page = nil
|
11
|
+
end
|
12
|
+
|
13
|
+
def list(start_date = nil, end_date = nil, page = 1)
|
14
|
+
|
15
|
+
@last_start_date = start_date
|
16
|
+
@last_end_date = end_date
|
17
|
+
@last_page = page
|
18
|
+
|
19
|
+
payload = {
|
20
|
+
request: {
|
21
|
+
authentication: {
|
22
|
+
key: @api_key,
|
23
|
+
hash: @api_hash
|
24
|
+
},
|
25
|
+
blacklist: {
|
26
|
+
page: page,
|
27
|
+
rowCount: 1000
|
28
|
+
}
|
29
|
+
}
|
30
|
+
}
|
31
|
+
|
32
|
+
if start_date && end_date
|
33
|
+
payload[:request][:blacklist][:filter] = {
|
34
|
+
start: start_date,
|
35
|
+
end: end_date
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
response = @http_client.post('get-blacklist/json', json: payload)
|
40
|
+
Responses::BlacklistResponse.new(response[:body], response[:status])
|
41
|
+
end
|
42
|
+
|
43
|
+
def next
|
44
|
+
return nil unless @last_page
|
45
|
+
|
46
|
+
list(@last_start_date, @last_end_date, @last_page + 1)
|
47
|
+
end
|
48
|
+
|
49
|
+
def add(numbers)
|
50
|
+
payload = {
|
51
|
+
request: {
|
52
|
+
authentication: {
|
53
|
+
key: @api_key,
|
54
|
+
hash: @api_hash
|
55
|
+
},
|
56
|
+
blacklist: {
|
57
|
+
number: Array(numbers).first
|
58
|
+
}
|
59
|
+
}
|
60
|
+
}
|
61
|
+
|
62
|
+
response = @http_client.post('add-blacklist/json', json: payload)
|
63
|
+
Responses::BaseResponse.new(response[:body], response[:status])
|
64
|
+
end
|
65
|
+
|
66
|
+
def delete(numbers)
|
67
|
+
payload = {
|
68
|
+
request: {
|
69
|
+
authentication: {
|
70
|
+
key: @api_key,
|
71
|
+
hash: @api_hash
|
72
|
+
},
|
73
|
+
blacklist: {
|
74
|
+
number: Array(numbers).first
|
75
|
+
}
|
76
|
+
}
|
77
|
+
}
|
78
|
+
|
79
|
+
response = @http_client.post('delete-blacklist/json', json: payload)
|
80
|
+
Responses::BaseResponse.new(response[:body], response[:status])
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module IletimerkeziSdk
|
2
|
+
module Services
|
3
|
+
class ReportService
|
4
|
+
def initialize(http_client, api_key, api_hash)
|
5
|
+
@http_client = http_client
|
6
|
+
@api_key = api_key
|
7
|
+
@api_hash = api_hash
|
8
|
+
@last_order_id = nil
|
9
|
+
@last_page = nil
|
10
|
+
end
|
11
|
+
|
12
|
+
def get(order_id, page = 1, row_count = 1000)
|
13
|
+
@last_order_id = order_id
|
14
|
+
@last_page = page
|
15
|
+
|
16
|
+
payload = {
|
17
|
+
request: {
|
18
|
+
authentication: {
|
19
|
+
key: @api_key,
|
20
|
+
hash: @api_hash
|
21
|
+
},
|
22
|
+
order: {
|
23
|
+
id: order_id,
|
24
|
+
page: page,
|
25
|
+
rowCount: row_count
|
26
|
+
}
|
27
|
+
}
|
28
|
+
}
|
29
|
+
|
30
|
+
response = @http_client.post('get-report/json', json: payload)
|
31
|
+
Responses::ReportResponse.new(response[:body], response[:status], page)
|
32
|
+
end
|
33
|
+
|
34
|
+
def next
|
35
|
+
return nil unless @last_order_id && @last_page
|
36
|
+
|
37
|
+
get(@last_order_id, @last_page + 1)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module IletimerkeziSdk
|
2
|
+
module Services
|
3
|
+
class SenderService
|
4
|
+
def initialize(http_client, api_key, api_hash)
|
5
|
+
@http_client = http_client
|
6
|
+
@api_key = api_key
|
7
|
+
@api_hash = api_hash
|
8
|
+
end
|
9
|
+
|
10
|
+
def list
|
11
|
+
payload = {
|
12
|
+
request: {
|
13
|
+
authentication: {
|
14
|
+
key: @api_key,
|
15
|
+
hash: @api_hash
|
16
|
+
}
|
17
|
+
}
|
18
|
+
}
|
19
|
+
|
20
|
+
response = @http_client.post('get-sender/json', json: payload)
|
21
|
+
Responses::SenderResponse.new(response[:body], response[:status])
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
module IletimerkeziSdk
|
2
|
+
module Services
|
3
|
+
class SmsService
|
4
|
+
def initialize(http_client, api_key, api_hash, default_sender = nil)
|
5
|
+
@http_client = http_client
|
6
|
+
@api_key = api_key
|
7
|
+
@api_hash = api_hash
|
8
|
+
@default_sender = default_sender
|
9
|
+
@send_datetime = ''
|
10
|
+
@iys = '1'
|
11
|
+
@iys_list = 'BIREYSEL'
|
12
|
+
end
|
13
|
+
|
14
|
+
def schedule(send_datetime)
|
15
|
+
@send_datetime = send_datetime
|
16
|
+
self
|
17
|
+
end
|
18
|
+
|
19
|
+
def enable_iys_consent
|
20
|
+
@iys = '1'
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
24
|
+
def disable_iys_consent
|
25
|
+
@iys = '0'
|
26
|
+
self
|
27
|
+
end
|
28
|
+
|
29
|
+
def send(recipients, message, sender = nil)
|
30
|
+
payload = {
|
31
|
+
request: {
|
32
|
+
authentication: {
|
33
|
+
key: @api_key,
|
34
|
+
hash: @api_hash
|
35
|
+
},
|
36
|
+
order: {
|
37
|
+
sender: sender || @default_sender,
|
38
|
+
message: {
|
39
|
+
text: message,
|
40
|
+
receipents: {
|
41
|
+
number: recipients
|
42
|
+
}
|
43
|
+
},
|
44
|
+
iys: @iys,
|
45
|
+
iyslist: @iys_list
|
46
|
+
}
|
47
|
+
}
|
48
|
+
}
|
49
|
+
|
50
|
+
payload[:request][:order][:send_datetime] = @send_datetime unless @send_datetime.empty?
|
51
|
+
|
52
|
+
response = @http_client.post('send-sms/json', json: payload)
|
53
|
+
IletimerkeziSdk::Responses::SmsResponse.new(response[:body], response[:status])
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module IletimerkeziSdk
|
2
|
+
module Services
|
3
|
+
class SummaryService
|
4
|
+
def initialize(http_client, api_key, api_hash)
|
5
|
+
@http_client = http_client
|
6
|
+
@api_key = api_key
|
7
|
+
@api_hash = api_hash
|
8
|
+
@last_start_date = nil
|
9
|
+
@last_end_date = nil
|
10
|
+
@last_page = nil
|
11
|
+
end
|
12
|
+
|
13
|
+
def list(start_date, end_date, page = 1)
|
14
|
+
@last_start_date = start_date
|
15
|
+
@last_end_date = end_date
|
16
|
+
@last_page = page
|
17
|
+
|
18
|
+
payload = {
|
19
|
+
request: {
|
20
|
+
authentication: {
|
21
|
+
key: @api_key,
|
22
|
+
hash: @api_hash
|
23
|
+
},
|
24
|
+
filter: {
|
25
|
+
start: start_date,
|
26
|
+
end: end_date
|
27
|
+
},
|
28
|
+
page: page
|
29
|
+
}
|
30
|
+
}
|
31
|
+
|
32
|
+
response = @http_client.post('get-reports/json', json: payload)
|
33
|
+
IletimerkeziSdk::Responses::SummaryResponse.new(response[:body], response[:status], page)
|
34
|
+
end
|
35
|
+
|
36
|
+
def next
|
37
|
+
return nil unless @last_start_date && @last_end_date && @last_page
|
38
|
+
|
39
|
+
list(@last_start_date, @last_end_date, @last_page + 1)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module IletimerkeziSdk
|
2
|
+
module Services
|
3
|
+
class WebhookService
|
4
|
+
def handle(request_body = nil)
|
5
|
+
# Eğer request_body verilmemişse, Rack/Rails raw body'den oku
|
6
|
+
raw_body = request_body || read_raw_body
|
7
|
+
|
8
|
+
raise ArgumentError, 'No POST data received' if raw_body.nil? || raw_body.empty?
|
9
|
+
|
10
|
+
begin
|
11
|
+
data = JSON.parse(raw_body)
|
12
|
+
rescue JSON::ParserError
|
13
|
+
raise ArgumentError, 'Invalid JSON payload'
|
14
|
+
end
|
15
|
+
|
16
|
+
Models::WebhookReport.new(data)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def read_raw_body
|
22
|
+
if defined?(Rails)
|
23
|
+
Rails.application.env_config['rack.input'].read
|
24
|
+
else
|
25
|
+
# Rack uyumlu raw body okuma
|
26
|
+
request_body = nil
|
27
|
+
if defined?(request) && request.respond_to?(:body)
|
28
|
+
request_body = request.body.read
|
29
|
+
end
|
30
|
+
request_body
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'iletimerkezi_sdk/version'
|
4
|
+
require_relative 'iletimerkezi_sdk/models/summary_report'
|
5
|
+
require_relative 'iletimerkezi_sdk/responses/base_response'
|
6
|
+
require_relative 'iletimerkezi_sdk/responses/sms_response'
|
7
|
+
require_relative 'iletimerkezi_sdk/responses/account_response'
|
8
|
+
require_relative 'iletimerkezi_sdk/responses/sender_response'
|
9
|
+
require_relative 'iletimerkezi_sdk/responses/blacklist_response'
|
10
|
+
require_relative 'iletimerkezi_sdk/responses/report_response'
|
11
|
+
require_relative 'iletimerkezi_sdk/responses/summary_response'
|
12
|
+
require_relative 'iletimerkezi_sdk/client'
|
13
|
+
require_relative 'iletimerkezi_sdk/http/http_client_interface'
|
14
|
+
require_relative 'iletimerkezi_sdk/http/http_client'
|
15
|
+
require_relative 'iletimerkezi_sdk/http/net_http_client'
|
16
|
+
require_relative 'iletimerkezi_sdk/services/sms_service'
|
17
|
+
require_relative 'iletimerkezi_sdk/services/account_service'
|
18
|
+
require_relative 'iletimerkezi_sdk/services/sender_service'
|
19
|
+
require_relative 'iletimerkezi_sdk/services/blacklist_service'
|
20
|
+
require_relative 'iletimerkezi_sdk/services/webhook_service'
|
21
|
+
require_relative 'iletimerkezi_sdk/services/report_service'
|
22
|
+
require_relative 'iletimerkezi_sdk/services/summary_service'
|
23
|
+
|
24
|
+
module IletimerkeziSdk
|
25
|
+
class Error < StandardError; end
|
26
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "iletimerkezi_sdk"
|
4
|
+
|
5
|
+
RSpec.configure do |config|
|
6
|
+
# Enable flags like --only-failures and --next-failure
|
7
|
+
config.example_status_persistence_file_path = ".rspec_status"
|
8
|
+
|
9
|
+
# Disable RSpec exposing methods globally on `Module` and `main`
|
10
|
+
config.disable_monkey_patching!
|
11
|
+
|
12
|
+
config.expect_with :rspec do |c|
|
13
|
+
c.syntax = :expect
|
14
|
+
end
|
15
|
+
end
|
metadata
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: iletimerkezi_sdk
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Destek Ekibi
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2024-12-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rake
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '13.0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '13.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.0'
|
41
|
+
description: İletiMerkezi SMS API'ını kullanarak SMS gönderimi yapmanızı sağlayan
|
42
|
+
nodejs kütüphanesidir.
|
43
|
+
email:
|
44
|
+
- destek@emarka.com.tr
|
45
|
+
executables: []
|
46
|
+
extensions: []
|
47
|
+
extra_rdoc_files: []
|
48
|
+
files:
|
49
|
+
- LICENSE.md
|
50
|
+
- README.md
|
51
|
+
- lib/iletimerkezi_sdk.rb
|
52
|
+
- lib/iletimerkezi_sdk/client.rb
|
53
|
+
- lib/iletimerkezi_sdk/http/http_client.rb
|
54
|
+
- lib/iletimerkezi_sdk/http/http_client_interface.rb
|
55
|
+
- lib/iletimerkezi_sdk/http/net_http_client.rb
|
56
|
+
- lib/iletimerkezi_sdk/models/summary_report.rb
|
57
|
+
- lib/iletimerkezi_sdk/models/webhook_report.rb
|
58
|
+
- lib/iletimerkezi_sdk/responses/account_response.rb
|
59
|
+
- lib/iletimerkezi_sdk/responses/base_response.rb
|
60
|
+
- lib/iletimerkezi_sdk/responses/blacklist_response.rb
|
61
|
+
- lib/iletimerkezi_sdk/responses/report_response.rb
|
62
|
+
- lib/iletimerkezi_sdk/responses/sender_response.rb
|
63
|
+
- lib/iletimerkezi_sdk/responses/sms_response.rb
|
64
|
+
- lib/iletimerkezi_sdk/responses/summary_response.rb
|
65
|
+
- lib/iletimerkezi_sdk/services/account_service.rb
|
66
|
+
- lib/iletimerkezi_sdk/services/blacklist_service.rb
|
67
|
+
- lib/iletimerkezi_sdk/services/report_service.rb
|
68
|
+
- lib/iletimerkezi_sdk/services/sender_service.rb
|
69
|
+
- lib/iletimerkezi_sdk/services/sms_service.rb
|
70
|
+
- lib/iletimerkezi_sdk/services/summary_service.rb
|
71
|
+
- lib/iletimerkezi_sdk/services/webhook_service.rb
|
72
|
+
- lib/iletimerkezi_sdk/version.rb
|
73
|
+
- spec/iletimerkezi_sdk_spec.rb
|
74
|
+
- spec/spec_helper.rb
|
75
|
+
homepage: https://github.com/iletimerkezi/iletimerkezi-ruby
|
76
|
+
licenses:
|
77
|
+
- MIT
|
78
|
+
metadata:
|
79
|
+
homepage_uri: https://github.com/iletimerkezi/iletimerkezi-ruby
|
80
|
+
source_code_uri: https://github.com/iletimerkezi/iletimerkezi-ruby
|
81
|
+
changelog_uri: https://github.com/iletimerkezi/iletimerkezi-ruby/blob/master/UPGRADE.md
|
82
|
+
post_install_message:
|
83
|
+
rdoc_options: []
|
84
|
+
require_paths:
|
85
|
+
- lib
|
86
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - ">="
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: 2.6.0
|
91
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
requirements: []
|
97
|
+
rubygems_version: 3.4.20
|
98
|
+
signing_key:
|
99
|
+
specification_version: 4
|
100
|
+
summary: Ruby kütüphanesi, iletimerkezi.com API
|
101
|
+
test_files: []
|