add home channel setting, first pass of public routesfix identity tests

This commit is contained in:
Inhji 2023-03-11 00:05:16 +01:00
parent d374880152
commit c969e6e90f
21 changed files with 118 additions and 52 deletions

View file

@ -8,8 +8,10 @@ defmodule Chiya.Channels.Channel do
field :slug, :string
field :visibility, Ecto.Enum, values: [:public, :private, :unlisted]
many_to_many :notes, Chiya.Notes.Note, join_through: "channels_notes"
many_to_many :notes, Chiya.Notes.Note,
join_through: "channels_notes",
join_keys: [note: :id, channel: :id]
timestamps()
end

View file

@ -64,6 +64,9 @@ defmodule Chiya.Notes do
"""
def get_note_preloaded!(id), do: Repo.get!(Note, id) |> preload_note()
def get_note_by_slug_preloaded!(slug), do: Repo.get_by!(Note, slug: slug) |> preload_note()
@doc """
Creates a note.

View file

@ -9,17 +9,27 @@ defmodule Chiya.Site.Setting do
field :custom_css, :string, default: ""
field :custom_html, :string, default: ""
field :theme, Ecto.Enum, values: [:default]
field :theme, Ecto.Enum, values: [:default], default: :default
field :user_agent, :string, default: "Chiya/0.x +https://inhji.de"
belongs_to :home_channel, Chiya.Channels.Channel
timestamps()
end
@doc false
def changeset(setting, attrs) do
setting
|> cast(attrs, [:title, :subtitle, :theme, :user_agent, :custom_css, :custom_html])
|> cast(attrs, [
:title,
:subtitle,
:theme,
:user_agent,
:custom_css,
:custom_html,
:home_channel_id
])
|> validate_required([:title, :subtitle, :theme, :user_agent])
end
end

View file

@ -2,4 +2,4 @@ defmodule ChiyaWeb.AdminHTML do
use ChiyaWeb, :html
embed_templates "admin_html/*"
end
end

View file

@ -1 +1 @@
<.header>Admin</.header>
<.header>Admin</.header>

View file

@ -4,11 +4,26 @@ defmodule ChiyaWeb.PageController do
def home(conn, _params) do
# The home page is often custom made,
# so skip the default app layout.
render(conn, :home, layout: {ChiyaWeb.Layouts, "public.html"})
settings = conn.assigns.settings
channel =
if settings.home_channel_id != nil do
IO.inspect(settings)
Chiya.Channels.get_channel_preloaded!(settings.home_channel_id)
else
nil
end
render(conn, :home, layout: {ChiyaWeb.Layouts, "public.html"}, channel: channel)
end
def channel(conn, %{"slug" => channel_slug}) do
channel = Chiya.Channels.get_channel_by_slug_preloaded!(channel_slug)
render(conn, :channel, layout: {ChiyaWeb.Layouts, "public.html"}, channel: channel)
end
def note(conn, %{"slug" => note_slug}) do
note = Chiya.Notes.get_note_by_slug_preloaded!(note_slug)
render(conn, :note, layout: {ChiyaWeb.Layouts, "public.html"}, note: note)
end
end

View file

@ -9,20 +9,31 @@
<div class="w-full mt-6 sm:w-auto">
<div class="flex gap-4 text-sm leading-6 text-zinc-700">
<%= for identity <- @identities do %>
<div>
<a
rel={identity.rel}
href={identity.url}
target="_blank"
class="group -mx-2 -my-0.5 inline-flex items-center gap-3 rounded-lg px-2 py-0.5 hover:bg-zinc-50 hover:text-zinc-900"
>
<.icon name="hero-cube" />
<%= identity.name %>
</a>
</div>
<div>
<a
rel={identity.rel}
href={identity.url}
target="_blank"
class="group -mx-2 -my-0.5 inline-flex items-center gap-3 rounded-lg px-2 py-0.5 hover:bg-zinc-50 hover:text-zinc-900"
>
<.icon name="hero-cube" />
<%= identity.name %>
</a>
</div>
<% end %>
</div>
</div>
<%= if @channel do %>
<div class="w-full mt-6 sm:w-auto">
<%= for note <- @channel.notes do %>
<a href={~p"/n/#{note.slug}"}>
<.header>
<%= note.name %>
<:subtitle><%= note.published_at %></:subtitle>
</.header>
</a>
<% end %>
</div>
<% end %>
</div>
</div>

