Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat!: update deprecated user method signatures #159

Merged
merged 2 commits into from
Jan 2, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions lib/passageidentity/client.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# frozen_string_literal: true

require_relative 'auth'
require_relative 'user_api'
require_relative 'user'
require_relative 'version'

module Passage
Expand Down Expand Up @@ -30,7 +30,7 @@ def initialize(app_id:, api_key:)
req_opts[:debug_auth_names] = ['header']

@auth = Passage::Auth.new(app_id: app_id, req_opts: req_opts)
@user = Passage::UserAPI.new(app_id: app_id, req_opts: req_opts)
@user = Passage::User.new(app_id: app_id, req_opts: req_opts)
end
end
end
104 changes: 44 additions & 60 deletions lib/passageidentity/user_api.rb → lib/passageidentity/user.rb
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
# frozen_string_literal: true

require_relative 'client'
require_relative '../openapi_client'

module Passage
# The UserAPI class provides methods for interacting with Passage Users
class UserAPI
# rubocop:disable Metrics/AbcSize
# The User class provides methods for interacting with Passage Users
class User
def initialize(app_id:, req_opts:)
@app_id = app_id
@req_opts = req_opts
Expand All @@ -29,31 +28,20 @@ def get(user_id:)
end
end

def get_by_identifier(user_identifier:)
raise ArgumentError, 'identifier is required.' unless user_identifier && !user_identifier.empty?
def get_by_identifier(identifier:)
raise ArgumentError, 'identifier is required.' unless identifier && !identifier.empty?

begin
@req_opts[:limit] = 1
@req_opts[:identifier] = user_identifier.downcase
response = @user_client.list_paginated_users(@app_id, @req_opts)
users = response.users

if users.empty?
raise PassageError.new(
status_code: 404,
body: {
error: 'User not found.',
code: 'user_not_found'
}
)
end
get(user_id: users.first.id)
req_opts = set_get_by_identifier_query_params(identifier: identifier)
response = @user_client.list_paginated_users(@app_id, req_opts)
rescue Faraday::Error => e
raise PassageError.new(
status_code: e.response[:status],
body: e.response[:body]
)
end

handle_get_by_identifier(users: response.users)
end

def activate(user_id:)
Expand Down Expand Up @@ -84,28 +72,29 @@ def deactivate(user_id:)
end
end

def update(user_id:, email: '', phone: '', user_metadata: {})
warn '[DEPRECATED] the `update` method parameters will change to `user_id: string, ' \
'options: UpdateUserArgs`. Parameters will change on or after 2025-1.'

updates = {}
updates['email'] = email unless email.empty?
updates['phone'] = phone unless phone.empty?
updates['user_metadata'] = user_metadata unless user_metadata.empty?
def update(user_id:, options:)
raise ArgumentError, 'user_id is required.' unless user_id && !user_id.empty?
raise ArgumentError, 'options are required.' unless options && !options.empty?

update_v2(user_id: user_id, options: updates)
response = @user_client.update_user(@app_id, user_id, options, @req_opts)
response.user
rescue Faraday::Error => e
raise PassageError.new(
status_code: e.response[:status],
body: e.response[:body]
)
end

def create(email: '', phone: '', user_metadata: {})
warn '[DEPRECATED] the `create` method parameters will change to `args: CreateUserArgs`.' \
'Parameters will change on or after 2025-1.'

create = {}
create['email'] = email unless email.empty?
create['phone'] = phone unless phone.empty?
create['user_metadata'] = user_metadata unless user_metadata.empty?
def create(args:)
raise ArgumentError, 'At least one of args.email or args.phone is required.' unless args['phone'] || args['email']

create_v2(args: create)
response = @user_client.create_user(@app_id, args, @req_opts)
response.user
rescue Faraday::Error => e
raise PassageError.new(
status_code: e.response[:status],
body: e.response[:body]
)
end

def delete(user_id:)
Expand Down Expand Up @@ -166,30 +155,25 @@ def revoke_refresh_tokens(user_id:)

private

def create_v2(args: {})
raise ArgumentError, 'At least one of args.email or args.phone is required.' unless args['phone'] || args['email']

response = @user_client.create_user(@app_id, args, @req_opts)
response.user
rescue Faraday::Error => e
raise PassageError.new(
status_code: e.response[:status],
body: e.response[:body]
)
def set_get_by_identifier_query_params(identifier:)
req_opts = @req_opts.dup
req_opts[:limit] = 1
req_opts[:identifier] = identifier.downcase
req_opts
end

