podbox_ash/lib/podbox/repo.ex

51 lines
1.3 KiB
Elixir

defmodule Podbox.Repo do
@moduledoc """
The Ecto Repo used for Sqlite.
"""
use AshSqlite.Repo, otp_app: :podbox
require Logger
@doc "Ensure that all repos are created"
@spec create! :: :ok | no_return
def create! do
for repo <- repos() do
case repo.__adapter__().storage_up(repo.config()) do
:ok ->
Logger.info("Database for #{inspect(repo)} has been created")
{:error, :already_up} ->
Logger.info("Database for #{inspect(repo)} is present")
{:error, term} when is_binary(term) ->
raise "Database for #{inspect(repo)} could not be created: #{term}"
{:error, term} ->
raise "Database for #{inspect(repo)} could not be created: #{inspect(term)}"
end
end
:ok
end
@doc "Ensure that migrations are run for all repos"
@spec migrate! :: :ok | no_return
def migrate! do
for repo <- repos() do
{:ok, _, _} = Ecto.Migrator.with_repo(repo, &Ecto.Migrator.run(&1, :up, all: true))
end
:ok
end
defp repos do
:podbox
|> Application.fetch_env!(:ash_domains)
|> Enum.flat_map(fn domain ->
domain
|> Ash.Domain.Info.resources()
|> Enum.map(&AshSqlite.DataLayer.Info.repo/1)
|> Enum.reject(&is_nil/1)
end)
|> Enum.uniq()
end
end