From c969e6e90f4cfc42072dd16bdcbfc1a710a2ccbb Mon Sep 17 00:00:00 2001 From: Inhji Date: Sat, 11 Mar 2023 00:05:16 +0100 Subject: [PATCH] add home channel setting, first pass of public routesfix identity tests --- lib/chiya/channels/channel.ex | 6 ++-- lib/chiya/notes.ex | 3 ++ lib/chiya/site/setting.ex | 14 ++++++-- lib/chiya_web/controllers/admin_html.ex | 2 +- .../controllers/admin_html/home.html.heex | 2 +- lib/chiya_web/controllers/page_controller.ex | 17 ++++++++- .../controllers/page_html/home.html.heex | 35 ++++++++++++------- .../controllers/page_html/note.html.heex | 3 ++ .../controllers/setting_controller.ex | 10 +++--- .../controllers/setting_html/edit.html.heex | 2 +- .../controllers/setting_html/new.html.heex | 2 +- .../setting_html/setting_form.html.heex | 1 + lib/chiya_web/format.ex | 16 ++++----- lib/chiya_web/router.ex | 3 +- .../20230310202848_add_default_settings.exs | 15 ++++++++ ...0230310204524_add_home_channel_setting.exs | 9 +++++ test/chiya/site_test.exs | 12 ++++--- .../controllers/identity_controller_test.exs | 2 ++ .../controllers/page_controller_test.exs | 3 +- .../controllers/setting_controller_test.exs | 11 ------ .../live/user_registration_live_test.exs | 2 +- 21 files changed, 118 insertions(+), 52 deletions(-) create mode 100644 lib/chiya_web/controllers/page_html/note.html.heex create mode 100644 priv/repo/migrations/20230310202848_add_default_settings.exs create mode 100644 priv/repo/migrations/20230310204524_add_home_channel_setting.exs diff --git a/lib/chiya/channels/channel.ex b/lib/chiya/channels/channel.ex index 551e587..33dd354 100644 --- a/lib/chiya/channels/channel.ex +++ b/lib/chiya/channels/channel.ex @@ -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 diff --git a/lib/chiya/notes.ex b/lib/chiya/notes.ex index 1119b45..43c86c4 100644 --- a/lib/chiya/notes.ex +++ b/lib/chiya/notes.ex @@ -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. diff --git a/lib/chiya/site/setting.ex b/lib/chiya/site/setting.ex index 90e133e..b4fdbb3 100644 --- a/lib/chiya/site/setting.ex +++ b/lib/chiya/site/setting.ex @@ -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 diff --git a/lib/chiya_web/controllers/admin_html.ex b/lib/chiya_web/controllers/admin_html.ex index 8f604c2..1f80de2 100644 --- a/lib/chiya_web/controllers/admin_html.ex +++ b/lib/chiya_web/controllers/admin_html.ex @@ -2,4 +2,4 @@ defmodule ChiyaWeb.AdminHTML do use ChiyaWeb, :html embed_templates "admin_html/*" -end \ No newline at end of file +end diff --git a/lib/chiya_web/controllers/admin_html/home.html.heex b/lib/chiya_web/controllers/admin_html/home.html.heex index 273b580..b49447f 100644 --- a/lib/chiya_web/controllers/admin_html/home.html.heex +++ b/lib/chiya_web/controllers/admin_html/home.html.heex @@ -1 +1 @@ -<.header>Admin \ No newline at end of file +<.header>Admin diff --git a/lib/chiya_web/controllers/page_controller.ex b/lib/chiya_web/controllers/page_controller.ex index 2ec431d..922a85f 100644 --- a/lib/chiya_web/controllers/page_controller.ex +++ b/lib/chiya_web/controllers/page_controller.ex @@ -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 diff --git a/lib/chiya_web/controllers/page_html/home.html.heex b/lib/chiya_web/controllers/page_html/home.html.heex index 805be2e..2544d3f 100644 --- a/lib/chiya_web/controllers/page_html/home.html.heex +++ b/lib/chiya_web/controllers/page_html/home.html.heex @@ -9,20 +9,31 @@
- + <%= if @channel do %> +
+ <%= for note <- @channel.notes do %> + + <.header> + <%= note.name %> + <:subtitle><%= note.published_at %> + + + <% end %> +
+ <% end %> diff --git a/lib/chiya_web/controllers/page_html/note.html.heex b/lib/chiya_web/controllers/page_html/note.html.heex new file mode 100644 index 0000000..4235434 --- /dev/null +++ b/lib/chiya_web/controllers/page_html/note.html.heex @@ -0,0 +1,3 @@ +<.header> + <%= @note.name %> + diff --git a/lib/chiya_web/controllers/setting_controller.ex b/lib/chiya_web/controllers/setting_controller.ex index 8af9e4c..3b35652 100644 --- a/lib/chiya_web/controllers/setting_controller.ex +++ b/lib/chiya_web/controllers/setting_controller.ex @@ -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 diff --git a/lib/chiya_web/controllers/setting_html/edit.html.heex b/lib/chiya_web/controllers/setting_html/edit.html.heex index 0c294f3..f2e4a27 100644 --- a/lib/chiya_web/controllers/setting_html/edit.html.heex +++ b/lib/chiya_web/controllers/setting_html/edit.html.heex @@ -3,6 +3,6 @@ <:subtitle>Use this form to manage setting records in your database. -<.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 diff --git a/lib/chiya_web/controllers/setting_html/new.html.heex b/lib/chiya_web/controllers/setting_html/new.html.heex index e4ba824..d39b5f0 100644 --- a/lib/chiya_web/controllers/setting_html/new.html.heex +++ b/lib/chiya_web/controllers/setting_html/new.html.heex @@ -3,6 +3,6 @@ <:subtitle>Use this form to manage setting records in your database. -<.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 diff --git a/lib/chiya_web/controllers/setting_html/setting_form.html.heex b/lib/chiya_web/controllers/setting_html/setting_form.html.heex index 090dadc..1c3bc45 100644 --- a/lib/chiya_web/controllers/setting_html/setting_form.html.heex +++ b/lib/chiya_web/controllers/setting_html/setting_form.html.heex @@ -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 diff --git a/lib/chiya_web/format.ex b/lib/chiya_web/format.ex index 2ad0aa1..0e181a9 100644 --- a/lib/chiya_web/format.ex +++ b/lib/chiya_web/format.ex @@ -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 \ No newline at end of file +end diff --git a/lib/chiya_web/router.ex b/lib/chiya_web/router.ex index e74412f..4b2ad15 100644 --- a/lib/chiya_web/router.ex +++ b/lib/chiya_web/router.ex @@ -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 diff --git a/priv/repo/migrations/20230310202848_add_default_settings.exs b/priv/repo/migrations/20230310202848_add_default_settings.exs new file mode 100644 index 0000000..c4ba51a --- /dev/null +++ b/priv/repo/migrations/20230310202848_add_default_settings.exs @@ -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 diff --git a/priv/repo/migrations/20230310204524_add_home_channel_setting.exs b/priv/repo/migrations/20230310204524_add_home_channel_setting.exs new file mode 100644 index 0000000..ed665bf --- /dev/null +++ b/priv/repo/migrations/20230310204524_add_home_channel_setting.exs @@ -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 diff --git a/test/chiya/site_test.exs b/test/chiya/site_test.exs index 2fbc8b9..dfc3e34 100644 --- a/test/chiya/site_test.exs +++ b/test/chiya/site_test.exs @@ -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 diff --git a/test/chiya_web/controllers/identity_controller_test.exs b/test/chiya_web/controllers/identity_controller_test.exs index 39005b1..1dab54e 100644 --- a/test/chiya_web/controllers/identity_controller_test.exs +++ b/test/chiya_web/controllers/identity_controller_test.exs @@ -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") diff --git a/test/chiya_web/controllers/page_controller_test.exs b/test/chiya_web/controllers/page_controller_test.exs index 6616f5e..ee496fd 100644 --- a/test/chiya_web/controllers/page_controller_test.exs +++ b/test/chiya_web/controllers/page_controller_test.exs @@ -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 diff --git a/test/chiya_web/controllers/setting_controller_test.exs b/test/chiya_web/controllers/setting_controller_test.exs index 3438673..75f616f 100644 --- a/test/chiya_web/controllers/setting_controller_test.exs +++ b/test/chiya_web/controllers/setting_controller_test.exs @@ -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 diff --git a/test/chiya_web/live/user_registration_live_test.exs b/test/chiya_web/live/user_registration_live_test.exs index 73a8f1b..6cc03b2 100644 --- a/test/chiya_web/live/user_registration_live_test.exs +++ b/test/chiya_web/live/user_registration_live_test.exs @@ -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