total rebase
[anni] / lib / pleroma / delivery.ex
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
5 defmodule Pleroma.Delivery do
6   use Ecto.Schema
7
8   alias Pleroma.Delivery
9   alias Pleroma.Object
10   alias Pleroma.Repo
11   alias Pleroma.User
12
13   import Ecto.Changeset
14   import Ecto.Query
15
16   schema "deliveries" do
17     belongs_to(:user, User, type: FlakeId.Ecto.CompatType)
18     belongs_to(:object, Object)
19   end
20
21   def changeset(delivery, params \\ %{}) do
22     delivery
23     |> cast(params, [:user_id, :object_id])
24     |> validate_required([:user_id, :object_id])
25     |> foreign_key_constraint(:object_id)
26     |> foreign_key_constraint(:user_id)
27     |> unique_constraint(:user_id, name: :deliveries_user_id_object_id_index)
28   end
29
30   def create(object_id, user_id) do
31     %Delivery{}
32     |> changeset(%{user_id: user_id, object_id: object_id})
33     |> Repo.insert(on_conflict: :nothing)
34   end
35
36   def get(object_id, user_id) do
37     from(d in Delivery, where: d.user_id == ^user_id and d.object_id == ^object_id)
38     |> Repo.one()
39   end
40
41   # A hack because user delete activities have a fake id for whatever reason
42   # TODO: Get rid of this
43   def delete_all_by_object_id("pleroma:fake_object_id"), do: {0, []}
44
45   def delete_all_by_object_id(object_id) do
46     from(d in Delivery, where: d.object_id == ^object_id)
47     |> Repo.delete_all()
48   end
49 end