cclark
I’m new to Elixir, Phoenix and Absinthe but trying to write an API onto an existing dataset. The dataset includes information about trails and they have a status attribute with values of 1, 2, 3 or 4. In the domain these map to Green (1), Yellow(2), Amber(3) and Red(4) so I’d like to use the actual enum values as it would be much more expressive.
For the GraphQL API onto this it would be much nicer if I could write a query like:
query {
trails(havingStatus: RED) {
id
name
status
}
}
In my schema I’ve defined an enum as
@desc "Current status of the trail"
enum :trail_status do
value :green, as: 1, description: "Green: Clear"
value :yellow, as: 2, description: "Yellow: Minor Issue"
value :amber, as: 3, description: "Amber: Significant Issue"
value :red, as: 4, description: "Red: Major Issue"
end
This allows me to query and enforce that the user chooses valid values for havingStatus. However, in my results I see the raw value of
{
"status": 4,
"name": "Lost Loop",
"id": "16601"
}
where I’d really like to have the 3 be returned as RED.
First does this make sense to do? If the client already knows about GREEN, YELLOW, AMBER and RED when making the query then it seems like a failure to make the client know how to receive 1-4 and map it to those values.
It seems like a custom scalar might be one way to get at this. All of the examples I can find are for dates and make sense. But when I have a very specific enumeration of four values I wonder if that is overkill and it seems like I’d lose the nice ability to introspect and see the only valid values. So I think I want a combination of an enum and a custom scalar type?
Any thoughts or pointers to Absinthe/GraphQL articles on the subject would be greatly appreciated.
Trending in Questions
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #blog-post
- #phoenix_html
- #iex
- #graphql
- #ai
- #genstage
- #elixirconf-us
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #metaprogramming
- #security
- #hex











Showing Posts 1 to 4- Show Best Posts
- Show All Posts (oldest first)
- Show All Posts (newest first)
kokolegorille
Hello, welcome to the forum.
I use simple atoms, without as when I don’t need to use db, like so
But if You want to persists Int in the DB and keep nice looking status, I would use a scalar. Nothing really complicate, You just need a parse and a serialize functions.
I use this for json.
And with your Enum requirement, it would be simple to write those 2 functions. For example…
cclark
Thanks @kokolegorille! I’m really enjoying Elixir and the forum so far.
Would a scalar be a straight swap out for an enum? From my understanding of your reply it is one or the other and not a way to combine the two.
I tried as per your guidance and am stuck. In my top level
schema.exI took my enum definition of:and replaced it with your scalar definition (altering it slightly to be
trail_statusto fit my actual code)It probably helps to see my resolver as well…
Before the switch I was able to run the following query
It ran without issue and I had the nice constrained/type-ahead completion in GraphiQL that only
GREEN,YELLOW,AMBERandREDwere allowed.Now I no longer have the nice type-ahead completion constrained to the valid enum values in GraphiQL but also I’m not able to pass a value to
havingStatus:in my query query which results in anything other than an error message saying"Argument \"havingStatus\" has invalid value <VALUE>."where I’ve tried all the following for<VALUE>:cclark
With some more experimentation I found out where my issue was with getting an
enumto work the way I expected, in my object data type definitions I had missed changing a field from:integerto:trail_status. Once I did that I see values likeGREENin my responses instead of1and I was able to even use them in amutationcall.Something still feels a little off because the
enumis defined in the GraphQL schema and it does a nice mapping to integer values in the database schema I was given but if I were to do more complex business logic with conditions on the status of a trail then it seems like I’d want some sort of entity to reflect the trail status – but that could be my OO brain still trying to wrap my head around how to do things in Elixir.StefanL
You might want to have a look at EctoEnum, it will probably provide the casting from/to integers in ecto that you are searching for.