Allow attaching emojis to user lists
Signed-off-by: nicole mikołajczyk <git@mkljczk.pl>
This commit is contained in:
parent
6f5ea55613
commit
c6d1cead83
9 changed files with 168 additions and 7 deletions
|
|
@ -9,6 +9,7 @@ defmodule Pleroma.List do
|
|||
import Ecto.Changeset
|
||||
|
||||
alias Pleroma.Activity
|
||||
alias Pleroma.Emoji
|
||||
alias Pleroma.Repo
|
||||
alias Pleroma.User
|
||||
|
||||
|
|
@ -18,14 +19,53 @@ defmodule Pleroma.List do
|
|||
field(:following, {:array, :string}, default: [])
|
||||
field(:ap_id, :string)
|
||||
field(:exclusive, :boolean, default: false)
|
||||
field(:emoji, :string)
|
||||
|
||||
timestamps()
|
||||
end
|
||||
|
||||
def update_changeset(list, attrs \\ %{}) do
|
||||
list
|
||||
|> cast(attrs, [:title, :exclusive])
|
||||
|> cast(attrs, [:title, :exclusive, :emoji])
|
||||
|> validate_required([:title])
|
||||
|> fix_emoji()
|
||||
|> validate_emoji()
|
||||
end
|
||||
|
||||
defp fix_emoji(changeset) do
|
||||
with {:emoji_field, emoji} when is_binary(emoji) <-
|
||||
{:emoji_field, get_field(changeset, :emoji)},
|
||||
{:fixed_emoji, emoji} <-
|
||||
{:fixed_emoji,
|
||||
emoji
|
||||
|> Emoji.fully_qualify_emoji()
|
||||
|> Emoji.maybe_quote()} do
|
||||
put_change(changeset, :emoji, emoji)
|
||||
else
|
||||
{:emoji_field, _} -> changeset
|
||||
end
|
||||
end
|
||||
|
||||
defp validate_emoji(changeset) do
|
||||
validate_change(changeset, :emoji, fn
|
||||
:emoji, nil ->
|
||||
[]
|
||||
|
||||
:emoji, emoji ->
|
||||
if Emoji.unicode?(emoji) or valid_local_custom_emoji?(emoji) do
|
||||
[]
|
||||
else
|
||||
[emoji: "Invalid emoji"]
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
defp valid_local_custom_emoji?(emoji) do
|
||||
with %{file: _path} <- Emoji.get(emoji) do
|
||||
true
|
||||
else
|
||||
_ -> false
|
||||
end
|
||||
end
|
||||
|
||||
def follow_changeset(list, attrs \\ %{}) do
|
||||
|
|
|
|||
|
|
@ -41,7 +41,8 @@ defmodule Pleroma.Web.ApiSpec.ListOperation do
|
|||
responses: %{
|
||||
200 => Operation.response("List", "application/json", List),
|
||||
400 => Operation.response("Error", "application/json", ApiError),
|
||||
404 => Operation.response("Error", "application/json", ApiError)
|
||||
404 => Operation.response("Error", "application/json", ApiError),
|
||||
422 => Operation.response("Error", "application/json", ApiError)
|
||||
}
|
||||
}
|
||||
end
|
||||
|
|
@ -175,7 +176,8 @@ defmodule Pleroma.Web.ApiSpec.ListOperation do
|
|||
exclusive: %Schema{
|
||||
type: :boolean,
|
||||
description: "Whether members of the list should be removed from the “Home” feed"
|
||||
}
|
||||
},
|
||||
emoji: %Schema{type: :string, description: "List emoji", nullable: true}
|
||||
},
|
||||
required: [:title]
|
||||
},
|
||||
|
|
@ -194,7 +196,8 @@ defmodule Pleroma.Web.ApiSpec.ListOperation do
|
|||
exclusive: %Schema{
|
||||
type: :boolean,
|
||||
description: "Whether members of the list should be removed from the “Home” feed"
|
||||
}
|
||||
},
|
||||
emoji: %Schema{type: :string, description: "List emoji", nullable: true}
|
||||
}
|
||||
},
|
||||
required: true
|
||||
|
|
|
|||
|
|
@ -17,11 +17,26 @@ defmodule Pleroma.Web.ApiSpec.Schemas.List do
|
|||
exclusive: %Schema{
|
||||
type: :boolean,
|
||||
description: "Whether members of the list should be removed from the “Home” feed"
|
||||
},
|
||||
pleroma: %Schema{
|
||||
type: :object,
|
||||
properties: %{
|
||||
emoji: %Schema{type: :string, description: "List emoji", nullable: true},
|
||||
emoji_url: %Schema{
|
||||
type: :string,
|
||||
description: "URL of the list emoji if it's a custom emoji, null otherwise",
|
||||
nullable: true
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
example: %{
|
||||
"id" => "12249",
|
||||
"title" => "Friends"
|
||||
"title" => "Friends",
|
||||
"pleroma" => %{
|
||||
"emoji" => nil,
|
||||
"emoji_url" => nil
|
||||
}
|
||||
}
|
||||
})
|
||||
end
|
||||
|
|
|
|||
|
|
@ -4,6 +4,8 @@
|
|||
|
||||
defmodule Pleroma.Web.MastodonAPI.ListView do
|
||||
use Pleroma.Web, :view
|
||||
|
||||
alias Pleroma.Emoji
|
||||
alias Pleroma.Web.MastodonAPI.ListView
|
||||
|
||||
def render("index.json", %{lists: lists} = opts) do
|
||||
|
|
@ -11,10 +13,29 @@ defmodule Pleroma.Web.MastodonAPI.ListView do
|
|||
end
|
||||
|
||||
def render("show.json", %{list: list}) do
|
||||
{emoji, emoji_url} = get_emoji(list.emoji)
|
||||
|
||||
%{
|
||||
id: to_string(list.id),
|
||||
title: list.title,
|
||||
exclusive: list.exclusive
|
||||
exclusive: list.exclusive,
|
||||
pleroma: %{
|
||||
emoji: emoji,
|
||||
emoji_url: emoji_url
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
defp get_emoji(nil), do: {nil, nil}
|
||||
|
||||
defp get_emoji(emoji) do
|
||||
if Emoji.unicode?(emoji) do
|
||||
{emoji, nil}
|
||||
else
|
||||
case Emoji.get(emoji) do
|
||||
nil -> {nil, nil}
|
||||
emoji_data -> {emoji, Emoji.local_url(emoji_data.file)}
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue