Add /api/v1/followed_tags
[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 user
47 |> followed_hashtags_query()
48 |> Repo.all()
49 end
50
51 def followed_hashtags_query(%User{} = user) do
52 Ecto.assoc(user, :followed_hashtags)
53 |> Ecto.Query.order_by([h], desc: h.id)
54 end
55 end