WIP notification settings

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel
2021-06-01 18:08:03 +02:00
parent 6adbbc6a1d
commit 58bffc5c66
34 changed files with 1127 additions and 136 deletions

View File

@@ -0,0 +1,34 @@
defmodule Mobilizon.Users.ActivitySetting do
@moduledoc """
Module to manage users settings
"""
use Ecto.Schema
import Ecto.Changeset
alias Mobilizon.Users.User
@type t :: %__MODULE__{
key: String.t(),
method: String.t(),
enabled: boolean()
}
@attrs [:key, :method, :enabled, :user_id]
@primary_key {:user_id, :id, autogenerate: false}
schema "user_activity_settings" do
field(:key, :string)
field(:method, :string)
field(:enabled, :boolean)
belongs_to(:user, User, primary_key: true, type: :id, foreign_key: :id, define_field: false)
end
@doc false
def changeset(activity_setting, attrs) do
activity_setting
|> cast(attrs, @attrs)
|> validate_required(@attrs)
|> unique_constraint([:key, :method], name: :user_activity_settings_user_id_key_method_index)
end
end

View File

@@ -13,7 +13,7 @@ defmodule Mobilizon.Users do
alias Mobilizon.{Crypto, Events}
alias Mobilizon.Events.FeedToken
alias Mobilizon.Storage.{Page, Repo}
alias Mobilizon.Users.{PushSubscription, Setting, User}
alias Mobilizon.Users.{ActivitySetting, PushSubscription, Setting, User}
defenum(UserRole, :user_role, [:administrator, :moderator, :user])
@@ -478,6 +478,48 @@ defmodule Mobilizon.Users do
Repo.delete(push_subscription)
end
@doc """
Lists the activity settings for an user
## Examples
iex> activity_settings_for_user(user)
[%ActivitySetting{}]
iex> activity_settings_for_user(user)
[]
"""
def activity_settings_for_user(%User{id: user_id}) do
ActivitySetting
|> where([a], a.user_id == ^user_id)
|> Repo.all()
end
def activity_setting(%User{id: user_id}, key, method) do
ActivitySetting
|> where([a], a.user_id == ^user_id and a.key == ^key and a.method == ^method)
|> Repo.one()
end
@doc """
Creates an activity setting. Overrides existing values if present
## Examples
iex> create_activity_setting(%{field: value})
{:ok, %ActivitySetting{}}
iex> create_activity_setting(%{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def create_activity_setting(attrs \\ %{}) do
%ActivitySetting{}
|> ActivitySetting.changeset(attrs)
|> Repo.insert(on_conflict: :replace_all, conflict_target: [:user_id, :key, :method])
end
@spec user_by_email_query(String.t(), boolean | nil, boolean()) :: Ecto.Query.t()
defp user_by_email_query(email, activated, unconfirmed) do
User