philomena/lib/philomena/user_statistics.ex
2021-04-01 12:49:41 -04:00

57 lines
1.3 KiB
Elixir

defmodule Philomena.UserStatistics do
@moduledoc """
The UserStatistics context.
"""
import Ecto.Query, warn: false
alias Philomena.Repo
alias Philomena.UserStatistics.UserStatistic
alias Philomena.Users.User
@doc """
Updates a user_statistic.
## Examples
iex> update_user_statistic(user_statistic, %{field: new_value})
{:ok, %UserStatistic{}}
iex> update_user_statistic(user_statistic, %{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def inc_stat(user, action, amount \\ 1)
def inc_stat(nil, _action, _amount), do: {:ok, nil}
def inc_stat(%{id: user_id}, action, amount)
when action in [
:uploads,
:images_favourited,
:comments_posted,
:votes_cast,
:metadata_updates,
:forum_posts
] do
now =
DateTime.utc_now()
|> DateTime.to_unix(:second)
|> div(86400)
user = User |> where(id: ^user_id)
action_count = String.to_existing_atom("#{action}_count")
run = fn ->
Repo.update_all(user, inc: [{action_count, amount}])
Repo.insert(
Map.put(%UserStatistic{day: now, user_id: user_id}, action, amount),
on_conflict: [inc: [{action, amount}]],
conflict_target: [:day, :user_id]
)
end
Repo.transaction(run)
end
end