EctoJsonapi is tool for dealing with JSON:API and Ecto schemas:
EctoJsonApi.dump/1Convert JSON:API v1.0 into Ecto friendly maps .EctoJsonApi.load/2Convert Ecto schemas into maps structured like JSON:API v1.0.
Add :ecto_jsonapi to your list of dependencies in mix.exs:
def deps do
[
{:ecto_jsonapi, "~> 0.2.0"},
]
endLet's say you have the following Ecto schema data:
user_with_credit_cards = %User{
id: 1,
name: "Micah Cooper",
email: "micah@example.com",
credit_cards: [
%CreditCard{
id: 456,
number: "4444 4444 4444 4444",
expiration_date: "2018-02",
cvv: "321",
user_id: 1
}
]
}You can convert user_with_credit_cards to JSON:API.
Say you only want to return the User's email and you only want the
expiration_date, and cvv from the CreditCard
EctoJsonapi.load(user_with_credit_cards,
attributes: %{
User => [:email],
CreditCard => [:expiration_date, :cvv]
}
)Resulting in:
%{
"data" => %{
"attributes" => %{
"email" => "test@example.com"
},
"id" => 1,
"relationships" => %{
"credit-cards" => %{
"data" => [
%{"id" => 456, "type" => "credit_cards"}
]
}
},
"type" => "users"
},
"included" => [
%{
"attributes" => %{
"cvv" => "321",
"expiration-date" => "2018-02"
},
"id" => 456,
"relationships" => %{"user" => %{"data" => %{"id" => 1, "type" => "users"}}},
"type" => "credit_cards"
}
]
}