summaryrefslogtreecommitdiff
path: root/lib/mix/tasks/pleroma/notification_settings.ex
blob: f99275de13c557ae6501435b231ca07fa66871ac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# Pleroma: A lightweight social networking server
# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only

defmodule Mix.Tasks.Pleroma.NotificationSettings do
  @shortdoc "Enable&Disable privacy option for push notifications"
  @moduledoc """
  Example:

  > mix pleroma.notification_settings --hide-notification-contents=false --nickname-users="parallel588"  # set false only for parallel588 user
  > mix pleroma.notification_settings --hide-notification-contents=true # set true for all users

  """

  use Mix.Task
  import Mix.Pleroma
  import Ecto.Query

  def run(args) do
    start_pleroma()

    {options, _, _} =
      OptionParser.parse(
        args,
        strict: [
          hide_notification_contents: :boolean,
          email_users: :string,
          nickname_users: :string
        ]
      )

    hide_notification_contents = Keyword.get(options, :hide_notification_contents)

    if not is_nil(hide_notification_contents) do
      hide_notification_contents
      |> build_query(options)
      |> Pleroma.Repo.update_all([])
    end

    shell_info("Done")
  end

  defp build_query(hide_notification_contents, options) do
    query =
      from(u in Pleroma.User,
        update: [
          set: [
            notification_settings:
              fragment(
                "jsonb_set(notification_settings, '{hide_notification_contents}', ?)",
                ^hide_notification_contents
              )
          ]
        ]
      )

    user_emails =
      options
      |> Keyword.get(:email_users, "")
      |> String.split(",")
      |> Enum.map(&String.trim(&1))
      |> Enum.reject(&(&1 == ""))

    query =
      if length(user_emails) > 0 do
        where(query, [u], u.email in ^user_emails)
      else
        query
      end

    user_nicknames =
      options
      |> Keyword.get(:nickname_users, "")
      |> String.split(",")
      |> Enum.map(&String.trim(&1))
      |> Enum.reject(&(&1 == ""))

    query =
      if length(user_nicknames) > 0 do
        where(query, [u], u.nickname in ^user_nicknames)
      else
        query
      end

    query
  end
end