logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git

render_error.ex (6758B)


  1. # Pleroma: A lightweight social networking server
  2. # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
  3. # SPDX-License-Identifier: AGPL-3.0-only
  4. defmodule Pleroma.Web.ApiSpec.RenderError do
  5. @behaviour Plug
  6. import Plug.Conn, only: [put_status: 2]
  7. import Phoenix.Controller, only: [json: 2]
  8. import Pleroma.Web.Gettext
  9. @impl Plug
  10. def init(opts), do: opts
  11. @impl Plug
  12. def call(conn, errors) do
  13. errors =
  14. Enum.map(errors, fn
  15. %{name: nil, reason: :invalid_enum} = err ->
  16. %OpenApiSpex.Cast.Error{err | name: err.value}
  17. %{name: nil} = err ->
  18. %OpenApiSpex.Cast.Error{err | name: List.last(err.path)}
  19. err ->
  20. err
  21. end)
  22. conn
  23. |> put_status(:bad_request)
  24. |> json(%{
  25. error: errors |> Enum.map(&message/1) |> Enum.join(" "),
  26. errors: errors |> Enum.map(&render_error/1)
  27. })
  28. end
  29. defp render_error(error) do
  30. pointer = OpenApiSpex.path_to_string(error)
  31. %{
  32. title: "Invalid value",
  33. source: %{
  34. pointer: pointer
  35. },
  36. message: OpenApiSpex.Cast.Error.message(error)
  37. }
  38. end
  39. defp message(%{reason: :invalid_schema_type, type: type, name: name}) do
  40. gettext("%{name} - Invalid schema.type. Got: %{type}.",
  41. name: name,
  42. type: inspect(type)
  43. )
  44. end
  45. defp message(%{reason: :null_value, name: name} = error) do
  46. case error.type do
  47. nil ->
  48. gettext("%{name} - null value.", name: name)
  49. type ->
  50. gettext("%{name} - null value where %{type} expected.",
  51. name: name,
  52. type: type
  53. )
  54. end
  55. end
  56. defp message(%{reason: :all_of, meta: %{invalid_schema: invalid_schema}}) do
  57. gettext(
  58. "Failed to cast value as %{invalid_schema}. Value must be castable using `allOf` schemas listed.",
  59. invalid_schema: invalid_schema
  60. )
  61. end
  62. defp message(%{reason: :any_of, meta: %{failed_schemas: failed_schemas}}) do
  63. gettext("Failed to cast value using any of: %{failed_schemas}.",
  64. failed_schemas: failed_schemas
  65. )
  66. end
  67. defp message(%{reason: :one_of, meta: %{failed_schemas: failed_schemas}}) do
  68. gettext("Failed to cast value to one of: %{failed_schemas}.", failed_schemas: failed_schemas)
  69. end
  70. defp message(%{reason: :min_length, length: length, name: name}) do
  71. gettext("%{name} - String length is smaller than minLength: %{length}.",
  72. name: name,
  73. length: length
  74. )
  75. end
  76. defp message(%{reason: :max_length, length: length, name: name}) do
  77. gettext("%{name} - String length is larger than maxLength: %{length}.",
  78. name: name,
  79. length: length
  80. )
  81. end
  82. defp message(%{reason: :unique_items, name: name}) do
  83. gettext("%{name} - Array items must be unique.", name: name)
  84. end
  85. defp message(%{reason: :min_items, length: min, value: array, name: name}) do
  86. gettext("%{name} - Array length %{length} is smaller than minItems: %{min}.",
  87. name: name,
  88. length: length(array),
  89. min: min
  90. )
  91. end
  92. defp message(%{reason: :max_items, length: max, value: array, name: name}) do
  93. gettext("%{name} - Array length %{length} is larger than maxItems: %{}.",
  94. name: name,
  95. length: length(array),
  96. max: max
  97. )
  98. end
  99. defp message(%{reason: :multiple_of, length: multiple, value: count, name: name}) do
  100. gettext("%{name} - %{count} is not a multiple of %{multiple}.",
  101. name: name,
  102. count: count,
  103. multiple: multiple
  104. )
  105. end
  106. defp message(%{reason: :exclusive_max, length: max, value: value, name: name})
  107. when value >= max do
  108. gettext("%{name} - %{value} is larger than exclusive maximum %{max}.",
  109. name: name,
  110. value: value,
  111. max: max
  112. )
  113. end
  114. defp message(%{reason: :maximum, length: max, value: value, name: name})
  115. when value > max do
  116. gettext("%{name} - %{value} is larger than inclusive maximum %{max}.",
  117. name: name,
  118. value: value,
  119. max: max
  120. )
  121. end
  122. defp message(%{reason: :exclusive_multiple, length: min, value: value, name: name})
  123. when value <= min do
  124. gettext("%{name} - %{value} is smaller than exclusive minimum %{min}.",
  125. name: name,
  126. value: value,
  127. min: min
  128. )
  129. end
  130. defp message(%{reason: :minimum, length: min, value: value, name: name})
  131. when value < min do
  132. gettext("%{name} - %{value} is smaller than inclusive minimum %{min}.",
  133. name: name,
  134. value: value,
  135. min: min
  136. )
  137. end
  138. defp message(%{reason: :invalid_type, type: type, value: value, name: name}) do
  139. gettext("%{name} - Invalid %{type}. Got: %{value}.",
  140. name: name,
  141. value: OpenApiSpex.TermType.type(value),
  142. type: type
  143. )
  144. end
  145. defp message(%{reason: :invalid_format, format: format, name: name}) do
  146. gettext("%{name} - Invalid format. Expected %{format}.", name: name, format: inspect(format))
  147. end
  148. defp message(%{reason: :invalid_enum, name: name}) do
  149. gettext("%{name} - Invalid value for enum.", name: name)
  150. end
  151. defp message(%{reason: :polymorphic_failed, type: polymorphic_type}) do
  152. gettext("Failed to cast to any schema in %{polymorphic_type}",
  153. polymorphic_type: polymorphic_type
  154. )
  155. end
  156. defp message(%{reason: :unexpected_field, name: name}) do
  157. gettext("Unexpected field: %{name}.", name: safe_string(name))
  158. end
  159. defp message(%{reason: :no_value_for_discriminator, name: field}) do
  160. gettext("Value used as discriminator for `%{field}` matches no schemas.", name: field)
  161. end
  162. defp message(%{reason: :invalid_discriminator_value, name: field}) do
  163. gettext("No value provided for required discriminator `%{field}`.", name: field)
  164. end
  165. defp message(%{reason: :unknown_schema, name: name}) do
  166. gettext("Unknown schema: %{name}.", name: name)
  167. end
  168. defp message(%{reason: :missing_field, name: name}) do
  169. gettext("Missing field: %{name}.", name: name)
  170. end
  171. defp message(%{reason: :missing_header, name: name}) do
  172. gettext("Missing header: %{name}.", name: name)
  173. end
  174. defp message(%{reason: :invalid_header, name: name}) do
  175. gettext("Invalid value for header: %{name}.", name: name)
  176. end
  177. defp message(%{reason: :max_properties, meta: meta}) do
  178. gettext(
  179. "Object property count %{property_count} is greater than maxProperties: %{max_properties}.",
  180. property_count: meta.property_count,
  181. max_properties: meta.max_properties
  182. )
  183. end
  184. defp message(%{reason: :min_properties, meta: meta}) do
  185. gettext(
  186. "Object property count %{property_count} is less than minProperties: %{min_properties}",
  187. property_count: meta.property_count,
  188. min_properties: meta.min_properties
  189. )
  190. end
  191. defp safe_string(string) do
  192. to_string(string) |> String.slice(0..39)
  193. end
  194. end