logo

pleroma

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

account_view.ex (4375B)


  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.AdminAPI.AccountView do
  5. use Pleroma.Web, :view
  6. alias Pleroma.User
  7. alias Pleroma.Web.AdminAPI
  8. alias Pleroma.Web.AdminAPI.AccountView
  9. alias Pleroma.Web.CommonAPI
  10. alias Pleroma.Web.MastodonAPI
  11. alias Pleroma.Web.MediaProxy
  12. def render("index.json", %{users: users, count: count, page_size: page_size}) do
  13. %{
  14. users: render_many(users, AccountView, "show.json", as: :user),
  15. count: count,
  16. page_size: page_size
  17. }
  18. end
  19. def render("index.json", %{users: users}) do
  20. %{
  21. users: render_many(users, AccountView, "show.json", as: :user)
  22. }
  23. end
  24. def render("credentials.json", %{user: user, for: for_user}) do
  25. user = User.sanitize_html(user, User.html_filter_policy(for_user))
  26. avatar = User.avatar_url(user) |> MediaProxy.url()
  27. banner = User.banner_url(user) |> MediaProxy.url()
  28. background = image_url(user.background) |> MediaProxy.url()
  29. user
  30. |> Map.take([
  31. :id,
  32. :bio,
  33. :email,
  34. :fields,
  35. :name,
  36. :nickname,
  37. :is_locked,
  38. :no_rich_text,
  39. :default_scope,
  40. :hide_follows,
  41. :hide_followers_count,
  42. :hide_follows_count,
  43. :hide_followers,
  44. :hide_favorites,
  45. :allow_following_move,
  46. :show_role,
  47. :skip_thread_containment,
  48. :pleroma_settings_store,
  49. :raw_fields,
  50. :is_discoverable,
  51. :actor_type
  52. ])
  53. |> Map.merge(%{
  54. "avatar" => avatar,
  55. "banner" => banner,
  56. "background" => background
  57. })
  58. end
  59. def render("show.json", %{user: user}) do
  60. avatar = User.avatar_url(user) |> MediaProxy.url()
  61. display_name = Pleroma.HTML.strip_tags(user.name || user.nickname)
  62. user = User.sanitize_html(user, FastSanitize.Sanitizer.StripTags)
  63. %{
  64. "id" => user.id,
  65. "email" => user.email,
  66. "avatar" => avatar,
  67. "nickname" => user.nickname,
  68. "display_name" => display_name,
  69. "is_active" => user.is_active,
  70. "local" => user.local,
  71. "roles" => roles(user),
  72. "tags" => user.tags || [],
  73. "is_confirmed" => user.is_confirmed,
  74. "is_approved" => user.is_approved,
  75. "is_suggested" => user.is_suggested,
  76. "url" => user.uri || user.ap_id,
  77. "registration_reason" => user.registration_reason,
  78. "actor_type" => user.actor_type,
  79. "created_at" => CommonAPI.Utils.to_masto_date(user.inserted_at)
  80. }
  81. end
  82. def render("created_many.json", %{users: users}) do
  83. render_many(users, AccountView, "created.json", as: :user)
  84. end
  85. def render("created.json", %{user: user}) do
  86. %{
  87. type: "success",
  88. code: 200,
  89. data: %{
  90. nickname: user.nickname,
  91. email: user.email
  92. }
  93. }
  94. end
  95. def render("create_errors.json", %{changesets: changesets}) do
  96. render_many(changesets, AccountView, "create_error.json", as: :changeset)
  97. end
  98. def render("create_error.json", %{changeset: %Ecto.Changeset{changes: changes, errors: errors}}) do
  99. %{
  100. type: "error",
  101. code: 409,
  102. error: parse_error(errors),
  103. data: %{
  104. nickname: Map.get(changes, :nickname),
  105. email: Map.get(changes, :email)
  106. }
  107. }
  108. end
  109. def merge_account_views(%User{} = user) do
  110. MastodonAPI.AccountView.render("show.json", %{user: user, skip_visibility_check: true})
  111. |> Map.merge(AdminAPI.AccountView.render("show.json", %{user: user}))
  112. end
  113. def merge_account_views(_), do: %{}
  114. defp parse_error([]), do: ""
  115. defp parse_error(errors) do
  116. ## when nickname is duplicate ap_id constraint error is raised
  117. nickname_error = Keyword.get(errors, :nickname) || Keyword.get(errors, :ap_id)
  118. email_error = Keyword.get(errors, :email)
  119. password_error = Keyword.get(errors, :password)
  120. cond do
  121. nickname_error ->
  122. "nickname #{elem(nickname_error, 0)}"
  123. email_error ->
  124. "email #{elem(email_error, 0)}"
  125. password_error ->
  126. "password #{elem(password_error, 0)}"
  127. true ->
  128. ""
  129. end
  130. end
  131. defp image_url(%{"url" => [%{"href" => href} | _]}), do: href
  132. defp image_url(_), do: nil
  133. defp roles(%{is_moderator: is_moderator, is_admin: is_admin}) do
  134. %{
  135. admin: is_admin,
  136. moderator: is_moderator
  137. }
  138. end
  139. end