mirror of
https://github.com/philomena-dev/philomena.git
synced 2024-12-18 15:08:00 +01:00
57 lines
1.3 KiB
Elixir
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
|