Current section

Files

Jump to
indieweb lib indieweb microsub.ex
Raw

lib/indieweb/microsub.ex

defmodule IndieWeb.Microsub do
@moduledoc false
@action_modules %{
"timeline" => IndieWeb.Microsub.Timeline,
"channels" => IndieWeb.Microsub.Channel,
"follow" => IndieWeb.Microsub.Follow,
# "unfollow" => IndieWeb.Microsub.Unfollow,
"mute" => IndieWeb.Microsub.Mute,
# "unmute" => IndieWeb.Microsub.Unmute,
"block" => IndieWeb.Microsub.Block,
"search" => IndieWeb.Microsub.Search
# "unblock" => IndieWeb.Microsub.Unblock,
}
@known_actions Map.keys(@action_modules)
require Logger
alias IndieWeb.LinkRel
defmodule Action do
@doc "Defines the default action to take."
@callback default_method() :: binary()
@doc "Handles the action with provided parameters."
@callback invoke(action :: binary(), params :: map()) ::
{:ok, keyword()} | {:error, keyword()}
end
def invoke(action, params)
def invoke({action, _method}, params) when action in @known_actions do
_cursor = %{
before: Map.get(params, "before"),
after: Map.get(params, "after")
}
case Map.get(@action_modules, action, :no_module) do
:no_module ->
{:error, reason: :action_not_supported}
specified_module ->
method =
Map.get(
params,
"method",
specified_module.default_method()
)
Logger.info("Invoking the module with parameters.",
action: action,
method: method,
module: specified_module
)
specified_module.invoke(method, Map.drop(params, ~w(action method)))
end
end
def invoke(action, _params) do
{:error, reason: :action_not_supported, action: action}
end
@doc "Fetches the Microsub endpoint for the provided site."
@spec endpoint_for(binary()) :: binary()
def endpoint_for(url) when is_binary(url) do
List.first(LinkRel.find(url, "microsub"))
end
def endpoint_for(_url), do: nil
end