philomena/lib/philomena/user_statistics.ex

49 lines
1.2 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 = :"#{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