How do create custom api to get a user by their :first_name
and :date_of_birth
?
read :get_user do argument :first_name, :string do allow_nil? false end argument :date_of_birth, :date do allow_nil? false end end
How do create custom api to get a user by their :first_name
and :date_of_birth
?
read :get_user do argument :first_name, :string do allow_nil? false end argument :date_of_birth, :date do allow_nil? false end end
There isn’t much information in your post so I’m assuming you have setup the AshJsonAPI as described here: Getting started with AshJsonApi — ash_json_api v1.0.0 . With that assumption, I’m guessing this is what you need on the User
resource to get you the API you need.
defmodule Hello.User do use Ash.Resource, data_layer: AshPostgres.DataLayer, domain: Hello.Users, extensions: [AshJsonApi.Resource] postgres do table "users" repo Hello.Repo end attributes do uuid_primary_key :id attribute :first_name, :string, public?: true attribute :date_of_birth, :date, public?: true .... other attributes end json_api do type "user" routes do base "/users" get :get_user, route: "/find" end end actions do read :get_user do argument :first_name, :string do allow_nil? false end argument :date_of_birth, :date do allow_nil? false end filter expr(first_name == ^arg(:first_name) && date_of_birth == ^arg(:date_of_birth)) end end end
Basically, you are missing the filter
macro in your read
action. In the get
route, the first argument :get_user
is the read action name defined inside actions
and the route
option is given to make url as GET /users/find
, otherwise the default route for a get
path will result in /users/:id
where :id
is a placeholder and is not relevant in your case.
The API will return all the fields marked as public?: true
in the attributes section.
filter expr(first_name == ^arg(:first_name) && date_of_birth == ^arg(:date_of_birth)) ** (RuntimeError) Cannot use `&&` without adding the extension `ash-functions` to your repo.
I already tried filter macro, but I got an issue with invalid_filter_value:
filter expr(first_name == ^arg(:first_name) and date_of_birth == ^arg(:date_of_birth))
{ "errors": [ { "code": "invalid_filter_value", "id": "26d912d6-c9d0-4a42-a00a-3683d236df07", "status": "400", "title": "invalid_filter_value", "detail": "Invalid filter value `\"user\"`" } ], "jsonapi": { "version": "1.0" } }
In my Repo
module, I have the following:
defmodule Hello.Repo do use AshPostgres.Repo, otp_app: :hello # Installs Postgres extensions that ash commonly uses def installed_extensions do ["ash-functions"] end end
Are you using Ash 3 or 2? I think this got added recently in Ash 3. Official instructions are here: Ash Framework
"Raised error: 014f3a37-22d5-4875-8014-2767c1dd5417\n\n** (Ash.Error.Query.InvalidFilterValue) Invalid filter value
Your uuid has new lines at the end, it’s not a valid uuid
Thank you so much.