def update_v2(user_id:, options: {})
raise ArgumentError, 'user_id is required.' unless user_id && !user_id.empty?
raise ArgumentError, 'options are required.' if options.empty?
def handle_get_by_identifier(users:)
if users.empty?
raise PassageError.new(
status_code: 404,
body: {
error: 'User not found.',
code: 'user_not_found'
}
)
end

response = @user_client.update_user(@app_id, user_id, options, @req_opts)
response.user
rescue Faraday::Error => e
raise PassageError.new(
status_code: e.response[:status],
body: e.response[:body]
)
get(user_id: users.first.id)
end
# rubocop:enable Metrics/AbcSize
end
end
65 changes: 33 additions & 32 deletions tests/user_api_test.rb → tests/user_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,30 +7,31 @@

Dotenv.load('.env')

# This is a test suite for the Passage User API using the Test::Unit framework.
class TestUserAPI < Test::Unit::TestCase
# This is a test suite for the Passage User using the Test::Unit framework.
class TestUser < Test::Unit::TestCase
PassageClient = Passage::Client.new(app_id: ENV['APP_ID'], api_key: ENV['API_KEY'])

def setup
@test_user =
PassageClient.user.create(
email: '[email protected]',
user_metadata: {
example1: 'cool'
}
)
args = {
'email' => '[email protected]',
'user_metadata' => {
'example1' => 'cool'
}
}
@test_user = PassageClient.user.create(args: args)
end

def test_create_delete_user
user =
PassageClient.user.create(
email: '[email protected]',
user_metadata: {
example1: 'cool'
}
)
args = {
'email' => 'passage+test-create[email protected]',
'user_metadata' => {
'example1' => 'cool'
}
}
user = PassageClient.user.create(args: args)
assert_equal '[email protected]', user.email
assert_equal 'cool', user.user_metadata[:example1]

deleted = PassageClient.user.delete(user_id: user.id)
assert_equal true, deleted
end
Expand All @@ -44,7 +45,7 @@ def test_get_user_by_identifier
user = PassageClient.user.get(user_id: @test_user.id)
assert_equal @test_user.id, user.id

user_by_identifier = PassageClient.user.get_by_identifier(user_identifier: @test_user.email)
user_by_identifier = PassageClient.user.get_by_identifier(identifier: @test_user.email)
assert_equal @test_user.id, user_by_identifier.id

assert_equal user, user_by_identifier
Expand All @@ -54,32 +55,33 @@ def test_get_user_by_identifier_upper_case
user = PassageClient.user.get(user_id: @test_user.id)
assert_equal @test_user.id, user.id

user_by_identifier = PassageClient.user.get_by_identifier(user_identifier: @test_user.email.upcase)
user_by_identifier = PassageClient.user.get_by_identifier(identifier: @test_user.email.upcase)
assert_equal @test_user.id, user_by_identifier.id

assert_equal user, user_by_identifier
end

def test_get_user_by_identifier_phone
phone = '+15005550007'
create_user = PassageClient.user.create(
phone: phone
)
args = {
'phone' => phone
}
create_user = PassageClient.user.create(args: args)
user = PassageClient.user.get(user_id: create_user.id)
assert_equal create_user.id, user.id

user_by_identifier = PassageClient.user.get_by_identifier(user_identifier: phone)
user_by_identifier = PassageClient.user.get_by_identifier(identifier: phone)
assert_equal create_user.id, user_by_identifier.id

assert_equal user, user_by_identifier
end

def test_invalid_get_user_by_identifier
def test_invalid_get_by_identifier
user = PassageClient.user.get(user_id: @test_user.id)
assert_equal @test_user.id, user.id

assert_raise Passage::PassageError do
PassageClient.user.get_by_identifier(user_identifier: '[email protected]')
PassageClient.user.get_by_identifier(identifier: '[email protected]')
end
end

Expand All @@ -97,14 +99,13 @@ def test_activate_user

def test_update_user
new_email = '[email protected]'
user =
PassageClient.user.update(
user_id: @test_user.id,
email: new_email,
user_metadata: {
example1: 'lame'
}
)
opts = {
'email' => new_email,
'user_metadata' => {
'example1' => 'lame'
}
}
user = PassageClient.user.update(user_id: @test_user.id, options: opts)
assert_equal @test_user.id, user.id
assert_equal new_email, user.email
assert_equal 'lame', user.user_metadata[:example1]
Expand Down
Loading