diff --git a/services/app/.iex.exs b/services/app/.iex.exs index d33e5cf..b35e53b 100644 --- a/services/app/.iex.exs +++ b/services/app/.iex.exs @@ -2,3 +2,4 @@ import Ecto.Query alias HexletBasics.Repo alias HexletBasics.Language alias HexletBasics.User +alias HexletBasics.UserManager diff --git a/services/app/lib/hexlet_basics/state_machines/user/email_delivery_state_machine.ex b/services/app/lib/hexlet_basics/state_machines/user/email_delivery_state_machine.ex new file mode 100644 index 0000000..7ec5a67 --- /dev/null +++ b/services/app/lib/hexlet_basics/state_machines/user/email_delivery_state_machine.ex @@ -0,0 +1,9 @@ +defmodule HexletBasics.StateMachines.User.EmailDeliveryStateMachine do + use Machinery, + field: :email_delivery_state, + states: ["enabled", "disabled"], + transitions: %{ + "enabled" => "disabled", + "disabled" => "enabled" + } +end diff --git a/services/app/lib/hexlet_basics/user.ex b/services/app/lib/hexlet_basics/user.ex index 097bcc8..d674f63 100644 --- a/services/app/lib/hexlet_basics/user.ex +++ b/services/app/lib/hexlet_basics/user.ex @@ -13,6 +13,7 @@ defmodule HexletBasics.User do field(:facebook_uid, :string) field(:nickname, :string) field(:state, :string, default: "initial") + field(:email_delivery_state, :string, default: "enabled") field(:encrypted_password, :string) field(:confirmation_token, :string) field(:reset_password_token, :string) @@ -39,6 +40,10 @@ defmodule HexletBasics.User do user |> cast(attrs, [:state]) end + def email_delivery_state_changeset(%User{} = user, attrs \\ %{}) do + user |> cast(attrs, [:email_delivery_state]) + end + def locale_changeset(%User{} = user, attrs \\ %{}) do user |> cast(attrs, [:locale]) end diff --git a/services/app/lib/hexlet_basics/user_manager.ex b/services/app/lib/hexlet_basics/user_manager.ex index fafdd6d..9ed8ee2 100644 --- a/services/app/lib/hexlet_basics/user_manager.ex +++ b/services/app/lib/hexlet_basics/user_manager.ex @@ -1,6 +1,7 @@ defmodule HexletBasics.UserManager do alias Bcrypt - alias HexletBasics.{User, User.Account, StateMachines.UserStateMachine} + alias HexletBasics.{User, User.Account} + alias HexletBasics.StateMachines.{UserStateMachine, User.EmailDeliveryStateMachine} import Ecto.Query, warn: false alias HexletBasics.Repo @@ -75,6 +76,24 @@ defmodule HexletBasics.UserManager do |> Repo.insert() end + def disable_delivery!(user) do + {:ok, %User{email_delivery_state: state}} = + Machinery.transition_to(user, EmailDeliveryStateMachine, "disabled") + + user + |> User.email_delivery_state_changeset(%{email_delivery_state: state}) + |> Repo.update!() + end + + def enable_delivery!(user) do + {:ok, %User{email_delivery_state: state}} = + Machinery.transition_to(user, EmailDeliveryStateMachine, "enabled") + + user + |> User.email_delivery_state_changeset(%{email_delivery_state: state}) + |> Repo.update!() + end + defp activate_user!(user) do {:ok, %User{state: state}} = Machinery.transition_to(user, UserStateMachine, "active") diff --git a/services/app/lib/hexlet_basics_web/router.ex b/services/app/lib/hexlet_basics_web/router.ex index 8233040..cbc53b7 100644 --- a/services/app/lib/hexlet_basics_web/router.ex +++ b/services/app/lib/hexlet_basics_web/router.ex @@ -82,7 +82,7 @@ defmodule HexletBasicsWeb.Router do scope "/api/webhooks", HexletBasicsWeb do pipe_through(:api_for_webhooks) - post("sparkpost/process", Api.Webhooks.SparkpostController, :process) + post("/sparkpost/process", Api.Webhooks.SparkpostController, :process) end scope "/", HexletBasicsWeb do diff --git a/services/app/priv/repo/migrations/20190911072227_add_email_delivery_state_to_user.exs b/services/app/priv/repo/migrations/20190911072227_add_email_delivery_state_to_user.exs new file mode 100644 index 0000000..83b4939 --- /dev/null +++ b/services/app/priv/repo/migrations/20190911072227_add_email_delivery_state_to_user.exs @@ -0,0 +1,9 @@ +defmodule HexletBasics.Repo.Migrations.AddEmailDeliveryStateToUser do + use Ecto.Migration + + def change do + alter table(:users) do + add :email_delivery_state, :string + end + end +end diff --git a/services/app/priv/repo/migrations/20190911072926_migrate_email_deliviery_state_for_user.exs b/services/app/priv/repo/migrations/20190911072926_migrate_email_deliviery_state_for_user.exs new file mode 100644 index 0000000..f729b43 --- /dev/null +++ b/services/app/priv/repo/migrations/20190911072926_migrate_email_deliviery_state_for_user.exs @@ -0,0 +1,7 @@ +defmodule HexletBasics.Repo.Migrations.MigrateEmailDelivieryStateForUser do + use Ecto.Migration + + def change do + HexletBasics.Repo.update_all(HexletBasics.User, set: [email_delivery_state: "enabled"]) + end +end