Add changelog entry for hashtag following
[akkoma] / lib / pleroma / user / hashtag_follow.ex
1 defmodule Pleroma.User.HashtagFollow do
2 use Ecto.Schema
3 import Ecto.Query
4 import Ecto.Changeset
5
6 alias Pleroma.User
7 alias Pleroma.Hashtag
8 alias Pleroma.Repo
9
10 schema "user_follows_hashtag" do
11 belongs_to(:user, User, type: FlakeId.Ecto.CompatType)
12 belongs_to(:hashtag, Hashtag)
13 end
14
15 def changeset(%__MODULE__{} = user_hashtag_follow, attrs) do
16 user_hashtag_follow
17 |> cast(attrs, [:user_id, :hashtag_id])
18 |> unique_constraint(:hashtag_id,
19 name: :user_hashtag_follows_user_id_hashtag_id_index,
20 message: "already following"
21 )
22 |> validate_required([:user_id, :hashtag_id])
23 end
24
25 def new(%User{} = user, %Hashtag{} = hashtag) do
26 %__MODULE__{}
27 |> changeset(%{user_id: user.id, hashtag_id: hashtag.id})
28 |> Repo.insert(on_conflict: :nothing)
29 end
30
31 def delete(%User{} = user, %Hashtag{} = hashtag) do
32 with %__MODULE__{} = user_hashtag_follow <- get(user, hashtag) do
33 Repo.delete(user_hashtag_follow)
34 else
35 _ -> {:ok, nil}
36 end
37 end
38
39 def get(%User{} = user, %Hashtag{} = hashtag) do
40 from(hf in __MODULE__)
41 |> where([hf], hf.user_id == ^user.id and hf.hashtag_id == ^hashtag.id)
42 |> Repo.one()
43 end
44
45 def get_by_user(%User{} = user) do
46 Ecto.assoc(user, :followed_hashtags)
47 |> Repo.all()
48 end
49 end