Releases: tobyzerner/json-api-server
Releases · tobyzerner/json-api-server
v1.0.0-beta.6
⚠️ Breaking Changes
- Change
Resource\Paginatable::paginate()
signature to accept the resolved
offset and limit integers (plus the request context) and return the page of
results instead of mutating the query in place - New contract for custom
Pagination
implementations:- Add
paginate(object $query, Context $context): Page
method which should
return a page of results - Remove
meta
andlinks
methods; set this data inpaginate
via the
Context
object
- Add
Resource\\Listable
implementations must now providedefaultSort()
and
pagination()
methods so defaults can be reused when listing related data- Refactor
Serializer
so it is instantiated without aContext
and expects
the resource context to be provided toaddPrimary()
/addIncluded()
Added
- Add cursor pagination support via
Endpoint\Index::cursorPaginate()
and the
Resource\CursorPaginatable
contract, following the
ethanresnick/cursor-pagination
JSON:API profile - Allow exceptions to attach
meta
andlinks
members to the error response - Add
Context::$documentMeta
andContext::$documentLinks
asArrayObject
instances to allow callbacks to add meta information to the response document - Support JSON:API relationship URLs via the
Show
endpoint, adding automatic
self
/related
links, and paginated/filterable/sortable to-many responses
when the related resource isListable
- Allow the
Update
endpoint to handlePATCH
/POST
/DELETE
requests to
relationship URLs and return the updated relationship document - Implement the
Resource\Attachable
contract and addToMany::attachable()
,
validateAttach()
, andvalidateDetach()
helpers for controlling
relationship mutation endpoints with attach/detach hooks - Introduce
Endpoint\ResourceEndpoint
andEndpoint\RelationshipEndpoint
so
endpoints can contribute relationship and resource links during serialization
v1.0.0-beta.5
⚠️ Breaking Changes
Tobyz\\JsonApiServer\\Laravel\\Filter\\EloquentFilter
renamed to
ColumnFilter
.- Remove the
Has
Laravel filter; useWhereExists
instead. - Remove the
WhereDoesntHave
Laravel filter; use the operator support on
WhereHas
instead. - Remove
Where::asNumber()
; express numeric comparisons with operators such as
filter[score][gt]=...
orfilter[score][lte]=...
.
Added
- Add support for boolean filter groups (
filter[and]
,filter[or]
,
filter[not]
) for resources that implement theSupportsBooleanFilters
interface - Laravel: Add support for boolean filter groups to
EloquentResource
- Laravel: Overhaul filter implementations to support operators like
eq
,ne
,
in
,lt
,lte
,gt
,gte
,like
,notlike
,null
, andnotnull
v1.0.0-beta.4
Added
- Add support for generating OpenAPI Definitions
- Add
CollectionAction
andResourceAction
endpoints - Allow including relationships by default (#96 by @SychO9)
- Add support for conditional linkage (#110 by @SychO9)
- Add
Enum
support toStr
type - Add the ability to make a field
sparse
by default - Add the ability to add
after
callbacks to theCreate
endpoint - Add the ability to pass a condition to
writableOnCreate
- Add
Relationship::notIncludable()
- Allow
psr/http-message
v2 - Laravel: Add
ToOne
andToMany
subclasses which support constraining relationship queries (#103 by @SychO9) - Laravel: Support array of abilities in
can
helper
Changed
- Laravel:
EloquentCollection
queries now keep the resource'sEloquent\Builder
instead of converting to the baseQuery\Builder
- Laravel: Apply
EloquentResource
scope when applyingWhereHas
filter
Fixed
- Fix error when request body
data.attributes
is null (#98 by @SychO9) - Fix support for nested includes on polymorphic relationships
- Fix
multipleOf
bugs (#114 by @bertramakers) - Fix error when using
Context::withRequest
(#107 by @SychO9) - The
self
link for a resource now only appears if theShow
endpoint is present in a collection - Laravel: Support dynamically resolved relationships (#100 by @SychO9)
- Laravel: Fix serialization for
MorphTo
relationships (#97 by @SychO9) - Laravel: Only attempt to preload related
EloquentResource
s - Laravel: Fix error parameter name in
WhereBelongsTo
filter - Laravel: Fix limiting
ToMany
relation results (#112 by @SychO9)
v1.0.0-beta.3
⚠️ Breaking Changes
- Drop
Interface
suffix from various interfaces:Resource
class renamed toAbstractResource
ResourceInterface
renamed toResource
CollectionInterface
renamed toCollection
ErrorProviderInterface
renamed toErrorProvider
PaginationInterface
renamed toPagination
EndpointInterface
renamed toEndpoint
TypeInterface
renamed toType
Fixed
v1.0.0-beta.2
⚠️ Breaking Changes
- Types are now their own construct instead of being subclasses of
Attribute
. See the Attributes documentation for more information. - Removed support for defining polymorphic relationships by passing a map of model classes to resource types. You should use heterogeneous collections instead. See the Relationships documentation for more information.
Added
- Add support for heterogeneous collections
- Add
Arr
type for defining array attributes (#88 by @bertramakers) - Laravel: Allow
WhereHas
field to be specified manually
Fixed
- When creating a resource, set the context model prior to field validation
- Fix error when updating a resource with a conflicting ID (#85)
- Laravel: Fix
Has
filter not working without ascope
- Laravel: Don't apply relationship loading constraints if there aren't any
v1.0.0-beta.1
Added
- Add
Str::enum()
method (#75 by @bertramakers) - Allow literal values in
Field::default()
method (#80 by @bertramakers)
Fixed
- Fix
Number
properties not being initialized - Fix validators not being run for null values
- Fix
DateTime
values containing milliseconds not being accepted - Fix nested filters not receiving correct resource in context
- Laravel: Fix
EloquentResource
sometimes using incorrect relation name when setting value - Laravel: Convert
DateTime
values to Laravel app's storage timezone - Laravel: Validate that
WhereBelongsTo
filter input is a list
v1.0.0-alpha.2
Added
- Finish Laravel integration
- Add basic field schema configuration in preparation for OpenAPI generation
- Add
Context::$query
to access the query used in theIndex
endpoint - Add
Context::fieldRequested()
andContext::sortRequested()
methods - Add
BooleanDateTime
attribute for exposing internal date-time values as booleans - Improve error sources in Bad Request errors
- Add a performance benchmark
Changed
- Add
void
return type toFilter::apply()
signature
Fixed
- Fix typed attribute values being deserialized and always passing validation
- Fix visibility callback result not being cast to a boolean
- Fix
Integer
incorrectly not extendingNumber
- Fix empty to-many relationships not being present in the response at all
- Fix TypeError when removing non-nullable to-one relationship
(#74)
v1.0.0-alpha.1
-
New class-based API. More ergonomic for managing large resource definitions and
inheriting/overriding behavior. Complex fields can be extracted into their own classes and
reused across resources. -
Typed attributes. Implementations of typed attributes are provided to match the data types
in the OpenAPI specification. Attributes can be marked as required and nullable. -
Customizable endpoints. Each endpoint is now opt-in for each resource and can be configured
and implemented separately. Also adds the ability for custom endpoints to be added. -
Restructured internals. The codebase is cleaner and easier to reason about, especially the
serialization process.
Still to come:
- Implementation of Laravel stuff (currently it is documented but not implemented)
- Ability to generate OpenAPI definitions
- Additional attribute types (array, object)
- Benchmarks (it should probably be a bit faster)
v0.2.0-beta.2
Added
- Content-Type validation and Accept negotation
- Include
jsonapi
object withversion
member in response - Validate implementation-specific query parameters according to specification
- Added
Location
header to201 Created
responses - Improved error repsonses when creating and updating resources
Context::filter()
method to get the value of a filterResourceType::applyScope()
,applyFilter()
andapplySort()
methodsResourceType::url()
method to get the URL for a modelForbidden
error details for CRUD actions, useful when running Atomic OperationsJsonApi::getExtensions()
method to get all registered extensionsConflictException
class
Changed
- Renamed
$linkage
parameter inAdapterInterface
methods to$linkageOnly
- Renamed
Type::newModel()
tomodel()
to be consistent with Adapter
Fixed
- Properly respond with meta information added to
Context
instance
v0.2.0-beta.1
Added
- Preliminary support for Extensions
- Support filtering by nested relationships/attributes (eg.
filter[relationship.attribute]=value
) - Add new methods to Context object:
getApi
,getPath
,fieldRequested
,meta
- Eloquent adapter: apply scopes when including polymorphic relationships
- Laravel validation helper: support nested validation messages
- Allow configuration of sort and filter visibility
- Add new
setId
method toAdapterInterface
Changed
- Change paradigm for eager loading relationships; allow fields to return
Deferred
values to be evaluated after all other fields, so that resource loading can be buffered. - Remove
on
prefix from field event methods
Removed
- Removed
load
anddontLoad
field methods
Fixed
- Fix pagination next link appearing when it shouldn't