base.rb
2.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
require 'json'
module Dingtalk
module Api
class Base
ACCESS_TOKEN = "access_token"
JS_TICKET = "js_ticket"
def initialize(corp = nil)
@corp = corp
end
def access_token
token = redis.get("#{redis_prefix}:#{@corp.corp_id}_#{ACCESS_TOKEN}")
token.to_s.empty? ? set_access_token : token
end
def set_access_token
if @corp.isv_mode?
Suite.new.set_corp_access_token(@corp.corp_id, @corp.permanent_code)
elsif !@corp.corp_secret.nil?
set_corp_access_token
end
end
def js_ticket
ticket = redis.get("#{redis_prefix}:#{@corp.corp_id}_#{JS_TICKET}")
ticket.to_s.empty? ? set_js_ticket : ticket
end
def set_corp_access_token
res = http_get("#{ENDPOINT}/gettoken?corpid=#{@corp.corp_id}&corpsecret=#{@corp.corp_secret}")
key = "#{redis_prefix}:#{@corp.corp_id}_#{ACCESS_TOKEN}"
redis.set(key, res['access_token'], {ex: 6600})
res['access_token']
end
def set_js_ticket
key = "#{redis_prefix}:#{@corp.corp_id}_#{JS_TICKET}"
res = http_get("#{ENDPOINT}/get_jsapi_ticket?access_token=#{access_token}")
redis.set(key, res['ticket'], {ex: 6600})
res['ticket']
end
def redis_prefix
Dingtalk.config.redis_prefix || 'dingtalk'
end
private
def default_params
{ access_token: access_token }
end
def payload(url, params)
[ request_url(url), {
params: default_params.merge(params).to_json,
content_type: :json
}]
end
def http_get(url, params = {})
res = RestClient.get(request_url(url))
JSON.parse(res)
end
def http_post(url, params = {})
p = default_params.merge(params)
res = RestClient.post(request_url(url), p.to_json, content_type: :json)
JSON.parse(res)
end
def base_url
''
end
def request_url(url)
if url.start_with?('https')
url
else
"#{ENDPOINT}/#{base_url}/#{url}"
end
end
def redis
Dingtalk.dingtalk_redis
end
end
end
end