We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
There was an error while loading. Please reload this page.
2 parents 68b1d41 + c9434ec commit 7f9124aCopy full SHA for 7f9124a
lib/epochtalk_server_web/controllers/post.ex
@@ -358,6 +358,22 @@ defmodule EpochtalkServerWeb.Controllers.Post do
358
end
359
360
361
+ @doc """
362
+ Get `Post` preview by running content through parser
363
+ """
364
+ def preview(conn, attrs) do
365
+ with post_max_length <-
366
+ Map.get(Application.get_env(:epochtalk_server, :frontend_config), :post_max_length),
367
+ body <-
368
+ Validate.cast(attrs, "body", :string, required: true, max: post_max_length, min: 1),
369
+ parsed_body <- Parse.markdown(body) do
370
+ render(conn, :preview, %{parsed_body: parsed_body})
371
+ else
372
+ _ ->
373
+ ErrorHelpers.render_json_error(conn, 400, "Error, cannot generate preview")
374
+ end
375
376
+
377
## === Private Authorization Helper Functions ===
378
379
defp can_authed_user_view_deleted_posts(nil, _thread_id), do: false
lib/epochtalk_server_web/helpers/parse.ex
@@ -9,4 +9,11 @@ defmodule EpochtalkServerWeb.Helpers.Parse do
9
@spec markdown_within_body(attrs :: map) :: map()
10
def markdown_within_body(attrs) when is_map(attrs),
11
do: Map.put(attrs, "body_html", Earmark.as_html!(attrs["body_html"] || attrs["body"]))
12
13
14
+ Used to parse markdown inorder to preview `Thread` or `Post` content from the frontend client
15
16
+ @spec markdown_within_body(to_parse :: String.t()) :: String.t()
17
+ def markdown(to_parse) when is_binary(to_parse),
18
+ do: Earmark.as_html!(to_parse)
19
lib/epochtalk_server_web/json/post_json.ex
@@ -25,6 +25,20 @@ defmodule EpochtalkServerWeb.Controllers.PostJSON do
25
post_data
26
27
28
29
+ Renders `Post` data for preview purposes
30
31
+ ## Example
32
+ iex> parsed_body = %{parsed_body: "<p><strong>Hello World</strong><p>"}
33
+ iex> EpochtalkServerWeb.Controllers.PostJSON.preview(parsed_body)
34
+ parsed_body
35
36
+ def preview(%{
37
+ parsed_body: parsed_body
38
+ }) do
39
+ %{parsed_body: parsed_body}
40
41
42
@doc """
43
Renders all `Post` for a particular `Thread`.
44
"""
lib/epochtalk_server_web/router.ex
@@ -51,11 +51,11 @@ defmodule EpochtalkServerWeb.Router do
51
post "/threads/:thread_id/polls/lock", Poll, :lock
52
put "/threads/:thread_id/polls", Poll, :update
53
post "/threads/:thread_id/polls", Poll, :create
54
- get "/posts", Post, :by_thread
55
get "/posts/draft", PostDraft, :by_user_id
56
put "/posts/draft", PostDraft, :upsert
57
post "/posts", Post, :create
58
post "/posts/:id", Post, :update
+ post "/preview", Post, :preview
59
get "/admin/modlog", ModerationLog, :page
60
get "/boards/movelist", Board, :movelist
61
@@ -66,6 +66,7 @@ defmodule EpochtalkServerWeb.Router do
66
get "/boards/:id", Board, :find
67
get "/boards/:slug/id", Board, :slug_to_id
68
get "/breadcrumbs", Breadcrumb, :breadcrumbs
69
+ get "/posts", Post, :by_thread
70
get "/threads", Thread, :by_board
71
get "/threads/:slug/id", Thread, :slug_to_id
72
post "/threads/:id/viewed", Thread, :viewed
test/epochtalk_server_web/controllers/post_test.exs
@@ -0,0 +1,50 @@
1
+defmodule Test.EpochtalkServerWeb.Controllers.Post do
2
+ use Test.Support.ConnCase, async: true
3
+ alias EpochtalkServerWeb.CustomErrors.InvalidPayload
4
5
+ describe "preview/1" do
6
+ test "when unauthenticated, returns Unauthorized error", %{conn: conn} do
7
+ response =
8
+ conn
+ |> post(Routes.post_path(conn, :preview), %{"body" => "**Test**"})
+ |> json_response(401)
+ assert response["error"] == "Unauthorized"
+ assert response["message"] == "No resource found"
+ @tag :authenticated
+ test "when authenticated and supplied with markdown string for body, returns html string",
+ %{conn: conn} do
20
21
22
+ |> json_response(200)
23
24
+ assert response["parsed_body"] == "<p>\n<strong>Test</strong></p>\n"
+ test "when authenticated and supplied with empty string for body, returns error",
+ assert_raise InvalidPayload,
+ ~r/^Invalid payload, key 'body' should be of type 'string' with length between 1 and 10000/,
+ fn ->
+ post(conn, Routes.post_path(conn, :preview), %{"body" => ""})
+ test "when authenticated and supplied with too large of a string for body, returns error",
+ post(conn, Routes.post_path(conn, :preview), %{
+ "body" =>
45
+ for(_ <- 1..10_001, into: "", do: <<Enum.random('0123456789abcdef')>>)
46
+ })
47
48
49
50
+end
test/epochtalk_server_web/json/post_json_test.exs
@@ -0,0 +1,7 @@
+defmodule Test.EpochtalkServerWeb.Controllers.PostJSON do
+ alias EpochtalkServerWeb.Controllers.PostJSON
+ # Specify that we want to use doctests:
+ doctest PostJSON
0 commit comments