Current section

Files

Jump to
ami lib ami like.ex
Raw

lib/ami/like.ex

defmodule Ami.Like do
use Ecto.Schema
import Ecto.{
Query,
Changeset
}
alias Ami.{
User,
Repo
}
schema "likes" do
@timestamps_opts [type: :naive_datetime_usec]
field(:likeable_id, :integer)
field(:likeable_type, :string)
field(:created_at, :utc_datetime_usec)
field(:updated_at, :utc_datetime_usec)
belongs_to(:user, User)
end
def preload_likes(struct, likeable_type) do
query = from(l in __MODULE__, where: l.likeable_type == ^likeable_type, order_by: l.id)
struct
|> Repo.preload(likes: {query, [user: :profile]})
end
def changeset(like, params \\ %{}) do
like
|> cast(params, [:created_at, :updated_at, :likeable_type, :likeable_id, :user_id])
|> validate_required([:user_id, :likeable_type, :likeable_id])
|> unique_constraint(:likeable_id, name: :likes_likeable_id_likeable_type_user_id_index)
end
def count_for(%Ami.Post{} = post, user) do
Repo.one(
from(
l in __MODULE__,
where: l.likeable_type == "Post",
where: l.likeable_id == ^post.id,
where: l.user_id == ^user.id,
select: count(l.id)
)
)
end
def count_for(%Ami.Tool{} = tool, user) do
Repo.one(
from(
l in __MODULE__,
where: l.likeable_type == "Tool",
where: l.likeable_id == ^tool.id,
where: l.user_id == ^user.id,
select: count(l.id)
)
)
end
def count_for(%Ami.Toolkit{} = toolkit, user) do
Repo.one(
from(
l in __MODULE__,
where: l.likeable_type == "ToolKit",
where: l.likeable_id == ^toolkit.id,
where: l.user_id == ^user.id,
select: count(l.id)
)
)
end
end