Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion config/prod.exs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ config :mailgun_logger, MailgunLoggerWeb.Endpoint,
code_reloader: false,
version: Application.spec(:mailgun_logger, :vsn)


config :logger,
level: String.to_existing_atom(System.get_env("ML_LOG_LEVEL", "info")) || :info,
compile_time_purge_matching: [[application: :remote_ip]]
Expand Down
3 changes: 1 addition & 2 deletions config/test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@ config :mailgun_logger, MailgunLoggerWeb.Endpoint,
server: false

# Quantum cron schedule
config :mailgun_logger, MailgunLogger.Scheduler,
jobs: []
config :mailgun_logger, MailgunLogger.Scheduler, jobs: []

config :logger, level: :warning
config :mailgun_logger, MailgunLogger.Repo, pool: Ecto.Adapters.SQL.Sandbox
Expand Down
13 changes: 10 additions & 3 deletions lib/mailgun_logger/roles/roles.ex
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@ defmodule MailgunLogger.Roles do

@superuser_role "superuser"
@admin_role "admin"
@member_role "member"

#########################################################

@default_actions ~w()

@admin_actions ~w(do_stuff) ++ @default_actions

@member_actions ~w(view_events) ++ @default_actions
@admin_actions ~w(do_stuff manage_roles) ++ @member_actions
@superuser_actions ~w() ++ @admin_actions

#########################################################
Expand Down Expand Up @@ -55,6 +55,11 @@ defmodule MailgunLogger.Roles do
Enum.any?(roles, &can?(&1.name, action))
end

for action <- @member_actions do
action = String.to_atom(action)
def can?(@member_role, unquote(action)), do: true
end

for action <- @admin_actions do
action = String.to_atom(action)
def can?(@admin_role, unquote(action)), do: true
Expand All @@ -69,12 +74,14 @@ 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)

def abilities(%User{roles: []}), do: []
def abilities(%User{roles: roles}), do: hd(roles) |> abilities()
def abilities(%Role{name: "member"}), do: @member_actions
def abilities(%Role{name: "admin"}), do: @admin_actions
def abilities(%Role{name: "superuser"}), do: @superuser_actions

Expand Down
2 changes: 1 addition & 1 deletion lib/mailgun_logger/seeder.ex
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ defmodule MailgunLogger.Seeder do

# alias MailgunLogger.UserRole

@roles [%Role{name: "superuser"}, %Role{name: "admin"}]
@roles [%Role{name: "superuser"}, %Role{name: "admin"}, %Role{name: "member"}]

def run do
Enum.each(@roles, &insert_if_new(&1))
Expand Down
17 changes: 16 additions & 1 deletion lib/mailgun_logger/users/users.ex
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ defmodule MailgunLogger.Users do
alias MailgunLogger.Repo
alias MailgunLogger.User


@type ecto_user() :: {:ok, User.t()} | {:error, Ecto.Changeset.t()}
@type maybe_user() :: User.t() | nil

Expand Down Expand Up @@ -151,13 +150,29 @@ defmodule MailgunLogger.Users do
|> Repo.insert()
end

@spec create_user_with_roles(map, [MailgunLogger.Role.t()]) :: ecto_user()
def create_user_with_roles(params, roles) do
%User{}
|> User.changeset(params)
|> Ecto.Changeset.put_assoc(:roles, roles)
|> Repo.insert()
end

@spec update_user(User.t(), map) :: ecto_user()
def update_user(user, params) do
user
|> User.update_changeset(params)
|> Repo.update()
end

@spec update_user_with_roles(User.t(), map, [MailgunLogger.Role.t()]) :: ecto_user()
def update_user_with_roles(user, params, roles) do
user
|> User.update_changeset(params)
|> Ecto.Changeset.put_assoc(:roles, roles)
|> Repo.update()
end

