Skip to content

Commit 2c1f551

Browse files
vishaldeepakbegedin
authored andcommitted
Added project filter in users index api (#1268)
1 parent 3788c8b commit 2c1f551

File tree

5 files changed

+65
-1
lines changed

5 files changed

+65
-1
lines changed

lib/code_corps/accounts/users.ex

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
defmodule CodeCorps.Accounts.Users do
2+
alias CodeCorps.ProjectUser
3+
4+
import Ecto.Query
5+
6+
def project_filter(query, %{"project_id" => project_id}) do
7+
from user in query,
8+
join: pu in ProjectUser, on: pu.user_id == user.id and pu.project_id == ^project_id
9+
end
10+
def project_filter(query, _), do: query
11+
end

lib/code_corps_web/controllers/user_controller.ex

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ defmodule CodeCorpsWeb.UserController do
77
GitHub,
88
Helpers.Query,
99
Services.UserService,
10-
User
10+
User,
11+
Accounts
1112
}
1213

1314
action_fallback CodeCorpsWeb.FallbackController
@@ -20,6 +21,7 @@ defmodule CodeCorpsWeb.UserController do
2021
|> Query.id_filter(params)
2122
|> Query.limit_filter(params)
2223
|> Query.user_filter(params)
24+
|> Accounts.Users.project_filter(params)
2325
|> Repo.all()
2426
|> preload()
2527

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
defmodule CodeCorps.Accounts.UsersTest do
2+
@moduledoc false
3+
4+
use CodeCorps.DbAccessCase
5+
import CodeCorps.TestHelpers, only: [assert_ids_from_query: 2]
6+
7+
alias CodeCorps.{Accounts, User}
8+
9+
describe "project_filter/2" do
10+
test "filters users by project filter" do
11+
user_1 = insert(:user)
12+
user_2 = insert(:user)
13+
14+
project = insert(:project)
15+
16+
insert(:project_user, user: user_1, project: project)
17+
insert(:project_user, user: user_2, project: project)
18+
insert(:project_user)
19+
20+
result =
21+
User
22+
|> Accounts.Users.project_filter(%{"project_id" => project.id})
23+
|> Repo.all()
24+
25+
assert_ids_from_query(result, [user_1.id, user_2.id])
26+
end
27+
end
28+
end

test/lib/code_corps_web/controllers/user_controller_test.exs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,25 @@ defmodule CodeCorpsWeb.UserControllerTest do
6262
|> assert_ids_from_response([user_1.id, user_2.id, user_3.id])
6363
end
6464

65+
test "returns search result on project filter", %{conn: conn} do
66+
user_1 = insert(:user)
67+
user_2 = insert(:user)
68+
69+
project = insert(:project)
70+
71+
insert(:project_user, user: user_1, project: project)
72+
insert(:project_user, user: user_2, project: project)
73+
insert(:project_user)
74+
75+
params = %{"project_id" => project.id}
76+
path = conn |> user_path(:index, params)
77+
78+
conn
79+
|> get(path)
80+
|> json_response(200)
81+
|> assert_ids_from_response([user_1.id, user_2.id])
82+
end
83+
6584
test "limit filter limits results on index", %{conn: conn} do
6685
insert_list(6, :user)
6786

test/support/test_helpers.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ defmodule CodeCorps.TestHelpers do
88
end
99
end
1010

11+
def assert_ids_from_query(query, ids) do
12+
assert query |> Enum.map(&Map.get(&1, :id)) |> Enum.sort == ids |> Enum.sort()
13+
end
14+
1115
def assert_id_from_response(response, id) do
1216
assert String.to_integer(response["data"]["id"]) == id
1317
response

0 commit comments

Comments
 (0)