amocrm-rails 0.0.2 → 0.0.6

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.
data/lib/amocrm-rails.rb CHANGED
@@ -2,32 +2,54 @@ require 'amocrm-rails/amocrm_error'
2
2
  require 'amocrm-rails/request'
3
3
  require 'amocrm-rails/api_request'
4
4
  require 'amocrm-rails/response'
5
+ require 'concern'
6
+ require 'helper'
5
7
 
6
8
  module AmocrmRails
7
9
  class << self
8
- def generate_access_token(client_id=AmocrmRails.client_id, client_secret=AmocrmRails.client_secret, refresh_token=nil, count=0)
10
+ def generate_access_token(**options)
11
+ user_id = AmocrmRails.try(:user_id)
12
+ client_id = options[:client_id] || AmocrmRails.client_id
13
+ client_secret = options[:client_secret] || AmocrmRails.client_secret
14
+ refresh_token = options[:refresh_token] || AmocrmRails.try(:refresh_token)
15
+ count = options[:count].to_i
9
16
  params = {
10
17
  client_id: client_id,
11
18
  client_secret: client_secret,
12
- grant_type: 'authorization_code',
13
- redirect_uri: AmocrmRails.redirect_uri
14
19
  }
15
20
  if refresh_token.present?
21
+ params[:grant_type] = 'refresh_token'
16
22
  params[:refresh_token] = refresh_token
17
23
  else
24
+ params[:grant_type] = 'authorization_code'
18
25
  params[:code] = AmocrmRails.code
19
26
  end
27
+ params[:redirect_uri] = AmocrmRails.redirect_uri
20
28
  response = Faraday.post(AmocrmRails.url_token, params.to_json, "Content-Type" => "application/json")
21
- if response.status < 200 || response.status > 204
29
+ if AmocrmRails::Request.debug
30
+ logger = AmocrmRails::Request.logger || ::Logger.new(STDOUT)
31
+ logger.info "---generate_access_token---"
32
+ logger.info "params: #{params}"
33
+ logger.info "Responding with #{response.status.inspect} => #{response.body.inspect}"
34
+ end
35
+ if response.status >= 200 && response.status <= 204
22
36
  response_token = JSON.parse(response.body)
23
37
  data = YAML.load_file("config/amocrm_token.yml")
24
38
  response_token.each do |k, v|
25
- data[k] = v
26
- AmocrmRails::register k.underscore.to_sym, v
39
+ if user_id.present?
40
+ data[user_id] = {} if data[user_id].nil?
41
+ data[user_id][k] = v
42
+ else
43
+ data[k] = v
44
+ end
45
+ AmocrmRails::register(k.underscore.to_sym, v)
27
46
  end
28
47
  File.open("config/amocrm_token.yml", 'w') { |f| YAML.dump(data, f) }
29
- elsif count < 3
30
- AmocrmRails.generate_access_token(client_id, client_secret, AmocrmRails.refresh_token, count+1)
48
+ elsif count < 3 && AmocrmRails.refresh_token.present?
49
+ AmocrmRails.generate_access_token(client_id: client_id,
50
+ client_secret: client_secret,
51
+ refresh_token:AmocrmRails.refresh_token,
52
+ count: count+1)
31
53
  end
32
54
  end
33
55
 
@@ -14,9 +14,12 @@ module AmocrmRails
14
14
  end
15
15
  parse_response(response)
16
16
  rescue => e
17
- if e.response.try(:code) == 401 && first_time
17
+ if [401, 402].include?(e.response.dig(:status)) && first_time
18
18
  AmocrmRails.generate_access_token
19
19
  self.post(params: params, headers: headers, body: body, first_time: false)
20
+ elsif e.response.dig(:status) == 429
21
+ sleep(1.second)
22
+ self.post(params: params, headers: headers, body: body, first_time: false)
20
23
  else
21
24
  handle_error(e)
22
25
  end
