Skip to content

3.1.0 #70

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

Merged
merged 2 commits into from
Dec 19, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,17 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]
## [3.1.0] - 2019-12-19
### Added
- (Server) Routing is exposed via `server` library.

### Changed
- (Server) `Controller` renamed to `JsonApiController`.
- (Server) `Response` renamed to `JsonApiResponse`.

### Fixed
- (Server) Response classes had `included` member initialized to `[]` by default. Now the default is `null`.

## [3.0.0] - 2019-12-17
### Added
- Support for custom non-standard links ([#61](https://github.com/f3ath/json-api-dart/issues/61))
Expand Down Expand Up @@ -117,7 +128,8 @@ Most of the changes are **BC-BREAKING**.
### Added
- Client: fetch resources, collections, related resources and relationships

[Unreleased]: https://github.com/f3ath/json-api-dart/compare/3.0.0...HEAD
[Unreleased]: https://github.com/f3ath/json-api-dart/compare/3.1.0...HEAD
[3.1.0]: https://github.com/f3ath/json-api-dart/compare/3.0.0...3.1.0
[3.0.0]: https://github.com/f3ath/json-api-dart/compare/2.1.0...3.0.0
[2.1.0]: https://github.com/f3ath/json-api-dart/compare/2.0.3...2.1.0
[2.0.3]: https://github.com/f3ath/json-api-dart/compare/2.0.2...2.0.3
Expand Down
23 changes: 12 additions & 11 deletions example/cars_server/controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@ import 'package:uuid/uuid.dart';
import 'dao.dart';
import 'job_queue.dart';

class CarsController implements Controller {
class CarsController implements JsonApiController {
final Map<String, DAO> _dao;

final PaginationStrategy _pagination;

CarsController(this._dao, this._pagination);

@override
Response fetchCollection(String type, Uri uri) {
JsonApiResponse fetchCollection(String type, Uri uri) {
final page = Page.fromUri(uri);
final dao = _getDaoOrThrow(type);
final collection =
Expand All @@ -25,7 +25,8 @@ class CarsController implements Controller {
}

@override
Response fetchRelated(String type, String id, String relationship, Uri uri) {
JsonApiResponse fetchRelated(
String type, String id, String relationship, Uri uri) {
final res = _fetchResourceOrThrow(type, id);
final page = Page.fromUri(uri);
if (res.toOne.containsKey(relationship)) {
Expand All @@ -46,7 +47,7 @@ class CarsController implements Controller {
}

@override
Response fetchResource(String type, String id, Uri uri) {
JsonApiResponse fetchResource(String type, String id, Uri uri) {
final dao = _getDaoOrThrow(type);
final obj = dao.fetchById(id);
final include = Include.fromUri(uri);
Expand All @@ -72,7 +73,7 @@ class CarsController implements Controller {
}

@override
Response fetchRelationship(
JsonApiResponse fetchRelationship(
String type, String id, String relationship, Uri uri) {
final res = _fetchResourceOrThrow(type, id);

Expand All @@ -88,7 +89,7 @@ class CarsController implements Controller {
}

@override
Response deleteResource(String type, String id) {
JsonApiResponse deleteResource(String type, String id) {
final dao = _getDaoOrThrow(type);

final res = dao.fetchByIdAsResource(id);
Expand All @@ -104,7 +105,7 @@ class CarsController implements Controller {
}

@override
Response createResource(String type, Resource resource) {
JsonApiResponse createResource(String type, Resource resource) {
final dao = _getDaoOrThrow(type);

_throwIfIncompatibleTypes(type, resource);
Expand Down Expand Up @@ -139,7 +140,7 @@ class CarsController implements Controller {
}

@override
Response updateResource(String type, String id, Resource resource) {
JsonApiResponse updateResource(String type, String id, Resource resource) {
final dao = _getDaoOrThrow(type);

_throwIfIncompatibleTypes(type, resource);
Expand All @@ -155,7 +156,7 @@ class CarsController implements Controller {
}

@override
Response replaceToOne(
JsonApiResponse replaceToOne(
String type, String id, String relationship, Identifier identifier) {
final dao = _getDaoOrThrow(type);

Expand All @@ -164,7 +165,7 @@ class CarsController implements Controller {
}

@override
Response replaceToMany(String type, String id, String relationship,
JsonApiResponse replaceToMany(String type, String id, String relationship,
List<Identifier> identifiers) {
final dao = _getDaoOrThrow(type);

Expand All @@ -173,7 +174,7 @@ class CarsController implements Controller {
}

@override
Response addToMany(String type, String id, String relationship,
JsonApiResponse addToMany(String type, String id, String relationship,
List<Identifier> identifiers) {
final dao = _getDaoOrThrow(type);

Expand Down
15 changes: 11 additions & 4 deletions lib/server.dart
Original file line number Diff line number Diff line change
@@ -1,26 +1,33 @@
/// The JSON:API Server.
///
/// **WARNING!**
///
/// **The server is still under development! Not for production!**
///
/// **The API is not stable!**
library server;

export 'package:json_api/query.dart';
export 'package:json_api/src/pagination/fixed_size_page.dart';
export 'package:json_api/src/pagination/pagination_strategy.dart';
export 'package:json_api/src/server/controller.dart';
export 'package:json_api/src/server/http_method.dart';
export 'package:json_api/src/server/json_api_controller.dart';
export 'package:json_api/src/server/json_api_server.dart';
export 'package:json_api/src/server/pagination/fixed_size_page.dart';
export 'package:json_api/src/server/pagination/pagination_strategy.dart';
export 'package:json_api/src/server/response/accepted_response.dart';
export 'package:json_api/src/server/response/collection_response.dart';
export 'package:json_api/src/server/response/error_response.dart';
export 'package:json_api/src/server/response/json_api_response.dart';
export 'package:json_api/src/server/response/meta_response.dart';
export 'package:json_api/src/server/response/no_content_response.dart';
export 'package:json_api/src/server/response/related_collection_response.dart';
export 'package:json_api/src/server/response/related_resource_response.dart';
export 'package:json_api/src/server/response/resource_created_response.dart';
export 'package:json_api/src/server/response/resource_response.dart';
export 'package:json_api/src/server/response/resource_updated_response.dart';
export 'package:json_api/src/server/response/response.dart';
export 'package:json_api/src/server/response/see_other_response.dart';
export 'package:json_api/src/server/response/to_many_response.dart';
export 'package:json_api/src/server/response/to_one_response.dart';
export 'package:json_api/src/server/routing/route.dart';
export 'package:json_api/src/server/routing/route_factory.dart';
export 'package:json_api/src/server/server_document_factory.dart';
export 'package:json_api/url_design.dart';
2 changes: 1 addition & 1 deletion lib/src/client/client_document_factory.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import 'package:json_api/src/nullable.dart';
/// for building the JSON representation of the outgoing resources.
class ClientDocumentFactory {
/// Creates an instance of the factory.
ClientDocumentFactory({Api api}) : _api = api ?? Api();
ClientDocumentFactory({Api api}) : _api = api;

/// Makes a document containing a single resource.
Document<ResourceData> makeResourceDocument(Resource resource) =>
Expand Down
33 changes: 0 additions & 33 deletions lib/src/server/controller.dart

This file was deleted.

34 changes: 34 additions & 0 deletions lib/src/server/json_api_controller.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import 'dart:async';

import 'package:json_api/document.dart';
import 'package:json_api/src/document/identifier.dart';
import 'package:json_api/src/document/resource.dart';
import 'package:json_api/src/server/response/json_api_response.dart';

abstract class JsonApiController {
FutureOr<JsonApiResponse> fetchCollection(String type, Uri uri);

FutureOr<JsonApiResponse> fetchResource(String type, String id, Uri uri);

FutureOr<JsonApiResponse> fetchRelated(
String type, String id, String relationship, Uri uri);

FutureOr<JsonApiResponse> fetchRelationship(
String type, String id, String relationship, Uri uri);

FutureOr<JsonApiResponse> deleteResource(String type, String id);

FutureOr<JsonApiResponse> createResource(String type, Resource resource);

FutureOr<JsonApiResponse> updateResource(
String type, String id, Resource resource);

FutureOr<JsonApiResponse> replaceToOne(
String type, String id, String relationship, Identifier identifier);

FutureOr<JsonApiResponse> replaceToMany(String type, String id,
String relationship, List<Identifier> identifiers);

FutureOr<JsonApiResponse> addToMany(String type, String id,
String relationship, List<Identifier> identifiers);
}
15 changes: 8 additions & 7 deletions lib/src/server/json_api_server.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@ import 'dart:async';
import 'dart:convert';
import 'dart:io';

import 'package:json_api/src/server/controller.dart';
import 'package:json_api/src/server/http_method.dart';
import 'package:json_api/src/server/json_api_controller.dart';
import 'package:json_api/src/server/response/error_response.dart';
import 'package:json_api/src/server/response/response.dart';
import 'package:json_api/src/server/response/json_api_response.dart';
import 'package:json_api/src/server/routing/route_factory.dart';
import 'package:json_api/src/server/server_document_factory.dart';
import 'package:json_api/url_design.dart';

class JsonApiServer {
final UrlDesign urlDesign;
final Controller controller;
final JsonApiController controller;
final ServerDocumentFactory documentFactory;
final String allowOrigin;
final RouteFactory routeMapper;
Expand All @@ -31,7 +31,8 @@ class JsonApiServer {
return request.response.close();
}

Future<Response> _call(Controller controller, HttpRequest request) async {
Future<JsonApiResponse> _call(
JsonApiController controller, HttpRequest request) async {
final method = HttpMethod(request.method);
final body = await _getBody(request);
try {
Expand All @@ -43,16 +44,16 @@ class JsonApiServer {
}
}

void _writeBody(HttpRequest request, Response response) {
void _writeBody(HttpRequest request, JsonApiResponse response) {
final doc = response.buildDocument(documentFactory, request.requestedUri);
if (doc != null) request.response.write(json.encode(doc));
}

void _setStatus(HttpRequest request, Response response) {
void _setStatus(HttpRequest request, JsonApiResponse response) {
request.response.statusCode = response.status;
}

void _setHeaders(HttpRequest request, Response response) {
void _setHeaders(HttpRequest request, JsonApiResponse response) {
final add = request.response.headers.add;
response.getHeaders(urlDesign).forEach(add);
if (allowOrigin != null) add('Access-Control-Allow-Origin', allowOrigin);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:json_api/src/pagination/pagination_strategy.dart';
import 'package:json_api/src/query/page.dart';
import 'package:json_api/src/server/pagination/pagination_strategy.dart';

class FixedSizePage implements PaginationStrategy {
final int size;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:json_api/src/pagination/pagination_strategy.dart';
import 'package:json_api/src/query/page.dart';
import 'package:json_api/src/server/pagination/pagination_strategy.dart';

class NoPagination implements PaginationStrategy {
const NoPagination();
Expand Down
10 changes: 5 additions & 5 deletions lib/src/server/response/accepted_response.dart
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import 'package:json_api/document.dart';
import 'package:json_api/src/server/response/response.dart';
import 'package:json_api/src/server/response/json_api_response.dart';
import 'package:json_api/src/server/server_document_factory.dart';
import 'package:json_api/url_design.dart';

class AcceptedResponse extends Response {
class AcceptedResponse extends JsonApiResponse {
final Resource resource;

AcceptedResponse(this.resource) : super(202);
Expand All @@ -14,9 +14,9 @@ class AcceptedResponse extends Response {
factory.makeResourceDocument(self, resource);

@override
Map<String, String> getHeaders(UrlFactory route) => {
...super.getHeaders(route),
Map<String, String> getHeaders(UrlFactory urlFactory) => {
...super.getHeaders(urlFactory),
'Content-Location':
route.resource(resource.type, resource.id).toString(),
urlFactory.resource(resource.type, resource.id).toString(),
};
}
7 changes: 3 additions & 4 deletions lib/src/server/response/collection_response.dart
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
import 'package:json_api/document.dart';
import 'package:json_api/src/server/response/response.dart';
import 'package:json_api/src/server/response/json_api_response.dart';
import 'package:json_api/src/server/server_document_factory.dart';

class CollectionResponse extends Response {
class CollectionResponse extends JsonApiResponse {
final Iterable<Resource> collection;
final Iterable<Resource> included;
final int total;

const CollectionResponse(this.collection,
{this.included = const [], this.total})
const CollectionResponse(this.collection, {this.included, this.total})
: super(200);

@override
Expand Down
4 changes: 2 additions & 2 deletions lib/src/server/response/error_response.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import 'package:json_api/document.dart';
import 'package:json_api/src/server/response/response.dart';
import 'package:json_api/src/server/response/json_api_response.dart';
import 'package:json_api/src/server/server_document_factory.dart';

class ErrorResponse extends Response {
class ErrorResponse extends JsonApiResponse {
final Iterable<JsonApiError> errors;

const ErrorResponse(int status, this.errors) : super(status);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ import 'package:json_api/document.dart';
import 'package:json_api/src/server/server_document_factory.dart';
import 'package:json_api/url_design.dart';

abstract class Response {
abstract class JsonApiResponse {
final int status;

const Response(this.status);
const JsonApiResponse(this.status);

Document buildDocument(ServerDocumentFactory factory, Uri self);

Map<String, String> getHeaders(UrlFactory route) =>
Map<String, String> getHeaders(UrlFactory urlFactory) =>
{'Content-Type': Document.contentType};
}
4 changes: 2 additions & 2 deletions lib/src/server/response/meta_response.dart
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import 'package:json_api/document.dart';
import 'package:json_api/src/server/response/response.dart';
import 'package:json_api/src/server/response/json_api_response.dart';
import 'package:json_api/src/server/server_document_factory.dart';

class MetaResponse extends Response {
class MetaResponse extends JsonApiResponse {
final Map<String, Object> meta;

MetaResponse(this.meta) : super(200);
Expand Down
Loading