Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
e93f335
feat: TD-8083 Add user group management features
victordpc Apr 29, 2026
28004d1
feat: TD-8083 Enhance user group management with alias support
victordpc Apr 30, 2026
a48b19e
feat: TD-8083 Add support for group role fields in template processing
victordpc Apr 30, 2026
2dd18ad
fix: TD-8083 Update user cache to correctly handle group name and ali…
guillermobluetab May 6, 2026
999785f
test: TD-8083 Add tests to ignore users and groups not present in cache
guillermobluetab May 6, 2026
46ec95e
feat: TD-8083 Update group management to handle name and alias changes
guillermobluetab May 6, 2026
377feaf
feat: TD-8083 Add cache clearing functions for users and groups
guillermobluetab May 6, 2026
4d3115b
refactor: TD-8083 Simplify group name and alias handling in field for…
guillermobluetab May 7, 2026
e41b465
refactor: TD-8083 Improve group ID parsing in user cache
guillermobluetab May 7, 2026
48b16f9
chore: TD-8083 bump version 8.6.0
guillermobluetab May 12, 2026
56f8fb2
Merge branch 'main' of github.com:Bluetab/td-cache into feature/td-8083
guillermobluetab May 19, 2026
cc0bf6e
Merge branch 'main' of github.com:Bluetab/td-cache into feature/td-8083
guillermobluetab Jun 1, 2026
8582aa0
feat: TD-8083 Enhance user group and template processing
guillermobluetab Jun 1, 2026
1c94014
chore: TD-8083 bump version 8.6.2
guillermobluetab Jun 1, 2026
13f1dec
feat: TD-8083 Normalize empty group alias to nil in field formatter
guillermobluetab Jun 1, 2026
7226bc1
refactor: TD-8083 Remove display_name from group handling in user cac…
guillermobluetab Jun 3, 2026
c034088
chore: TD-803 update changelog
guillermobluetab Jun 3, 2026
132ec79
chore: TD-8083 gitignore
saulisern Jun 4, 2026
6516d7f
feat: TD-8083 Add list_groups function to user cache for retrieving a…
guillermobluetab Jun 5, 2026
4db2f34
doc: TD-8083 CHANGELOG
saulisern Jun 5, 2026
8f40aee
Merge branch 'feature/td-8083' of github.com:Bluetab/td-cache into fe…
saulisern Jun 5, 2026
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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,3 +25,4 @@ td_cache-*.tar

.iex.exs
.tool-versions
CLAUDE.md
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Changelog

## [8.6.2] 2026-06-05

### Added

- [TD-8083] Add processed_groups_details

## [8.6.1] 2026-05-20

### Fixed
Expand Down
19 changes: 18 additions & 1 deletion lib/td_cache/templates/field_formatter.ex
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,13 @@ defmodule TdCache.Templates.FieldFormatter do
when not is_nil(role_name) do
groups = Map.get(user_group_roles, role_name, [])
names = Enum.map(groups, &group_name_or_alias/1)
values = Map.put(values, "processed_groups", names)
details = Enum.map(groups, &group_details/1)

values =
values
|> Map.put("processed_groups", names)
|> Map.put("processed_groups_details", details)

Map.put(field, "values", values)
end

Expand All @@ -93,4 +99,15 @@ defmodule TdCache.Templates.FieldFormatter do
do: name

defp group_name_or_alias(%{alias: group_alias}), do: group_alias

defp group_details(%{id: id, name: name, alias: group_alias}) do
%{
"id" => id,
"name" => name,
"alias" => normalize_group_alias(group_alias)
}
end

defp normalize_group_alias(group_alias) when group_alias in [nil, ""], do: nil
defp normalize_group_alias(group_alias), do: group_alias
end
14 changes: 14 additions & 0 deletions lib/td_cache/user_cache.ex
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,10 @@ defmodule TdCache.UserCache do
GenServer.call(__MODULE__, {:get_group_by_name, name})
end

def list_groups do
GenServer.call(__MODULE__, :list_groups)
end

