How to pass Repo for a package to use?

I’m trying to do this:

Main app has the database.

A package will hold a GraphQL API and its resolvers that use that database.

How can I accomplish that?

Thanks!

Hi @rafbgarcia,
you may specify the Repo on a configuration key in your app config file.

e.g

In the main app config.exs

config :your_package,
  repo: MainApp.Repo

In your package

defmodule YourPackage do
  def repo() do
    Application.get_env(:your_package, :repo)     
  end
end

And reference the repo anywhere in your package like this

YourPackage.repo

I guess that will do but of course, you can tweak a little to adapt it to your needs.

1 Like

Hi @nbap,

Thanks for the reply, it actually worked.

However, I’m trying to use Absinthe.Ecto, repo: Application.get_env(:enderecify_api, :repo) and when I attempted to publish the package I get ** (RuntimeError) You mustuse Absinthe.Ecto, repo: MyApp.Repowith your application's repo..

Any ideas how to get around that?

I managed to get around that using a FakeRepo lol.

defmodule Enderecify.FakeRepo do
  use Ecto.Repo,
    otp_app: :enderecify_api,
    adapter: Ecto.Adapters.Postgres
end
1 Like

What you should do is have your Ecto schemas and GraphQL resolvers in the same package with the Ecto Repo, but don’t add it to your supervision tree. In order to do that you’ll have to configure the :otp_app part so your Ecto schema/GraphQL package’s repo. This would mean your non-main package would just define schemas, resolvers and a repo but wouldn’t start them or do anything (they’re just plain modules then). Be warned though, compilation will fail if you do not configure it! (i.e. in tests or other areas) This would look something like:

defmodule API.Repo do
  @otp_app Application.get_env(:api, :otp_app)
  use Ecto.Repo, otp_app: @otp_app, adapter: Ecto.Adapters.Postgres
  use Absinthe.Ecto, otp_app: @otp_app
end

Then in your main app do the following in config:

config :api, otp_app: :main_app

# Config for Ecto repos & database connection here
config :main_app, ecto_repos: [API.Repo]
config :main_app, API.Repo,
  # ...

Finally in your main app supervision tree:

def start(_type, _args) do
  children = [
    API.Repo,
  ]

  # ...
end
1 Like