Split list_packs

This commit is contained in:
vaartis 2019-09-11 15:48:51 +00:00 committed by Ekaterina Vaartis
parent f251225cae
commit b8a214b0ab

View file

@ -23,47 +23,49 @@ defmodule Pleroma.Web.EmojiAPI.EmojiAPIController do
a map of "pack directory name" to pack.json contents. a map of "pack directory name" to pack.json contents.
""" """
def list_packs(conn, _params) do def list_packs(conn, _params) do
pack_infos = with {:ok, results} <- File.ls(@emoji_dir_path) do
case File.ls(@emoji_dir_path) do pack_infos =
{:error, _} -> results
%{} |> Enum.filter(&has_pack_json?/1)
|> Enum.map(&load_pack/1)
# Check if all the files are in place and can be sent
|> Enum.map(&validate_pack/1)
# Transform into a map of pack-name => pack-data
|> Enum.into(%{})
{:ok, results} -> json(conn, pack_infos)
results end
|> Enum.filter(fn file -> end
dir_path = Path.join(@emoji_dir_path, file)
# Filter to only use the pack.json packs
File.dir?(dir_path) and File.exists?(Path.join(dir_path, "pack.json"))
end)
|> Enum.map(fn pack_name ->
pack_path = Path.join(@emoji_dir_path, pack_name)
pack_file = Path.join(pack_path, "pack.json")
{pack_name, Jason.decode!(File.read!(pack_file))} defp has_pack_json?(file) do
end) dir_path = Path.join(@emoji_dir_path, file)
# Transform into a map of pack-name => pack-data # Filter to only use the pack.json packs
# Check if all the files are in place and can be sent File.dir?(dir_path) and File.exists?(Path.join(dir_path, "pack.json"))
|> Enum.map(fn {name, pack} -> end
pack_path = Path.join(@emoji_dir_path, name)
if can_download?(pack, pack_path) do defp load_pack(pack_name) do
archive_for_sha = make_archive(name, pack, pack_path) pack_path = Path.join(@emoji_dir_path, pack_name)
archive_sha = :crypto.hash(:sha256, archive_for_sha) |> Base.encode16() pack_file = Path.join(pack_path, "pack.json")
{name, {pack_name, Jason.decode!(File.read!(pack_file))}
pack end
|> put_in(["pack", "can-download"], true)
|> put_in(["pack", "download-sha256"], archive_sha)}
else
{name,
pack
|> put_in(["pack", "can-download"], false)}
end
end)
|> Enum.into(%{})
end
conn |> json(pack_infos) defp validate_pack({name, pack}) do
pack_path = Path.join(@emoji_dir_path, name)
if can_download?(pack, pack_path) do
archive_for_sha = make_archive(name, pack, pack_path)
archive_sha = :crypto.hash(:sha256, archive_for_sha) |> Base.encode16()
pack =
pack
|> put_in(["pack", "can-download"], true)
|> put_in(["pack", "download-sha256"], archive_sha)
{name, pack}
else
{name, put_in(pack, ["pack", "can-download"], false)}
end
end end
defp can_download?(pack, pack_path) do defp can_download?(pack, pack_path) do
@ -159,6 +161,7 @@ keeping it in cache for #{div(cache_ms, 1000)}s")
|> Map.get(:body) |> Map.get(:body)
|> Jason.decode!() |> Jason.decode!()
|> Map.get(name) |> Map.get(name)
pfiles = full_pack["files"] pfiles = full_pack["files"]
pack_info_res = pack_info_res =