- name
- ash-json-api
- description
- AshJsonApi guidelines for exposing Ash resources as JSON:API compliant REST endpoints. Use when adding JSON:API extensions to domains/resources, configuring routes, or implementing filtering, sorting, pagination, and includes. Supports full JSON:API specification.
# AshJsonApi Guidelines
AshJsonApi generates JSON:API compliant endpoints from Ash resources, supporting filtering, sorting, pagination, includes, and relationships.
## Domain Configuration
Add the `AshJsonApi.Domain` extension and define routes:
```elixir
defmodule MyApp.Blog do
use Ash.Domain,
extensions: [AshJsonApi.Domain]
json_api do
authorize? true
routes do
base_route "/posts", MyApp.Blog.Post do
get :read
index :read
post :create
patch :update
delete :destroy
end
end
end
resources do
resource MyApp.Blog.Post
resource MyApp.Blog.Comment
end
end
```
## Resource Configuration
Add the `AshJsonApi.Resource` extension and specify the type:
```elixir
defmodule MyApp.Blog.Post do
use Ash.Resource,
domain: MyApp.Blog,
extensions: [AshJsonApi.Resource]
attributes do
uuid_primary_key :id
attribute :title, :string
attribute :body, :string
attribute :published, :boolean
end
relationships do
belongs_to :author, MyApp.Accounts.User
has_many :comments, MyApp.Blog.Comment
end
json_api do
type "post" # Required: JSON:API type name
end
actions do
defaults [:create, :read, :update, :destroy]
read :list_published do
filter expr(published == true)
end
update :publish do
accept []
change set_attribute(:published, true)
end
end
end
```
## Route Types
| Route | HTTP | Path | Description |
|-------|------|------|-------------|
| `get` | GET | `/posts/:id` | Fetch single resource |
| `index` | GET | `/posts` | List resources (filter/sort/paginate) |
| `post` | POST | `/posts` | Create resource |
| `patch` | PATCH | `/posts/:id` | Update resource |
| `delete` | DELETE | `/posts/:id` | Destroy resource |
| `related` | GET | `/posts/:id/comments` | Fetch related resources |
| `relationship` | GET | `/posts/:id/relationships/comments` | Fetch relationship data |
| `post_to_relationship` | POST | `/posts/:id/relationships/comments` | Add to relationship |
| `patch_relationship` | PATCH | `/posts/:id/relationships/comments` | Replace relationship |
| `delete_from_relationship` | DELETE | `/posts/:id/relationships/comments` | Remove from relationship |
## Query Parameters
Standard JSON:API query parameters:
```
# Filter
?filter[attribute]=value
# Sort (descending with -)
?sort=attribute,-other_attribute
# Pagination
?page[number]=2&page[size]=10
# Includes (sideload related resources)
?include=author,comments.author
```
Auf GitHub ansehen