def put(user) do
GenServer.call(__MODULE__, {:put, user})
end
Expand Down Expand Up @@ -210,6 +214,16 @@ defmodule TdCache.UserCache do
{:reply, {:ok, group}, state}
end

def handle_call(:list_groups, _from, state) do
groups =
case Redix.command(["SMEMBERS", Keys.group_ids()]) do
{:ok, ids} -> ids |> Enum.map(&read_group/1) |> Enum.reject(&is_nil/1)
_ -> []
end

{:reply, {:ok, groups}, state}
end

def handle_call({:put, user}, _from, state) do
reply = put_user(user)
{:reply, reply, state}
Expand Down
2 changes: 1 addition & 1 deletion mix.exs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ defmodule TdCache.MixProject do
def project do
[
app: :td_cache,
version: "8.6.1",
version: "8.6.2",
elixir: "~> 1.18",
elixirc_paths: elixirc_paths(Mix.env()),
start_permanent: Mix.env() == :prod,
Expand Down
48 changes: 48 additions & 0 deletions test/td_cache/templates/field_formatter_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -47,5 +47,53 @@ defmodule TdCache.Templates.FieldFormatterTest do

assert FieldFormatter.format(field, ctx) == field
end

test "format/2 applies user group metadata with group details" do
field = %{"name" => "foo", "type" => "user_group", "values" => %{"role_groups" => "owner"}}

groups = [
%{id: 1, name: "group_1", alias: "Group 1"},
%{id: 2, name: "group_2", alias: nil}
]

user_group_roles = %{"owner" => groups}
ctx = %{user_group_roles: user_group_roles}

expected = %{
"name" => "foo",
"type" => "user_group",
"values" => %{
"role_groups" => "owner",
"processed_groups" => ["Group 1", "group_2"],
"processed_groups_details" => [
%{"id" => 1, "name" => "group_1", "alias" => "Group 1"},
%{"id" => 2, "name" => "group_2", "alias" => nil}
]
}
}

assert FieldFormatter.format(field, ctx) == expected
end

test "format/2 normalizes empty group alias to nil in processed_groups_details" do
field = %{"name" => "foo", "type" => "user_group", "values" => %{"role_groups" => "owner"}}
groups = [%{id: 1, name: "group_1", alias: ""}]
user_group_roles = %{"owner" => groups}
ctx = %{user_group_roles: user_group_roles}

expected = %{
"name" => "foo",
"type" => "user_group",
"values" => %{
"role_groups" => "owner",
"processed_groups" => ["group_1"],
"processed_groups_details" => [
%{"id" => 1, "name" => "group_1", "alias" => nil}
]
}
}

assert FieldFormatter.format(field, ctx) == expected
end
end
end
31 changes: 26 additions & 5 deletions test/td_cache/templates/preprocessor_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ defmodule TdCache.Templates.PreprocessorTest do
test "preprocess_template/2 enriches user_group role fields" do
%{id: domain_id} = CacheHelpers.insert_domain()
%{id: user_id, full_name: full_name} = CacheHelpers.insert_user()
%{id: group_id, alias: group_alias} = CacheHelpers.insert_group()
%{id: group_id, alias: group_alias, name: group_name} = CacheHelpers.insert_group()

AclCache.set_acl_roles("domain", domain_id, [@role_name])
AclCache.set_acl_group_roles("domain", domain_id, [@role_name])
Expand Down Expand Up @@ -83,7 +83,14 @@ defmodule TdCache.Templates.PreprocessorTest do
"values" => %{
"role_groups" => @role_name,
"processed_users" => [full_name],
"processed_groups" => [group_alias]
"processed_groups" => [group_alias],
"processed_groups_details" => [
%{
"id" => group_id,
"name" => group_name,
"alias" => group_alias
}
]
}
}

