Skip to content
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
14 changes: 14 additions & 0 deletions lib/workos/organizations.ex
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,20 @@ defmodule WorkOS.Organizations do
)
end

@doc """
Gets an organization by external ID.
"""
@spec get_organization_by_external_id(String.t()) :: WorkOS.Client.response(Organization.t())
@spec get_organization_by_external_id(WorkOS.Client.t(), String.t()) ::
WorkOS.Client.response(Organization.t())
def get_organization_by_external_id(client \\ WorkOS.client(), external_id) do
WorkOS.Client.get(client, Organization, "/organizations/external_id/:external_id",
opts: [
path_params: [external_id: external_id]
]
)
end

@doc """
Creates an organization.

Expand Down
3 changes: 3 additions & 0 deletions lib/workos/organizations/organization.ex
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ defmodule WorkOS.Organizations.Organization do
object: String.t(),
name: String.t(),
allow_profiles_outside_organization: boolean(),
external_id: String.t() | nil,
domains: list(Domain.t()) | nil,
updated_at: String.t(),
created_at: String.t()
Expand All @@ -32,6 +33,7 @@ defmodule WorkOS.Organizations.Organization do
:object,
:name,
:allow_profiles_outside_organization,
:external_id,
:domains,
:updated_at,
:created_at
Expand All @@ -45,6 +47,7 @@ defmodule WorkOS.Organizations.Organization do
name: map["name"],
domains: Castable.cast_list(Domain, map["domains"]),
allow_profiles_outside_organization: map["allow_profiles_outside_organization"],
external_id: map["external_id"],
updated_at: map["updated_at"],
created_at: map["created_at"]
}
Expand Down
13 changes: 13 additions & 0 deletions lib/workos/user_management.ex
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,19 @@ defmodule WorkOS.UserManagement do
)
end

@doc """
Gets a user by external ID.
"""
@spec get_user_by_external_id(String.t()) :: WorkOS.Client.response(User.t())
@spec get_user_by_external_id(WorkOS.Client.t(), String.t()) :: WorkOS.Client.response(User.t())
def get_user_by_external_id(client \\ WorkOS.client(), external_id) do
WorkOS.Client.get(client, User, "/user_management/users/external_id/:external_id",
opts: [
path_params: [external_id: external_id]
]
)
end

@doc """
Lists all users.

Expand Down
3 changes: 3 additions & 0 deletions lib/workos/user_management/user.ex
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
defmodule WorkOS.UserManagement.User do

Check warning on line 1 in lib/workos/user_management/user.ex

View workflow job for this annotation

GitHub Actions / Test (Elixir 1.14.5, OTP 25.3)

@behaviour WorkOS.Castable does not exist (in module WorkOS.UserManagement.User)
@moduledoc """
WorkOS User struct.
"""
Expand All @@ -11,6 +11,7 @@
email_verified: boolean(),
first_name: String.t() | nil,
last_name: String.t() | nil,
external_id: String.t() | nil,
updated_at: String.t(),
created_at: String.t()
}
Expand All @@ -28,18 +29,20 @@
:email_verified,
:first_name,
:last_name,
:external_id,
:updated_at,
:created_at
]

@impl true
def cast(map) do

Check warning on line 38 in lib/workos/user_management/user.ex

View workflow job for this annotation

GitHub Actions / Test (Elixir 1.14.5, OTP 25.3)

got "@impl true" for function cast/1 but no behaviour specifies such callback. There are no known callbacks, please specify the proper @behaviour and make sure it defines callbacks
%__MODULE__{
id: map["id"],
email: map["email"],
email_verified: map["email_verified"],
first_name: map["first_name"],
last_name: map["last_name"],
external_id: map["external_id"],
updated_at: map["updated_at"],
created_at: map["created_at"]
}
Expand Down
33 changes: 33 additions & 0 deletions test/support/organizations_client_mock.ex
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,39 @@ defmodule WorkOS.Organizations.ClientMock do
end)
end

