user_view.ex (6090B)
1 # Pleroma: A lightweight social networking server 2 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> 3 # SPDX-License-Identifier: AGPL-3.0-only 4 5 defmodule Pleroma.Web.TwitterAPI.UserView do 6 use Pleroma.Web, :view 7 alias Pleroma.Formatter 8 alias Pleroma.HTML 9 alias Pleroma.User 10 alias Pleroma.Web.CommonAPI.Utils 11 alias Pleroma.Web.MediaProxy 12 13 def render("show.json", %{user: user = %User{}} = assigns) do 14 render_one(user, Pleroma.Web.TwitterAPI.UserView, "user.json", assigns) 15 end 16 17 def render("index.json", %{users: users, for: user}) do 18 users 19 |> render_many(Pleroma.Web.TwitterAPI.UserView, "user.json", for: user) 20 |> Enum.filter(&Enum.any?/1) 21 end 22 23 def render("user.json", %{user: user = %User{}} = assigns) do 24 if User.visible_for?(user, assigns[:for]), 25 do: do_render("user.json", assigns), 26 else: %{} 27 end 28 29 def render("short.json", %{ 30 user: %User{ 31 nickname: nickname, 32 id: id, 33 ap_id: ap_id, 34 name: name 35 } 36 }) do 37 %{ 38 "fullname" => name, 39 "id" => id, 40 "ostatus_uri" => ap_id, 41 "profile_url" => ap_id, 42 "screen_name" => nickname 43 } 44 end 45 46 defp do_render("user.json", %{user: user = %User{}} = assigns) do 47 for_user = assigns[:for] 48 image = User.avatar_url(user) |> MediaProxy.url() 49 50 {following, follows_you, statusnet_blocking} = 51 if for_user do 52 { 53 User.following?(for_user, user), 54 User.following?(user, for_user), 55 User.blocks?(for_user, user) 56 } 57 else 58 {false, false, false} 59 end 60 61 user_info = User.get_cached_user_info(user) 62 63 emoji = 64 (user.info.source_data["tag"] || []) 65 |> Enum.filter(fn %{"type" => t} -> t == "Emoji" end) 66 |> Enum.map(fn %{"icon" => %{"url" => url}, "name" => name} -> 67 {String.trim(name, ":"), url} 68 end) 69 70 emoji = Enum.dedup(emoji ++ user.info.emoji) 71 72 description_html = 73 (user.bio || "") 74 |> HTML.filter_tags(User.html_filter_policy(for_user)) 75 |> Formatter.emojify(emoji) 76 77 fields = 78 user.info 79 |> User.Info.fields() 80 |> Enum.map(fn %{"name" => name, "value" => value} -> 81 %{ 82 "name" => Pleroma.HTML.strip_tags(name), 83 "value" => Pleroma.HTML.filter_tags(value, Pleroma.HTML.Scrubber.LinksOnly) 84 } 85 end) 86 87 data = 88 %{ 89 "created_at" => user.inserted_at |> Utils.format_naive_asctime(), 90 "description" => HTML.strip_tags((user.bio || "") |> String.replace("<br>", "\n")), 91 "description_html" => description_html, 92 "favourites_count" => 0, 93 "followers_count" => user_info[:follower_count], 94 "following" => following, 95 "follows_you" => follows_you, 96 "statusnet_blocking" => statusnet_blocking, 97 "friends_count" => user_info[:following_count], 98 "id" => user.id, 99 "name" => user.name || user.nickname, 100 "name_html" => 101 if(user.name, 102 do: HTML.strip_tags(user.name) |> Formatter.emojify(emoji), 103 else: user.nickname 104 ), 105 "profile_image_url" => image, 106 "profile_image_url_https" => image, 107 "profile_image_url_profile_size" => image, 108 "profile_image_url_original" => image, 109 "screen_name" => user.nickname, 110 "statuses_count" => user_info[:note_count], 111 "statusnet_profile_url" => user.ap_id, 112 "cover_photo" => User.banner_url(user) |> MediaProxy.url(), 113 "background_image" => image_url(user.info.background) |> MediaProxy.url(), 114 "is_local" => user.local, 115 "locked" => user.info.locked, 116 "hide_followers" => user.info.hide_followers, 117 "hide_follows" => user.info.hide_follows, 118 "fields" => fields, 119 120 # Pleroma extension 121 "pleroma" => 122 %{ 123 "confirmation_pending" => user_info.confirmation_pending, 124 "tags" => user.tags, 125 "skip_thread_containment" => user.info.skip_thread_containment 126 } 127 |> maybe_with_activation_status(user, for_user) 128 |> with_notification_settings(user, for_user) 129 } 130 |> maybe_with_user_settings(user, for_user) 131 |> maybe_with_role(user, for_user) 132 133 if assigns[:token] do 134 Map.put(data, "token", token_string(assigns[:token])) 135 else 136 data 137 end 138 end 139 140 defp with_notification_settings(data, %User{id: user_id} = user, %User{id: user_id}) do 141 Map.put(data, "notification_settings", user.info.notification_settings) 142 end 143 144 defp with_notification_settings(data, _, _), do: data 145 146 defp maybe_with_activation_status(data, user, %User{info: %{is_admin: true}}) do 147 Map.put(data, "deactivated", user.info.deactivated) 148 end 149 150 defp maybe_with_activation_status(data, _, _), do: data 151 152 defp maybe_with_role(data, %User{id: id} = user, %User{id: id}) do 153 Map.merge(data, %{ 154 "role" => role(user), 155 "show_role" => user.info.show_role, 156 "rights" => %{ 157 "delete_others_notice" => !!user.info.is_moderator, 158 "admin" => !!user.info.is_admin 159 } 160 }) 161 end 162 163 defp maybe_with_role(data, %User{info: %{show_role: true}} = user, _user) do 164 Map.merge(data, %{ 165 "role" => role(user), 166 "rights" => %{ 167 "delete_others_notice" => !!user.info.is_moderator, 168 "admin" => !!user.info.is_admin 169 } 170 }) 171 end 172 173 defp maybe_with_role(data, _, _), do: data 174 175 defp maybe_with_user_settings(data, %User{info: info, id: id} = _user, %User{id: id}) do 176 data 177 |> Kernel.put_in(["default_scope"], info.default_scope) 178 |> Kernel.put_in(["no_rich_text"], info.no_rich_text) 179 end 180 181 defp maybe_with_user_settings(data, _, _), do: data 182 defp role(%User{info: %{:is_admin => true}}), do: "admin" 183 defp role(%User{info: %{:is_moderator => true}}), do: "moderator" 184 defp role(_), do: "member" 185 186 defp image_url(%{"url" => [%{"href" => href} | _]}), do: href 187 defp image_url(_), do: nil 188 189 defp token_string(%Pleroma.Web.OAuth.Token{token: token_str}), do: token_str 190 defp token_string(token), do: token 191 end