logo

pleroma

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

bookmark.ex (1683B)


  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.Repo
  11. alias Pleroma.User
  12. @type t :: %__MODULE__{}
  13. schema "bookmarks" do
  14. belongs_to(:user, User, type: FlakeId.Ecto.CompatType)
  15. belongs_to(:activity, Activity, type: FlakeId.Ecto.CompatType)
  16. timestamps()
  17. end
  18. @spec create(Ecto.UUID.t(), Ecto.UUID.t()) ::
  19. {:ok, Bookmark.t()} | {:error, Ecto.Changeset.t()}
  20. def create(user_id, activity_id) do
  21. attrs = %{
  22. user_id: user_id,
  23. activity_id: activity_id
  24. }
  25. %Bookmark{}
  26. |> cast(attrs, [:user_id, :activity_id])
  27. |> validate_required([:user_id, :activity_id])
  28. |> unique_constraint(:activity_id, name: :bookmarks_user_id_activity_id_index)
  29. |> Repo.insert()
  30. end
  31. @spec for_user_query(Ecto.UUID.t()) :: Ecto.Query.t()
  32. def for_user_query(user_id) do
  33. Bookmark
  34. |> where(user_id: ^user_id)
  35. |> join(:inner, [b], activity in assoc(b, :activity))
  36. |> preload([b, a], activity: a)
  37. end
  38. def get(user_id, activity_id) do
  39. Bookmark
  40. |> where(user_id: ^user_id)
  41. |> where(activity_id: ^activity_id)
  42. |> Repo.one()
  43. end
  44. @spec destroy(Ecto.UUID.t(), Ecto.UUID.t()) ::
  45. {:ok, Bookmark.t()} | {:error, Ecto.Changeset.t()}
  46. def destroy(user_id, activity_id) do
  47. from(b in Bookmark,
  48. where: b.user_id == ^user_id,
  49. where: b.activity_id == ^activity_id
  50. )
  51. |> Repo.one()
  52. |> Repo.delete()
  53. end
  54. end