@@ -32,9 +35,12 @@ module AmocrmRails
32
35
  end
33
36
  parse_response(response)
34
37
  rescue => e
35
- if e.response.try(:code) == 401 && first_time
38
+ if [401, 402].include?(e.response.dig(:status)) && first_time
36
39
  AmocrmRails.generate_access_token
37
40
  self.patch(params: params, headers: headers, body: body, first_time: false)
41
+ elsif e.response.try(:status) == 429
42
+ sleep(1.second)
43
+ self.patch(params: params, headers: headers, body: body, first_time: false)
38
44
  else
39
45
  handle_error(e)
40
46
  end
@@ -50,9 +56,12 @@ module AmocrmRails
50
56
  end
51
57
  parse_response(response)
52
58
  rescue => e
53
- if e.response.try(:code) == 401 && first_time
59
+ if [401, 402].include?(e.response.dig(:status)) && first_time
54
60
  AmocrmRails.generate_access_token
55
61
  self.put(params: params, headers: headers, body: body, first_time: false)
62
+ elsif e.response.dig(:status) == 429
63
+ sleep(1.second)
64
+ self.put(params: params, headers: headers, body: body, first_time: false)
56
65
  else
57
66
  handle_error(e)
58
67
  end
@@ -68,9 +77,12 @@ module AmocrmRails
68
77
  end
69
78
  parse_response(response)
70
79
  rescue => e
71
- if e.response.try(:code) == 401 && first_time
80
+ if [401, 402].include?(e.response.dig(:status)) && first_time
72
81
  AmocrmRails.generate_access_token
73
82
  self.get(params: params, headers: headers, first_time: false)
83
+ elsif e.response.try(:status) == 429
84
+ sleep(1.second)
85
+ self.get(params: params, headers: headers, body: body, first_time: false)
74
86
  else
75
87
  handle_error(e)
76
88
  end
@@ -86,9 +98,12 @@ module AmocrmRails
86
98
  end
87
99
  parse_response(response)
88
100
  rescue => e
89
- if e.response.try(:code) == 401 && first_time
101
+ if [401, 402].include?(e.response.dig(:status)) && first_time
90
102
  AmocrmRails.generate_access_token
91
103
  self.delete(params: params, headers: headers, first_time: false)
104
+ elsif e.response.try(:stattus) == 429
105
+ sleep(1.second)
106
+ self.delete(params: params, headers: headers, body: body, first_time: false)
92
107
  else
93
108
  handle_error(e)
94
109
  end
@@ -211,7 +226,7 @@ module AmocrmRails
211
226
  end
212
227
 
213
228
  def base_api_url
214
- "#{AmocrmRails.api_endpoint}/api/v2/"
229
+ "#{AmocrmRails.api_endpoint}/api/v4/"
215
230
  end
216
231
  end
217
232
  end
data/lib/concern.rb ADDED
@@ -0,0 +1,30 @@
1
+ module AmocrmRails
2
+ module Concern
3
+ extend ActiveSupport::Concern
4
+
5
+ private
6
+
7
+ def update_auth_code
8
+ if user_signed_in?
9
+ AmocrmRails::register :user_id, current_user.id
10
+ if File.exist?('config/amocrm.yml')
11
+ data = YAML.load_file('config/amocrm.yml')
12
+ return nil if data.dig(Rails.env, current_user.id).nil?
13
+ data[Rails.env][current_user.id].each do |k, v|
14
+ AmocrmRails::register k.underscore.to_sym, v
15
+ end
16
+
17
+ if File.exist?('config/amocrm_token.yml')
18
+ token_data = YAML.load_file("config/amocrm_token.yml")
19
+ token_data[current_user.id] = {} if data.dig(current_user.id).nil?
20
+ token_data[current_user.id].each do |k, v|
21
+ config::register k.underscore.to_sym, v
22
+ end
23
+ end
24
+
25
+ AmocrmRails.generate_access_token if AmocrmRails.access_token.nil? && AmocrmRails.code.present?
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -4,10 +4,31 @@ module AmocrmRails
4
4
  class InstallGenerator < Rails::Generators::Base
