Fork of Pleroma with site-specific changes and feature branches https://git.pleroma.social/pleroma/pleroma
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

50 lines
1.4KB

  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Delivery do
  5. use Ecto.Schema
  6. alias Pleroma.Delivery
  7. alias Pleroma.Object
  8. alias Pleroma.Repo
  9. alias Pleroma.User
  10. import Ecto.Changeset
  11. import Ecto.Query
  12. schema "deliveries" do
  13. belongs_to(:user, User, type: FlakeId.Ecto.CompatType)
  14. belongs_to(:object, Object)
  15. end
  16. def changeset(delivery, params \\ %{}) do
  17. delivery
  18. |> cast(params, [:user_id, :object_id])
  19. |> validate_required([:user_id, :object_id])
  20. |> foreign_key_constraint(:object_id)
  21. |> foreign_key_constraint(:user_id)
  22. |> unique_constraint(:user_id, name: :deliveries_user_id_object_id_index)
  23. end
  24. def create(object_id, user_id) do
  25. %Delivery{}
  26. |> changeset(%{user_id: user_id, object_id: object_id})
  27. |> Repo.insert(on_conflict: :nothing)
  28. end
  29. def get(object_id, user_id) do
  30. from(d in Delivery, where: d.user_id == ^user_id and d.object_id == ^object_id)
  31. |> Repo.one()
  32. end
  33. # A hack because user delete activities have a fake id for whatever reason
  34. # TODO: Get rid of this
  35. def delete_all_by_object_id("pleroma:fake_object_id"), do: {0, []}
  36. def delete_all_by_object_id(object_id) do
  37. from(d in Delivery, where: d.object_id == ^object_id)
  38. |> Repo.delete_all()
  39. end
  40. end