View file

@ -0,0 +1,3 @@
<.header>
<%= @note.name %>
</.header>

View file

@ -6,7 +6,7 @@ defmodule ChiyaWeb.SettingController do
def new(conn, _params) do
changeset = Site.change_setting(%Setting{})
render(conn, :new, changeset: changeset)
render(conn, :new, changeset: changeset, channels: channels())
end
def create(conn, %{"setting" => setting_params}) do
@ -17,7 +17,7 @@ defmodule ChiyaWeb.SettingController do
|> redirect(to: ~p"/admin/settings")
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, :new, changeset: changeset)
render(conn, :new, changeset: changeset, channels: channels())
end
end
@ -29,7 +29,7 @@ defmodule ChiyaWeb.SettingController do
def edit(conn, _params) do
setting = Site.get_settings()
changeset = Site.change_setting(setting)
render(conn, :edit, setting: setting, changeset: changeset)
render(conn, :edit, setting: setting, changeset: changeset, channels: channels())
end
def update(conn, %{"setting" => setting_params}) do
@ -42,7 +42,9 @@ defmodule ChiyaWeb.SettingController do
|> redirect(to: ~p"/admin/settings")
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, :edit, setting: setting, changeset: changeset)
render(conn, :edit, setting: setting, changeset: changeset, channels: channels())
end
end
defp channels(), do: Chiya.Channels.list_channels() |> Enum.map(fn c -> {c.name, c.id} end)
end

View file

@ -3,6 +3,6 @@
<:subtitle>Use this form to manage setting records in your database.</:subtitle>
</.header>
<.setting_form changeset={@changeset} action={~p"/admin/settings"} />
<.setting_form changeset={@changeset} action={~p"/admin/settings"} channels={@channels} />
<.back navigate={~p"/admin/settings"}>Back to settings</.back>

View file

@ -3,6 +3,6 @@
<:subtitle>Use this form to manage setting records in your database.</:subtitle>
</.header>
<.setting_form changeset={@changeset} action={~p"/admin/settings"} />
<.setting_form changeset={@changeset} action={~p"/admin/settings"} channels={@channels} />
<.back navigate={~p"/admin/settings"}>Back to settings</.back>

View file

@ -14,6 +14,7 @@
<.input field={f[:user_agent]} type="text" label="User agent" />
<.input field={f[:custom_css]} type="textarea" label="Custom css" />
<.input field={f[:custom_html]} type="textarea" label="Custom html" />
<.input field={f[:home_channel_id]} type="select" label="Home Channel" options={@channels} />
<:actions>
<.button>Save Setting</.button>
</:actions>

View file

@ -1,17 +1,17 @@
defmodule ChiyaWeb.Format do
def from_now(later) do
now = DateTime.utc_now()
diff = DateTime.diff(now, later)
do_from_now(diff)
now = DateTime.utc_now()
diff = DateTime.diff(now, later)
do_from_now(diff)
end
def from_now_naive(later) do
now = NaiveDateTime.utc_now()
diff = NaiveDateTime.diff(now, later)
do_from_now(diff)
now = NaiveDateTime.utc_now()
diff = NaiveDateTime.diff(now, later)
do_from_now(diff)
end
def do_from_now(diff) do
def do_from_now(diff) do
cond do
diff <= -24 * 3600 -> "in #{div(-diff, 24 * 3600)}d"
diff <= -3600 -> "in #{div(-diff, 3600)}h"
@ -24,4 +24,4 @@ defmodule ChiyaWeb.Format do
true -> "#{div(diff, 24 * 3600)}d ago"
end
end
end
end

View file

@ -51,7 +51,7 @@ defmodule ChiyaWeb.Router do
pipe_through [:browser, :require_authenticated_user]
get "/", AdminController, :home
resources "/channels", ChannelController
resources "/notes", NoteController, except: [:show]
resources "/settings", SettingController, singleton: true
@ -104,6 +104,7 @@ defmodule ChiyaWeb.Router do
scope "/", ChiyaWeb do
pipe_through [:browser, :public]
get "/n/:slug", PageController, :note
get "/:slug", PageController, :channel
get "/", PageController, :home
end

