cover/Elixir.WalletRisk.Queries.GetRiskProfile.html

1 defmodule WalletRisk.Queries.GetRiskProfile do
2 @moduledoc """
3 Query the aggregated risk profile for a user.
4
5 Returns the current score, band, signal count, case count, and status.
6 """
7
8 alias WalletRisk.{RiskProfileStore, RiskSignalStore, RiskCaseStore}
9
10 @spec by_user_id(user_id :: String.t()) :: {:ok, map()} | {:error, :not_found}
11 def by_user_id(user_id) do
12 3 case RiskProfileStore.get_by_user(user_id) do
13 {:ok, profile} ->
14 2 signals = RiskSignalStore.list_by_user(user_id)
15 2 cases = RiskCaseStore.list_by_user(user_id)
16
17 {:ok, %{
18 2 profile_id: profile.profile_id,
19 2 user_id: profile.user_id,
20 2 score: profile.score,
21 2 status: profile.status,
22 signal_count: length(signals),
23 case_count: length(cases),
24 2 last_scored_at: profile.last_scored_at,
25 open_case_ids: cases
26 1 |> Enum.filter(fn c -> c.status not in [:resolved, :escalated_to_compliance] end)
27 1 |> Enum.map(& &1.case_id)
28 }}
29
30 1 err -> err
31 end
32 end
33 end
Line Hits Source