diff --git a/lib/shopify_app/session/user_session_storage_with_scopes.rb b/lib/shopify_app/session/user_session_storage_with_scopes.rb index 440226862..8b285e579 100644 --- a/lib/shopify_app/session/user_session_storage_with_scopes.rb +++ b/lib/shopify_app/session/user_session_storage_with_scopes.rb @@ -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 @@ -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 @@ -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 diff --git a/test/shopify_app/session/user_session_storage_with_scopes_test.rb b/test/shopify_app/session/user_session_storage_with_scopes_test.rb index 1bb47188b..fb6a32b16 100644 --- a/test/shopify_app/session/user_session_storage_with_scopes_test.rb +++ b/test/shopify_app/session/user_session_storage_with_scopes_test.rb @@ -12,6 +12,7 @@ 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( @@ -19,6 +20,7 @@ class UserSessionStorageWithScopesTest < ActiveSupport::TestCase 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) @@ -26,6 +28,7 @@ class UserSessionStorageWithScopesTest < ActiveSupport::TestCase 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 @@ -35,6 +38,7 @@ 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) @@ -42,6 +46,7 @@ class UserSessionStorageWithScopesTest < ActiveSupport::TestCase shop: instance.shopify_domain, access_token: instance.shopify_token, scope: TEST_MERCHANT_SCOPES, + expires: TEST_EXPIRES_AT, ) user_id = TEST_SHOPIFY_USER_ID @@ -49,6 +54,7 @@ class UserSessionStorageWithScopesTest < ActiveSupport::TestCase 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 diff --git a/test/support/session_store_strategy_test_helpers.rb b/test/support/session_store_strategy_test_helpers.rb index 622fd176c..ceebe937d 100644 --- a/test/support/session_store_strategy_test_helpers.rb +++ b/test/support/session_store_strategy_test_helpers.rb @@ -21,8 +21,8 @@ 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, @@ -30,7 +30,8 @@ def initialize( 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 @@ -38,6 +39,7 @@ def initialize( @shopify_token = shopify_token @api_version = api_version @access_scopes = scopes + @expires_at = expires_at end end end diff --git a/test/test_helper.rb b/test/test_helper.rb index ce758d969..0cf35575b 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -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