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 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,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module IletimerkeziSdk
4
+ VERSION = "1.0.0"
5
+ 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
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ RSpec.describe IletimerkeziSdk do
4
+ it "has a version number" do
5
+ expect(IletimerkeziSdk::VERSION).not_to be nil
6
+ end
7
+
8
+ it "does something useful" do
9
+ expect(false).to eq(true)
10
+ end
11
+ end
@@ -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: []