mirror of
https://github.com/philomena-dev/philomena.git
synced 2024-11-30 23:08:00 +01:00
49 lines
1.2 KiB
Elixir
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
|