defmodule Mix.Tasks.Qs.Gen.InitAssigns do use Mix.Task require Mix.Generator Mix.Generator.embed_template(:init_assigns, """ defmodule <%= @web_module %>.InitAssigns do import Phoenix.LiveView alias <%= @context_module %>.Accounts def on_mount(:default, _params, session, socket) do {:cont, assign_new(socket, :current_user, fn -> Accounts.get_user_by_session_token(session["user_token"]) end)} end def on_mount(:admin, _params, session, socket) do socket = assign_new(socket, :current_user, fn -> Accounts.get_user_by_session_token(session["user_token"]) end) case :admin in socket.assigns.current_user.roles do true -> {:cont, socket} false -> {:halt, redirect(socket, to: "/login")} end end end """) def run(_args) do base_name = Mix.Project.config() |> Keyword.fetch!(:app) |> to_string() context_module_path = base_name web_module_path = "#{base_name}_web" web_module = Macro.camelize(web_module_path) context_module = Macro.camelize(context_module_path) Mix.Generator.create_file( "lib/#{web_module_path}/live/init_assigns.ex", init_assigns_template( web_module: web_module, context_module: context_module ) ) Mix.shell().info(""" Add to router.exs live_session :admin, on_mount: {#{web_module}.InitAssigns, :admin} do scope "/", #{web_module} do pipe_through [:browser, :require_authenticated_user] live "/example", ExampleLive.Index, :index end end """) end end