diff --git a/lib/workos/events.ex b/lib/workos/events.ex new file mode 100644 index 00000000..a49d0d0d --- /dev/null +++ b/lib/workos/events.ex @@ -0,0 +1,53 @@ +defmodule WorkOS.Events do + @moduledoc """ + Manage Events API in WorkOS. + + @see https://workos.com/docs/events + """ + + alias WorkOS.Events.Event + + @doc """ + Lists all events. + + Parameter options: + + * `:events` - Filter to only return events of particular types. + * `:range_start` - Date range start for stream of events. + * `:range_end` - Date range end for stream of events. + * `:limit` - Maximum number of records to return. Accepts values between 1 and 100. Default is 10. + * `:after` - Pagination cursor to receive records after a provided event ID. + + """ + @spec list_events(WorkOS.Client.t(), map()) :: + WorkOS.Client.response(WorkOS.List.t(Event.t())) + def list_events(client, opts) do + WorkOS.Client.get(client, WorkOS.List.of(Event), "/events", + opts: [ + query: %{ + events: opts[:events], + range_start: opts[:range_start], + range_end: opts[:range_end], + limit: opts[:limit], + after: opts[:after] + } + ] + ) + end + + @spec list_events(map()) :: + WorkOS.Client.response(WorkOS.List.t(Event.t())) + def list_events(opts \\ %{}) do + WorkOS.Client.get(WorkOS.client(), WorkOS.List.of(Event), "/events", + opts: [ + query: %{ + events: opts[:events], + range_start: opts[:range_start], + range_end: opts[:range_end], + limit: opts[:limit], + after: opts[:after] + } + ] + ) + end +end diff --git a/lib/workos/events/event.ex b/lib/workos/events/event.ex new file mode 100644 index 00000000..b800d224 --- /dev/null +++ b/lib/workos/events/event.ex @@ -0,0 +1,32 @@ +defmodule WorkOS.Events.Event do + @moduledoc """ + WorkOS Event struct. + """ + + @behaviour WorkOS.Castable + + @type t() :: %__MODULE__{ + id: String.t(), + event: String.t(), + data: map(), + created_at: String.t() + } + + @enforce_keys [:id, :event, :created_at] + defstruct [ + :id, + :event, + :data, + :created_at + ] + + @impl true + def cast(map) do + %__MODULE__{ + id: map["id"], + data: map["data"], + event: map["event"], + created_at: map["created_at"] + } + end +end diff --git a/mix.exs b/mix.exs index f9301b2e..ced6298b 100755 --- a/mix.exs +++ b/mix.exs @@ -89,6 +89,7 @@ defmodule WorkOS.MixProject do WorkOS.Webhooks, WorkOS.DirectorySync, WorkOS.Passwordless, + WorkOS.Events, ], "Response Structs": [ WorkOS.SSO.Connection, @@ -104,6 +105,7 @@ defmodule WorkOS.MixProject do WorkOS.DirectorySync.Directory.User, WorkOS.Passwordless.Session, WorkOS.Passwordless.Session.Send, + WorkOS.Events.Event, WorkOS.Empty, WorkOS.Error, WorkOS.List diff --git a/test/support/events_client_mock.ex b/test/support/events_client_mock.ex new file mode 100644 index 00000000..93b5151f --- /dev/null +++ b/test/support/events_client_mock.ex @@ -0,0 +1,42 @@ +defmodule WorkOS.Events.ClientMock do + @moduledoc false + + use ExUnit.Case + + def list_events(context, opts \\ []) do + Tesla.Mock.mock(fn request -> + %{api_key: api_key} = context + + assert request.method == :get + assert request.url == "#{WorkOS.base_url()}/events" + + assert Enum.find(request.headers, &(elem(&1, 0) == "Authorization")) == + {"Authorization", "Bearer #{api_key}"} + + success_body = %{ + "data" => [ + %{ + "id" => "event_01234ABCD", + "created_at" => "2020-05-06 04:21:48.649164", + "event" => "connection.activated", + "data" => %{ + "object" => "connection", + "id" => "conn_01234ABCD", + "organization_id" => "org_1234", + "name" => "Connection", + "connection_type" => "OktaSAML", + "state" => "active", + "domains" => [], + "created_at" => "2020-05-06 04:21:48.649164", + "updated_at" => "2020-05-06 04:21:48.649164" + } + } + ], + "list_metadata" => %{} + } + + {status, body} = Keyword.get(opts, :respond_with, {200, success_body}) + %Tesla.Env{status: status, body: body} + end) + end +end diff --git a/test/workos/events_test.exs b/test/workos/events_test.exs new file mode 100644 index 00000000..38e3d428 --- /dev/null +++ b/test/workos/events_test.exs @@ -0,0 +1,18 @@ +defmodule WorkOS.EventsTest do + use WorkOS.TestCase + + alias WorkOS.Events.ClientMock + + setup :setup_env + + describe "list_events" do + test "requests events", context do + opts = [events: ["connection.activated"]] + + context |> ClientMock.list_events(assert_fields: opts) + + assert {:ok, %WorkOS.List{data: [%WorkOS.Events.Event{}], list_metadata: %{}}} = + WorkOS.Events.list_events(opts |> Enum.into(%{})) + end + end +end diff --git a/workos_elixir.livemd b/workos_elixir.livemd index 27bece8e..e2361249 100644 --- a/workos_elixir.livemd +++ b/workos_elixir.livemd @@ -355,3 +355,11 @@ Kino.nothing() {:ok, %WorkOS.Passwordless.Session.Send{}} = WorkOS.Passwordless.send_session(client, Kino.Input.read(session_id)) ``` + +### Events + +#### List Events + +```elixir +{:ok, %WorkOS.List{}} = WorkOS.Events.list_events(client, %{}) +```