diff --git a/package.json b/package.json index d56e3b2..d5b4896 100644 --- a/package.json +++ b/package.json @@ -26,16 +26,15 @@ "homepage": "https://github.com/rtablada/adonis-jsonapi#readme", "dependencies": { "change-case": "^3.0.0", - "i": "^0.3.5", - "inflect": "^0.4.0", + "inflection": "^1.12.0", "jsonapi-serializer": "^3.5.0", "lodash.keysin": "^4.2.0", "lodash.mapkeys": "^4.6.0", "lodash.pick": "^4.4.0", - "node-exceptions": "^1.0.3" + "node-exceptions": "^4.0.1" }, "peerDependencies": { - "adonis-fold": "^3.0.2" + "@adonisjs/fold": "^4.0.0" }, "devDependencies": { "eslint": "^3.2.0", diff --git a/providers/JsonApiProvider.js b/providers/JsonApiProvider.js index d01d41d..e9b7083 100644 --- a/providers/JsonApiProvider.js +++ b/providers/JsonApiProvider.js @@ -1,17 +1,62 @@ -'use strict'; +const { ServiceProvider, ioc } = require('@adonisjs/fold'); +const JsonApiSerializer = require('jsonapi-serializer').Serializer; +const { JsonApiError, ValidationError } = require('../src/JsonApiRequest'); +const Helpers = use('Helpers'); -const ServiceProvider = require('adonis-fold').ServiceProvider; +function setupSerializer(use) { + return function (serializerName, data, meta) { + + const View = require(Helpers.appRoot() + '/app/JsonApiViews/' + serializerName + '.js') + const view = new View(use) + + if (data.toJSON && typeof data.toJSON === 'function') { + data = data.toJSON() + } + + const pluralizeType = Array.isArray(data) + const options = Object.assign({}, view.build({ meta: meta }), { pluralizeType }) + const json = new JsonApiSerializer(view.type, options).serialize(data) + + return json + }; +} class JsonApiProvider extends ServiceProvider { + async boot () { + const Response = use('Adonis/Src/Response'); + const serializer = setupSerializer(use); + + Response.macro('serializePayload', serializer); + Response.macro('jsonApi', function (serializerName, data, meta = {}, statusCode = 200) { + const json = serializer(serializerName, data, meta); - * register() { - this.app.bind('AdonisJsonApi/Middleware', (app) => { + this.status(statusCode).json(json); + }); + + Response.macro('isJsonApiError', (err) => err instanceof JsonApiError); + Response.macro('isValidationError', (err) => err instanceof ValidationError); + Response.macro('jsonApiError', function (err) { + if (err instanceof ValidationError) { + this.status(err.status).json({ errors: err.makeErrors() }); + } else if (err instanceof JsonApiError) { + this.status(err.status).json({ errors: [err.message] }); + } else { + this.status(err.status).json({ errors: [{ + status: err.status, + title: err.name, + detail: err.message, + }] }); + } + }); + } + + async register() { + ioc.bind('Adonis/Middleware/JsonApi', (app) => { const JsonApi = require('../src/JsonApiMiddleware'); return new JsonApi(app.use); }); } - } module.exports = JsonApiProvider; diff --git a/src/JsonApiMiddleware.js b/src/JsonApiMiddleware.js index 81b7d5f..8e1b2f2 100644 --- a/src/JsonApiMiddleware.js +++ b/src/JsonApiMiddleware.js @@ -1,65 +1,11 @@ -'use strict'; - -const JsonApiSerializer = require('jsonapi-serializer').Serializer; -const { JsonApiRequest, JsonApiError, ValidationError } = require('./JsonApiRequest'); - -function setupSerializer(use) { - return function (serializerName, data, meta) { - const helpers = use('Helpers'); - - const View = use(helpers.makeNameSpace('Http/JsonApiViews', serializerName)); - const view = new View(use); - - if (data.toJSON && typeof data.toJSON === 'function') { - data = data.toJSON(); - } - - const pluralizeType = Array.isArray(data); - - const options = Object.assign({}, view.build({ meta: meta }), { pluralizeType }); - - const json = new JsonApiSerializer(view.type, options).serialize(data); - - return json; - }; -} +const { JsonApiRequest } = require('./JsonApiRequest'); class JsonApi { - - constructor(use) { - const Response = use('Adonis/Src/Response'); - const serializer = setupSerializer(use); - - Response.macro('serializePayload', serializer); - Response.macro('jsonApi', function (serializerName, data, meta = {}, statusCode = 200) { - const json = serializer(serializerName, data, meta); - - this.status(statusCode).json(json); - }); - - Response.macro('isJsonApiError', (err) => err instanceof JsonApiError); - Response.macro('isValidationError', (err) => err instanceof ValidationError); - Response.macro('jsonApiError', function (err) { - if (err instanceof ValidationError) { - this.status(err.status).json({ errors: err.makeErrors() }); - } else if (err instanceof JsonApiError) { - this.status(err.status).json({ errors: [err.message] }); - } else { - this.status(err.status).json({ errors: [{ - status: err.status, - title: err.name, - detail: err.message, - }] }); - } - }); - } - - * handle(request, response, next) { + async handle({ request }, next) { request.jsonApi = new JsonApiRequest(request); - yield next; + await next(); } - } module.exports = JsonApi; diff --git a/src/JsonApiRequest.js b/src/JsonApiRequest.js index 60c81c6..f4a3632 100644 --- a/src/JsonApiRequest.js +++ b/src/JsonApiRequest.js @@ -84,9 +84,9 @@ class JsonApiRequest { } } - * assertValid(input, rules, messages) { + async assertValid(input, rules, messages) { const Validator = use('Validator'); - const validation = yield Validator.validateAll(input, rules, messages); + const validation = await Validator.validateAll(input, rules, messages); if (validation.fails()) { throw new ValidationError(validation); diff --git a/src/JsonApiView.js b/src/JsonApiView.js index bca4d6b..6c248dd 100644 --- a/src/JsonApiView.js +++ b/src/JsonApiView.js @@ -1,4 +1,4 @@ -const i = require('inflect'); +const i = require('inflection'); const keysIn = require('lodash.keysin'); class JsonApiRelation {