|
| 1 | +'use strict'; |
| 2 | + |
| 3 | +const { decorate, metadata, param } = require('../lib/helpers.js'); |
| 4 | +const context = require("@loopback/context"); |
| 5 | +const rest = require("@loopback/rest"); |
| 6 | +const SequenceActions = rest.RestBindings.SequenceActions; |
| 7 | + |
| 8 | +module.exports = function (options) { |
| 9 | + const { name: sequenceName, handler } = options; |
| 10 | + let classes = {}; |
| 11 | + classes[sequenceName] = class { |
| 12 | + constructor(findRoute, parseParams, invoke, send, reject) { |
| 13 | + this.findRoute = findRoute; |
| 14 | + this.parseParams = parseParams; |
| 15 | + this.invoke = invoke; |
| 16 | + this.send = send; |
| 17 | + this.reject = reject; |
| 18 | + } |
| 19 | + async handle(context) { |
| 20 | + const sequence = { |
| 21 | + findRoute: this.findRoute, |
| 22 | + parseParams: this.parseParams, |
| 23 | + invoke: this.invoke, |
| 24 | + send: this.send, |
| 25 | + reject: this.reject |
| 26 | + }; |
| 27 | + try { |
| 28 | + if (handler) { |
| 29 | + handler.call(sequence, context); |
| 30 | + } else { |
| 31 | + const { request, response } = context; |
| 32 | + const route = this.findRoute(request); |
| 33 | + const args = await this.parseParams(request, route); |
| 34 | + const result = await this.invoke(route, args); |
| 35 | + this.send(response, result); |
| 36 | + } |
| 37 | + } |
| 38 | + catch (err) { |
| 39 | + this.reject(context, err); |
| 40 | + } |
| 41 | + } |
| 42 | + }; |
| 43 | + |
| 44 | + let SequenceClass = classes[sequenceName]; |
| 45 | + SequenceClass.sequenceName = sequenceName; |
| 46 | + Object.defineProperty(SequenceClass, 'name', { writable: true }); |
| 47 | + SequenceClass.name = sequenceName; |
| 48 | + Object.defineProperty(SequenceClass, 'name', { writable: false }); |
| 49 | + |
| 50 | + SequenceClass = decorate([ |
| 51 | + param(0, context.inject(SequenceActions.FIND_ROUTE)), |
| 52 | + param(1, context.inject(SequenceActions.PARSE_PARAMS)), |
| 53 | + param(2, context.inject(SequenceActions.INVOKE_METHOD)), |
| 54 | + param(3, context.inject(SequenceActions.SEND)), |
| 55 | + param(4, context.inject(SequenceActions.REJECT)), |
| 56 | + metadata('design:paramtypes', [Function, Function, Function, Function, Function]) |
| 57 | + ], SequenceClass); |
| 58 | + |
| 59 | + return SequenceClass; |
| 60 | +} |
0 commit comments