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!
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.
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 must
use 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
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