Remove sensitive-property setting #nsfw, create HashtagPolicy
[akkoma] / lib / pleroma / migrators / hashtags_table_migrator / state.ex
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
5 defmodule Pleroma.Migrators.HashtagsTableMigrator.State do
6 use Agent
7
8 alias Pleroma.DataMigration
9
10 defdelegate data_migration(), to: Pleroma.Migrators.HashtagsTableMigrator
11
12 @reg_name {:global, __MODULE__}
13
14 def start_link(_) do
15 Agent.start_link(fn -> load_state_from_db() end, name: @reg_name)
16 end
17
18 defp load_state_from_db do
19 data_migration = data_migration()
20
21 data =
22 if data_migration do
23 Map.new(data_migration.data, fn {k, v} -> {String.to_atom(k), v} end)
24 else
25 %{}
26 end
27
28 %{
29 data_migration_id: data_migration && data_migration.id,
30 data: data
31 }
32 end
33
34 def persist_to_db do
35 %{data_migration_id: data_migration_id, data: data} = state()
36
37 if data_migration_id do
38 DataMigration.update_one_by_id(data_migration_id, data: data)
39 else
40 {:error, :nil_data_migration_id}
41 end
42 end
43
44 def reset do
45 %{data_migration_id: data_migration_id} = state()
46
47 with false <- is_nil(data_migration_id),
48 :ok <-
49 DataMigration.update_one_by_id(data_migration_id,
50 state: :pending,
51 data: %{}
52 ) do
53 reinit()
54 else
55 true -> {:error, :nil_data_migration_id}
56 e -> e
57 end
58 end
59
60 def reinit do
61 Agent.update(@reg_name, fn _state -> load_state_from_db() end)
62 end
63
64 def state do
65 Agent.get(@reg_name, & &1)
66 end
67
68 def get_data_key(key, default \\ nil) do
69 get_in(state(), [:data, key]) || default
70 end
71
72 def put_data_key(key, value) do
73 _ = persist_non_data_change(key, value)
74
75 Agent.update(@reg_name, fn state ->
76 put_in(state, [:data, key], value)
77 end)
78 end
79
80 def increment_data_key(key, increment \\ 1) do
81 Agent.update(@reg_name, fn state ->
82 initial_value = get_in(state, [:data, key]) || 0
83 updated_value = initial_value + increment
84 put_in(state, [:data, key], updated_value)
85 end)
86 end
87
88 defp persist_non_data_change(:state, value) do
89 with true <- get_data_key(:state) != value,
90 true <- value in Pleroma.DataMigration.State.__valid_values__(),
91 %{data_migration_id: data_migration_id} when not is_nil(data_migration_id) <- state() do
92 DataMigration.update_one_by_id(data_migration_id, state: value)
93 else
94 false -> :ok
95 _ -> {:error, :nil_data_migration_id}
96 end
97 end
98
99 defp persist_non_data_change(_, _) do
100 nil
101 end
102
103 def data_migration_id, do: Map.get(state(), :data_migration_id)
104 end