logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git

bookmark.ex (2335B)


  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Bookmark do
  5. use Ecto.Schema
  6. import Ecto.Changeset
  7. import Ecto.Query
  8. alias Pleroma.Activity
  9. alias Pleroma.Bookmark
  10. alias Pleroma.BookmarkFolder
  11. alias Pleroma.Repo
  12. alias Pleroma.User
  13. @type t :: %__MODULE__{}
  14. schema "bookmarks" do
  15. belongs_to(:user, User, type: FlakeId.Ecto.CompatType)
  16. belongs_to(:activity, Activity, type: FlakeId.Ecto.CompatType)
  17. belongs_to(:folder, BookmarkFolder, type: FlakeId.Ecto.CompatType)
  18. timestamps()
  19. end
  20. @spec create(Ecto.UUID.t(), Ecto.UUID.t()) ::
  21. {:ok, Bookmark.t()} | {:error, Ecto.Changeset.t()}
  22. def create(user_id, activity_id, folder_id \\ nil) do
  23. attrs = %{
  24. user_id: user_id,
  25. activity_id: activity_id,
  26. folder_id: folder_id
  27. }
  28. %Bookmark{}
  29. |> cast(attrs, [:user_id, :activity_id, :folder_id])
  30. |> validate_required([:user_id, :activity_id])
  31. |> unique_constraint(:activity_id, name: :bookmarks_user_id_activity_id_index)
  32. |> Repo.insert(
  33. on_conflict: [set: [folder_id: folder_id]],
  34. conflict_target: [:user_id, :activity_id]
  35. )
  36. end
  37. @spec for_user_query(Ecto.UUID.t()) :: Ecto.Query.t()
  38. def for_user_query(user_id, folder_id \\ nil) do
  39. Bookmark
  40. |> where(user_id: ^user_id)
  41. |> maybe_filter_by_folder(folder_id)
  42. |> join(:inner, [b], activity in assoc(b, :activity))
  43. |> preload([b, a], activity: a)
  44. end
  45. defp maybe_filter_by_folder(query, nil), do: query
  46. defp maybe_filter_by_folder(query, folder_id) do
  47. query
  48. |> where(folder_id: ^folder_id)
  49. end
  50. def get(user_id, activity_id) do
  51. Bookmark
  52. |> where(user_id: ^user_id)
  53. |> where(activity_id: ^activity_id)
  54. |> Repo.one()
  55. end
  56. @spec destroy(Ecto.UUID.t(), Ecto.UUID.t()) ::
  57. {:ok, Bookmark.t()} | {:error, Ecto.Changeset.t()}
  58. def destroy(user_id, activity_id) do
  59. from(b in Bookmark,
  60. where: b.user_id == ^user_id,
  61. where: b.activity_id == ^activity_id
  62. )
  63. |> Repo.one()
  64. |> Repo.delete()
  65. end
  66. def set_folder(bookmark, folder_id) do
  67. bookmark
  68. |> cast(%{folder_id: folder_id}, [:folder_id])
  69. |> validate_required([:folder_id])
  70. |> Repo.update()
  71. end
  72. end