55 lines
1.4 KiB
Elixir
55 lines
1.4 KiB
Elixir
defmodule Pleroma.User.HashtagFollow do
|
|
use Ecto.Schema
|
|
import Ecto.Query
|
|
import Ecto.Changeset
|
|
|
|
alias Pleroma.User
|
|
alias Pleroma.Hashtag
|
|
alias Pleroma.Repo
|
|
|
|
schema "user_follows_hashtag" do
|
|
belongs_to(:user, User, type: FlakeId.Ecto.CompatType)
|
|
belongs_to(:hashtag, Hashtag)
|
|
end
|
|
|
|
def changeset(%__MODULE__{} = user_hashtag_follow, attrs) do
|
|
user_hashtag_follow
|
|
|> cast(attrs, [:user_id, :hashtag_id])
|
|
|> unique_constraint(:hashtag_id,
|
|
name: :user_hashtag_follows_user_id_hashtag_id_index,
|
|
message: "already following"
|
|
)
|
|
|> validate_required([:user_id, :hashtag_id])
|
|
end
|
|
|
|
def new(%User{} = user, %Hashtag{} = hashtag) do
|
|
%__MODULE__{}
|
|
|> changeset(%{user_id: user.id, hashtag_id: hashtag.id})
|
|
|> Repo.insert(on_conflict: :nothing)
|
|
end
|
|
|
|
def delete(%User{} = user, %Hashtag{} = hashtag) do
|
|
with %__MODULE__{} = user_hashtag_follow <- get(user, hashtag) do
|
|
Repo.delete(user_hashtag_follow)
|
|
else
|
|
_ -> {:ok, nil}
|
|
end
|
|
end
|
|
|
|
def get(%User{} = user, %Hashtag{} = hashtag) do
|
|
from(hf in __MODULE__)
|
|
|> where([hf], hf.user_id == ^user.id and hf.hashtag_id == ^hashtag.id)
|
|
|> Repo.one()
|
|
end
|
|
|
|
def get_by_user(%User{} = user) do
|
|
user
|
|
|> followed_hashtags_query()
|
|
|> Repo.all()
|
|
end
|
|
|
|
def followed_hashtags_query(%User{} = user) do
|
|
Ecto.assoc(user, :followed_hashtags)
|
|
|> Ecto.Query.order_by([h], desc: h.id)
|
|
end
|
|
end
|