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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e0cb83ef3bb6adbedbad8e6671d7bacea19c0602c8f36672651484a8216e28b6
4
- data.tar.gz: e5ea1d71c14fae2aaaad3966b27fb6ad3fcabf87b1871d09410584354e470ef0
3
+ metadata.gz: 769371ccfa3c68e1fb4e70af29889f49e19319c6c4d7152dea54ce56f462d7d4
4
+ data.tar.gz: 00d08d8cb7479e1004bc5a3eaacc87faad6ce1708d38f05d06c14066983fe830
5
5
  SHA512:
6
- metadata.gz: 8409cb00d02bf2fad991c697157bdcaf3bca1f873beac81b1c96adc39b0bf4497f2071cc3a576da59f5696b6df51a4552b2ce112bb4e1c4273985d0324752844
7
- data.tar.gz: d6268de4958175d1f6d9307c96fe131f018353c67fdb08701b83fd7b33260db23858e7795994c6afcbdf6195369a854308ca33523c4e01a1acfbee4bc5b9a2fc
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. after any API call, you can grab the (possibly refreshed) tokens to persist them:
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
- token = client.oauth_token
37
- save_to_database(
38
- access_token: token.token,
39
- refresh_token: token.refresh_token,
40
- expires_at: token.expires_at
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HCBV4
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hcbv4
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - 24c02