52 lines
1.3 KiB
Elixir
52 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
|