Current section

Files

Jump to
webauthn_components lib wac_gen misc.ex
Raw

lib/wac_gen/misc.ex

defmodule Wac.Gen.Misc do
@moduledoc false
alias Sourceror.Zipper
@template_path "../../templates/misc"
@template_files %{
user_token_cleaner: "user_token_cleaner.ex"
}
@templates Map.keys(@template_files)
def copy_templates(assigns) do
for template <- @templates, do: copy_template(template, assigns)
end
def copy_template(template, assigns) when template in @templates and is_list(assigns) do
app_snake_case = Keyword.fetch!(assigns, :app_snake_case)
file_name = @template_files[template]
template_dir = Path.expand(@template_path, __DIR__)
source = Path.join([template_dir, file_name])
target = Path.join(["lib", app_snake_case, file_name])
Mix.Generator.copy_template(source, target, assigns)
Code.format_file!(target)
inject_application_child(assigns)
end
def inject_application_child(assigns) do
app_snake_case = Keyword.fetch!(assigns, :app_snake_case)
application_file_path = Path.join(["lib", app_snake_case, "application.ex"])
updated_contents =
application_file_path
|> File.read!()
|> Sourceror.parse_string!()
|> Zipper.zip()
|> insert_cleaner_child(assigns)
|> Zipper.root()
|> Sourceror.to_string()
File.write!(application_file_path, updated_contents)
end
defp insert_cleaner_child(%Zipper{} = zipper, assigns) do
zipper
|> Zipper.find(&find_repo_child/1)
|> Zipper.insert_right(token_cleaner_child(assigns))
end
defp find_repo_child({:__aliases__, _meta, [_, :Repo]}), do: true
defp find_repo_child(_), do: false
defp token_cleaner_child(assigns) do
app_web_case = Keyword.fetch!(assigns, :app_pascal_case)
"""
# Start the UserTokenCleaner
{#{inspect(app_web_case)}.UserTokenCleaner, interval_minutes: 10}
"""
|> Sourceror.parse_string!()
end
end