Skip to content

Commit 909410d

Browse files
authored
feat: Support transient identities and traits (#36)
1 parent d10e496 commit 909410d

File tree

3 files changed

+63
-15
lines changed

3 files changed

+63
-15
lines changed

lib/flagsmith_client.ex

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -152,28 +152,30 @@ defmodule Flagsmith.Client do
152152
@spec get_identity_flags(
153153
Configuration.t() | Keyword.t(),
154154
String.t(),
155-
list(map() | Schemas.Traits.Trait.t())
155+
list(map() | Schemas.Traits.Trait.t()),
156+
boolean()
156157
) ::
157158
{:ok, Schemas.Flags.t()} | {:error, term()}
158-
def get_identity_flags(configuration_or_opts \\ [], identifier, traits)
159+
def get_identity_flags(configuration_or_opts \\ [], identifier, traits, transient \\ false)
159160

160161
def get_identity_flags(
161162
%Configuration{enable_local_evaluation: local?} = config,
162163
identifier,
163-
traits
164+
traits,
165+
transient
164166
) do
165167
case local? do
166168
true -> Flagsmith.Client.Poller.get_identity_flags(config, identifier, traits)
167-
false -> get_identity_flags_request(config, identifier, traits)
169+
false -> get_identity_flags_request(config, identifier, traits, transient)
168170
end
169171
end
170172

171-
def get_identity_flags(opts, identifier, traits) when is_list(opts),
172-
do: get_identity_flags(new(opts), identifier, traits)
173+
def get_identity_flags(opts, identifier, traits, transient) when is_list(opts),
174+
do: get_identity_flags(new(opts), identifier, traits, transient)
173175

174176
@doc false
175-
def get_identity_flags_request(%Configuration{} = config, identifier, traits) do
176-
query = build_identity_params(identifier, traits)
177+
def get_identity_flags_request(%Configuration{} = config, identifier, traits, transient) do
178+
query = build_identity_params(identifier, traits, transient)
177179

178180
case Tesla.post(http_client(config), @api_paths.identities, query) do
179181
{:ok, %{status: status, body: body}} when status >= 200 and status < 300 ->
@@ -375,15 +377,16 @@ defmodule Flagsmith.Client do
375377
feature_flag
376378
end
377379

378-
defp build_identity_params(identifier, [_ | _] = traits) do
380+
defp build_identity_params(identifier, [_ | _] = traits, transient) do
379381
%{
380382
identifier: identifier,
381-
traits: Schemas.Traits.Trait.from(traits)
383+
traits: Schemas.Traits.Trait.from(traits),
384+
transient: transient
382385
}
383386
end
384387

385-
defp build_identity_params(identifier, _),
386-
do: %{identifier: identifier}
388+
defp build_identity_params(identifier, _, transient),
389+
do: %{identifier: identifier, transient: transient}
387390

388391
@doc false
389392
@spec auth_middleware(environment_key :: String.t()) ::

lib/schemas/traits/trait.ex

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@ defmodule Flagsmith.Schemas.Traits.Trait do
88
Ecto schema representing a Flagsmith trait definition.
99
"""
1010

11-
@derive {Jason.Encoder, only: [:trait_key, :trait_value]}
11+
@derive {Jason.Encoder, only: [:trait_key, :trait_value, :transient]}
1212

1313
@primary_key {:id, :id, autogenerate: false}
1414
typed_embedded_schema do
1515
field(:trait_key, :string)
1616
field(:trait_value, __MODULE__.Value)
17+
field(:transient, :boolean, default: false)
1718
end
1819

1920
@doc false
@@ -44,7 +45,7 @@ defmodule Flagsmith.Schemas.Traits.Trait do
4445

4546
def from(%{} = params) do
4647
%__MODULE__{}
47-
|> cast(params, [:trait_value, :trait_key, :id])
48+
|> cast(params, [:trait_value, :trait_key, :transient, :id])
4849
|> validate_required([:trait_value])
4950
|> apply_changes()
5051
end

test/flagsmith_client_test.exs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ defmodule Flagsmith.Client.Test do
269269
expect(Tesla.Adapter.Mock, :call, fn tesla_env, _options ->
270270
assert_request(
271271
tesla_env,
272-
body: "{\"identifier\":\"super1234324\"}",
272+
body: "{\"transient\":false,\"identifier\":\"super1234324\"}",
273273
query: [],
274274
headers: [{@environment_header, config.environment_key}],
275275
url: Path.join([@api_url, @api_paths.identities]) <> "/",
@@ -315,6 +315,50 @@ defmodule Flagsmith.Client.Test do
315315
# we also assert that no poller was initiated by making sure there's no pid
316316
assert :undefined = Flagsmith.Client.Poller.whereis(config.environment_key)
317317
end
318+
319+
test "get_identity_flags for transient identity", %{config: config} do
320+
# set expectation for the http call
321+
expect(Tesla.Adapter.Mock, :call, fn tesla_env, _options ->
322+
assert_request(
323+
tesla_env,
324+
body: "{\"transient\":true,\"identifier\":\"super1234324\"}",
325+
query: [],
326+
headers: [{@environment_header, config.environment_key}],
327+
url: Path.join([@api_url, @api_paths.identities]) <> "/",
328+
method: :post
329+
)
330+
331+
{:ok, %Tesla.Env{status: 200, body: Test.Generators.map_identity()}}
332+
end)
333+
334+
Flagsmith.Client.get_identity_flags(config, "super1234324", [], true)
335+
end
336+
337+
test "get_identity_flags for transient traits", %{config: config} do
338+
# set expectation for the http call
339+
expect(Tesla.Adapter.Mock, :call, fn tesla_env, _options ->
340+
assert_request(
341+
tesla_env,
342+
body:
343+
"{\"transient\":false,\"identifier\":\"super1234324\",\"traits\":[{\"trait_key\":\"foo\",\"trait_value\":{\"value\":\"bar\",\"type\":\"string\"},\"transient\":false},{\"trait_key\":\"transient\",\"trait_value\":{\"value\":\"bar\",\"type\":\"string\"},\"transient\":true}]}",
344+
query: [],
345+
headers: [{@environment_header, config.environment_key}],
346+
url: Path.join([@api_url, @api_paths.identities]) <> "/",
347+
method: :post
348+
)
349+
350+
{:ok, %Tesla.Env{status: 200, body: Test.Generators.map_identity()}}
351+
end)
352+
353+
Flagsmith.Client.get_identity_flags(
354+
config,
355+
"super1234324",
356+
[
357+
%{trait_key: "foo", trait_value: "bar"},
358+
%{trait_key: "transient", trait_value: "bar", transient: true}
359+
]
360+
)
361+
end
318362
end
319363

320364
describe "failure tests" do

0 commit comments

Comments
 (0)