hcbv4 0.1.0 → 0.2.0
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.
- checksums.yaml +4 -4
- data/README.md +32 -53
- data/lib/hcbv4/client.rb +9 -5
- data/lib/hcbv4/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 769371ccfa3c68e1fb4e70af29889f49e19319c6c4d7152dea54ce56f462d7d4
|
|
4
|
+
data.tar.gz: 00d08d8cb7479e1004bc5a3eaacc87faad6ce1708d38f05d06c14066983fe830
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8b2df71c8f293d0988a18fdb97ac180b756e3d06e196e0314275e458255fb79fd9bbb88124544c43b3792e9c2a1345e49a9a9ea42649f1a17a250952a95cfa13
|
|
7
|
+
data.tar.gz: ed0641418b2cf847ba8396f22ca860373c3cb04d05f6110cda7f7d73348a54d9f3de54704cb7121982ed6772046e46e3f3decb247be19fb463e31b98c821f836
|
data/README.md
CHANGED
|
@@ -30,17 +30,43 @@ client = HCBV4::Client.from_credentials(
|
|
|
30
30
|
)
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
-
the client automatically refreshes expired tokens before each request.
|
|
33
|
+
the client automatically refreshes expired tokens before each request. to persist refreshed tokens, use the `on_token_refresh` callback:
|
|
34
34
|
|
|
35
35
|
```ruby
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
36
|
+
client = HCBV4::Client.from_credentials(
|
|
37
|
+
client_id: ENV["HCB_CLIENT_ID"],
|
|
38
|
+
client_secret: ENV["HCB_CLIENT_SECRET"],
|
|
39
|
+
access_token: user.hcb_access_token,
|
|
40
|
+
refresh_token: user.hcb_refresh_token,
|
|
41
|
+
expires_at: user.hcb_token_expires_at,
|
|
42
|
+
on_token_refresh: ->(token) {
|
|
43
|
+
user.update!(
|
|
44
|
+
hcb_access_token: token.token,
|
|
45
|
+
hcb_refresh_token: token.refresh_token,
|
|
46
|
+
hcb_token_expires_at: token.expires_at
|
|
47
|
+
)
|
|
48
|
+
}
|
|
41
49
|
)
|
|
42
50
|
```
|
|
43
51
|
|
|
52
|
+
the callback is invoked immediately after a token refresh, before the API request is made. this ensures your stored tokens are always up to date.
|
|
53
|
+
|
|
54
|
+
### disabling automatic token refresh
|
|
55
|
+
|
|
56
|
+
if you're managing token refresh yourself, you can disable automatic refresh:
|
|
57
|
+
|
|
58
|
+
```ruby
|
|
59
|
+
client = HCBV4::Client.from_credentials(
|
|
60
|
+
client_id: ENV["HCB_CLIENT_ID"],
|
|
61
|
+
client_secret: ENV["HCB_CLIENT_SECRET"],
|
|
62
|
+
access_token: "...",
|
|
63
|
+
refresh_token: "...",
|
|
64
|
+
auto_token_refresh: false
|
|
65
|
+
)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
the `auto_token_refresh` option defaults to `true`.
|
|
69
|
+
|
|
44
70
|
### using a pre-built token
|
|
45
71
|
|
|
46
72
|
if you're managing the `OAuth2::AccessToken` lifecycle yourself:
|
|
@@ -482,53 +508,6 @@ tx.update!(memo: "new memo") # => Error: organization.id is nil
|
|
|
482
508
|
|
|
483
509
|
## recipes
|
|
484
510
|
|
|
485
|
-
### token persistence
|
|
486
|
-
|
|
487
|
-
the client automatically refreshes expired tokens. only persist when the token actually changes:
|
|
488
|
-
|
|
489
|
-
```ruby
|
|
490
|
-
class HCBService
|
|
491
|
-
def self.with(user, &block)
|
|
492
|
-
service = new(user)
|
|
493
|
-
block.call(service.client)
|
|
494
|
-
ensure
|
|
495
|
-
service.persist_if_refreshed!
|
|
496
|
-
end
|
|
497
|
-
|
|
498
|
-
def initialize(user)
|
|
499
|
-
@user = user
|
|
500
|
-
@original_token = user.hcb_access_token
|
|
501
|
-
end
|
|
502
|
-
|
|
503
|
-
def client
|
|
504
|
-
@client ||= HCBV4::Client.from_credentials(
|
|
505
|
-
client_id: ENV["HCB_CLIENT_ID"],
|
|
506
|
-
client_secret: ENV["HCB_CLIENT_SECRET"],
|
|
507
|
-
access_token: @user.hcb_access_token,
|
|
508
|
-
refresh_token: @user.hcb_refresh_token,
|
|
509
|
-
expires_at: @user.hcb_token_expires_at
|
|
510
|
-
)
|
|
511
|
-
end
|
|
512
|
-
|
|
513
|
-
def persist_if_refreshed!
|
|
514
|
-
return unless @client
|
|
515
|
-
token = @client.oauth_token
|
|
516
|
-
return if token.token == @original_token
|
|
517
|
-
|
|
518
|
-
@user.update!(
|
|
519
|
-
hcb_access_token: token.token,
|
|
520
|
-
hcb_refresh_token: token.refresh_token,
|
|
521
|
-
hcb_token_expires_at: token.expires_at
|
|
522
|
-
)
|
|
523
|
-
end
|
|
524
|
-
end
|
|
525
|
-
|
|
526
|
-
# usage:
|
|
527
|
-
HCBService.with(current_user) do |client|
|
|
528
|
-
client.organizations
|
|
529
|
-
end
|
|
530
|
-
```
|
|
531
|
-
|
|
532
511
|
### keep your ledger pretty
|
|
533
512
|
|
|
534
513
|
when a card grant is created, it generates a disbursement (transfer) from the org to the grant. you might want to label it:
|
data/lib/hcbv4/client.rb
CHANGED
|
@@ -9,20 +9,22 @@ module HCBV4
|
|
|
9
9
|
DEFAULT_BASE_URL = "https://hcb.hackclub.com"
|
|
10
10
|
API_PATH = "/api/v4"
|
|
11
11
|
|
|
12
|
-
attr_reader :oauth_token, :base_url
|
|
12
|
+
attr_reader :oauth_token, :base_url, :auto_token_refresh, :on_token_refresh
|
|
13
13
|
|
|
14
|
-
def initialize(oauth_token:, base_url: DEFAULT_BASE_URL)
|
|
14
|
+
def initialize(oauth_token:, base_url: DEFAULT_BASE_URL, auto_token_refresh: true, on_token_refresh: nil)
|
|
15
15
|
@oauth_token = oauth_token
|
|
16
16
|
@base_url = base_url
|
|
17
|
+
@auto_token_refresh = auto_token_refresh
|
|
18
|
+
@on_token_refresh = on_token_refresh
|
|
17
19
|
end
|
|
18
20
|
|
|
19
21
|
def self.from_credentials(client_id:, client_secret:, access_token:, refresh_token:, expires_at: nil,
|
|
20
|
-
base_url: DEFAULT_BASE_URL)
|
|
22
|
+
base_url: DEFAULT_BASE_URL, auto_token_refresh: true, on_token_refresh: nil)
|
|
21
23
|
oauth_client = OAuth2::Client.new(
|
|
22
24
|
client_id,
|
|
23
25
|
client_secret,
|
|
24
26
|
site: base_url,
|
|
25
|
-
token_url: "/oauth/token"
|
|
27
|
+
token_url: "/api/v4/oauth/token"
|
|
26
28
|
)
|
|
27
29
|
|
|
28
30
|
token = OAuth2::AccessToken.new(
|
|
@@ -32,7 +34,7 @@ module HCBV4
|
|
|
32
34
|
expires_at:
|
|
33
35
|
)
|
|
34
36
|
|
|
35
|
-
new(oauth_token: token, base_url:)
|
|
37
|
+
new(oauth_token: token, base_url:, auto_token_refresh:, on_token_refresh:)
|
|
36
38
|
end
|
|
37
39
|
|
|
38
40
|
# ─────────────────────────────────────────────────────────────────────────
|
|
@@ -558,10 +560,12 @@ module HCBV4
|
|
|
558
560
|
end
|
|
559
561
|
|
|
560
562
|
def refresh_token_if_needed!
|
|
563
|
+
return unless auto_token_refresh
|
|
561
564
|
return unless oauth_token.respond_to?(:expired?)
|
|
562
565
|
return unless oauth_token.expired?
|
|
563
566
|
|
|
564
567
|
@oauth_token = oauth_token.refresh!
|
|
568
|
+
on_token_refresh&.call(@oauth_token)
|
|
565
569
|
end
|
|
566
570
|
|
|
567
571
|
def connection
|
data/lib/hcbv4/version.rb
CHANGED