From 445fa91f8b5325e97a1090a4718a259a8e24faf5 Mon Sep 17 00:00:00 2001 From: Stefdev13 Date: Wed, 18 Mar 2026 16:26:48 +0100 Subject: [PATCH 1/7] Added Member role - Added member role - Added a check on the relevant navlinks to only be present when the user in not a member - Added new Plug "redirect_member" to redirect members to events page if they go to non-allowed url - Added the new Plug to the router and split the scope into 2 scopes: 1 for all user-roles and 1 for admin and superuser only --- lib/mailgun_logger/roles/roles.ex | 1 + .../plugs/redirect_member.ex | 27 +++++++++++++++++++ lib/mailgun_logger_web/router.ex | 17 +++++++++--- .../templates/layout/app.html.heex | 8 +++--- 4 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 lib/mailgun_logger_web/plugs/redirect_member.ex diff --git a/lib/mailgun_logger/roles/roles.ex b/lib/mailgun_logger/roles/roles.ex index 8a873bb..3ec4c06 100644 --- a/lib/mailgun_logger/roles/roles.ex +++ b/lib/mailgun_logger/roles/roles.ex @@ -69,6 +69,7 @@ defmodule MailgunLogger.Roles do def is?(%User{roles: roles}, :superuser), do: is(roles, "superuser") def is?(%User{roles: roles}, :admin), do: is(roles, "admin") + def is?(%User{roles: roles}, :member), do: is(roles, "member") def is?(_, _), do: raise("Roles.is/2 requires roles to be preloaded") defp is(roles, role) when is_binary(role), do: Enum.map(roles, & &1.name) |> Enum.member?(role) diff --git a/lib/mailgun_logger_web/plugs/redirect_member.ex b/lib/mailgun_logger_web/plugs/redirect_member.ex new file mode 100644 index 0000000..618c8e1 --- /dev/null +++ b/lib/mailgun_logger_web/plugs/redirect_member.ex @@ -0,0 +1,27 @@ +defmodule MailgunLoggerWeb.Plugs.RedirectMember do + import Plug.Conn + import Phoenix.Controller + + alias MailgunLogger.Roles + alias MailgunLogger.User + alias MailgunLoggerWeb.Router.Helpers, as: Routes + + def init(opts), do: opts + + def call(conn, _opts) do + case conn.assigns[:current_user] do + %User{} = user -> + if Roles.is?(user, :member) do + conn + |> redirect(to: Routes.event_path(conn, :index)) + |> halt() + else + conn + end + _ -> + conn + end + end + + +end diff --git a/lib/mailgun_logger_web/router.ex b/lib/mailgun_logger_web/router.ex index 7297982..d9f1bf5 100644 --- a/lib/mailgun_logger_web/router.ex +++ b/lib/mailgun_logger_web/router.ex @@ -23,6 +23,10 @@ defmodule MailgunLoggerWeb.Router do plug(MailgunLoggerWeb.Plugs.Auth) end + pipeline :redirect_member do + plug(MailgunLoggerWeb.Plugs.RedirectMember) + end + # Always except in prod if Application.compile_env(:mailgun_logger, :env) == :dev do forward("/sent_emails", Bamboo.SentEmailViewerPlug) @@ -69,6 +73,7 @@ defmodule MailgunLoggerWeb.Router do post("/", SetupController, :create_root) end + # - Scope for all authenticated users scope "/", MailgunLoggerWeb do pipe_through([:browser, :auth]) @@ -76,15 +81,21 @@ defmodule MailgunLoggerWeb.Router do resources("/events", EventController, only: [:index, :show]) get("/events/:id/stored_message", EventController, :stored_message) - resources("/accounts", AccountController, except: [:show]) get("/profile", ProfileController, :edit) put("/profile", ProfileController, :update) - resources("/users", UserController, except: [:show]) get("/", PageController, :index) post("/trigger-run", PageController, :trigger_run) - get("/stats", PageController, :stats) get("/graphs", PageController, :graphs) get("/non-affiliation", PageController, :non_affiliation) end + + # - Only for users with role set as admin or superuser, members get redirected + scope "/", MailgunLoggerWeb do + pipe_through([:browser, :auth, :redirect_member]) + + resources("/users", UserController, except: [:show]) + resources("/accounts", AccountController, except: [:show]) + get("/stats", PageController, :stats) + end end diff --git a/lib/mailgun_logger_web/templates/layout/app.html.heex b/lib/mailgun_logger_web/templates/layout/app.html.heex index 6a78307..3c246e7 100644 --- a/lib/mailgun_logger_web/templates/layout/app.html.heex +++ b/lib/mailgun_logger_web/templates/layout/app.html.heex @@ -39,9 +39,11 @@