diff --git a/lib/comfycamp/accounts.ex b/lib/comfycamp/accounts.ex index 5cad78e..5cf653e 100644 --- a/lib/comfycamp/accounts.ex +++ b/lib/comfycamp/accounts.ex @@ -290,6 +290,12 @@ defmodule Comfycamp.Accounts do end end + def update_approval_status(user, is_approved) do + user + |> User.approval_changeset(%{"is_approved" => is_approved}) + |> Repo.update() + end + defp confirm_user_multi(user) do Ecto.Multi.new() |> Ecto.Multi.update(:user, User.confirm_changeset(user)) diff --git a/lib/comfycamp/accounts/user.ex b/lib/comfycamp/accounts/user.ex index 60b0a0d..7ba3c80 100644 --- a/lib/comfycamp/accounts/user.ex +++ b/lib/comfycamp/accounts/user.ex @@ -136,6 +136,12 @@ defmodule Comfycamp.Accounts.User do change(user, confirmed_at: now) end + def approval_changeset(user, attrs) do + user + |> cast(attrs, [:is_approved]) + |> validate_required([:is_approved]) + end + @doc """ Verifies the password. diff --git a/lib/comfycamp_web/controllers/user_editor_controller.ex b/lib/comfycamp_web/controllers/user_editor_controller.ex index c0d2783..c154378 100644 --- a/lib/comfycamp_web/controllers/user_editor_controller.ex +++ b/lib/comfycamp_web/controllers/user_editor_controller.ex @@ -21,4 +21,36 @@ defmodule ComfycampWeb.UserEditorController do |> put_layout(html: :admin) |> render(:show, page_title: user.email, user: user, stylesheets: ["/assets/admin.css"]) end + + def approve(conn, %{"id" => id}) do + user = Accounts.get_user!(id) + + case Accounts.update_approval_status(user, true) do + {:ok, user} -> + conn + |> put_flash(:info, "Пользователь одобрен") + |> redirect(to: ~p"/admin/users/#{user}") + + {:error, _changeset} -> + conn + |> put_flash(:error, "Ошибка при одобрении") + |> redirect(to: ~p"/admin/users/#{user}") + end + end + + def disapprove(conn, %{"id" => id}) do + user = Accounts.get_user!(id) + + case Accounts.update_approval_status(user, false) do + {:ok, user} -> + conn + |> put_flash(:info, "Одобрение отменено") + |> redirect(to: ~p"/admin/users/#{user}") + + {:error, _changeset} -> + conn + |> put_flash(:error, "Ошибка при отмене одобрения") + |> redirect(to: ~p"/admin/users/#{user}") + end + end end diff --git a/lib/comfycamp_web/controllers/user_editor_html.ex b/lib/comfycamp_web/controllers/user_editor_html.ex index eff9a1a..a28c51b 100644 --- a/lib/comfycamp_web/controllers/user_editor_html.ex +++ b/lib/comfycamp_web/controllers/user_editor_html.ex @@ -39,6 +39,24 @@ defmodule ComfycampWeb.UserEditorHTML do Описания нет. <% end %>

+ + <%= if @user.is_approved == false do %> + <.link + method="PUT" + href={~p"/admin/users/#{@user}/approve"} + data-confirm="Точно хотите одобрить пользователя?" + > + Одобрить + + <% else %> + <.link + method="PUT" + href={~p"/admin/users/#{@user}/disapprove"} + data-confirm="Точно хотите отменить одобрение?" + > + Отменить одобрение + + <% end %> """ end diff --git a/lib/comfycamp_web/router.ex b/lib/comfycamp_web/router.ex index 3ce11d2..1275097 100644 --- a/lib/comfycamp_web/router.ex +++ b/lib/comfycamp_web/router.ex @@ -95,5 +95,7 @@ defmodule ComfycampWeb.Router do get "/services", AdminPageController, :services resources "/notes", NotesEditorController resources "/users", UserEditorController, only: [:index, :show] + put "/users/:id/approve", UserEditorController, :approve + put "/users/:id/disapprove", UserEditorController, :disapprove end end