fix: A1-6 preview prefers draft content over published files for on-demand rendering
This commit is contained in:
@@ -406,35 +406,35 @@ defmodule BDS.Preview.Router do
|
|||||||
|> MapSet.new()
|
|> MapSet.new()
|
||||||
|
|
||||||
project_id
|
project_id
|
||||||
|> load_all_published_posts()
|
|> load_previewable_posts()
|
||||||
|> Enum.reject(fn post ->
|
|> Enum.reject(fn post ->
|
||||||
Enum.any?(post.categories || [], &MapSet.member?(excluded, &1))
|
Enum.any?(post.categories || [], &MapSet.member?(excluded, &1))
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp load_all_published_posts(project_id) do
|
defp load_previewable_posts(project_id) do
|
||||||
Repo.all(
|
Repo.all(
|
||||||
from p in Post,
|
from p in Post,
|
||||||
where: p.project_id == ^project_id and p.status == :published,
|
where: p.project_id == ^project_id and p.status in [:published, :draft],
|
||||||
order_by: [desc: p.created_at, desc: p.published_at, asc: p.slug]
|
order_by: [desc: p.created_at, desc: p.published_at, asc: p.slug]
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp load_published_posts_by_category(project_id, category) do
|
defp load_published_posts_by_category(project_id, category) do
|
||||||
project_id
|
project_id
|
||||||
|> load_all_published_posts()
|
|> load_previewable_posts()
|
||||||
|> Enum.filter(fn post -> category in (post.categories || []) end)
|
|> Enum.filter(fn post -> category in (post.categories || []) end)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp load_published_posts_by_tag(project_id, tag) do
|
defp load_published_posts_by_tag(project_id, tag) do
|
||||||
project_id
|
project_id
|
||||||
|> load_all_published_posts()
|
|> load_previewable_posts()
|
||||||
|> Enum.filter(fn post -> tag in (post.tags || []) end)
|
|> Enum.filter(fn post -> tag in (post.tags || []) end)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp load_published_posts_by_year(project_id, year) do
|
defp load_published_posts_by_year(project_id, year) do
|
||||||
project_id
|
project_id
|
||||||
|> load_all_published_posts()
|
|> load_previewable_posts()
|
||||||
|> Enum.filter(fn post ->
|
|> Enum.filter(fn post ->
|
||||||
{post_year, _, _} = Paths.local_date_parts!(post.created_at)
|
{post_year, _, _} = Paths.local_date_parts!(post.created_at)
|
||||||
post_year == year
|
post_year == year
|
||||||
@@ -443,7 +443,7 @@ defmodule BDS.Preview.Router do
|
|||||||
|
|
||||||
defp load_published_posts_by_month(project_id, year, month) do
|
defp load_published_posts_by_month(project_id, year, month) do
|
||||||
project_id
|
project_id
|
||||||
|> load_all_published_posts()
|
|> load_previewable_posts()
|
||||||
|> Enum.filter(fn post ->
|
|> Enum.filter(fn post ->
|
||||||
{post_year, post_month, _} = Paths.local_date_parts!(post.created_at)
|
{post_year, post_month, _} = Paths.local_date_parts!(post.created_at)
|
||||||
post_year == year and post_month == month
|
post_year == year and post_month == month
|
||||||
@@ -452,7 +452,7 @@ defmodule BDS.Preview.Router do
|
|||||||
|
|
||||||
defp load_published_posts_by_day(project_id, year, month, day) do
|
defp load_published_posts_by_day(project_id, year, month, day) do
|
||||||
project_id
|
project_id
|
||||||
|> load_all_published_posts()
|
|> load_previewable_posts()
|
||||||
|> Enum.filter(fn post ->
|
|> Enum.filter(fn post ->
|
||||||
{post_year, post_month, post_day} = Paths.local_date_parts!(post.created_at)
|
{post_year, post_month, post_day} = Paths.local_date_parts!(post.created_at)
|
||||||
post_year == year and post_month == month and post_day == day
|
post_year == year and post_month == month and post_day == day
|
||||||
@@ -462,7 +462,9 @@ defmodule BDS.Preview.Router do
|
|||||||
defp find_post_by_slug_and_date(project_id, slug, year, month, day) do
|
defp find_post_by_slug_and_date(project_id, slug, year, month, day) do
|
||||||
case Repo.one(
|
case Repo.one(
|
||||||
from p in Post,
|
from p in Post,
|
||||||
where: p.project_id == ^project_id and p.slug == ^slug and p.status == :published
|
where:
|
||||||
|
p.project_id == ^project_id and p.slug == ^slug and
|
||||||
|
p.status in [:published, :draft]
|
||||||
) do
|
) do
|
||||||
nil ->
|
nil ->
|
||||||
nil
|
nil
|
||||||
@@ -481,7 +483,9 @@ defmodule BDS.Preview.Router do
|
|||||||
defp find_page_by_slug(project_id, slug) do
|
defp find_page_by_slug(project_id, slug) do
|
||||||
case Repo.one(
|
case Repo.one(
|
||||||
from p in Post,
|
from p in Post,
|
||||||
where: p.project_id == ^project_id and p.slug == ^slug and p.status == :published
|
where:
|
||||||
|
p.project_id == ^project_id and p.slug == ^slug and
|
||||||
|
p.status in [:published, :draft]
|
||||||
) do
|
) do
|
||||||
%Post{categories: categories} = post ->
|
%Post{categories: categories} = post ->
|
||||||
if "page" in (categories || []), do: post, else: nil
|
if "page" in (categories || []), do: post, else: nil
|
||||||
|
|||||||
@@ -605,6 +605,107 @@ defmodule BDS.PreviewTest do
|
|||||||
assert :ok = BDS.Preview.stop_preview(project.id)
|
assert :ok = BDS.Preview.stop_preview(project.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "on-demand rendering: draft post (never published) is visible and uses DB content", %{
|
||||||
|
project: project
|
||||||
|
} do
|
||||||
|
assert {:ok, _metadata} =
|
||||||
|
Metadata.update_project_metadata(project.id, %{
|
||||||
|
main_language: "en",
|
||||||
|
blog_languages: ["en"]
|
||||||
|
})
|
||||||
|
|
||||||
|
assert {:ok, post} =
|
||||||
|
Posts.create_post(%{
|
||||||
|
project_id: project.id,
|
||||||
|
title: "Pure Draft",
|
||||||
|
content: "Draft-only content",
|
||||||
|
language: "en"
|
||||||
|
})
|
||||||
|
|
||||||
|
assert post.status == :draft
|
||||||
|
assert {:ok, _server} = BDS.Preview.start_preview(project.id)
|
||||||
|
|
||||||
|
datetime = DateTime.from_unix!(post.created_at, :millisecond)
|
||||||
|
y = Integer.to_string(datetime.year)
|
||||||
|
m = String.pad_leading(Integer.to_string(datetime.month), 2, "0")
|
||||||
|
d = String.pad_leading(Integer.to_string(datetime.day), 2, "0")
|
||||||
|
|
||||||
|
assert {:ok, %{body: html, content_type: "text/html"}} =
|
||||||
|
BDS.Preview.request(project.id, "/#{y}/#{m}/#{d}/#{post.slug}")
|
||||||
|
|
||||||
|
assert html =~ "Pure Draft"
|
||||||
|
assert html =~ "Draft-only content"
|
||||||
|
|
||||||
|
assert :ok = BDS.Preview.stop_preview(project.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "on-demand rendering: published-then-edited post shows draft DB content over file", %{
|
||||||
|
project: project
|
||||||
|
} do
|
||||||
|
assert {:ok, _metadata} =
|
||||||
|
Metadata.update_project_metadata(project.id, %{
|
||||||
|
main_language: "en",
|
||||||
|
blog_languages: ["en"]
|
||||||
|
})
|
||||||
|
|
||||||
|
assert {:ok, post} =
|
||||||
|
Posts.create_post(%{
|
||||||
|
project_id: project.id,
|
||||||
|
title: "Published Then Edited",
|
||||||
|
content: "Original content",
|
||||||
|
language: "en"
|
||||||
|
})
|
||||||
|
|
||||||
|
assert {:ok, published} = Posts.publish_post(post.id)
|
||||||
|
|
||||||
|
{:ok, edited} =
|
||||||
|
Posts.update_post(published.id, %{
|
||||||
|
title: "Edited Title",
|
||||||
|
content: "Edited draft content"
|
||||||
|
})
|
||||||
|
|
||||||
|
assert {:ok, _server} = BDS.Preview.start_preview(project.id)
|
||||||
|
|
||||||
|
datetime = DateTime.from_unix!(edited.created_at, :millisecond)
|
||||||
|
y = Integer.to_string(datetime.year)
|
||||||
|
m = String.pad_leading(Integer.to_string(datetime.month), 2, "0")
|
||||||
|
d = String.pad_leading(Integer.to_string(datetime.day), 2, "0")
|
||||||
|
|
||||||
|
assert {:ok, %{body: html, content_type: "text/html"}} =
|
||||||
|
BDS.Preview.request(project.id, "/#{y}/#{m}/#{d}/#{edited.slug}")
|
||||||
|
|
||||||
|
assert html =~ "Edited Title"
|
||||||
|
assert html =~ "Edited draft content"
|
||||||
|
refute html =~ "Original content"
|
||||||
|
|
||||||
|
assert :ok = BDS.Preview.stop_preview(project.id)
|
||||||
|
end
|
||||||
|
|
||||||
|
test "on-demand rendering: draft posts appear in home listing", %{project: project} do
|
||||||
|
assert {:ok, _metadata} =
|
||||||
|
Metadata.update_project_metadata(project.id, %{
|
||||||
|
main_language: "en",
|
||||||
|
blog_languages: ["en"]
|
||||||
|
})
|
||||||
|
|
||||||
|
assert {:ok, _draft} =
|
||||||
|
Posts.create_post(%{
|
||||||
|
project_id: project.id,
|
||||||
|
title: "Draft In List",
|
||||||
|
content: "Draft list body",
|
||||||
|
language: "en"
|
||||||
|
})
|
||||||
|
|
||||||
|
assert {:ok, _server} = BDS.Preview.start_preview(project.id)
|
||||||
|
|
||||||
|
assert {:ok, %{body: html, content_type: "text/html"}} =
|
||||||
|
BDS.Preview.request(project.id, "/")
|
||||||
|
|
||||||
|
assert html =~ "Draft In List"
|
||||||
|
|
||||||
|
assert :ok = BDS.Preview.stop_preview(project.id)
|
||||||
|
end
|
||||||
|
|
||||||
test "preview query params can override the rendered theme for generated and draft pages", %{
|
test "preview query params can override the rendered theme for generated and draft pages", %{
|
||||||
project: project
|
project: project
|
||||||
} do
|
} do
|
||||||
|
|||||||
Reference in New Issue
Block a user