5
5
  source_root File.expand_path('templates', __dir__)
6
6
 
7
+ class_option :with, type: :string, default: ''
8
+
7
9
  def generate_install
8
- copy_file 'amocrm.yml', 'config/amocrm.yml'
10
+ with = options['with']
9
11
  copy_file 'amocrm_token.yml', 'config/amocrm_token.yml'
10
- copy_file 'amocrm.rb', 'config/initializers/amocrm.rb'
12
+
13
+ if with.to_s.downcase == 'devise'
14
+ copy_file 'devise/app/controllers/amocrm_controller.rb', 'app/controllers/amocrm_controller.rb'
15
+ copy_file 'devise/app/views/amocrm/code.html.erb', 'app/views/amocrm/code.html.erb'
16
+ copy_file 'devise/app/views/amocrm/link.html.erb', 'app/views/amocrm/link.html.erb'
17
+ copy_file 'devise/config/amocrm.yml', 'config/amocrm.yml'
18
+ copy_file 'devise/config/initializers/amocrm.rb', 'config/initializers/amocrm.rb'
19
+ route "get '/amocrm' => 'amocrm#code'"
20
+ route "get '/amocrm/link' => 'amocrm#link'"
21
+ route "post '/amocrm/webhook/:name' => 'amocrm#webhook'"
22
+
23
+ inject_into_file 'app/controllers/application_controller.rb', after: "class ApplicationController < ActionController::Base\n" do <<-'RUBY'
24
+ include AmocrmRails::Concern
25
+ before_action :update_auth_code
26
+ RUBY
27
+ end
28
+ else
29
+ copy_file 'amocrm.rb', 'config/initializers/amocrm.rb'
30
+ copy_file 'amocrm.yml', 'config/amocrm.yml'
31
+ end
11
32
  end
12
33
  end
13
34
  end
@@ -15,8 +15,8 @@ AmocrmRails.setup do |config|
15
15
  end
16
16
  end
17
17
 
18
- config::Request.timeout = 15
19
- config::Request.open_timeout = 15
18
+ config::Request.timeout = 60
19
+ config::Request.open_timeout = 60
20
20
  config::Request.symbolize_keys = true
21
21
  config::Request.debug = false
22
22
  end
@@ -2,14 +2,11 @@ defaults: &defaults
2
2
  CLIENT_ID: '***'
3
3
  CLIENT_SECRET: '***'
4
4
  CODE: '***'
5
- redirect_uri: https://yourdomain.ru
5
+ redirect_uri: https://yourdomain.ru/amocrm
6
6
  api_endpoint: https://yourdomain.amocrm.ru
7
- URL_TOKEN: 'https://yourdomain.amocrm.ru/oauth2/access_token'
8
- REDIRECT_URI: 'https://yourdomain.com'
7
+ URL_TOKEN: https://yourdomain.amocrm.ru/oauth2/access_token
9
8
  production:
10
9
  <<: *defaults
11
- URL_TOKEN: 'https://yourdomain.amocrm.ru/oauth2/access_token'
12
- REDIRECT_URI: 'https://yourdomain.ru'
13
10
  development:
14
11
  <<: *defaults
15
12
  test:
@@ -1,4 +1,4 @@
1
1
  token_type: Bearer
2
2
  expires_in: 86400
3
3
  access_token: '***'