def get_organization_by_external_id(context, opts \\ []) do
Tesla.Mock.mock(fn request ->
%{api_key: api_key} = context

external_id = opts |> Keyword.get(:assert_fields) |> Keyword.get(:external_id)
assert request.method == :get
assert request.url == "#{WorkOS.base_url()}/organizations/external_id/#{external_id}"

assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) ==
{"Authorization", "Bearer #{api_key}"}

success_body = %{
"id" => "org_01EHT88Z8J8795GZNQ4ZP1J81T",
"object" => "organization",
"name" => "Test Organization",
"allow_profiles_outside_organization" => false,
"external_id" => external_id,
"domains" => [
%{
"domain" => "example.com",
"object" => "organization_domain",
"id" => "org_domain_01EHT88Z8WZEFWYPM6EC9BX2R8"
}
],
"created_at" => "2023-07-17T20:07:20.055Z",
"updated_at" => "2023-07-17T20:07:20.055Z"
}

{status, body} = Keyword.get(opts, :respond_with, {200, success_body})
%Tesla.Env{status: status, body: body}
end)
end

def create_organization(context, opts \\ []) do
Tesla.Mock.mock(fn request ->
%{api_key: api_key} = context
Expand Down
23 changes: 22 additions & 1 deletion test/support/user_management_client_mock.ex
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ defmodule WorkOS.UserManagement.ClientMock do
"last_name" => "User",
"created_at" => "2023-07-18T02:07:19.911Z",
"updated_at" => "2023-07-18T02:07:19.911Z",
"email_verified" => true
"email_verified" => true,
"external_id" => "ext_user_123"
}

@invitation_mock %{
Expand Down Expand Up @@ -90,6 +91,26 @@ defmodule WorkOS.UserManagement.ClientMock do
end)
end

def get_user_by_external_id(context, opts \\ []) do
Tesla.Mock.mock(fn request ->
%{api_key: api_key} = context

external_id = opts |> Keyword.get(:assert_fields) |> Keyword.get(:external_id)
assert request.method == :get

assert request.url ==
"#{WorkOS.base_url()}/user_management/users/external_id/#{external_id}"

assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) ==
{"Authorization", "Bearer #{api_key}"}

success_body = @user_mock

{status, body} = Keyword.get(opts, :respond_with, {200, success_body})
%Tesla.Env{status: status, body: body}
end)
end

def list_users(context, opts \\ []) do
Tesla.Mock.mock(fn request ->
%{api_key: api_key} = context
Expand Down
16 changes: 16 additions & 0 deletions test/workos/organizations_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,22 @@ defmodule WorkOS.OrganizationsTest do
end
end

describe "get_organization_by_external_id" do
test "requests an organization by external_id", context do
opts = [external_id: "ext_org_123"]
context |> ClientMock.get_organization_by_external_id(assert_fields: opts)

assert {:ok, %WorkOS.Organizations.Organization{id: id, external_id: external_id}} =
WorkOS.Organizations.get_organization_by_external_id(
opts
|> Keyword.get(:external_id)
)

refute is_nil(id)
assert external_id == "ext_org_123"
end
end

describe "create_organization" do
test "with an idempotency key, includes an idempotency key with request", context do
opts = [
Expand Down
13 changes: 13 additions & 0 deletions test/workos/user_management_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,19 @@ defmodule WorkOS.UserManagementTest do
end
end

describe "get_user_by_external_id" do
test "requests a user by external_id", context do
opts = [external_id: "ext_user_123"]
context |> ClientMock.get_user_by_external_id(assert_fields: opts)

assert {:ok, %WorkOS.UserManagement.User{id: id, external_id: external_id}} =
WorkOS.UserManagement.get_user_by_external_id(opts |> Keyword.get(:external_id))

refute is_nil(id)
assert external_id == "ext_user_123"
end
end

describe "list_users" do
test "without any options, returns users and metadata", context do
context
Expand Down
Loading