/
channel_controller.ex
46 lines (38 loc) · 1.39 KB
/
channel_controller.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
defmodule AeMdwWeb.ChannelController do
use AeMdwWeb, :controller
alias AeMdw.Validate
alias AeMdw.Channels
alias AeMdwWeb.FallbackController
alias AeMdwWeb.Plugs.PaginatedPlug
alias AeMdwWeb.Util
alias Plug.Conn
plug(PaginatedPlug)
action_fallback(FallbackController)
@spec channels(Conn.t(), map()) :: Conn.t()
def channels(%Conn{assigns: assigns} = conn, _params) do
%{state: state, pagination: pagination, scope: scope, cursor: cursor} = assigns
with {:ok, prev_cursor, channels, next_cursor} <-
Channels.fetch_active_channels(state, pagination, scope, cursor) do
Util.paginate(conn, prev_cursor, channels, next_cursor)
end
end
@spec channel(Conn.t(), map()) :: Conn.t()
def channel(%Conn{assigns: %{state: state}} = conn, %{"id" => id} = params) do
block_hash = params["block_hash"]
with {:ok, channel_pk} <- Validate.id(id, [:channel]),
{:ok, type_block_hash} <- valid_optional_block_hash?(block_hash),
{:ok, channel} <- Channels.fetch_channel(state, channel_pk, type_block_hash) do
json(conn, channel)
end
end
defp valid_optional_block_hash?(nil), do: {:ok, nil}
defp valid_optional_block_hash?(block_hash) do
with {:ok, hash} <- Validate.id(block_hash) do
if String.starts_with?(block_hash, "kh") do
{:ok, {:key, hash}}
else
{:ok, {:micro, hash}}
end
end
end
end