View file

@ -0,0 +1,15 @@
defmodule Chiya.Repo.Migrations.AddDefaultSettings do
use Ecto.Migration
alias Chiya.Site.Setting
def up do
if not repo().exists?(Setting) do
repo().insert(%Setting{})
end
end
def down do
repo().delete_all(Setting)
end
end

View file

@ -0,0 +1,9 @@
defmodule Chiya.Repo.Migrations.AddHomeChannelSetting do
use Ecto.Migration
def change do
alter table(:settings) do
add :home_channel_id, references(:channels, on_delete: :nothing)
end
end
end

View file

@ -17,9 +17,11 @@ defmodule Chiya.SiteTest do
user_agent: nil
}
test "get_setting!/1 returns the setting with given id" do
setting = setting_fixture()
assert Site.get_settings() == setting
test "get_setting!/1 returns the setting" do
# setting = setting_fixture()
setting = Site.get_settings()
assert setting.title == "Title"
assert setting.subtitle == "Subtitle"
end
test "create_setting/1 with valid data creates a setting" do
@ -46,7 +48,7 @@ defmodule Chiya.SiteTest do
end
test "update_setting/2 with valid data updates the setting" do
setting = setting_fixture()
setting = Site.get_settings()
update_attrs = %{
custom_css: "some updated custom_css",
@ -67,7 +69,7 @@ defmodule Chiya.SiteTest do
end
test "update_setting/2 with invalid data returns error changeset" do
setting = setting_fixture()
setting = Site.get_settings()
assert {:error, %Ecto.Changeset{}} = Site.update_setting(setting, @invalid_attrs)
assert setting == Site.get_settings()
end

View file

@ -13,6 +13,8 @@ defmodule ChiyaWeb.IdentityControllerTest do
}
@invalid_attrs %{active: nil, name: nil, public: nil, rel: nil, url: nil}
setup [:register_and_log_in_user]
describe "index" do
test "lists all identities", %{conn: conn} do
conn = get(conn, ~p"/admin/identities")

View file

@ -3,6 +3,7 @@ defmodule ChiyaWeb.PageControllerTest do
test "GET /", %{conn: conn} do
conn = get(conn, ~p"/")
assert html_response(conn, 200) =~ "Peace of mind from prototype to production"
assert html_response(conn, 200) =~ "Title"
assert html_response(conn, 200) =~ "Subtitle"
end
end

View file

@ -1,8 +1,6 @@
defmodule ChiyaWeb.SettingControllerTest do
use ChiyaWeb.ConnCase
import Chiya.SiteFixtures
@create_attrs %{
custom_css: "some custom_css",
custom_html: "some custom_html",
@ -50,8 +48,6 @@ defmodule ChiyaWeb.SettingControllerTest do
end
describe "edit setting" do
setup [:create_setting]
test "renders form for editing chosen setting", %{conn: conn} do
conn = get(conn, ~p"/admin/settings/edit")
assert html_response(conn, 200) =~ "Edit Setting"
@ -59,8 +55,6 @@ defmodule ChiyaWeb.SettingControllerTest do
end
describe "update setting" do
setup [:create_setting]
test "redirects when data is valid", %{conn: conn} do
conn = put(conn, ~p"/admin/settings", setting: @update_attrs)
assert redirected_to(conn) == ~p"/admin/settings"
@ -74,9 +68,4 @@ defmodule ChiyaWeb.SettingControllerTest do
assert html_response(conn, 200) =~ "Edit Setting"
end
end
defp create_setting(_) do
setting = setting_fixture()
%{setting: setting}
end
end

View file

@ -51,7 +51,7 @@ defmodule ChiyaWeb.UserRegistrationLiveTest do
conn = get(conn, "/")
response = html_response(conn, 200)
assert response =~ email
assert response =~ "Settings"
assert response =~ "Admin"
assert response =~ "Log out"
end
end