Track object/create activity fetches
[akkoma] / lib / pleroma / delivery.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2019 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.FlakeId
10 alias Pleroma.User
11 alias Pleroma.Repo
12 alias Pleroma.Object
13 alias Pleroma.User
14
15 import Ecto.Changeset
16 import Ecto.Query
17
18 schema "deliveries" do
19 belongs_to(:user, User, type: FlakeId)
20 belongs_to(:object, Object)
21 end
22
23 def changeset(delivery, params \\ %{}) do
24 delivery
25 |> cast(params, [:user_id, :object_id])
26 |> foreign_key_constraint(:object_id)
27 |> foreign_key_constraint(:user_id)
28 |> unique_constraint(:user_id, name: :deliveries_user_id_object_id_index)
29 end
30
31 def create(object_id, user_id) do
32 %Delivery{}
33 |> changeset(%{user_id: user_id, object_id: object_id})
34 |> Repo.insert()
35 end
36
37 def get(object_id, user_id) do
38 from(d in Delivery, where: d.user_id == ^user_id and d.object_id == ^object_id)
39 |> Repo.one()
40 end
41
42 def get_or_create(object_id, user_id) do
43 case get(object_id, user_id) do
44 %Delivery{} = delivery -> {:ok, delivery}
45 nil -> create(object_id, user_id)
46 end
47 end
48
49 def delete_all_by_object_id(object_id) do
50 from(d in Delivery, where: d.object_id == ^object_id)
51 |> Repo.delete_all()
52 end
53
54 def get_all_by_object_id(object_id) do
55 from(d in Delivery, where: d.object_id == ^object_id)
56 |> Repo.all()
57 end
58 end