amocrm-rails 0.0.3 → 0.0.7

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,10 +14,10 @@ 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.try(:code) == 429
20
+ elsif e.response.dig(:status) == 429
21
21
  sleep(1.second)
22
22
  self.post(params: params, headers: headers, body: body, first_time: false)
23
23
  else
@@ -35,10 +35,10 @@ module AmocrmRails
35
35
  end
36
36
  parse_response(response)
37
37
  rescue => e
38
- if e.response.try(:code) == 401 && first_time
38
+ if [401, 402].include?(e.response.dig(:status)) && first_time
39
39
  AmocrmRails.generate_access_token
40
40
  self.patch(params: params, headers: headers, body: body, first_time: false)
41
- elsif e.response.try(:code) == 429
41
+ elsif e.response.try(:status) == 429
42
42
  sleep(1.second)
43
43
  self.patch(params: params, headers: headers, body: body, first_time: false)
44
44
  else
@@ -56,10 +56,10 @@ module AmocrmRails
56
56
  end
57
57
  parse_response(response)
58
58
  rescue => e
59
- if e.response.try(:code) == 401 && first_time
59
+ if [401, 402].include?(e.response.dig(:status)) && first_time
60
60
  AmocrmRails.generate_access_token
61
61
  self.put(params: params, headers: headers, body: body, first_time: false)
62
- elsif e.response.try(:code) == 429
62
+ elsif e.response.dig(:status) == 429
63
63
  sleep(1.second)
64
64
  self.put(params: params, headers: headers, body: body, first_time: false)
65
65
  else
@@ -77,10 +77,10 @@ module AmocrmRails
77
77
  end
78
78
  parse_response(response)
79
79
  rescue => e
80
- if e.response.try(:code) == 401 && first_time
80
+ if [401, 402].include?(e.response.dig(:status)) && first_time
81
81
  AmocrmRails.generate_access_token
82
82
  self.get(params: params, headers: headers, first_time: false)
83
- elsif e.response.try(:code) == 429
83
+ elsif e.response.try(:status) == 429
84
84
  sleep(1.second)
85
85
  self.get(params: params, headers: headers, body: body, first_time: false)
86
86
  else
@@ -98,10 +98,10 @@ module AmocrmRails
98
98
  end
99
99
  parse_response(response)
100
100
  rescue => e
101
- if e.response.try(:code) == 401 && first_time
101
+ if [401, 402].include?(e.response.dig(:status)) && first_time
102
102
  AmocrmRails.generate_access_token
103
103
  self.delete(params: params, headers: headers, first_time: false)
104
- elsif e.response.try(:code) == 429
104
+ elsif e.response.try(:stattus) == 429
105
105
  sleep(1.second)
106
106
  self.delete(params: params, headers: headers, body: body, first_time: false)
107
107
  else
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,37 @@
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
+ response = AmocrmRails::Request.account.retrieve(params: {
21
+ with: 'amojo_id,amojo_rights,users_groups,task_types,version,entity_names,datetime_settings'
22
+ })
23
+ @account = response.body
24
+ end
25
+
26
+ def webhook
27
+ webhook_name = params[:name]
28
+ end
29
+
30
+ private
31
+
32
+ def authenticate_user!
33
+ unless user_signed_in?
34
+ redirect_to new_user_session_path
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,11 @@
1
+ <div style="width: 100%; padding: 100px; text-align: center;">
2
+ Your code:
3
+ <code>
4
+ <%= @code %>
5
+ </code>
6
+ <hr>
7
+ Your account:
8
+ <code>
9
+ <%= @account.to_json %>
10
+ </code>
11
+ </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.3
4
+ version: 0.0.7
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