Skip to content

Commit 7f136b7

Browse files
committed
fetch user activities from nested children
1 parent 55b9a66 commit 7f136b7

File tree

3 files changed

+68
-48
lines changed

3 files changed

+68
-48
lines changed

lib/algora/activities/activities.ex

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ defmodule Algora.Activities do
22
@moduledoc false
33
import Ecto.Query
44

5+
alias Algora.Accounts.User
56
alias Algora.Activities.Activity
67
alias Algora.Repo
78

@@ -42,6 +43,9 @@ defmodule Algora.Activities do
4243
:owned_installations,
4344
:connected_installations,
4445
:client_contracts,
46+
{:client_contracts, :transactions},
47+
:client_contracts,
48+
{:contractor_contracts, :transactions},
4549
:contractor_contracts
4650
]
4751

@@ -50,17 +54,27 @@ defmodule Algora.Activities do
5054

5155
def base_query do
5256
[head | tail] = @tables
53-
5457
query = head |> to_string() |> base_query()
5558

56-
Enum.reduce(tail, query, fn table_name, acc ->
57-
new_query = table_name |> to_string() |> base_query()
59+
Enum.reduce(tail, query, fn table_path, acc ->
60+
new_query = base_query(table_path)
5861
union_all(new_query, ^acc)
5962
end)
6063
end
6164

6265
def base_query(table_name) do
63-
from(_e in {table_name, Activity})
66+
from(_e in {to_string(table_name), Activity})
67+
end
68+
69+
def base_query({parent_table_name, table_name}) do
70+
parent = to_string(parent_table_name)
71+
child = to_string(table_name)
72+
73+
parent_table_name
74+
|> base_query()
75+
|> join(:inner, [p], assoc(p, ^parent), as: :parent)
76+
|> join(:inner, [c], assoc(c, ^child), as: :child)
77+
|> join(:inner, [a], assoc(a, :activities), as: :activities)
6478
end
6579

6680
def base_query_for_user(user_id) do
@@ -73,8 +87,17 @@ defmodule Algora.Activities do
7387
end)
7488
end
7589

90+
def base_query_for_user(user_id, {parent_table_name, table_name}) do
91+
from u in User,
92+
where: u.id == ^user_id,
93+
join: p in assoc(u, ^parent_table_name),
94+
join: c in assoc(p, ^table_name),
95+
join: a in assoc(c, :activities),
96+
select: a
97+
end
98+
7699
def base_query_for_user(user_id, name) do
77-
from u in Algora.Accounts.User,
100+
from u in User,
78101
where: u.id == ^user_id,
79102
join: c in assoc(u, ^name),
80103
join: a in assoc(c, :activities),

test/algora/accounts_test.exs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ defmodule Algora.AccountsTest do
2626
user_2 = insert(:user, tech_stack: ["rust", "c++"])
2727
org_1 = insert(:organization, seeded: false)
2828

29-
assert Accounts.fetch_developer(user_1.id) |> elem(1) |> Map.get(:id) == user_1.id
30-
assert Accounts.fetch_developer_by([sort_by_tech_stack: ["rust"]]) |> elem(1) |> Map.get(:id) == user_2.id
29+
assert user_1.id |> Accounts.fetch_developer() |> elem(1) |> Map.get(:id) == user_1.id
30+
assert [sort_by_tech_stack: ["rust"]] |> Accounts.fetch_developer_by() |> elem(1) |> Map.get(:id) == user_2.id
3131

32-
assert Accounts.list_developers([]) |> length == 2
33-
assert Accounts.list_orgs([]) |> length == 2
32+
assert [] |> Accounts.list_developers() |> length() == 2
33+
assert [] |> Accounts.list_orgs() |> length() == 1
3434

3535
assert_activity_names_for_user(user_1.id, [])
3636
assert_activity_names_for_user(org_1.id, [])

test/algora/contracts_test.exs

Lines changed: 36 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -206,59 +206,56 @@ defmodule Algora.ContractsTest do
206206
{:ok, contract_b_1} = Contracts.fetch_contract(contract_b_1.id)
207207
{:ok, {_txs2, _contract_b_2}} = Contracts.release_and_renew_contract(contract_b_1)
208208

209-
activities_per_contract = [
210-
# :transaction_created,
211-
# :transaction_created,
212-
# :transaction_created,
213-
# :transaction_created,
214-
# :transaction_status_change,
215-
# :transaction_status_change,
216-
# :transaction_status_change,
217-
:contract_paid
218-
]
219-
220-
activities_per_cycle =
221-
activities_per_contract ++
222-
[
223-
:contract_renewed
224-
]
225-
226-
activities_per_group =
227-
[
228-
# :transaction_created,
229-
:contract_prepaid
230-
] ++
231-
activities_per_cycle ++
232-
activities_per_cycle
233-
234209
assert_activity_names(
235210
contract_a_0,
236-
[
237-
# :transaction_created,
238-
:contract_prepaid
239-
] ++ activities_per_contract
211+
[:contract_prepaid, :contract_paid]
240212
)
241213

242214
assert_activity_names(
243215
contract_a_1,
244-
[
245-
:contract_renewed
246-
] ++ activities_per_contract
216+
[:contract_renewed, :contract_paid]
247217
)
248218

249219
assert_activity_names(
250220
"contract_activities",
251-
activities_per_group ++ activities_per_group
221+
[
222+
:contract_prepaid,
223+
:contract_paid,
224+
:contract_renewed,
225+
:contract_paid,
226+
:contract_renewed,
227+
:contract_prepaid,
228+
:contract_paid,
229+
:contract_renewed,
230+
:contract_paid,
231+
:contract_renewed
232+
]
252233
)
253234

254235
assert_activity_names_for_user(
255236
contract_a_0.contractor_id,
256-
activities_per_group
257-
)
258-
259-
assert_activity_names_for_user(
260-
contract_b_0.contractor_id,
261-
activities_per_group
237+
[
238+
:transaction_created,
239+
:contract_prepaid,
240+
:transaction_created,
241+
:transaction_created,
242+
:transaction_created,
243+
:transaction_created,
244+
:transaction_status_change,
245+
:transaction_status_change,
246+
:transaction_status_change,
247+
:contract_paid,
248+
:contract_renewed,
249+
:transaction_created,
250+
:transaction_created,
251+
:transaction_created,
252+
:transaction_created,
253+
:transaction_status_change,
254+
:transaction_status_change,
255+
:transaction_status_change,
256+
:contract_paid,
257+
:contract_renewed
258+
]
262259
)
263260

264261
assert Activities.all_for_user(contract_a_0.client_id) !=

0 commit comments

Comments
 (0)