lib/timescaledb/migrator.ex

defmodule Membrane.Telemetry.TimescaleDB.Migrator do
  @moduledoc """
  An auto migration task that can be run along with Reporter's supervisor tree.
  """
  use GenServer

  require Logger

  @repo Membrane.Telemetry.TimescaleDB.Repo

  @spec start_link(GenServer.options()) :: :ignore | {:error, any()}
  def start_link(opts) do
    GenServer.start_link(__MODULE__, %{}, opts)
  end

  @impl true
  def init(_opts) do
    if migrate() do
      Logger.info("#{@repo} successfully migrated.")

      :ignore
    else
      message = "#{@repo} failed to perform a migration"
      Logger.error(message)

      {:error, message}
    end
  end

  @doc """
  Performs database migration required for the reporter to work.
  """
  @spec migrate() :: boolean()
  def migrate() do
    case Ecto.Migrator.with_repo(@repo, &Ecto.Migrator.run(&1, :up, all: true)) do
      {:ok, _return, _started_apps} -> true
      _other -> false
    end
  end
end