@spec delete_user(User.t()) :: ecto_user()
def delete_user(%User{} = user) do
Repo.delete(user)
Expand Down
56 changes: 28 additions & 28 deletions lib/mailgun_logger_web/components/core_components.ex
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ defmodule MailgunLoggerWeb.CoreComponents do
</button>
</div>
<div id={"#{@id}-content"}>
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</div>
</.focus_wrap>
</div>
Expand Down Expand Up @@ -122,9 +122,9 @@ defmodule MailgunLoggerWeb.CoreComponents do
<p :if={@title} class="flex items-center gap-1.5 text-sm font-semibold leading-6">
<.icon :if={@kind == :info} name="hero-information-circle-mini" class="h-4 w-4" />
<.icon :if={@kind == :error} name="hero-exclamation-circle-mini" class="h-4 w-4" />
<%= @title %>
{@title}
</p>
<p class="mt-2 text-sm leading-5"><%= msg %></p>
<p class="mt-2 text-sm leading-5">{msg}</p>
<button type="button" class="group absolute top-1 right-1 p-2" aria-label={gettext("close")}>
<.icon name="hero-x-mark-solid" class="h-5 w-5 opacity-40 group-hover:opacity-70" />
</button>
Expand Down Expand Up @@ -186,9 +186,9 @@ defmodule MailgunLoggerWeb.CoreComponents do
~H"""
<.form :let={f} for={@for} as={@as} {@rest}>
<div class="mt-10 space-y-8 bg-white">
<%= render_slot(@inner_block, f) %>
{render_slot(@inner_block, f)}
<div :for={action <- @actions} class="mt-2 flex items-center justify-between gap-6">
<%= render_slot(action, f) %>
{render_slot(action, f)}
</div>
</div>
</.form>
Expand Down Expand Up @@ -220,7 +220,7 @@ defmodule MailgunLoggerWeb.CoreComponents do
]}
{@rest}
>
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</button>
"""
end
Expand Down Expand Up @@ -291,43 +291,43 @@ defmodule MailgunLoggerWeb.CoreComponents do
checked={@checked}
{@rest}
/>
<%= @label %>
{@label}
</label>
<.error :for={msg <- @errors}><%= msg %></.error>
<.error :for={msg <- @errors}>{msg}</.error>
</div>
"""
end

def input(%{type: "select"} = assigns) do
~H"""
<div class="form-group">
<.label for={@id}><%= @label %></.label>
<.label for={@id}>{@label}</.label>
<select
id={@id}
name={@name}
class="form-control"
multiple={@multiple}
{@rest}
>
<option :if={@prompt} value=""><%= @prompt %></option>
<%= Phoenix.HTML.Form.options_for_select(@options, @value) %>
<option :if={@prompt} value="">{@prompt}</option>
{Phoenix.HTML.Form.options_for_select(@options, @value)}
</select>
<.error :for={msg <- @errors}><%= msg %></.error>
<.error :for={msg <- @errors}>{msg}</.error>
</div>
"""
end

def input(%{type: "textarea"} = assigns) do
~H"""
<div class="form-group">
<.label for={@id}><%= @label %></.label>
<.label for={@id}>{@label}</.label>
<textarea
id={@id}
name={@name}
class="form-control"
{@rest}
><%= Phoenix.HTML.Form.normalize_value("textarea", @value) %></textarea>
<.error :for={msg <- @errors}><%= msg %></.error>
<.error :for={msg <- @errors}>{msg}</.error>
</div>
"""
end
Expand All @@ -336,7 +336,7 @@ defmodule MailgunLoggerWeb.CoreComponents do
def input(assigns) do
~H"""
<div class="form-group">
<.label for={@id}><%= @label %></.label>
<.label for={@id}>{@label}</.label>
<input
type={@type}
name={@name}
Expand All @@ -346,7 +346,7 @@ defmodule MailgunLoggerWeb.CoreComponents do
class="form-control"
{@rest}
/>
<.error :for={msg <- @errors}><%= msg %></.error>
<.error :for={msg <- @errors}>{msg}</.error>
</div>
"""
end
Expand All @@ -360,7 +360,7 @@ defmodule MailgunLoggerWeb.CoreComponents do
def label(assigns) do
~H"""
<label for={@for} class="control-label">
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</label>
"""
end
Expand All @@ -373,7 +373,7 @@ defmodule MailgunLoggerWeb.CoreComponents do
def error(assigns) do
~H"""
<p class="validation-error">
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</p>
"""
end
Expand All @@ -392,13 +392,13 @@ defmodule MailgunLoggerWeb.CoreComponents do
<header class={[@actions != [] && "flex items-center justify-between gap-6", @class]}>
<div>
<h1 class="text-lg font-semibold leading-8 text-zinc-800">
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</h1>
<p :if={@subtitle != []} class="mt-2 text-sm leading-6 text-zinc-600">
<%= render_slot(@subtitle) %>
{render_slot(@subtitle)}
</p>
</div>
<div class="flex-none"><%= render_slot(@actions) %></div>
<div class="flex-none">{render_slot(@actions)}</div>
</header>
"""
end
Expand Down Expand Up @@ -440,8 +440,8 @@ defmodule MailgunLoggerWeb.CoreComponents do
<table class="w-[40rem] mt-11 sm:w-full">
<thead class="text-sm text-left leading-6 text-zinc-500">
<tr>
<th :for={col <- @col} class="p-0 pr-6 pb-4 font-normal"><%= col[:label] %></th>
<th class="relative p-0 pb-4"><span class="sr-only"><%= gettext("Actions") %></span></th>
<th :for={col <- @col} class="p-0 pr-6 pb-4 font-normal">{col[:label]}</th>
<th class="relative p-0 pb-4"><span class="sr-only">{gettext("Actions")}</span></th>
</tr>
</thead>
<tbody
Expand All @@ -458,7 +458,7 @@ defmodule MailgunLoggerWeb.CoreComponents do
<div class="block py-4 pr-6">
<span class="absolute -inset-y-px right-0 -left-4 group-hover:bg-zinc-50 sm:rounded-l-xl" />
<span class={["relative", i == 0 && "font-semibold text-zinc-900"]}>
<%= render_slot(col, @row_item.(row)) %>
{render_slot(col, @row_item.(row))}
</span>
</div>
</td>
Expand All @@ -469,7 +469,7 @@ defmodule MailgunLoggerWeb.CoreComponents do
:for={action <- @action}
class="relative ml-4 font-semibold leading-6 text-zinc-900 hover:text-zinc-700"
>
<%= render_slot(action, @row_item.(row)) %>
{render_slot(action, @row_item.(row))}
</span>
</div>
</td>
Expand Down Expand Up @@ -499,8 +499,8 @@ defmodule MailgunLoggerWeb.CoreComponents do
<div class="mt-14">
<dl class="-my-4 divide-y divide-zinc-100">
<div :for={item <- @item} class="flex gap-4 py-4 text-sm leading-6 sm:gap-8">
<dt class="w-1/4 flex-none text-zinc-500"><%= item.title %></dt>
<dd class="text-zinc-700"><%= render_slot(item) %></dd>
<dt class="w-1/4 flex-none text-zinc-500">{item.title}</dt>
<dd class="text-zinc-700">{render_slot(item)}</dd>
</div>
</dl>
</div>
Expand All @@ -525,7 +525,7 @@ defmodule MailgunLoggerWeb.CoreComponents do
class="text-sm font-semibold leading-6 text-zinc-900 hover:text-zinc-700"
>
<.icon name="hero-arrow-left-solid" class="h-3 w-3" />
<%= render_slot(@inner_block) %>
{render_slot(@inner_block)}
</.link>
</div>
"""
Expand Down
2 changes: 1 addition & 1 deletion lib/mailgun_logger_web/controllers/setup_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ defmodule MailgunLoggerWeb.SetupController do
end
end

def create_root(conn, %{"user" => params}) do
def create_root(conn, %{"user" => params}) do
# Only allow create_root if there are no users in the database yet,
# otherwise it's possible for any unauthenticated request to this
# endpoint to make an admin user.
Expand Down
Loading