Compare commits
3
Commits
ab3d65a899
...
51c584056b
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
51c584056b | ||
|
|
b70b99ba51 | ||
|
|
9c7a555dae |
@@ -64,7 +64,7 @@ defmodule DecentralisedBookIndexWeb.Components.MyComponents.SearchResources do
|
|||||||
|
|
||||||
defp can_add?(current_user, role) do
|
defp can_add?(current_user, role) do
|
||||||
case role do
|
case role do
|
||||||
:admin -> current_user != nil and Role.can_moderate?(current_user.role)
|
:admin -> current_user != nil and Role.can_administrate?(current_user.role)
|
||||||
:moderator -> current_user != nil and Role.can_moderate?(current_user.role)
|
:moderator -> current_user != nil and Role.can_moderate?(current_user.role)
|
||||||
_ -> false
|
_ -> false
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -57,6 +57,25 @@ defmodule DecentralisedBookIndexWeb.AuthorLive.Show do
|
|||||||
<p class="text-gray-300 leading-relaxed">
|
<p class="text-gray-300 leading-relaxed">
|
||||||
{@author.description}
|
{@author.description}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<%= if not is_nil(@author.dbi_server) do %>
|
||||||
|
<dl>
|
||||||
|
<dt class="mt-4 mb-2 font-semibold leading-none text-gray-900 dark:text-white">
|
||||||
|
From Server
|
||||||
|
</dt>
|
||||||
|
<dd class="mb-4 font-light text-gray-500 sm:mb-5 dark:text-gray-400">
|
||||||
|
<%= if @current_user != nil and Role.can_moderate?(@current_user.role) do %>
|
||||||
|
<.link navigate={~p"/servers/#{@author.dbi_server.id}/"} class="hover:underline">
|
||||||
|
{@author.dbi_server.name}
|
||||||
|
</.link>
|
||||||
|
<% else %>
|
||||||
|
<.link navigate={@author.dbi_server.url} class="hover:underline">
|
||||||
|
{@author.dbi_server.name}
|
||||||
|
</.link>
|
||||||
|
<% end %>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -74,6 +74,22 @@ defmodule DecentralisedBookIndexWeb.BookLive.Show do
|
|||||||
<dd class="mb-4 font-light text-gray-500 sm:mb-5 dark:text-gray-400">{bid.type}: {bid.bid}</dd>
|
<dd class="mb-4 font-light text-gray-500 sm:mb-5 dark:text-gray-400">{bid.type}: {bid.bid}</dd>
|
||||||
<% end %>
|
<% end %>
|
||||||
</dl>
|
</dl>
|
||||||
|
<%= if not is_nil(@book.dbi_server) do %>
|
||||||
|
<dl>
|
||||||
|
<dt class="mb-2 font-semibold leading-none text-gray-900 dark:text-white">From Server</dt>
|
||||||
|
<dd class="mb-4 font-light text-gray-500 sm:mb-5 dark:text-gray-400">
|
||||||
|
<%= if @current_user != nil and Role.can_moderate?(@current_user.role) do %>
|
||||||
|
<.link navigate={~p"/servers/#{@book.dbi_server.id}/"} class="hover:underline">
|
||||||
|
{@book.dbi_server.name}
|
||||||
|
</.link>
|
||||||
|
<% else %>
|
||||||
|
<.link navigate={@book.dbi_server.url} class="hover:underline">
|
||||||
|
{@book.dbi_server.name}
|
||||||
|
</.link>
|
||||||
|
<% end %>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<%= if not Enum.empty?(@alternative_editions) do %>
|
<%= if not Enum.empty?(@alternative_editions) do %>
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ defmodule DecentralisedBookIndexWeb.DbiServerLive.FormComponent do
|
|||||||
socket =
|
socket =
|
||||||
socket
|
socket
|
||||||
|> put_flash(:info, "Server #{socket.assigns.form.source.type}d successfully")
|
|> put_flash(:info, "Server #{socket.assigns.form.source.type}d successfully")
|
||||||
|> push_navigate(to: patch_url(socket.assigns.action, dbi_server.id))
|
|> redirect(to: patch_url(socket.assigns.action, dbi_server.id))
|
||||||
|
|
||||||
{:noreply, socket}
|
{:noreply, socket}
|
||||||
|
|
||||||
|
|||||||
@@ -4,26 +4,30 @@ defmodule DecentralisedBookIndexWeb.DbiServerLive.Index do
|
|||||||
alias DecentralisedBookIndex.Metadata
|
alias DecentralisedBookIndex.Metadata
|
||||||
alias DecentralisedBookIndex.SyncTasks.SyncServerTask
|
alias DecentralisedBookIndex.SyncTasks.SyncServerTask
|
||||||
|
|
||||||
|
alias DecentralisedBookIndex.Accounts.Role
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def render(assigns) do
|
def render(assigns) do
|
||||||
~H"""
|
~H"""
|
||||||
<.header>
|
<.header>
|
||||||
Listing Servers
|
Listing Servers
|
||||||
<:actions>
|
<:actions>
|
||||||
<div class="flex flex-row gap-2">
|
<%= if @current_user != nil and Role.can_administrate?(@current_user.role) do %>
|
||||||
<div class="flex flex-row gap-2">
|
<div class="flex flex-row gap-2">
|
||||||
<.primary_button phx-click="sync">
|
<div class="flex flex-row gap-2">
|
||||||
Sync now
|
<.primary_button phx-click="sync">
|
||||||
</.primary_button>
|
Sync now
|
||||||
</div>
|
|
||||||
<div class="flex flex-row gap-2">
|
|
||||||
<.link patch={~p"/oban"}>
|
|
||||||
<.primary_button>
|
|
||||||
Task dashboard
|
|
||||||
</.primary_button>
|
</.primary_button>
|
||||||
</.link>
|
</div>
|
||||||
|
<div class="flex flex-row gap-2">
|
||||||
|
<.link patch={~p"/oban"}>
|
||||||
|
<.primary_button>
|
||||||
|
Task dashboard
|
||||||
|
</.primary_button>
|
||||||
|
</.link>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<% end %>
|
||||||
</:actions>
|
</:actions>
|
||||||
</.header>
|
</.header>
|
||||||
|
|
||||||
@@ -63,7 +67,9 @@ defmodule DecentralisedBookIndexWeb.DbiServerLive.Index do
|
|||||||
<.link navigate={~p"/servers/#{dbi_server}"}>Show</.link>
|
<.link navigate={~p"/servers/#{dbi_server}"}>Show</.link>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<.link patch={~p"/servers/#{dbi_server}/edit"}>Edit</.link>
|
<%= if @current_user != nil and Role.can_administrate?(@current_user.role) do %>
|
||||||
|
<.link patch={~p"/servers/#{dbi_server}/edit"}>Edit</.link>
|
||||||
|
<% end %>
|
||||||
</:action>
|
</:action>
|
||||||
</.table>
|
</.table>
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
defmodule DecentralisedBookIndexWeb.DbiServerLive.Show do
|
defmodule DecentralisedBookIndexWeb.DbiServerLive.Show do
|
||||||
use DecentralisedBookIndexWeb, :live_view
|
use DecentralisedBookIndexWeb, :live_view
|
||||||
|
|
||||||
|
alias DecentralisedBookIndex.Accounts.Role
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def render(assigns) do
|
def render(assigns) do
|
||||||
~H"""
|
~H"""
|
||||||
@@ -8,7 +10,7 @@ defmodule DecentralisedBookIndexWeb.DbiServerLive.Show do
|
|||||||
{@dbi_server.name}
|
{@dbi_server.name}
|
||||||
|
|
||||||
<:actions>
|
<:actions>
|
||||||
<%= if is_nil(@dbi_server.dbi_server) do %>
|
<%= if is_nil(@dbi_server.dbi_server) and @current_user != nil and Role.can_administrate?(@current_user.role) do %>
|
||||||
<.link patch={~p"/servers/#{@dbi_server}/edit"} phx-click={JS.push_focus()}>
|
<.link patch={~p"/servers/#{@dbi_server}/edit"} phx-click={JS.push_focus()}>
|
||||||
<.edit_button>
|
<.edit_button>
|
||||||
Edit
|
Edit
|
||||||
@@ -18,7 +20,6 @@ defmodule DecentralisedBookIndexWeb.DbiServerLive.Show do
|
|||||||
</:actions>
|
</:actions>
|
||||||
</.header>
|
</.header>
|
||||||
|
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<dl>
|
<dl>
|
||||||
<dt class="mb-2 font-semibold leading-none text-gray-900 dark:text-white">Url</dt>
|
<dt class="mb-2 font-semibold leading-none text-gray-900 dark:text-white">Url</dt>
|
||||||
@@ -28,6 +29,16 @@ defmodule DecentralisedBookIndexWeb.DbiServerLive.Show do
|
|||||||
<dt class="mb-2 font-semibold leading-none text-gray-900 dark:text-white">Sync on?</dt>
|
<dt class="mb-2 font-semibold leading-none text-gray-900 dark:text-white">Sync on?</dt>
|
||||||
<dd class="mb-4 font-light text-gray-500 sm:mb-5 dark:text-gray-400">{@dbi_server.sync_on?}</dd>
|
<dd class="mb-4 font-light text-gray-500 sm:mb-5 dark:text-gray-400">{@dbi_server.sync_on?}</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
<%= if not is_nil(@dbi_server.dbi_server) do %>
|
||||||
|
<dl>
|
||||||
|
<dt class="mb-2 font-semibold leading-none text-gray-900 dark:text-white">From Server</dt>
|
||||||
|
<dd class="mb-4 font-light text-gray-500 sm:mb-5 dark:text-gray-400">
|
||||||
|
<.link navigate={~p"/servers/#{@dbi_server.dbi_server.id}/"} class="hover:underline">
|
||||||
|
{@dbi_server.dbi_server.name}
|
||||||
|
</.link>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<.back navigate={~p"/servers"}>Back to servers</.back>
|
<.back navigate={~p"/servers"}>Back to servers</.back>
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
defmodule DecentralisedBookIndexWeb.PublisherLive.Show do
|
defmodule DecentralisedBookIndexWeb.PublisherLive.Show do
|
||||||
use DecentralisedBookIndexWeb, :live_view
|
use DecentralisedBookIndexWeb, :live_view
|
||||||
|
|
||||||
|
alias DecentralisedBookIndex.Accounts.Role
|
||||||
|
|
||||||
@impl true
|
@impl true
|
||||||
def render(assigns) do
|
def render(assigns) do
|
||||||
~H"""
|
~H"""
|
||||||
@@ -18,6 +20,27 @@ defmodule DecentralisedBookIndexWeb.PublisherLive.Show do
|
|||||||
</:actions>
|
</:actions>
|
||||||
</.header>
|
</.header>
|
||||||
|
|
||||||
|
<%= if not is_nil(@publisher.dbi_server) do %>
|
||||||
|
<div>
|
||||||
|
<dl>
|
||||||
|
<dt class="mt-4 mb-2 font-semibold leading-none text-gray-900 dark:text-white">
|
||||||
|
From Server
|
||||||
|
</dt>
|
||||||
|
<dd class="mb-4 font-light text-gray-500 sm:mb-5 dark:text-gray-400">
|
||||||
|
<%= if @current_user != nil and Role.can_moderate?(@current_user.role) do %>
|
||||||
|
<.link navigate={~p"/servers/#{@publisher.dbi_server.id}/"} class="hover:underline">
|
||||||
|
{@publisher.dbi_server.name}
|
||||||
|
</.link>
|
||||||
|
<% else %>
|
||||||
|
<.link navigate={@publisher.dbi_server.url} class="hover:underline">
|
||||||
|
{@publisher.dbi_server.name}
|
||||||
|
</.link>
|
||||||
|
<% end %>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
<.back navigate={~p"/publishers"}>Back to publishers</.back>
|
<.back navigate={~p"/publishers"}>Back to publishers</.back>
|
||||||
"""
|
"""
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -41,6 +41,18 @@ defmodule DecentralisedBookIndexWeb.Router do
|
|||||||
scope "/", DecentralisedBookIndexWeb do
|
scope "/", DecentralisedBookIndexWeb do
|
||||||
pipe_through :browser
|
pipe_through :browser
|
||||||
|
|
||||||
|
ash_authentication_live_session :admin_authenticated_routes,
|
||||||
|
on_mount: {DecentralisedBookIndexWeb.LiveUserAuth, :admin_required} do
|
||||||
|
live "/servers/new", DbiServerLive.Edit, :new
|
||||||
|
live "/servers/:id/edit", DbiServerLive.Edit, :edit
|
||||||
|
#live "/servers", DbiServerLive.Index, :index
|
||||||
|
#live "/servers/:id", DbiServerLive.Show, :show
|
||||||
|
|
||||||
|
live "/users", UserLive.Index, :index
|
||||||
|
live "/users/:id", UserLive.Show, :show
|
||||||
|
live "/users/:id/edit", UserLive.Edit, :edit
|
||||||
|
end
|
||||||
|
|
||||||
ash_authentication_live_session :moderator_authenticated_routes,
|
ash_authentication_live_session :moderator_authenticated_routes,
|
||||||
on_mount: {DecentralisedBookIndexWeb.LiveUserAuth, :moderator_required} do
|
on_mount: {DecentralisedBookIndexWeb.LiveUserAuth, :moderator_required} do
|
||||||
live "/books/new", BookLive.Edit, :new
|
live "/books/new", BookLive.Edit, :new
|
||||||
@@ -56,19 +68,9 @@ defmodule DecentralisedBookIndexWeb.Router do
|
|||||||
live "/publishers/:id/edit", PublisherLive.Edit, :edit
|
live "/publishers/:id/edit", PublisherLive.Edit, :edit
|
||||||
|
|
||||||
live "/publishers/:id", PublisherLive.Show, :show
|
live "/publishers/:id", PublisherLive.Show, :show
|
||||||
end
|
|
||||||
|
|
||||||
ash_authentication_live_session :admin_authenticated_routes,
|
|
||||||
on_mount: {DecentralisedBookIndexWeb.LiveUserAuth, :admin_required} do
|
|
||||||
live "/servers", DbiServerLive.Index, :index
|
live "/servers", DbiServerLive.Index, :index
|
||||||
live "/servers/new", DbiServerLive.Edit, :new
|
|
||||||
live "/servers/:id/edit", DbiServerLive.Edit, :edit
|
|
||||||
|
|
||||||
live "/servers/:id", DbiServerLive.Show, :show
|
live "/servers/:id", DbiServerLive.Show, :show
|
||||||
|
|
||||||
live "/users", UserLive.Index, :index
|
|
||||||
live "/users/:id", UserLive.Show, :show
|
|
||||||
live "/users/:id/edit", UserLive.Edit, :edit
|
|
||||||
end
|
end
|
||||||
|
|
||||||
ash_authentication_live_session :maybe_authenticated_routes,
|
ash_authentication_live_session :maybe_authenticated_routes,
|
||||||
|
|||||||
@@ -303,12 +303,11 @@ defmodule DecentralisedBookIndexWeb.LiveViewsPermissionsTest do
|
|||||||
end
|
end
|
||||||
|
|
||||||
describe "Server Index /servers" do
|
describe "Server Index /servers" do
|
||||||
test "can't be accessed by regular user and moderator", %{
|
test "can't be accessed by regular user", %{
|
||||||
conn: conn,
|
conn: conn,
|
||||||
user: user,
|
user: user
|
||||||
moderator: moderator
|
|
||||||
} do
|
} do
|
||||||
for user <- [nil, user, moderator] do
|
for user <- [nil, user] do
|
||||||
assert {:error, {:redirect, %{flash: %{"error" => "Unauthorized!"}, to: "/"}}} =
|
assert {:error, {:redirect, %{flash: %{"error" => "Unauthorized!"}, to: "/"}}} =
|
||||||
conn
|
conn
|
||||||
|> log_in_user(user)
|
|> log_in_user(user)
|
||||||
@@ -316,8 +315,12 @@ defmodule DecentralisedBookIndexWeb.LiveViewsPermissionsTest do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
test "can be accessed by admin", %{conn: conn, admin: admin} do
|
test "can be accessed by moderator and admin", %{
|
||||||
for user <- [admin] do
|
conn: conn,
|
||||||
|
moderator: moderator,
|
||||||
|
admin: admin
|
||||||
|
} do
|
||||||
|
for user <- [moderator, admin] do
|
||||||
assert {:ok, _view, html} =
|
assert {:ok, _view, html} =
|
||||||
conn
|
conn
|
||||||
|> log_in_user(user)
|
|> log_in_user(user)
|
||||||
@@ -333,13 +336,12 @@ defmodule DecentralisedBookIndexWeb.LiveViewsPermissionsTest do
|
|||||||
%{server: generate(dbi_server())}
|
%{server: generate(dbi_server())}
|
||||||
end
|
end
|
||||||
|
|
||||||
test "can't be accessed by non-admin user", %{
|
test "can't be accessed by non-moderator user", %{
|
||||||
conn: conn,
|
conn: conn,
|
||||||
user: user,
|
user: user,
|
||||||
moderator: moderator,
|
|
||||||
server: server
|
server: server
|
||||||
} do
|
} do
|
||||||
for user <- [nil, user, moderator] do
|
for user <- [nil, user] do
|
||||||
assert {:error, {:redirect, %{flash: %{"error" => "Unauthorized!"}, to: "/"}}} =
|
assert {:error, {:redirect, %{flash: %{"error" => "Unauthorized!"}, to: "/"}}} =
|
||||||
conn
|
conn
|
||||||
|> log_in_user(user)
|
|> log_in_user(user)
|
||||||
@@ -347,8 +349,13 @@ defmodule DecentralisedBookIndexWeb.LiveViewsPermissionsTest do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
test "can be accessed by admin", %{conn: conn, admin: admin, server: server} do
|
test "can be accessed by admin", %{
|
||||||
for user <- [admin] do
|
conn: conn,
|
||||||
|
moderator: moderator,
|
||||||
|
admin: admin,
|
||||||
|
server: server
|
||||||
|
} do
|
||||||
|
for user <- [moderator, admin] do
|
||||||
{:ok, _view, html} =
|
{:ok, _view, html} =
|
||||||
conn
|
conn
|
||||||
|> log_in_user(user)
|
|> log_in_user(user)
|
||||||
|
|||||||
Reference in New Issue
Block a user