amocrm-rails 0.0.2 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
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