Skip to content

Commit 5e7b73c

Browse files
committed
fix: derive user metrics via user_activities
1 parent 3fcbff2 commit 5e7b73c

File tree

2 files changed

+70
-16
lines changed

2 files changed

+70
-16
lines changed

lib/algora/analytics/metrics.ex

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ defmodule Algora.Analytics.Metrics do
5050
where: not is_nil(u.handle),
5151
select: %{
5252
inserted_at: fragment("date_trunc(?, ?)", ^interval_str, u.inserted_at),
53-
last_active_at: fragment("date_trunc(?, ?)", ^interval_str, u.last_active_at),
5453
is_org:
5554
fragment(
5655
"""
@@ -78,17 +77,52 @@ defmodule Algora.Analytics.Metrics do
7877
}
7978
}
8079

81-
# Get returns per period
80+
# Get returns per period using user_activities
8281
returns =
83-
from q in subquery(base_query),
82+
from u in User,
83+
inner_join: ua in "user_activities",
84+
on: ua.assoc_id == u.id and ua.type == "user_online",
85+
where: not is_nil(u.handle),
8486
right_join: p in subquery(periods_query),
85-
on: q.last_active_at == p.period_start,
87+
on: fragment("date_trunc(?, ?)", ^interval_str, ua.inserted_at) == p.period_start,
8688
group_by: p.period_start,
8789
select: {
8890
p.period_start,
8991
%{
90-
org_returns: coalesce(count(fragment("CASE WHEN ? IS TRUE THEN 1 END", q.is_org)), 0),
91-
dev_returns: coalesce(count(fragment("CASE WHEN ? IS NOT TRUE THEN 1 END", q.is_org)), 0)
92+
org_returns:
93+
coalesce(
94+
count(
95+
fragment(
96+
"""
97+
DISTINCT CASE WHEN EXISTS (
98+
SELECT 1 FROM members m
99+
INNER JOIN users o ON m.org_id = o.id
100+
WHERE m.user_id = ? AND o.id != m.user_id
101+
) THEN ? END
102+
""",
103+
u.id,
104+
u.id
105+
)
106+
),
107+
0
108+
),
109+
dev_returns:
110+
coalesce(
111+
count(
112+
fragment(
113+
"""
114+
DISTINCT CASE WHEN NOT EXISTS (
115+
SELECT 1 FROM members m
116+
INNER JOIN users o ON m.org_id = o.id
117+
WHERE m.user_id = ? AND o.id != m.user_id
118+
) THEN ? END
119+
""",
120+
u.id,
121+
u.id
122+
)
123+
),
124+
0
125+
)
92126
}
93127
}
94128

lib/algora_web/live/admin/admin_live.ex

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -150,12 +150,28 @@ defmodule AlgoraWeb.Admin.AdminLive do
150150
<.stat_card title={metric.label} value={metric.value} />
151151
<% end %>
152152
</div>
153-
<div class="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-4">
154-
<%= for {_date, metrics} <- Enum.take(@user_metrics, 1) do %>
155-
<.stat_card title="Organization Signups" value={metrics.org_signups} subtitle="Last 24h" />
156-
<.stat_card title="Organization Returns" value={metrics.org_returns} subtitle="Last 24h" />
157-
<.stat_card title="Developer Signups" value={metrics.dev_signups} subtitle="Last 24h" />
158-
<.stat_card title="Developer Returns" value={metrics.dev_returns} subtitle="Last 24h" />
153+
<div :if={@timezone} class="grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-4">
154+
<%= for {date, metrics} <- Enum.take(@user_metrics, 1) do %>
155+
<.stat_card
156+
title="Organization Signups"
157+
value={metrics.org_signups}
158+
subtext={format_date(date, @timezone)}
159+
/>
160+
<.stat_card
161+
title="Organization Returns"
162+
value={metrics.org_returns}
163+
subtext={format_date(date, @timezone)}
164+
/>
165+
<.stat_card
166+
title="Developer Signups"
167+
value={metrics.dev_signups}
168+
subtext={format_date(date, @timezone)}
169+
/>
170+
<.stat_card
171+
title="Developer Returns"
172+
value={metrics.dev_returns}
173+
subtext={format_date(date, @timezone)}
174+
/>
159175
<% end %>
160176
</div>
161177
</section>
@@ -536,10 +552,7 @@ defmodule AlgoraWeb.Admin.AdminLive do
536552
defp cell(%{value: %NaiveDateTime{}} = assigns) do
537553
~H"""
538554
<span :if={@timezone} class="tabular-nums whitespace-nowrap text-sm">
539-
{Calendar.strftime(
540-
DateTime.from_naive!(@value, "Etc/UTC") |> DateTime.shift_zone!(@timezone),
541-
"%Y/%m/%d, %H:%M:%S"
542-
)}
555+
{format_date(@value, @timezone)}
543556
</span>
544557
"""
545558
end
@@ -681,4 +694,11 @@ defmodule AlgoraWeb.Admin.AdminLive do
681694
updated_queries = Map.put(queries, name, query)
682695
Algora.Settings.set("saved_queries", updated_queries)
683696
end
697+
698+
defp format_date(date, timezone) do
699+
date
700+
|> DateTime.from_naive!("Etc/UTC")
701+
|> DateTime.shift_zone!(timezone)
702+
|> Calendar.strftime("%Y/%m/%d, %H:%M:%S")
703+
end
684704
end

0 commit comments

Comments
 (0)