@open-norantec/herbal 1.0.2-alpha.7 → 1.0.2-alpha.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,3 @@
1
1
  export * from './auth-adapter.decorator';
2
2
  export * from './client-groups.decorator';
3
+ export * from './no-transaction.decorator';
@@ -16,3 +16,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./auth-adapter.decorator"), exports);
18
18
  __exportStar(require("./client-groups.decorator"), exports);
19
+ __exportStar(require("./no-transaction.decorator"), exports);
@@ -0,0 +1,5 @@
1
+ import 'reflect-metadata';
2
+ export declare function NoTransaction(): PropertyDecorator;
3
+ export declare namespace NoTransaction {
4
+ var isDisabled: (target: object, propertyKey: string) => boolean;
5
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NoTransaction = void 0;
4
+ require("reflect-metadata");
5
+ var _ = require("lodash");
6
+ var TRANSACTION_DISABLED = Symbol();
7
+ function NoTransaction() {
8
+ return function (target, propertyKey) {
9
+ Reflect.defineMetadata(TRANSACTION_DISABLED, true, target, propertyKey);
10
+ };
11
+ }
12
+ exports.NoTransaction = NoTransaction;
13
+ NoTransaction.isDisabled = function (target, propertyKey) {
14
+ var result = _.attempt(function () { return Reflect.getMetadata(TRANSACTION_DISABLED, target, propertyKey); });
15
+ return result === true;
16
+ };
@@ -86,6 +86,7 @@ var rxjs_1 = require("rxjs");
86
86
  var operators_1 = require("rxjs/operators");
87
87
  var logger_service_1 = require("../modules/logger/logger.service");
88
88
  var sequelize_typescript_1 = require("sequelize-typescript");
89
+ var decorators_1 = require("../decorators");
89
90
  var IS_CONTROLLER = Symbol();
90
91
  function isHerbalController(target) {
91
92
  return _.attempt(function () { return Reflect.getMetadata(IS_CONTROLLER, target.prototype); }) === true;
@@ -156,19 +157,13 @@ function HerbalGuard(options) {
156
157
  var _a, e_1, _b, _c;
157
158
  var _d, _e, _f, _g, _h, _j, _k;
158
159
  return __awaiter(this, void 0, void 0, function () {
159
- var sequelizeInstance, transaction, request, response, traceId, chunks, _l, request_1, request_1_1, chunk, e_1_1, _m, parsedBody, handlerName, authAdapters, _i, authAdapters_1, AuthAdapterClass, adapter, authenticateResult, error_1, _o;
160
+ var sequelizeInstance, transaction, request, response, traceId, chunks, _l, request_1, request_1_1, chunk, e_1_1, _m, parsedBody, rawHandlerName, handlerPropertype, handlerName, authAdapters, e_2, _i, authAdapters_1, AuthAdapterClass, adapter, authenticateResult, error_1, _o;
160
161
  var _this = this;
161
162
  return __generator(this, function (_p) {
162
163
  switch (_p.label) {
163
164
  case 0:
164
165
  sequelizeInstance = _.attempt(function () { return _this.ref.get(sequelize_typescript_1.Sequelize, { strict: false }); });
165
166
  transaction = undefined;
166
- if (!!(sequelizeInstance instanceof Error)) return [3, 2];
167
- return [4, ((_e = (_d = sequelizeInstance === null || sequelizeInstance === void 0 ? void 0 : sequelizeInstance.transaction) === null || _d === void 0 ? void 0 : _d.call(sequelizeInstance)) === null || _e === void 0 ? void 0 : _e.catch(function () { return Promise.resolve(undefined); }))];
168
- case 1:
169
- transaction = _p.sent();
170
- _p.label = 2;
171
- case 2:
172
167
  request = context.switchToHttp().getRequest();
173
168
  response = context.switchToHttp().getResponse();
174
169
  traceId = typeof (options === null || options === void 0 ? void 0 : options.getTraceId) === 'function'
@@ -178,50 +173,49 @@ function HerbalGuard(options) {
178
173
  traceId = uuid_util_class_1.UUIDUtil.generateV4();
179
174
  request.traceId = traceId;
180
175
  request.methodName = request.url.split('/').pop();
181
- request.transaction = transaction;
182
176
  response.setHeader(headers_constant_1.HEADERS.TRACE_ID, traceId);
183
177
  chunks = [];
178
+ _p.label = 1;
179
+ case 1:
180
+ _p.trys.push([1, 14, , 15]);
181
+ _p.label = 2;
182
+ case 2:
183
+ _p.trys.push([2, 7, 8, 13]);
184
+ _l = true, request_1 = __asyncValues(request);
184
185
  _p.label = 3;
185
- case 3:
186
- _p.trys.push([3, 16, , 17]);
187
- _p.label = 4;
186
+ case 3: return [4, request_1.next()];
188
187
  case 4:
189
- _p.trys.push([4, 9, 10, 15]);
190
- _l = true, request_1 = __asyncValues(request);
191
- _p.label = 5;
192
- case 5: return [4, request_1.next()];
193
- case 6:
194
- if (!(request_1_1 = _p.sent(), _a = request_1_1.done, !_a)) return [3, 8];
188
+ if (!(request_1_1 = _p.sent(), _a = request_1_1.done, !_a)) return [3, 6];
195
189
  _c = request_1_1.value;
196
190
  _l = false;
197
191
  chunk = _c;
198
192
  chunks.push(chunk);
199
- _p.label = 7;
200
- case 7:
193
+ _p.label = 5;
194
+ case 5:
201
195
  _l = true;
202
- return [3, 5];
203
- case 8: return [3, 15];
204
- case 9:
196
+ return [3, 3];
197
+ case 6: return [3, 13];
198
+ case 7:
205
199
  e_1_1 = _p.sent();
206
200
  e_1 = { error: e_1_1 };
207
- return [3, 15];
208
- case 10:
209
- _p.trys.push([10, , 13, 14]);
210
- if (!(!_l && !_a && (_b = request_1.return))) return [3, 12];
201
+ return [3, 13];
202
+ case 8:
203
+ _p.trys.push([8, , 11, 12]);
204
+ if (!(!_l && !_a && (_b = request_1.return))) return [3, 10];
211
205
  return [4, _b.call(request_1)];
212
- case 11:
206
+ case 9:
213
207
  _p.sent();
214
- _p.label = 12;
215
- case 12: return [3, 14];
216
- case 13:
208
+ _p.label = 10;
209
+ case 10: return [3, 12];
210
+ case 11:
217
211
  if (e_1) throw e_1.error;
218
212
  return [7];
219
- case 14: return [7];
220
- case 15: return [3, 17];
221
- case 16:
213
+ case 12: return [7];
214
+ case 13: return [3, 15];
215
+ case 14:
222
216
  _m = _p.sent();
223
- return [3, 17];
224
- case 17:
217
+ return [3, 15];
218
+ case 15:
225
219
  parsedBody = _.attempt(function () { return Buffer.concat(chunks).toString('utf8'); });
226
220
  if (!(parsedBody instanceof Error)) {
227
221
  request.rawBody = parsedBody;
@@ -230,47 +224,68 @@ function HerbalGuard(options) {
230
224
  request.rawBody = null;
231
225
  }
232
226
  _.attempt(function () { return _this.getLogger().log("[trace:".concat(request === null || request === void 0 ? void 0 : request.traceId, ":request:body] ").concat(request.rawBody)); });
233
- handlerName = (_g = (_f = context === null || context === void 0 ? void 0 : context.getHandler) === null || _f === void 0 ? void 0 : _f.call(context)) === null || _g === void 0 ? void 0 : _g.name;
234
- authAdapters = auth_adapter_decorator_1.AuthAdapters.getAdapters((_j = (_h = context === null || context === void 0 ? void 0 : context.getClass) === null || _h === void 0 ? void 0 : _h.call(context)) === null || _j === void 0 ? void 0 : _j.prototype, string_util_class_1.StringUtil.isFalsyString(handlerName) ? request.methodName : handlerName);
235
- _p.label = 18;
227
+ rawHandlerName = (_e = (_d = context === null || context === void 0 ? void 0 : context.getHandler) === null || _d === void 0 ? void 0 : _d.call(context)) === null || _e === void 0 ? void 0 : _e.name;
228
+ handlerPropertype = (_g = (_f = context === null || context === void 0 ? void 0 : context.getClass) === null || _f === void 0 ? void 0 : _f.call(context)) === null || _g === void 0 ? void 0 : _g.prototype;
229
+ handlerName = string_util_class_1.StringUtil.isFalsyString(rawHandlerName) ? request.methodName : rawHandlerName;
230
+ authAdapters = auth_adapter_decorator_1.AuthAdapters.getAdapters(handlerPropertype, handlerName);
231
+ if (!(!(sequelizeInstance instanceof Error) && !decorators_1.NoTransaction.isDisabled(handlerPropertype, handlerName))) return [3, 20];
232
+ _p.label = 16;
233
+ case 16:
234
+ _p.trys.push([16, 18, , 19]);
235
+ return [4, ((_j = (_h = sequelizeInstance === null || sequelizeInstance === void 0 ? void 0 : sequelizeInstance.transaction) === null || _h === void 0 ? void 0 : _h.call(sequelizeInstance)) === null || _j === void 0 ? void 0 : _j.catch(function () { return Promise.resolve(undefined); }))];
236
+ case 17:
237
+ transaction = _p.sent();
238
+ request.transaction = transaction;
239
+ this.getLogger().log("[trace:".concat(request === null || request === void 0 ? void 0 : request.traceId, ":transaction] Started transaction for route: ").concat(handlerName));
240
+ return [3, 19];
236
241
  case 18:
237
- _p.trys.push([18, 24, , 29]);
238
- if (!(Array.isArray(authAdapters) && authAdapters.length > 0)) return [3, 23];
242
+ e_2 = _p.sent();
243
+ this.getLogger().error("[trace:".concat(request === null || request === void 0 ? void 0 : request.traceId, ":transaction] Failed to start transaction: ").concat(e_2 === null || e_2 === void 0 ? void 0 : e_2.message, "\n").concat(e_2 === null || e_2 === void 0 ? void 0 : e_2.stack));
244
+ return [3, 19];
245
+ case 19: return [3, 21];
246
+ case 20:
247
+ if (decorators_1.NoTransaction.isDisabled(handlerPropertype, handlerName)) {
248
+ this.getLogger().log("[trace:".concat(request === null || request === void 0 ? void 0 : request.traceId, ":transaction] Transaction is disabled for this route: ").concat(handlerName));
249
+ }
250
+ _p.label = 21;
251
+ case 21:
252
+ _p.trys.push([21, 27, , 32]);
253
+ if (!(Array.isArray(authAdapters) && authAdapters.length > 0)) return [3, 26];
239
254
  _i = 0, authAdapters_1 = authAdapters;
240
- _p.label = 19;
241
- case 19:
242
- if (!(_i < authAdapters_1.length)) return [3, 22];
255
+ _p.label = 22;
256
+ case 22:
257
+ if (!(_i < authAdapters_1.length)) return [3, 25];
243
258
  AuthAdapterClass = authAdapters_1[_i];
244
259
  adapter = new AuthAdapterClass(request, this.ref);
245
260
  if (!adapter.match())
246
- return [3, 21];
261
+ return [3, 24];
247
262
  return [4, adapter.authenticate(transaction)];
248
- case 20:
263
+ case 23:
249
264
  authenticateResult = _p.sent();
250
265
  if (!authenticateResult)
251
- return [3, 22];
266
+ return [3, 25];
252
267
  request.authenticateResult = __assign({ AuthenticatorClass: AuthAdapterClass }, authenticateResult);
253
268
  return [2, true];
254
- case 21:
255
- _i++;
256
- return [3, 19];
257
- case 22: throw new common_2.UnauthorizedException();
258
- case 23: return [3, 29];
259
269
  case 24:
270
+ _i++;
271
+ return [3, 22];
272
+ case 25: throw new common_2.UnauthorizedException();
273
+ case 26: return [3, 32];
274
+ case 27:
260
275
  error_1 = _p.sent();
261
- _p.label = 25;
262
- case 25:
263
- _p.trys.push([25, 27, , 28]);
276
+ _p.label = 28;
277
+ case 28:
278
+ _p.trys.push([28, 30, , 31]);
264
279
  this.getLogger().error("Got error when handling route: ".concat(error_1 === null || error_1 === void 0 ? void 0 : error_1.message, " ").concat(error_1 === null || error_1 === void 0 ? void 0 : error_1.stack));
265
280
  return [4, ((_k = transaction === null || transaction === void 0 ? void 0 : transaction.rollback) === null || _k === void 0 ? void 0 : _k.call(transaction))];
266
- case 26:
281
+ case 29:
267
282
  _p.sent();
268
- return [3, 28];
269
- case 27:
283
+ return [3, 31];
284
+ case 30:
270
285
  _o = _p.sent();
271
- return [3, 28];
272
- case 28: throw error_1;
273
- case 29: return [2, true];
286
+ return [3, 31];
287
+ case 31: throw error_1;
288
+ case 32: return [2, true];
274
289
  }
275
290
  });
276
291
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-norantec/herbal",
3
- "version": "1.0.2-alpha.7",
3
+ "version": "1.0.2-alpha.9",
4
4
  "description": "Herbal is a builder and toolchain for Nest.js applications",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {