-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Mapping JSON API spec / schema to AMS [ci skip] #1301
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | |||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,138 @@ | |||||||||||||||||||||||||||||||||||||||||||||||||||||
[](http://jsonapi.org/) | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
## JSON API Requests | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
- [Query Parameters Spec](http://jsonapi.org/format/#query-parameters) | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
Headers: | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
- Request: `Accept: application/vnd.api+json` | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- Response: `Content-Type: application/vnd.api+json` | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
### [Fetching Data](http://jsonapi.org/format/#fetching) | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
A server MUST support fetching resource data for every URL provided as: | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
- a `self` link as part of the top-level links object | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- a `self` link as part of a resource-level links object | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- a `related` link as part of a relationship-level links object | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
Example supported requests | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
- Individual resource or collection | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- GET /articles | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- GET /articles/1 | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- GET /articles/1/author | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- Relationships | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- GET /articles/1/relationships/comments | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- GET /articles/1/relationships/author | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- Optional: [Inclusion of related resources](http://jsonapi.org/format/#fetching-includes) `ActiveModel::Serializer::IncludeTree` | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- GET /articles/1?`include`=comments | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- GET /articles/1?`include`=comments.author | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- GET /articles/1?`include`=author,comments.author | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- GET /articles/1/relationships/comments?`include`=comments.author | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- Optional: [Sparse Fieldsets](http://jsonapi.org/format/#fetching-sparse-fieldsets) `ActiveModel::Serializer::Fieldset` | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- GET /articles?`include`=author&`fields`[articles]=title,body&`fields`[people]=name | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- Optional: [Sorting](http://jsonapi.org/format/#fetching-sorting) | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- GET /people?`sort`=age | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- GET /people?`sort`=age,author.name | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- GET /articles?`sort`=-created,title | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- Optional: [Pagination](http://jsonapi.org/format/#fetching-pagination) | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- GET /articles?`page`[number]=3&`page`[size]=1 | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- Optional: [Filtering](http://jsonapi.org/format/#fetching-filtering) | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- GET /comments?`filter`[post]=1 | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- GET /comments?`filter`[post]=1,2 | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- GET /comments?`filter`[post]=1,2 | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
### [CRUD Actions](http://jsonapi.org/format/#crud) | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
### [Asynchronous Processing](http://jsonapi.org/recommendations/#asynchronous-processing) | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
### [Bulk Operations Extension](http://jsonapi.org/extensions/bulk/) | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
## JSON API Document Schema | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
| JSON API object | JSON API properties | Required | ActiveModelSerializers representation | | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|-----------------------|----------------------------------------------------------------------------------------------------|----------|---------------------------------------| | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| schema | oneOf (success, failure, info) | | | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| success | data, included, meta, links, jsonapi | | AM::SerializableResource | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| success.meta | meta | | AM::S::Adapter::Base#meta | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| success.included | UniqueArray(resource) | | AM::S::Adapter::JsonApi#serializable_hash_for_collection | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| success.data | data | | | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| success.links | allOf (links, pagination) | | AM::S::Adapter::JsonApi#links_for | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| success.jsonapi | jsonapi | | | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| failure | errors, meta, jsonapi | errors | | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| failure.errors | UniqueArray(error) | | #1004 | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| meta | Object | | | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| data | oneOf (resource, UniqueArray(resource)) | | AM::S::Adapter::JsonApi#serializable_hash_for_collection,#serializable_hash_for_single_resource | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| resource | String(type), String(id),<br>attributes, relationships,<br>links, meta | type, id | AM::S::Adapter::JsonApi#primary_data_for | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| links | Uri(self), Link(related) | | #1028, #1246, #1282 | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| link | oneOf (linkString, linkObject) | | | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| link.linkString | Uri | | | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| link.linkObject | Uri(href), meta | href | | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| attributes | patternProperties(<br>`"^(?!relationships$|links$)\\w[-\\w_]*$"`),<br>any valid JSON | | AM::Serializer#attributes, AM::S::Adapter::JsonApi#resource_object_for | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| relationships | patternProperties(<br>`"^\\w[-\\w_]*$"`);<br>links, relationships.data, meta | | AM::S::Adapter::JsonApi#relationships_for | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| relationships.data | oneOf (relationshipToOne, relationshipToMany) | | AM::S::Adapter::JsonApi#resource_identifier_for | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| relationshipToOne | anyOf(empty, linkage) | | | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| relationshipToMany | UniqueArray(linkage) | | | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| empty | null | | | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| linkage | String(type), String(id), meta | type, id | AM::S::Adapter::JsonApi#primary_data_for | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| pagination | pageObject(first), pageObject(last),<br>pageObject(prev), pageObject(next) | | AM::S::Adapter::JsonApi::PaginationLinks#serializable_hash | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| pagination.pageObject | oneOf(Uri, null) | | | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| jsonapi | String(version), meta | | AM::S::Adapter::JsonApi::ApiObjects::JsonApi | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| error | String(id), links, String(status),<br>String(code), String(title),<br>String(detail), error.source, meta | | | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| error.source | String(pointer), String(parameter) | | | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| pointer | [JSON Pointer RFC6901](https://tools.ietf.org/html/rfc6901) | | | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. reposting #1298 (comment) here with a few changes, is some thoughts on why we might organize things. let
re: see
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
The [http://jsonapi.org/schema](schema/schema.json) makes a nice roadmap. | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
### Success Document | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] success | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] data: `"$ref": "#/definitions/data"` | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] included: array of unique items of type `"$ref": "#/definitions/resource"` | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] meta: `"$ref": "#/definitions/meta"` | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] links: | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] link: `"$ref": "#/definitions/links"` | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] pagination: ` "$ref": "#/definitions/pagination"` | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] jsonapi: ` "$ref": "#/definitions/jsonapi"` | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
### Failure Document | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] failure | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] errors: array of unique items of type ` "$ref": "#/definitions/error"` | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] meta: `"$ref": "#/definitions/meta"` | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] jsonapi: `"$ref": "#/definitions/jsonapi"` | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
### Info Document | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] info | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] meta: `"$ref": "#/definitions/meta"` | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] links: `"$ref": "#/definitions/links"` | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] jsonapi: ` "$ref": "#/definitions/jsonapi"` | |||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Info document isn't really part of the spec json-api/json-api#440 (comment) |
|||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
### Definitions | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] definitions: | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] meta | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] data: oneOf (resource, array of unique resources) | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] resource | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] attributes | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] relationships | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] relationshipToOne | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] empty | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] linkage | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] meta | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] relationshipToMany | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] linkage | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] meta | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] links | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] meta | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] links | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] link | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] uri | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] href, meta | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] pagination | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] jsonapi | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] meta | |||||||||||||||||||||||||||||||||||||||||||||||||||||
- [ ] error: id, links, status, code, title: detail: source [{pointer, type}, {parameter: {description, type}], meta |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
the JSON API being represented by
ActiveModel::Serializer
is one of my larger motivations for this PR. The naming of the library asActiveModelSerializers
and its primary namespace beingActiveModel::Serializer
and its resource wrapper being a class of the same name causes no end of confusion.I'd like to at the least move towards naming
ActiveModel::Serializer
asActiveModelSerializers::Resource
, so that its naming is less confusing, more precise, and a better namespace. I know it's a big historical change, so it would be backwards compatible, deprecated for now.I generally also want to revisit what we mean to Serializer (Resource?) vs. Adapter and what interfaces we'd like for those.
Also, consider how versioned
resources
might look ref: #1290 (comment)And test like the other serializers and adapters
refs:
Keeping a well-defined interface, e.g. grape support: #1258 and serialization_context #1289
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm thinking of modeling naming after more complete (and well-informed) JSON API libraries such as
(I'm going to update this comment)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Added as a comment in #1298 (comment)