mirror of
https://github.com/philomena-dev/philomena.git
synced 2025-03-31 00:37:45 +02:00
40 lines
1.1 KiB
Elixir
40 lines
1.1 KiB
Elixir
defmodule Philomena.Adverts.Recorder do
|
|
alias Philomena.Adverts.Advert
|
|
alias Philomena.Repo
|
|
import Ecto.Query
|
|
|
|
def run(%{impressions: impressions, clicks: clicks}) do
|
|
now = DateTime.utc_now() |> DateTime.truncate(:second)
|
|
|
|
# Create insert statements for Ecto
|
|
impressions = Enum.map(impressions, &impressions_insert_all(&1, now))
|
|
clicks = Enum.map(clicks, &clicks_insert_all(&1, now))
|
|
|
|
# Merge into table
|
|
impressions_update = update(Advert, inc: [impressions: fragment("EXCLUDED.impressions")])
|
|
clicks_update = update(Advert, inc: [clicks: fragment("EXCLUDED.clicks")])
|
|
|
|
Repo.insert_all(Advert, impressions, on_conflict: impressions_update, conflict_target: [:id])
|
|
Repo.insert_all(Advert, clicks, on_conflict: clicks_update, conflict_target: [:id])
|
|
|
|
:ok
|
|
end
|
|
|
|
defp impressions_insert_all({advert_id, impressions}, now) do
|
|
%{
|
|
id: advert_id,
|
|
impressions: impressions,
|
|
created_at: now,
|
|
updated_at: now
|
|
}
|
|
end
|
|
|
|
defp clicks_insert_all({advert_id, clicks}, now) do
|
|
%{
|
|
id: advert_id,
|
|
clicks: clicks,
|
|
created_at: now,
|
|
updated_at: now
|
|
}
|
|
end
|
|
end
|