Compare commits
8
Commits
44841a53e8
...
1.0.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
045faf59a4 | ||
|
|
152bee732f | ||
|
|
99188454e9 | ||
|
|
80e99b7de8 | ||
|
|
51c584056b | ||
|
|
b70b99ba51 | ||
|
|
9c7a555dae | ||
|
|
ab3d65a899 |
+14
@@ -24,6 +24,20 @@ steps:
|
|||||||
commands:
|
commands:
|
||||||
- mix test
|
- mix test
|
||||||
|
|
||||||
|
- name: build the image
|
||||||
|
image: plugins/kaniko
|
||||||
|
settings:
|
||||||
|
username: kklochko
|
||||||
|
password:
|
||||||
|
from_secret: REGISTRY_PASSWORD
|
||||||
|
repo: git.kklochko.space/kklochko/decentralised_book_index
|
||||||
|
registry: git.kklochko.space
|
||||||
|
tags:
|
||||||
|
- latest
|
||||||
|
- ${DRONE_TAG}
|
||||||
|
when:
|
||||||
|
event: tag
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
- name: mix
|
- name: mix
|
||||||
temp: {}
|
temp: {}
|
||||||
|
|||||||
+2
-1
@@ -12,7 +12,8 @@ config :decentralised_book_index, Oban,
|
|||||||
repo: DecentralisedBookIndex.Repo,
|
repo: DecentralisedBookIndex.Repo,
|
||||||
queues: [default: 14],
|
queues: [default: 14],
|
||||||
plugins: [
|
plugins: [
|
||||||
Oban.Plugins.Pruner,
|
# A job will be pruned after 7 days.
|
||||||
|
{Oban.Plugins.Pruner, max_age: 7*24*60*60},
|
||||||
{Oban.Plugins.Cron,
|
{Oban.Plugins.Cron,
|
||||||
crontab: [
|
crontab: [
|
||||||
{"@daily", DecentralisedBookIndex.SyncWorker},
|
{"@daily", DecentralisedBookIndex.SyncWorker},
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -20,8 +20,6 @@ defmodule DecentralisedBookIndexWeb.Components.MyComponents.SelectedAuthor do
|
|||||||
|
|
||||||
errors =
|
errors =
|
||||||
if Phoenix.Component.used_input?(assigns.author_form), do: assigns.author_form.errors, else: []
|
if Phoenix.Component.used_input?(assigns.author_form), do: assigns.author_form.errors, else: []
|
||||||
IO.inspect("errors")
|
|
||||||
IO.inspect(errors)
|
|
||||||
|
|
||||||
assigns =
|
assigns =
|
||||||
assigns
|
assigns
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ defmodule DecentralisedBookIndexWeb.Components.MyPartials.Navbar do
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<% end %>
|
<% end %>
|
||||||
<%= if @current_user != nil and Role.can_administrate?(@current_user.role) do %>
|
<%= if @current_user != nil and Role.can_moderate?(@current_user.role) do %>
|
||||||
<li>
|
<li>
|
||||||
<a
|
<a
|
||||||
href={~p"/servers/"}
|
href={~p"/servers/"}
|
||||||
|
|||||||
@@ -158,9 +158,6 @@ defmodule DecentralisedBookIndexWeb.AuthorLive.FormComponent do
|
|||||||
end
|
end
|
||||||
|
|
||||||
def handle_event("select-author-alias", %{"author-alias" => author_alias_id}, socket) do
|
def handle_event("select-author-alias", %{"author-alias" => author_alias_id}, socket) do
|
||||||
IO.inspect("book_editions_registry_id")
|
|
||||||
IO.inspect(author_alias_id)
|
|
||||||
|
|
||||||
socket =
|
socket =
|
||||||
socket
|
socket
|
||||||
|> update(:form, fn form ->
|
|> update(:form, fn form ->
|
||||||
|
|||||||
@@ -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,12 +4,15 @@ 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>
|
||||||
|
<%= 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">
|
||||||
<div class="flex flex-row gap-2">
|
<div class="flex flex-row gap-2">
|
||||||
<.primary_button phx-click="sync">
|
<.primary_button phx-click="sync">
|
||||||
@@ -24,6 +27,7 @@ defmodule DecentralisedBookIndexWeb.DbiServerLive.Index do
|
|||||||
</.link>
|
</.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>
|
||||||
|
|
||||||
|
<%= if @current_user != nil and Role.can_administrate?(@current_user.role) do %>
|
||||||
<.link patch={~p"/servers/#{dbi_server}/edit"}>Edit</.link>
|
<.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,
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ defmodule DecentralisedBookIndex.MixProject do
|
|||||||
def project do
|
def project do
|
||||||
[
|
[
|
||||||
app: :decentralised_book_index,
|
app: :decentralised_book_index,
|
||||||
version: "0.1.0",
|
version: "1.0.0",
|
||||||
elixir: "~> 1.14",
|
elixir: "~> 1.14",
|
||||||
elixirc_paths: elixirc_paths(Mix.env()),
|
elixirc_paths: elixirc_paths(Mix.env()),
|
||||||
start_permanent: Mix.env() == :prod,
|
start_permanent: Mix.env() == :prod,
|
||||||
|
|||||||
@@ -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