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.