dibuk 0.0.1

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.
@@ -0,0 +1,31 @@
1
+ module Dibuk
2
+ class Client
3
+ extend Dry::Initializer::Mixin
4
+
5
+ option :seller_id
6
+ option :signature
7
+ option :sandbox, default: proc { false }
8
+
9
+ def license(user, item)
10
+ request = Dibuk::Request::License.new(user, item)
11
+ Dibuk::Response::Licensed.new(http_response: call(request))
12
+ end
13
+
14
+ def send(user, item, email)
15
+ request = Dibuk::Request::Send.new(user, item, email)
16
+ Dibuk::Response::Sent.new(http_response: call(request))
17
+ end
18
+
19
+ def links(user, item)
20
+ request = Dibuk::Request::Links.new(user, item)
21
+ Dibuk::Response::Linked.new(http_response: call(request))
22
+ end
23
+
24
+ private
25
+
26
+ def call(request)
27
+ http_request = Dibuk::HttpRequest.new(request: request, seller_id: seller_id, signature: signature, sandbox: sandbox)
28
+ http_request.call
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,63 @@
1
+ module Dibuk
2
+ class HttpRequest
3
+
4
+ ENDPOINT_URL = 'https://agregator.dibuk.eu/2_3/call.php'.freeze
5
+ ENDPOINT_SANDBOX_URL = 'https://sandbox.dibuk.eu/agregator/2_3/call.php'.freeze
6
+
7
+ extend Dry::Initializer::Mixin
8
+
9
+ option :request
10
+ option :seller_id
11
+ option :signature
12
+ option :sandbox, default: proc { false }
13
+
14
+
15
+ def call
16
+ # pr endpoint
17
+ # pr body_sign
18
+ uri = URI(endpoint)
19
+
20
+ net_http = Net::HTTP.new(uri.host, uri.port)
21
+ net_http.use_ssl=true
22
+ request = Net::HTTP::Post.new(uri)
23
+
24
+ net_http.start do |http|
25
+ post_data = URI.encode_www_form(body_sign)
26
+ http.request(request, post_data)
27
+ end
28
+ end
29
+
30
+ def endpoint
31
+ sandbox? ? ENDPOINT_SANDBOX_URL : ENDPOINT_URL
32
+ end
33
+
34
+ def sandbox?
35
+ sandbox
36
+ end
37
+
38
+ def body_sign
39
+ params = {
40
+ :a => request.action,
41
+ :v => ::Dibuk::API_VERSION,
42
+ :did => seller_id
43
+ }
44
+ request.body.each do |key, value|
45
+ params[key] = value
46
+ end
47
+
48
+ query = ''
49
+ params.each do |key, value|
50
+ query += '&' unless query == ''
51
+ query += key.to_s
52
+ query += '=' + CGI.escape(value)
53
+ end
54
+
55
+ #ph = Faraday::Utils::ParamsHash.new
56
+ #ph.update(params)
57
+ #puts ph.to_query wrong, changing order of keys
58
+
59
+ params[:ch] = OpenSSL::HMAC.hexdigest("sha1", Base64.decode64(signature), query)
60
+ params
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,12 @@
1
+ module Dibuk
2
+ class Item
3
+ extend Dry::Initializer::Mixin
4
+
5
+ option :id
6
+ option :order_id
7
+ option :payment_id
8
+ option :price
9
+ option :currency
10
+ option :unique_id
11
+ end
12
+ end
@@ -0,0 +1,8 @@
1
+ module Dibuk
2
+ module Request
3
+ require_relative "request/base"
4
+ require_relative "request/license"
5
+ require_relative "request/links"
6
+ require_relative "request/send"
7
+ end
8
+ end
@@ -0,0 +1,24 @@
1
+ module Dibuk::Request
2
+ class Base
3
+
4
+ def method
5
+ 'POST'
6
+ end
7
+
8
+ def body
9
+ ''
10
+ end
11
+
12
+ def headers
13
+ {
14
+ 'Content-Type' => 'application/json',
15
+ #'Authorization' => "Bearer #{client.auth_token}"
16
+ }
17
+ end
18
+
19
+ # @return [String]
20
+ def action
21
+ raise 'Action should be implemented'
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,30 @@
1
+ module Dibuk::Request
2
+ class License < Base
3
+ # @param [User] user
4
+ # @param [Item] item
5
+ # @return [self]
6
+ def initialize(user, item)
7
+ @item = item
8
+ @user = user
9
+ end
10
+
11
+ def body
12
+ {
13
+ :book_id => @item.id,
14
+ :user_id => @user.id,
15
+ :user_email => @user.email,
16
+ :user_order => @item.order_id,
17
+ :seller_price => @item.price,
18
+ :payment_channel => @item.payment_id,
19
+ :user_name => @user.name,
20
+ :user_surname => @user.surname,
21
+ :uniq_license_id => @item.unique_id,
22
+ }
23
+ end
24
+
25
+ # @return [String]
26
+ def action
27
+ 'buy'
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,25 @@
1
+ module Dibuk::Request
2
+ class Links < Base
3
+ # @param [User] user
4
+ # @param [Item] item
5
+ def initialize(user, item)
6
+ @item = item
7
+ @user = user
8
+ end
9
+
10
+ def body
11
+ {
12
+ :book_id => @item.id,
13
+ :user_id => @user.id,
14
+ :user_name => @user.name,
15
+ :user_surname => @user.surname,
16
+ :user_email => @user.email,
17
+ }
18
+ end
19
+
20
+ # @return [String]
21
+ def action
22
+ 'downloadLinks'
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,30 @@
1
+ module Dibuk::Request
2
+ class Send < Base
3
+ # @param [User] user
4
+ # @param [Item] item
5
+ # @param [string] email
6
+ # @return [Response]
7
+ def initialize(user, item, email)
8
+ @item = item
9
+ @user = user
10
+ @email = email
11
+ end
12
+
13
+ # @return [Hash{Symbol->String}]
14
+ def body
15
+ {
16
+ :book_id => @item.id,
17
+ :send_to_email => @user.email,
18
+ :user_id => @user.id,
19
+ :user_name => @user.name,
20
+ :user_surname => @user.surname,
21
+ :user_email => @user.email,
22
+ }
23
+ end
24
+
25
+ # @return [String]
26
+ def action
27
+ 'sendByEmail'
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,8 @@
1
+ module Dibuk
2
+ module Response
3
+ require_relative "response/base"
4
+ require_relative "response/licensed"
5
+ require_relative "response/linked"
6
+ require_relative "response/sent"
7
+ end
8
+ end
@@ -0,0 +1,68 @@
1
+ module Dibuk::Response
2
+ class Base
3
+ extend Dry::Initializer::Mixin
4
+
5
+ option :http_response
6
+
7
+ SUCCESS_HTTP_STATUSES = [200].freeze
8
+ SUCCESS_STATUSES = ['SUCCESS'].freeze
9
+
10
+ def success?
11
+ http_success? && status_success?
12
+ end
13
+
14
+ def error?
15
+ !success?
16
+ end
17
+
18
+ def error_code
19
+ return unless error?
20
+ body[:eNum].to_s
21
+ end
22
+
23
+ def error_data
24
+ return unless error?
25
+ body[:eData]
26
+ end
27
+
28
+ def limit_exceeded?
29
+ error_code == '2015'
30
+ end
31
+
32
+ def not_buyed?
33
+ error_code == '2004'
34
+ end
35
+
36
+ def body
37
+ return unless raw_body
38
+ @body ||=
39
+ begin
40
+ JSON.parse(raw_body, symbolize_names: true)
41
+ rescue => e
42
+ raise InvalidResponseError, e.message
43
+ end
44
+ end
45
+
46
+ def http_status_ok
47
+ @http_status_ok ||= http_response.instance_of? Net::HTTPOK
48
+ end
49
+
50
+ private
51
+
52
+ def http_success?
53
+ http_status_ok
54
+ end
55
+
56
+ def status_success?
57
+ self.class::SUCCESS_STATUSES.include?(status)
58
+ end
59
+
60
+ def status
61
+ body[:status] || ''
62
+ end
63
+
64
+ def raw_body
65
+ @raw_body ||= http_response.body
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,9 @@
1
+ module Dibuk::Response
2
+ class Licensed < Base
3
+ SUCCESS_HTTP_STATUSES = [200].freeze
4
+ SUCCESS_STATUSES = [
5
+ 'OK',
6
+ 'HAVEYET',
7
+ ].freeze
8
+ end
9
+ end
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dibuk::Response
4
+ class Linked < Base
5
+ SUCCESS_HTTP_STATUSES = [200].freeze
6
+ SUCCESS_STATUSES = [
7
+ 'OK'
8
+ ].freeze
9
+
10
+ @@formats = {
11
+ "3": {
12
+ 'title': 'EPUB',
13
+ 'code': 'epub',
14
+ 'mimetype': 'application/epub+zip'
15
+ },
16
+ "4": {
17
+ 'title': 'PDF',
18
+ 'code': 'pdf',
19
+ 'mimetype': 'application/pdf'
20
+ },
21
+ "5": {
22
+ 'title': 'MOBI',
23
+ 'code': 'mobi',
24
+ 'mimetype': 'application/x-mobipocket-ebook'
25
+ },
26
+ "1": {
27
+ 'title': 'EPUB (Adobe DRM)',
28
+ 'code': 'acs_epub',
29
+ 'mimetype': 'application/epub+zip'
30
+ },
31
+ "2": {
32
+ 'title': 'PDF (Adobe DRM)',
33
+ 'code': 'acs_pdf',
34
+ 'mimetype': 'application/pdf'
35
+ },
36
+ "6": {'title': 'EPUB', 'code': 'social_epub', 'mimetype': 'application/epub+zip'},
37
+ "7": {'title': 'PDF', 'code': 'social_pdf', 'mimetype': 'application/pdf'},
38
+ "8": {'title': 'MOBI', 'code': 'social_mobi', 'mimetype': 'application/x-mobipocket-ebook'},
39
+ "9 ": {'title': 'MP3', 'code': 'mp3', 'mimetype': 'audio/mpeg'}
40
+ }
41
+
42
+
43
+ def all
44
+ @formats || parse_formats
45
+ end
46
+
47
+ def epub
48
+ get_format "epub"
49
+ end
50
+
51
+ private
52
+
53
+ def parse_formats
54
+ @formats || begin
55
+ @formats = {}
56
+ body[:data].each do |num, url|
57
+ @formats[@@formats[num][:code]] = url
58
+ end
59
+ @formats
60
+ end
61
+ end
62
+
63
+ # @param [String] format
64
+ # @return [String] download url
65
+ def get_format(format)
66
+ parse_formats
67
+ @formats[format]
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,26 @@
1
+ module Dibuk::Response
2
+ class Sent < Base
3
+ SUCCESS_HTTP_STATUSES = [200].freeze
4
+ SUCCESS_STATUSES = [
5
+ 'OK'
6
+ ].freeze
7
+
8
+ WRONG_EMAIL_CODES = [
9
+ '2010', #email is not valid
10
+ '2011', #email domain is not supported
11
+ ].freeze
12
+
13
+ NOT_AVAILABLE_FORMAT_CODES = [
14
+ '2012', #format for this email is not available
15
+ '2022', #PDF size is limited to 50MB
16
+ ].freeze
17
+
18
+ def wrong_email?
19
+ self.class::WRONG_EMAIL_CODES.include?(status)
20
+ end
21
+
22
+ def not_available_format?
23
+ self.class::NOT_AVAILABLE_FORMAT_CODES.include?(status)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,11 @@
1
+ module Dibuk
2
+ class User
3
+ extend Dry::Initializer::Mixin
4
+
5
+ option :id
6
+ option :email
7
+ option :name
8
+ option :surname
9
+
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dibuk
4
+ VERSION = '0.0.1'
5
+ API_VERSION = '2.3'
6
+ end
metadata ADDED
@@ -0,0 +1,136 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dibuk
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Samuel Szabo
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2020-10-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dry-initializer
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.4'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.4'
27
+ - !ruby/object:Gem::Dependency
28
+ name: webmock
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '3.1'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '3.1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rubocop-performance
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.5'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.5'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop-rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.36'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.36'
69
+ description: Dibuk allow you to download purchased ebooks.
70
+ email:
71
+ - info@dibuk.eu
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".github/workflows/ruby.yml"
77
+ - ".gitignore"
78
+ - ".idea/.gitignore"
79
+ - ".idea/.rakeTasks"
80
+ - ".idea/dibuk.iml"
81
+ - ".idea/inspectionProfiles/Project_Default.xml"
82
+ - ".idea/misc.xml"
83
+ - ".idea/modules.xml"
84
+ - ".idea/vcs.xml"
85
+ - CODE_OF_CONDUCT.md
86
+ - Gemfile
87
+ - Gemfile.lock
88
+ - LICENSE.txt
89
+ - README.md
90
+ - Rakefile
91
+ - bin/console
92
+ - bin/setup
93
+ - dibuk.gemspec
94
+ - lib/dibuk.rb
95
+ - lib/dibuk/client.rb
96
+ - lib/dibuk/http_request.rb
97
+ - lib/dibuk/item.rb
98
+ - lib/dibuk/request.rb
99
+ - lib/dibuk/request/base.rb
100
+ - lib/dibuk/request/license.rb
101
+ - lib/dibuk/request/links.rb
102
+ - lib/dibuk/request/send.rb
103
+ - lib/dibuk/response.rb
104
+ - lib/dibuk/response/base.rb
105
+ - lib/dibuk/response/licensed.rb
106
+ - lib/dibuk/response/linked.rb
107
+ - lib/dibuk/response/sent.rb
108
+ - lib/dibuk/user.rb
109
+ - lib/dibuk/version.rb
110
+ homepage: https://www.dibuk.eu
111
+ licenses:
112
+ - MIT
113
+ metadata:
114
+ homepage_uri: https://www.dibuk.eu
115
+ source_code_uri: http://github.com/dibukeu/client-rb
116
+ changelog_uri: http://github.com/dibukeu/client-rb/releases
117
+ post_install_message:
118
+ rdoc_options: []
119
+ require_paths:
120
+ - lib
121
+ required_ruby_version: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - ">="
124
+ - !ruby/object:Gem::Version
125
+ version: 2.3.0
126
+ required_rubygems_version: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ requirements: []
132
+ rubygems_version: 3.1.2
133
+ signing_key:
134
+ specification_version: 4
135
+ summary: Ruby wrapper for Dibuk API
136
+ test_files: []