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 @@
<%= for identity <- @identities do %>
-
+
<% end %>
-
+ <%= if @channel do %>
+
+ <% 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