From fc38d12819c57579e98da12fa7397baacddd3b5c Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Sun, 12 Nov 2023 20:45:16 -0300 Subject: [PATCH 1/4] Add base modules --- lib/workos/events.ex | 7 +++++++ lib/workos/events/event.ex | 32 ++++++++++++++++++++++++++++++ mix.exs | 2 ++ test/support/events_client_mock.ex | 5 +++++ test/workos/events_test.exs | 7 +++++++ 5 files changed, 53 insertions(+) create mode 100644 lib/workos/events.ex create mode 100644 lib/workos/events/event.ex create mode 100644 test/support/events_client_mock.ex create mode 100644 test/workos/events_test.exs diff --git a/lib/workos/events.ex b/lib/workos/events.ex new file mode 100644 index 00000000..17e2ea98 --- /dev/null +++ b/lib/workos/events.ex @@ -0,0 +1,7 @@ +defmodule WorkOS.Events do + @moduledoc """ + Manage Events API in WorkOS. + + @see https://workos.com/docs/events + """ +end diff --git a/lib/workos/events/event.ex b/lib/workos/events/event.ex new file mode 100644 index 00000000..8f7c5bb7 --- /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..194c8d4c --- /dev/null +++ b/test/support/events_client_mock.ex @@ -0,0 +1,5 @@ +defmodule WorkOS.Events.ClientMock do + @moduledoc false + + use ExUnit.Case +end diff --git a/test/workos/events_test.exs b/test/workos/events_test.exs new file mode 100644 index 00000000..e7f30327 --- /dev/null +++ b/test/workos/events_test.exs @@ -0,0 +1,7 @@ +defmodule WorkOS.EventsTest do + use WorkOS.TestCase + + alias WorkOS.Events.ClientMock + + setup :setup_env +end From 160c27ed937b09a4f553bb2784a0e15cb49595c6 Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Sun, 12 Nov 2023 20:52:30 -0300 Subject: [PATCH 2/4] Implement `list_events` --- lib/workos/events.ex | 46 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/lib/workos/events.ex b/lib/workos/events.ex index 17e2ea98..a49d0d0d 100644 --- a/lib/workos/events.ex +++ b/lib/workos/events.ex @@ -4,4 +4,50 @@ defmodule WorkOS.Events do @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 From 36b88d01b2b4ee6aa3f4c1d694d6b8d900ad98af Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Sun, 12 Nov 2023 20:59:23 -0300 Subject: [PATCH 3/4] Implement tests --- lib/workos/events/event.ex | 6 ++--- test/support/events_client_mock.ex | 37 ++++++++++++++++++++++++++++++ test/workos/events_test.exs | 11 +++++++++ 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/lib/workos/events/event.ex b/lib/workos/events/event.ex index 8f7c5bb7..b800d224 100644 --- a/lib/workos/events/event.ex +++ b/lib/workos/events/event.ex @@ -9,7 +9,7 @@ defmodule WorkOS.Events.Event do id: String.t(), event: String.t(), data: map(), - created_at: String.t(), + created_at: String.t() } @enforce_keys [:id, :event, :created_at] @@ -17,7 +17,7 @@ defmodule WorkOS.Events.Event do :id, :event, :data, - :created_at, + :created_at ] @impl true @@ -26,7 +26,7 @@ defmodule WorkOS.Events.Event do id: map["id"], data: map["data"], event: map["event"], - created_at: map["created_at"], + created_at: map["created_at"] } end end diff --git a/test/support/events_client_mock.ex b/test/support/events_client_mock.ex index 194c8d4c..93b5151f 100644 --- a/test/support/events_client_mock.ex +++ b/test/support/events_client_mock.ex @@ -2,4 +2,41 @@ 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 index e7f30327..38e3d428 100644 --- a/test/workos/events_test.exs +++ b/test/workos/events_test.exs @@ -4,4 +4,15 @@ defmodule WorkOS.EventsTest do 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 From 4383c32a4ae306fe81daf4a5094d565cd8783313 Mon Sep 17 00:00:00 2001 From: Laura Beatris <48022589+LauraBeatris@users.noreply.github.com> Date: Sun, 12 Nov 2023 21:00:58 -0300 Subject: [PATCH 4/4] Add to Livebook --- workos_elixir.livemd | 8 ++++++++ 1 file changed, 8 insertions(+) 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, %{}) +```