4
- refresh_token: '***'
4
+ refresh_token: ''
@@ -0,0 +1,33 @@
1
+ class AmocrmController < ApplicationController
2
+ before_action :authenticate_user!, except: [:webhook]
3
+
4
+ def link
5
+ end
6
+
7
+ def code
8
+ if current_user.id == params[:state].to_i
9
+ if File.exist?('config/amocrm.yml')
10
+ data = YAML.load_file('config/amocrm.yml')
11
+ data[Rails.env][current_user.id] = {} if data[Rails.env][current_user.id].nil?
12
+ params.each do |k, v|
13
+ data[Rails.env][current_user.id][k] = v
14
+ AmocrmRails::register k.underscore.to_sym, v
15
+ end
16
+ File.open("config/amocrm.yml", 'w') { |f| YAML.dump(data, f) }
17
+ end
18
+ end
19
+ @code = params[:code]
20
+ end
21
+
22
+ def webhook
23
+ webhook_name = params[:name]
24
+ end
25
+
26
+ private
27
+
28
+ def authenticate_user!
29
+ unless user_signed_in?
30
+ redirect_to new_user_session_path
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,6 @@
1
+ <div style="width: 100%; padding: 100px; text-align: center;">
2
+ Your code:
3
+ <code>
4
+ <%= @code %>
5
+ </code>
6
+ </div>
@@ -0,0 +1,6 @@
1
+ <div style="width: 100%; padding: 100px; text-align: center;">
2
+
3
+ <%= link_to "Установить интеграцию",
4
+ amocrm_oauth_url(state: current_user.try(:id)),
5
+ class: 'btn btn-primary' %>
6
+ </div>
@@ -0,0 +1,16 @@
1
+ require 'amocrm'
2
+
3
+ AmocrmRails.setup do |config|
4
+ if File.exist?('config/amocrm.yml')
5
+ processed = YAML.load_file('config/amocrm.yml')[Rails.env]
6
+
7
+ processed.each do |k, v|
8
+ config::register k.underscore.to_sym, v
9
+ end
10
+
11
+ config::Request.timeout = 60
12
+ config::Request.open_timeout = 60
13
+ config::Request.symbolize_keys = true
14
+ config::Request.debug = false
15
+ end
16
+ end
@@ -0,0 +1,8 @@
1
+ require 'amocrm-rails'
2
+
3
+ AmocrmRails.setup do |config|
4
+ config::Request.timeout = 60
5
+ config::Request.open_timeout = 60
6
+ config::Request.symbolize_keys = true
7
+ config::Request.debug = false
8
+ end
data/lib/helper.rb ADDED
@@ -0,0 +1,5 @@
1
+ module AmocrmHelper
2
+ def amocrm_oauth_url(state: nil, mode: 'post_message', client_id: AmocrmRails::client_id)
3
+ "https://www.amocrm.ru/oauth?client_id=#{client_id}&mode=#{mode}&state=#{state}"
4
+ end
5
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: amocrm-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pavel Osetrov
@@ -52,11 +52,18 @@ files:
52
52
  - lib/amocrm-rails/request.rb
53
53
  - lib/amocrm-rails/response.rb
54
54
  - lib/amocrm-rails/version.rb
55
+ - lib/concern.rb
55
56
  - lib/generators/amocrm_rails/install/USAGE
56
57
  - lib/generators/amocrm_rails/install/install_generator.rb
57
58
  - lib/generators/amocrm_rails/install/templates/amocrm.rb
58
59
  - lib/generators/amocrm_rails/install/templates/amocrm.yml
59
60
  - lib/generators/amocrm_rails/install/templates/amocrm_token.yml
61
+ - lib/generators/amocrm_rails/install/templates/devise/app/controllers/amocrm_controller.rb
62
+ - lib/generators/amocrm_rails/install/templates/devise/app/views/amocrm/code.html.erb
63
+ - lib/generators/amocrm_rails/install/templates/devise/app/views/amocrm/link.html.erb
64
+ - lib/generators/amocrm_rails/install/templates/devise/config/amocrm.rb
65
+ - lib/generators/amocrm_rails/install/templates/devise/config/initializers/amocrm.rb
66
+ - lib/helper.rb
60
67
  homepage: https://github.com/osetrov/amocrm
61
68
  licenses:
62
69
  - MIT