Skip to content
This repository was archived by the owner on Nov 8, 2022. It is now read-only.

Commit b255880

Browse files
committed
refactor(editor): return map fmt when error raised
1 parent fd8831c commit b255880

File tree

5 files changed

+91
-43
lines changed

5 files changed

+91
-43
lines changed

lib/helper/converter/editor_to_html/validator.ex

Lines changed: 56 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,19 @@ defmodule Helper.Converter.EditorToHTML.Validator do
3636
with atom_map <- Utils.keys_to_atoms(map),
3737
true <- is_valid_editorjs_fmt(atom_map) do
3838
blocks = atom_map.blocks
39+
# validate_blocks(blocks)
3940

4041
try do
4142
validate_blocks(blocks)
4243
rescue
43-
e in MatchError -> format_parse_error(e)
44-
e in RuntimeError -> format_parse_error(e)
45-
e -> format_parse_error()
44+
e in MatchError ->
45+
format_parse_error(e)
46+
47+
e in RuntimeError ->
48+
format_parse_error(e)
49+
50+
e ->
51+
format_parse_error()
4652
end
4753
else
4854
false ->
@@ -57,16 +63,47 @@ defmodule Helper.Converter.EditorToHTML.Validator do
5763

5864
defp validate_blocks(blocks) do
5965
Enum.each(blocks, fn block ->
66+
# if error happened, will be rescued
6067
{:ok, _} = validate_block(block)
6168
end)
6269

6370
{:ok, :pass}
6471
end
6572

73+
defp validate_block(%{type: "paragraph", data: %{text: text} = data}) do
74+
schema = %{text: [:string]}
75+
76+
case ValidateBySchema.cast(schema, data) do
77+
{:error, errors} ->
78+
format_parse_error("paragraph", errors)
79+
80+
_ ->
81+
{:ok, :pass}
82+
end
83+
end
84+
85+
defp validate_block(%{type: "header", data: %{text: text, level: level} = data}) do
86+
schema = %{
87+
text: [:string],
88+
level: [enum: @valid_header_level],
89+
eyebrowTitle: [:string, required: false],
90+
footerTitle: [:string, required: false]
91+
}
92+
93+
case ValidateBySchema.cast(schema, data) do
94+
{:error, errors} ->
95+
format_parse_error("header", errors)
96+
97+
_ ->
98+
{:ok, :pass}
99+
end
100+
end
101+
66102
defp validate_block(%{type: "list", data: %{mode: mode, items: items} = data})
67103
when mode in @valid_list_mode and is_list(items) do
68104
# mode_schema = %{mode: [enum: @valid_list_mode]}
69105
# {:ok, _} = ValidateBySchema.cast(mode_schema, data)
106+
70107
item_schema = %{
71108
checked: [:boolean],
72109
hideLabel: [:boolean],
@@ -77,24 +114,17 @@ defmodule Helper.Converter.EditorToHTML.Validator do
77114
}
78115

79116
Enum.each(items, fn item ->
80-
{:ok, _} = ValidateBySchema.cast(item_schema, item)
81-
end)
82-
83-
{:ok, :pass}
84-
end
117+
case ValidateBySchema.cast(item_schema, item) do
118+
{:error, errors} ->
119+
{:error, message} = format_parse_error("list(#{mode})", errors)
120+
raise %MatchError{term: {:error, message}}
85121

86-
defp validate_block(%{type: "header", data: %{text: text, level: level} = data}) do
87-
schema = %{
88-
text: [:string],
89-
level: [enum: @valid_header_level],
90-
eyebrowTitle: [:string, required: false],
91-
footerTitle: [:string, required: false]
92-
}
93-
94-
{:ok, _} = ValidateBySchema.cast(schema, data)
122+
_ ->
123+
{:ok, :pass}
124+
end
125+
end)
95126
end
96127

97-
# defp validate_block(%{type: type, data: _}), do: raise("invalid data for #{type} block")
98128
defp validate_block(%{type: type}), do: raise("undown #{type} block")
99129
defp validate_block(_), do: raise("undown block")
100130

@@ -108,24 +138,20 @@ defmodule Helper.Converter.EditorToHTML.Validator do
108138
is_integer(map.time)
109139
end
110140

111-
# defp format_parse_error({:error, errors}) do
112-
defp format_parse_error(%MatchError{term: {:error, errors}}) do
113-
message =
114-
Enum.reduce(errors, "", fn x, acc ->
115-
case String.trim(acc) do
116-
"" -> x.message
117-
_ -> acc <> " ; " <> x.message
118-
end
119-
end)
141+
defp format_parse_error(type, error_list) when is_list(error_list) do
142+
{:error,
143+
Enum.map(error_list, fn error ->
144+
Map.merge(error, %{block: type})
145+
end)}
146+
end
120147