Expand Down Expand Up @@ -131,7 +138,7 @@ defmodule TdCache.Templates.PreprocessorTest do
test "preprocess_template/2 process dynamic table type fields" do
%{id: domain_id} = CacheHelpers.insert_domain()
%{id: user_id, full_name: full_name} = CacheHelpers.insert_user()
%{id: group_id, alias: group_alias} = CacheHelpers.insert_group()
%{id: group_id, alias: group_alias, name: group_name} = CacheHelpers.insert_group()

AclCache.set_acl_roles("domain", domain_id, [@role_name])
AclCache.set_acl_group_roles("domain", domain_id, [@role_name])
Expand Down Expand Up @@ -207,6 +214,13 @@ defmodule TdCache.Templates.PreprocessorTest do
"type" => "user_group",
"values" => %{
"processed_groups" => [group_alias],
"processed_groups_details" => [
%{
"id" => group_id,
"name" => group_name,
"alias" => group_alias
}
],
"processed_users" => [full_name],
"role_groups" => "foo_role"
}
Expand All @@ -216,7 +230,7 @@ defmodule TdCache.Templates.PreprocessorTest do
test "preprocess_template/2 enriches group role fields with groups only" do
%{id: domain_id} = CacheHelpers.insert_domain()
%{id: user_id} = CacheHelpers.insert_user()
%{id: group_id, alias: group_alias} = CacheHelpers.insert_group()
%{id: group_id, alias: group_alias, name: group_name} = CacheHelpers.insert_group()

AclCache.set_acl_roles("domain", domain_id, [@role_name])
AclCache.set_acl_group_roles("domain", domain_id, [@role_name])
Expand All @@ -243,7 +257,14 @@ defmodule TdCache.Templates.PreprocessorTest do
"type" => "group",
"values" => %{
"role_groups" => @role_name,
"processed_groups" => [group_alias]
"processed_groups" => [group_alias],
"processed_groups_details" => [
%{
"id" => group_id,
"name" => group_name,
"alias" => group_alias
}
]
}
}
end
Expand Down
18 changes: 11 additions & 7 deletions test/td_cache/user_cache_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -290,14 +290,14 @@ defmodule TdCache.UserCacheTest do
group = build(:group)
put_user_group(group)
{:ok, g} = UserCache.get_group(group.id)
assert g == Map.take(group, [:name, :alias, :id])
assert g == expected_group_cache(group)
end

test "get_group_by_name returns a map with name and alias " do
group = build(:group)
put_user_group(group)
{:ok, g} = UserCache.get_group_by_name(group.name)
assert g == Map.take(group, [:name, :alias, :id])
assert g == expected_group_cache(group)
end

test "get_group_by_name returns a group by alias" do
Expand All @@ -306,7 +306,7 @@ defmodule TdCache.UserCacheTest do

{:ok, g} = UserCache.get_group_by_name(group.alias)

assert g == Map.take(group, [:name, :alias, :id])
assert g == expected_group_cache(group)
end

test "get_group_by_name returns groups from a list of names" do
Expand All @@ -318,8 +318,8 @@ defmodule TdCache.UserCacheTest do
{:ok, groups} = UserCache.get_group_by_name([group1.name, group2.name])

assert groups == [
Map.take(group1, [:name, :alias, :id]),
Map.take(group2, [:name, :alias, :id])
expected_group_cache(group1),
expected_group_cache(group2)
]
end

Expand All @@ -338,8 +338,8 @@ defmodule TdCache.UserCacheTest do
UserCache.get_group_by_name([group1.name, group2.name, user1.user_name, user2.user_name])

assert groups == [
Map.take(group1, [:name, :alias, :id]),
Map.take(group2, [:name, :alias, :id]),
expected_group_cache(group1),
expected_group_cache(group2),
nil,
nil
]
Expand Down Expand Up @@ -468,4 +468,8 @@ defmodule TdCache.UserCacheTest do
on_exit(fn -> UserCache.delete_group(id) end)
UserCache.put_group(group)
end

defp expected_group_cache(%{id: id, name: name, alias: group_alias}) do
%{id: id, name: name, alias: group_alias}
end
end
Loading