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