Skip to content

Commit

Permalink
Store user session expiry date
Browse files Browse the repository at this point in the history
  • Loading branch information
gbzodek committed Nov 23, 2023
1 parent c0d57ab commit 2957c9a
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 3 deletions.
15 changes: 15 additions & 0 deletions lib/shopify_app/session/user_session_storage_with_scopes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ def store(auth_session, user)
user.shopify_token = auth_session.access_token
user.shopify_domain = auth_session.shop
user.access_scopes = auth_session.scope.to_s
user.expires_at = auth_session.expires

user.save!
user.id
Expand Down Expand Up @@ -52,6 +53,7 @@ def construct_session(user)
scope: user.access_scopes,
associated_user_scope: user.access_scopes,
associated_user: associated_user,
expires: user.expires_at,
)
end
end
Expand All @@ -67,5 +69,18 @@ def access_scopes
rescue NotImplementedError, NoMethodError
raise NotImplementedError, "#access_scopes= must be defined to hook into stored access scopes"
end

def expires_at=(expires_at)
super(expires_at)
rescue NotImplementedError, NoMethodError
ShopifyApp::Logger.warn("#expires_at= must be defined to handle storing the session expiry date")
end

def expires_at
super
rescue NotImplementedError, NoMethodError
ShopifyApp::Logger.warn("#expires_at must be defined to leverage the session expiry date")
nil
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,23 @@ class UserSessionStorageWithScopesTest < ActiveSupport::TestCase
TEST_SHOPIFY_DOMAIN = "example.myshopify.com"
TEST_SHOPIFY_USER_TOKEN = "some-user-token-42"
TEST_MERCHANT_SCOPES = "read_orders, write_products"
TEST_EXPIRES_AT = Time.now

test ".retrieve returns user session by id" do
UserMockSessionStoreWithScopes.stubs(:find_by).returns(MockUserInstance.new(
shopify_user_id: TEST_SHOPIFY_USER_ID,
shopify_domain: TEST_SHOPIFY_DOMAIN,
shopify_token: TEST_SHOPIFY_USER_TOKEN,
scopes: TEST_MERCHANT_SCOPES,
expires_at: TEST_EXPIRES_AT,
))

session = UserMockSessionStoreWithScopes.retrieve(shopify_user_id: TEST_SHOPIFY_USER_ID)

assert_equal TEST_SHOPIFY_DOMAIN, session.shop
assert_equal TEST_SHOPIFY_USER_TOKEN, session.access_token
assert_equal ShopifyAPI::Auth::AuthScopes.new(TEST_MERCHANT_SCOPES), session.scope
assert_equal TEST_EXPIRES_AT, session.expires
end

test ".retrieve_by_shopify_user_id returns user session by shopify_user_id" do
Expand All @@ -35,20 +38,23 @@ class UserSessionStorageWithScopesTest < ActiveSupport::TestCase
shopify_token: TEST_SHOPIFY_USER_TOKEN,
api_version: ShopifyApp.configuration.api_version,
scopes: TEST_MERCHANT_SCOPES,
expires_at: TEST_EXPIRES_AT,
)
UserMockSessionStoreWithScopes.stubs(:find_by).with(shopify_user_id: TEST_SHOPIFY_USER_ID).returns(instance)

expected_session = ShopifyAPI::Auth::Session.new(
shop: instance.shopify_domain,
access_token: instance.shopify_token,
scope: TEST_MERCHANT_SCOPES,
expires: TEST_EXPIRES_AT,
)

user_id = TEST_SHOPIFY_USER_ID
session = UserMockSessionStoreWithScopes.retrieve_by_shopify_user_id(user_id)
assert_equal expected_session.shop, session.shop
assert_equal expected_session.access_token, session.access_token
assert_equal expected_session.scope, session.scope
assert_equal expected_session.expires, session.expires
end

test ".store can store user session record" do
Expand Down
8 changes: 5 additions & 3 deletions test/support/session_store_strategy_test_helpers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -21,23 +21,25 @@ def initialize(
end

class MockUserInstance
attr_reader :id, :shopify_user_id, :shopify_domain, :shopify_token, :api_version, :access_scopes
attr_writer :shopify_token, :shopify_domain, :access_scopes
attr_reader :id, :shopify_user_id, :shopify_domain, :shopify_token, :api_version, :access_scopes, :expires_at
attr_writer :shopify_token, :shopify_domain, :access_scopes, :expires_at

def initialize(
id: 1,
shopify_user_id: 1,
shopify_domain: "example.myshopify.com",
shopify_token: "1234-user-token",
api_version: ShopifyApp.configuration.api_version,
scopes: "read_products"
scopes: "read_products",
expires_at: nil
)
@id = id
@shopify_user_id = shopify_user_id
@shopify_domain = shopify_domain
@shopify_token = shopify_token
@api_version = api_version
@access_scopes = scopes
@expires_at = expires_at
end
end
end
1 change: 1 addition & 0 deletions test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ def mock_session(shop: "my-shop.myshopify.com", scope: ShopifyApp.configuration.
mock_session.stubs(:access_token).returns("a-new-user_token!")
mock_session.stubs(:scope).returns(ShopifyAPI::Auth::AuthScopes.new(scope))
mock_session.stubs(:shopify_session_id).returns(1)
mock_session.stubs(:expires).returns(nil)

mock_session
end
Expand Down

0 comments on commit 2957c9a

Please sign in to comment.