9fdc1399087ce43e7529014d5c6f147155029799
[akkoma] / lib / pleroma / scheduled_activity.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.ScheduledActivity do
6 use Ecto.Schema
7
8 alias Pleroma.Repo
9 alias Pleroma.ScheduledActivity
10 alias Pleroma.User
11
12 import Ecto.Query
13 import Ecto.Changeset
14
15 @min_offset :timer.minutes(5)
16
17 schema "scheduled_activities" do
18 belongs_to(:user, User, type: Pleroma.FlakeId)
19 field(:scheduled_at, :naive_datetime)
20 field(:params, :map)
21
22 timestamps()
23 end
24
25 def changeset(%ScheduledActivity{} = scheduled_activity, attrs) do
26 scheduled_activity
27 |> cast(attrs, [:scheduled_at, :params])
28 end
29
30 def update_changeset(%ScheduledActivity{} = scheduled_activity, attrs) do
31 scheduled_activity
32 |> cast(attrs, [:scheduled_at])
33 end
34
35 def far_enough?(scheduled_at) when is_binary(scheduled_at) do
36 with {:ok, scheduled_at} <- Ecto.Type.cast(:naive_datetime, scheduled_at) do
37 far_enough?(scheduled_at)
38 else
39 _ -> false
40 end
41 end
42
43 def far_enough?(scheduled_at) do
44 now = NaiveDateTime.utc_now()
45 diff = NaiveDateTime.diff(scheduled_at, now, :millisecond)
46 diff > @min_offset
47 end
48
49 def new(%User{} = user, attrs) do
50 %ScheduledActivity{user_id: user.id}
51 |> changeset(attrs)
52 end
53
54 def create(%User{} = user, attrs) do
55 user
56 |> new(attrs)
57 |> Repo.insert()
58 end
59
60 def get(%User{} = user, scheduled_activity_id) do
61 ScheduledActivity
62 |> where(user_id: ^user.id)
63 |> where(id: ^scheduled_activity_id)
64 |> Repo.one()
65 end
66
67 def update(%User{} = user, scheduled_activity_id, attrs) do
68 with %ScheduledActivity{} = scheduled_activity <- get(user, scheduled_activity_id) do
69 scheduled_activity
70 |> update_changeset(attrs)
71 |> Repo.update()
72 else
73 nil -> {:error, :not_found}
74 end
75 end
76
77 def delete(%User{} = user, scheduled_activity_id) do
78 with %ScheduledActivity{} = scheduled_activity <- get(user, scheduled_activity_id) do
79 scheduled_activity
80 |> Repo.delete()
81 else
82 nil -> {:error, :not_found}
83 end
84 end
85
86 def for_user_query(%User{} = user) do
87 ScheduledActivity
88 |> where(user_id: ^user.id)
89 end
90 end