121-
{:error, message}
148+
defp format_parse_error(%MatchError{term: {:error, error}}) do
149+
{:error, error}
122150
end
123151

124-
# defp format_parse_error(%{message: message}), do: {:error, message}
125152
defp format_parse_error(%{message: message}) do
126153
{:error, message}
127154
end
128155

129-
# defp format_parse_error(e), do: IO.inspect(e, label: "e")
130156
defp format_parse_error(), do: {:error, "undown validate error"}
131157
end

lib/helper/validate_by_schema.ex

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,15 +91,15 @@ defmodule Helper.ValidateBySchema do
9191
false ->
9292
{:error,
9393
%{
94-
field: field,
95-
message: "#{field} should be: #{enum |> Enum.join(" | ") |> to_string}"
94+
field: "#{field |> to_string}",
95+
message: "should be: #{enum |> Enum.join(" | ") |> to_string}"
9696
}}
9797
end
9898
end
9999

100100
defp done(field, value), do: {:ok, %{field: field, value: value}}
101101

102102
defp error(field, value, schema) do
103-
{:error, %{field: field, value: value, message: "#{field} should be: #{schema}"}}
103+
{:error, %{field: field |> to_string, value: value, message: "should be: #{schema}"}}
104104
end
105105
end

test/helper/converter/editor_to_html_test/header_test.exs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ defmodule GroupherServer.Test.Helper.Converter.EditorToHTML.Header do
7777
"time" => 1_567_250_876_713,
7878
"version" => "2.15.0"
7979
}
80-
@tag :wip2
80+
@tag :wip
8181
test "optional field should valid properly" do
8282
json =
8383
Map.merge(@editor_json, %{
@@ -144,7 +144,21 @@ defmodule GroupherServer.Test.Helper.Converter.EditorToHTML.Header do
144144
{:ok, editor_string} = Jason.encode(json)
145145
{:error, error} = Parser.to_html(editor_string)
146146

147-
assert error == "eyebrowTitle should be: string ; footerTitle should be: string"
147+
assert error ==
148+
[
149+
%{
150+
block: "header",
151+
field: "eyebrowTitle",
152+
message: "should be: string",
153+
value: []
154+
},
155+
%{
156+
block: "header",
157+
field: "footerTitle",
158+
message: "should be: string",
159+
value: true
160+
}
161+
]
148162

149163
json =
150164
Map.merge(@editor_json, %{
@@ -161,7 +175,7 @@ defmodule GroupherServer.Test.Helper.Converter.EditorToHTML.Header do
161175

162176
{:ok, editor_string} = Jason.encode(json)
163177
{:error, error} = Parser.to_html(editor_string)
164-
assert error == "level should be: 1 | 2 | 3"
178+
assert error == [%{block: "header", field: "level", message: "should be: 1 | 2 | 3"}]
165179
end
166180
end
167181
end

test/helper/converter/editor_to_html_test/list_test.exs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,18 @@ defmodule GroupherServer.Test.Helper.Converter.EditorToHTML.List do
9494
],
9595
"version" => "2.15.0"
9696
}
97-
@tag :wip
97+
@tag :wip2
9898
test "invalid indent field should get error" do
9999
{:ok, editor_string} = Jason.encode(@editor_json)
100-
# {:ok, converted} = Parser.to_html(editor_string)
101-
assert {:error, "indent field should be: 0 | 1 | 2 | 3 | 4"} = Parser.to_html(editor_string)
100+
{:error, error} = Parser.to_html(editor_string)
101+
102+
assert error === [
103+
%{
104+
block: "list(checklist)",
105+
field: "indent",
106+
message: "should be: 0 | 1 | 2 | 3 | 4"
107+
}
108+
]
102109
end
103110
end
104111
end

test/helper/converter/editor_to_html_test/paragraph_test.exs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,14 @@ defmodule GroupherServer.Test.Helper.Converter.EditorToHTML.Paragraph do
4141
],
4242
"version" => "2.15.0"
4343
}
44-
@tag :wip
44+
@tag :wip2
4545
test "invalid paragraph should have invalid hint" do
4646
{:ok, editor_string} = Jason.encode(@editor_json)
47-
{:ok, converted} = Parser.to_html(editor_string)
47+
{:error, error} = Parser.to_html(editor_string)
4848

49-
assert converted ==
50-
"<div class=\"#{@clazz.viewer}\"><div class=\"#{@clazz.invalid_block}\">[invalid-block] paragraph:text</div><div>"
49+
assert error == [
50+
%{block: "paragraph", field: "text", message: "should be: string", value: []}
51+
]
5152
end
5253
end
5354
end

0 commit comments

Comments
 (0)