@uniorganization/uni-lib 4.0.51 → 4.1.2

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.
Files changed (283) hide show
  1. package/dist/entities/active-loads.entity.d.ts +1 -0
  2. package/dist/entities/active-loads.entity.js +4 -0
  3. package/dist/entities/applications.entity.d.ts +1 -0
  4. package/dist/entities/applications.entity.js +4 -0
  5. package/dist/entities/audit.entity.d.ts +1 -0
  6. package/dist/entities/audit.entity.js +4 -0
  7. package/dist/entities/autofail-reasons.entity.d.ts +1 -0
  8. package/dist/entities/autofail-reasons.entity.js +4 -0
  9. package/dist/entities/blacklist.entity.d.ts +1 -0
  10. package/dist/entities/blacklist.entity.js +5 -1
  11. package/dist/entities/bp-alerts.entity.d.ts +1 -0
  12. package/dist/entities/bp-alerts.entity.js +4 -0
  13. package/dist/entities/business-schedule-day.entity.d.ts +1 -0
  14. package/dist/entities/business-schedule-day.entity.js +4 -0
  15. package/dist/entities/business-schedule.entity.d.ts +1 -0
  16. package/dist/entities/business-schedule.entity.js +4 -0
  17. package/dist/entities/call-driver-data.entity.d.ts +1 -0
  18. package/dist/entities/call-driver-data.entity.js +4 -0
  19. package/dist/entities/call-drivers.entity.d.ts +1 -0
  20. package/dist/entities/call-drivers.entity.js +4 -0
  21. package/dist/entities/cb-completed-reasons.entity.d.ts +1 -0
  22. package/dist/entities/cb-completed-reasons.entity.js +4 -0
  23. package/dist/entities/change-alert.entity.d.ts +1 -0
  24. package/dist/entities/change-alert.entity.js +4 -0
  25. package/dist/entities/claim-report.entity.d.ts +1 -0
  26. package/dist/entities/claim-report.entity.js +6 -2
  27. package/dist/entities/client-credential.entity.d.ts +17 -0
  28. package/dist/entities/client-credential.entity.js +87 -0
  29. package/dist/entities/client.entity.d.ts +12 -0
  30. package/dist/entities/client.entity.js +67 -0
  31. package/dist/entities/config.entity.d.ts +1 -0
  32. package/dist/entities/config.entity.js +4 -0
  33. package/dist/entities/contact-search.entity.d.ts +1 -0
  34. package/dist/entities/contact-search.entity.js +17 -13
  35. package/dist/entities/daily-payment-status.entity.d.ts +1 -0
  36. package/dist/entities/daily-payment-status.entity.js +4 -0
  37. package/dist/entities/daily-payment.entity.d.ts +58 -0
  38. package/dist/entities/daily-payment.entity.js +248 -0
  39. package/dist/entities/daily-pending.entity.d.ts +1 -0
  40. package/dist/entities/daily-pending.entity.js +5 -1
  41. package/dist/entities/depreciation-categories.entity.d.ts +1 -0
  42. package/dist/entities/depreciation-categories.entity.js +4 -0
  43. package/dist/entities/depreciation-details.entity.d.ts +1 -0
  44. package/dist/entities/depreciation-details.entity.js +4 -0
  45. package/dist/entities/detail-type.entity.d.ts +1 -0
  46. package/dist/entities/detail-type.entity.js +4 -0
  47. package/dist/entities/dispute-request.entity.d.ts +1 -0
  48. package/dist/entities/dispute-request.entity.js +4 -0
  49. package/dist/entities/enr-calculation-log.entity.d.ts +1 -0
  50. package/dist/entities/enr-calculation-log.entity.js +4 -0
  51. package/dist/entities/enr-inventory.entity.d.ts +1 -0
  52. package/dist/entities/enr-inventory.entity.js +4 -0
  53. package/dist/entities/enr-results.entity.d.ts +1 -0
  54. package/dist/entities/enr-results.entity.js +4 -0
  55. package/dist/entities/escalation-category.entity.d.ts +1 -0
  56. package/dist/entities/escalation-category.entity.js +4 -0
  57. package/dist/entities/escalation-notes.entity.d.ts +1 -0
  58. package/dist/entities/escalation-notes.entity.js +4 -0
  59. package/dist/entities/escalation-outcome.entity.d.ts +1 -0
  60. package/dist/entities/escalation-outcome.entity.js +4 -0
  61. package/dist/entities/escalation-status-log.entity.d.ts +1 -0
  62. package/dist/entities/escalation-status-log.entity.js +4 -0
  63. package/dist/entities/escalation-status.entity.d.ts +1 -0
  64. package/dist/entities/escalation-status.entity.js +4 -0
  65. package/dist/entities/escalation-type.entity.d.ts +1 -0
  66. package/dist/entities/escalation-type.entity.js +4 -0
  67. package/dist/entities/escalations.entity.d.ts +1 -0
  68. package/dist/entities/escalations.entity.js +4 -0
  69. package/dist/entities/evaluation-autofail-reasons.entity.d.ts +1 -0
  70. package/dist/entities/evaluation-autofail-reasons.entity.js +4 -0
  71. package/dist/entities/evaluation-data.entity.d.ts +1 -0
  72. package/dist/entities/evaluation-data.entity.js +4 -0
  73. package/dist/entities/evaluation-forms.entity.d.ts +1 -0
  74. package/dist/entities/evaluation-forms.entity.js +4 -0
  75. package/dist/entities/evaluation-questions.entity.d.ts +1 -0
  76. package/dist/entities/evaluation-questions.entity.js +4 -0
  77. package/dist/entities/evaluations.entity.d.ts +1 -0
  78. package/dist/entities/evaluations.entity.js +4 -0
  79. package/dist/entities/feedback.entity.d.ts +1 -0
  80. package/dist/entities/feedback.entity.js +4 -0
  81. package/dist/entities/file-contents.entity.d.ts +1 -0
  82. package/dist/entities/file-contents.entity.js +4 -0
  83. package/dist/entities/file-type.entity.d.ts +1 -0
  84. package/dist/entities/file-type.entity.js +5 -2
  85. package/dist/entities/file-upload.entity.d.ts +1 -0
  86. package/dist/entities/file-upload.entity.js +4 -0
  87. package/dist/entities/file.entity.d.ts +1 -0
  88. package/dist/entities/file.entity.js +4 -0
  89. package/dist/entities/form-definition.entity.d.ts +1 -0
  90. package/dist/entities/form-definition.entity.js +4 -0
  91. package/dist/entities/form-fields.entity.d.ts +1 -0
  92. package/dist/entities/form-fields.entity.js +4 -0
  93. package/dist/entities/form.entity.d.ts +1 -0
  94. package/dist/entities/form.entity.js +4 -0
  95. package/dist/entities/inbox/agent-extension-backup.entity.d.ts +1 -0
  96. package/dist/entities/inbox/agent-extension-backup.entity.js +10 -2
  97. package/dist/entities/inbox/agent-extension.entity.d.ts +1 -0
  98. package/dist/entities/inbox/agent-extension.entity.js +6 -2
  99. package/dist/entities/inbox/assignment.entity.d.ts +1 -0
  100. package/dist/entities/inbox/assignment.entity.js +5 -3
  101. package/dist/entities/inbox/case-event.entity.d.ts +1 -0
  102. package/dist/entities/inbox/case-event.entity.js +4 -0
  103. package/dist/entities/inbox/case-file.entity.d.ts +1 -0
  104. package/dist/entities/inbox/case-file.entity.js +4 -0
  105. package/dist/entities/inbox/case-link.entity.d.ts +1 -0
  106. package/dist/entities/inbox/case-link.entity.js +4 -0
  107. package/dist/entities/inbox/case-note.entity.d.ts +1 -0
  108. package/dist/entities/inbox/case-note.entity.js +4 -0
  109. package/dist/entities/inbox/case-tag.entity.d.ts +1 -0
  110. package/dist/entities/inbox/case-tag.entity.js +4 -0
  111. package/dist/entities/inbox/case-text.entity.d.ts +1 -0
  112. package/dist/entities/inbox/case-text.entity.js +5 -3
  113. package/dist/entities/inbox/contact-attempt.entity.d.ts +1 -0
  114. package/dist/entities/inbox/contact-attempt.entity.js +4 -0
  115. package/dist/entities/inbox/inbound-message.entity.d.ts +1 -0
  116. package/dist/entities/inbox/inbound-message.entity.js +5 -1
  117. package/dist/entities/inbox/message-case.entity.d.ts +1 -0
  118. package/dist/entities/inbox/message-case.entity.js +9 -3
  119. package/dist/entities/inbox/notification.entity.d.ts +1 -0
  120. package/dist/entities/inbox/notification.entity.js +4 -0
  121. package/dist/entities/inbox/sla-policy.entity.d.ts +1 -0
  122. package/dist/entities/inbox/sla-policy.entity.js +7 -2
  123. package/dist/entities/inbox/tag.entity.d.ts +1 -0
  124. package/dist/entities/inbox/tag.entity.js +7 -2
  125. package/dist/entities/incoterms.entity.d.ts +1 -0
  126. package/dist/entities/incoterms.entity.js +4 -0
  127. package/dist/entities/index.d.ts +2 -0
  128. package/dist/entities/index.js +2 -0
  129. package/dist/entities/inventory.entity.d.ts +1 -0
  130. package/dist/entities/inventory.entity.js +4 -0
  131. package/dist/entities/kenko.entity.d.ts +1 -0
  132. package/dist/entities/kenko.entity.js +4 -0
  133. package/dist/entities/lob-assignment.entity.d.ts +1 -0
  134. package/dist/entities/lob-assignment.entity.js +4 -0
  135. package/dist/entities/lob-call-drivers.entity.d.ts +1 -0
  136. package/dist/entities/lob-call-drivers.entity.js +4 -0
  137. package/dist/entities/location-addresses.entity.d.ts +1 -0
  138. package/dist/entities/location-addresses.entity.js +4 -0
  139. package/dist/entities/ltp-history-transactions.entity.d.ts +1 -0
  140. package/dist/entities/ltp-history-transactions.entity.js +4 -0
  141. package/dist/entities/ltp-stm-roster.entity.d.ts +1 -0
  142. package/dist/entities/ltp-stm-roster.entity.js +4 -0
  143. package/dist/entities/modules-roles.entity.d.ts +1 -0
  144. package/dist/entities/modules-roles.entity.js +4 -0
  145. package/dist/entities/offphone-activities.entity.d.ts +1 -0
  146. package/dist/entities/offphone-activities.entity.js +4 -0
  147. package/dist/entities/onsite-ordering.entity.d.ts +1 -0
  148. package/dist/entities/onsite-ordering.entity.js +4 -0
  149. package/dist/entities/ost.entity.d.ts +1 -0
  150. package/dist/entities/ost.entity.js +4 -0
  151. package/dist/entities/otwe-offers.entity.d.ts +1 -0
  152. package/dist/entities/otwe-offers.entity.js +4 -0
  153. package/dist/entities/outbound-ticket-history.entity.d.ts +1 -0
  154. package/dist/entities/outbound-ticket-history.entity.js +4 -0
  155. package/dist/entities/p1-service-center.entity.d.ts +1 -0
  156. package/dist/entities/p1-service-center.entity.js +4 -0
  157. package/dist/entities/p1-service-network.entity.d.ts +1 -0
  158. package/dist/entities/p1-service-network.entity.js +4 -0
  159. package/dist/entities/pending-ticket-history.entity.d.ts +1 -0
  160. package/dist/entities/pending-ticket-history.entity.js +4 -0
  161. package/dist/entities/product-codes.entity.d.ts +1 -0
  162. package/dist/entities/product-codes.entity.js +4 -0
  163. package/dist/entities/question-group.entity.d.ts +1 -0
  164. package/dist/entities/question-group.entity.js +4 -0
  165. package/dist/entities/questions.entity.d.ts +1 -0
  166. package/dist/entities/questions.entity.js +4 -0
  167. package/dist/entities/raw_roster.entity.d.ts +1 -0
  168. package/dist/entities/raw_roster.entity.js +4 -0
  169. package/dist/entities/regional-service-mgr.entity.d.ts +1 -0
  170. package/dist/entities/regional-service-mgr.entity.js +4 -0
  171. package/dist/entities/role-definition.entity.d.ts +1 -0
  172. package/dist/entities/role-definition.entity.js +4 -0
  173. package/dist/entities/role-privileges.entity.d.ts +1 -0
  174. package/dist/entities/role-privileges.entity.js +4 -0
  175. package/dist/entities/roster-personnel.entity.d.ts +1 -0
  176. package/dist/entities/roster-personnel.entity.js +4 -0
  177. package/dist/entities/sap-raw-data.entity.d.ts +1 -0
  178. package/dist/entities/sap-raw-data.entity.js +4 -0
  179. package/dist/entities/service-center-distance-cache.entity.d.ts +1 -0
  180. package/dist/entities/service-center-distance-cache.entity.js +5 -1
  181. package/dist/entities/service-center-geocode-cache.entity.d.ts +1 -0
  182. package/dist/entities/service-center-geocode-cache.entity.js +5 -1
  183. package/dist/entities/service-center-interaction.entity.d.ts +1 -0
  184. package/dist/entities/service-center-interaction.entity.js +4 -0
  185. package/dist/entities/service-center-phone.entity.d.ts +1 -0
  186. package/dist/entities/service-center-phone.entity.js +4 -0
  187. package/dist/entities/service-center-ranking.entity.d.ts +1 -0
  188. package/dist/entities/service-center-ranking.entity.js +4 -0
  189. package/dist/entities/service-center-review.entity.d.ts +1 -0
  190. package/dist/entities/service-center-review.entity.js +4 -0
  191. package/dist/entities/service-center-unsupported-model.entity.d.ts +1 -0
  192. package/dist/entities/service-center-unsupported-model.entity.js +5 -1
  193. package/dist/entities/service-center.entity.d.ts +1 -0
  194. package/dist/entities/service-center.entity.js +6 -2
  195. package/dist/entities/service-type.entity.d.ts +1 -0
  196. package/dist/entities/service-type.entity.js +4 -0
  197. package/dist/entities/skipped-ticket.entity.d.ts +1 -0
  198. package/dist/entities/skipped-ticket.entity.js +4 -0
  199. package/dist/entities/state.entity.d.ts +1 -0
  200. package/dist/entities/state.entity.js +4 -0
  201. package/dist/entities/template.entity.d.ts +1 -0
  202. package/dist/entities/template.entity.js +4 -0
  203. package/dist/entities/ticket-queue.entity.d.ts +1 -0
  204. package/dist/entities/ticket-queue.entity.js +4 -0
  205. package/dist/entities/ticket-service-center-match-loa-pricing.entity.d.ts +1 -0
  206. package/dist/entities/ticket-service-center-match-loa-pricing.entity.js +4 -0
  207. package/dist/entities/ticket-service-center-match-process.entity.d.ts +1 -0
  208. package/dist/entities/ticket-service-center-match-process.entity.js +4 -0
  209. package/dist/entities/transactions.entity.d.ts +1 -0
  210. package/dist/entities/transactions.entity.js +4 -0
  211. package/dist/entities/user-campaign.entity.d.ts +1 -0
  212. package/dist/entities/user-campaign.entity.js +4 -0
  213. package/dist/entities/user-roles.entity.d.ts +4 -0
  214. package/dist/entities/user-roles.entity.js +22 -3
  215. package/dist/entities/usr.entity.d.ts +1 -0
  216. package/dist/entities/usr.entity.js +4 -0
  217. package/dist/entities/vw-escalation-age.d.ts +1 -0
  218. package/dist/entities/vw-escalation-age.js +4 -0
  219. package/dist/entities/warranty-category.entity.d.ts +1 -0
  220. package/dist/entities/warranty-category.entity.js +4 -0
  221. package/dist/middlewares/index.d.ts +1 -0
  222. package/dist/middlewares/index.js +17 -0
  223. package/dist/middlewares/version-checker.middleware.d.ts +2 -0
  224. package/dist/middlewares/version-checker.middleware.js +27 -0
  225. package/dist/modules/common/common.module.js +5 -4
  226. package/dist/modules/common/jwt-auth.guard.d.ts +5 -2
  227. package/dist/modules/common/jwt-auth.guard.js +20 -12
  228. package/dist/modules/common/jwt.strategy.d.ts +6 -18
  229. package/dist/modules/common/jwt.strategy.js +80 -16
  230. package/dist/modules/common/logged-user.decorator.js +2 -2
  231. package/dist/modules/common/skip-jwt-auth.decorator.d.ts +3 -1
  232. package/dist/modules/common/skip-jwt-auth.decorator.js +5 -2
  233. package/dist/modules/file-storage/file-storage.service.d.ts +5 -1
  234. package/dist/modules/file-storage/file-storage.service.js +64 -10
  235. package/dist/modules/index.d.ts +1 -0
  236. package/dist/modules/index.js +1 -0
  237. package/dist/modules/tenant/current-tenant.decorator.d.ts +1 -0
  238. package/dist/modules/tenant/current-tenant.decorator.js +14 -0
  239. package/dist/modules/tenant/index.d.ts +21 -0
  240. package/dist/modules/tenant/index.js +37 -0
  241. package/dist/modules/tenant/master-tenant.decorator.d.ts +1 -0
  242. package/dist/modules/tenant/master-tenant.decorator.js +7 -0
  243. package/dist/modules/tenant/master-tenant.guard.d.ts +7 -0
  244. package/dist/modules/tenant/master-tenant.guard.js +44 -0
  245. package/dist/modules/tenant/redis-tenant-state.store.d.ts +21 -0
  246. package/dist/modules/tenant/redis-tenant-state.store.js +165 -0
  247. package/dist/modules/tenant/tenant-audit.types.d.ts +15 -0
  248. package/dist/modules/tenant/tenant-audit.types.js +2 -0
  249. package/dist/modules/tenant/tenant-authorization.keys.d.ts +3 -0
  250. package/dist/modules/tenant/tenant-authorization.keys.js +28 -0
  251. package/dist/modules/tenant/tenant-authorization.service.d.ts +24 -0
  252. package/dist/modules/tenant/tenant-authorization.service.js +235 -0
  253. package/dist/modules/tenant/tenant-authorization.store.d.ts +8 -0
  254. package/dist/modules/tenant/tenant-authorization.store.js +4 -0
  255. package/dist/modules/tenant/tenant-authorization.types.d.ts +36 -0
  256. package/dist/modules/tenant/tenant-authorization.types.js +2 -0
  257. package/dist/modules/tenant/tenant-context.errors.d.ts +3 -0
  258. package/dist/modules/tenant/tenant-context.errors.js +10 -0
  259. package/dist/modules/tenant/tenant-context.interceptor.d.ts +9 -0
  260. package/dist/modules/tenant/tenant-context.interceptor.js +69 -0
  261. package/dist/modules/tenant/tenant-context.service.d.ts +15 -0
  262. package/dist/modules/tenant/tenant-context.service.js +56 -0
  263. package/dist/modules/tenant/tenant-context.storage.d.ts +6 -0
  264. package/dist/modules/tenant/tenant-context.storage.js +34 -0
  265. package/dist/modules/tenant/tenant-credential.guard.d.ts +13 -0
  266. package/dist/modules/tenant/tenant-credential.guard.js +119 -0
  267. package/dist/modules/tenant/tenant-ownership.service.d.ts +7 -0
  268. package/dist/modules/tenant/tenant-ownership.service.js +28 -0
  269. package/dist/modules/tenant/tenant-query.helpers.d.ts +12 -0
  270. package/dist/modules/tenant/tenant-query.helpers.js +37 -0
  271. package/dist/modules/tenant/tenant-runner.service.d.ts +7 -0
  272. package/dist/modules/tenant/tenant-runner.service.js +41 -0
  273. package/dist/modules/tenant/tenant-security-state.service.d.ts +11 -0
  274. package/dist/modules/tenant/tenant-security-state.service.js +75 -0
  275. package/dist/modules/tenant/tenant-security-state.store.d.ts +7 -0
  276. package/dist/modules/tenant/tenant-security-state.store.js +4 -0
  277. package/dist/modules/tenant/tenant.constants.d.ts +7 -0
  278. package/dist/modules/tenant/tenant.constants.js +10 -0
  279. package/dist/modules/tenant/tenant.module.d.ts +2 -0
  280. package/dist/modules/tenant/tenant.module.js +70 -0
  281. package/dist/modules/tenant/tenant.types.d.ts +69 -0
  282. package/dist/modules/tenant/tenant.types.js +2 -0
  283. package/package.json +14 -12
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
9
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
10
+ return new (P || (P = Promise))(function (resolve, reject) {
11
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
12
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
13
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
14
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
15
+ });
16
+ };
17
+ var RedisTenantStateStore_1;
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.RedisTenantStateStore = void 0;
20
+ const common_1 = require("@nestjs/common");
21
+ const ioredis_1 = require("ioredis");
22
+ let RedisTenantStateStore = RedisTenantStateStore_1 = class RedisTenantStateStore {
23
+ constructor() {
24
+ this.logger = new common_1.Logger(RedisTenantStateStore_1.name);
25
+ this.client = null;
26
+ }
27
+ get(key) {
28
+ return __awaiter(this, void 0, void 0, function* () {
29
+ const serialized = yield this.execute((client) => client.get(key));
30
+ if (serialized === null) {
31
+ return null;
32
+ }
33
+ const snapshot = JSON.parse(serialized);
34
+ if (!this.isAuthorizationSnapshot(snapshot)) {
35
+ throw new Error('Invalid cached authorization snapshot');
36
+ }
37
+ return snapshot;
38
+ });
39
+ }
40
+ set(key, value, ttlSeconds) {
41
+ return __awaiter(this, void 0, void 0, function* () {
42
+ yield this.execute((client) => client.set(key, JSON.stringify(value), 'EX', ttlSeconds));
43
+ });
44
+ }
45
+ delete(key) {
46
+ return __awaiter(this, void 0, void 0, function* () {
47
+ yield this.execute((client) => client.del(key));
48
+ });
49
+ }
50
+ deleteMany(keys) {
51
+ return __awaiter(this, void 0, void 0, function* () {
52
+ for (let offset = 0; offset < keys.length; offset += 500) {
53
+ const batch = keys.slice(offset, offset + 500);
54
+ yield this.execute((client) => client.del(...batch));
55
+ }
56
+ });
57
+ }
58
+ isRevoked(key) {
59
+ return __awaiter(this, void 0, void 0, function* () {
60
+ return (yield this.execute((client) => client.exists(key))) === 1;
61
+ });
62
+ }
63
+ revoke(key, ttlSeconds) {
64
+ return __awaiter(this, void 0, void 0, function* () {
65
+ yield this.execute((client) => client.set(key, '1', 'EX', ttlSeconds));
66
+ });
67
+ }
68
+ createPreAuth(key, userId, ttlSeconds) {
69
+ return __awaiter(this, void 0, void 0, function* () {
70
+ const result = yield this.execute((client) => client.set(key, String(userId), 'EX', ttlSeconds, 'NX'));
71
+ if (result !== 'OK') {
72
+ throw new Error('Pre-auth security state already exists');
73
+ }
74
+ });
75
+ }
76
+ consumePreAuth(key, userId) {
77
+ return __awaiter(this, void 0, void 0, function* () {
78
+ const result = yield this.execute((client) => client.eval('if redis.call("GET", KEYS[1]) == ARGV[1] then return redis.call("DEL", KEYS[1]) else return 0 end', 1, key, String(userId)));
79
+ return Number(result) === 1;
80
+ });
81
+ }
82
+ onModuleDestroy() {
83
+ return __awaiter(this, void 0, void 0, function* () {
84
+ if (!this.client) {
85
+ return;
86
+ }
87
+ const client = this.client;
88
+ this.client = null;
89
+ try {
90
+ if (client.status === 'ready') {
91
+ yield client.quit();
92
+ }
93
+ else {
94
+ client.disconnect();
95
+ }
96
+ }
97
+ catch (_a) {
98
+ client.disconnect();
99
+ }
100
+ });
101
+ }
102
+ execute(operation) {
103
+ return __awaiter(this, void 0, void 0, function* () {
104
+ const client = this.getClient();
105
+ return operation(client);
106
+ });
107
+ }
108
+ getClient() {
109
+ if (this.client && this.client.status !== 'end') {
110
+ return this.client;
111
+ }
112
+ const url = process.env.TENANT_REDIS_URL || process.env.REDIS_URL;
113
+ const host = process.env.TENANT_REDIS_HOST || process.env.REDIS_HOST;
114
+ if (!url && !host) {
115
+ throw new Error('Tenant Redis is not configured');
116
+ }
117
+ const options = {
118
+ connectTimeout: this.positiveInteger(process.env.TENANT_REDIS_CONNECT_TIMEOUT_MS, 2000),
119
+ maxRetriesPerRequest: 1,
120
+ username: process.env.TENANT_REDIS_USERNAME || process.env.REDIS_USERNAME,
121
+ password: process.env.TENANT_REDIS_PASSWORD || process.env.REDIS_PASSWORD,
122
+ tls: process.env.TENANT_REDIS_TLS === 'true' ? {} : undefined,
123
+ };
124
+ this.client = url
125
+ ? new ioredis_1.default(url, options)
126
+ : new ioredis_1.default(Object.assign(Object.assign({}, options), { host, port: this.positiveInteger(process.env.TENANT_REDIS_PORT || process.env.REDIS_PORT, 6379) }));
127
+ this.client.on('error', () => {
128
+ this.logger.error('Tenant Redis connection is unavailable');
129
+ });
130
+ return this.client;
131
+ }
132
+ positiveInteger(value, fallback) {
133
+ const parsed = Number(value);
134
+ return Number.isInteger(parsed) && parsed > 0 ? parsed : fallback;
135
+ }
136
+ isAuthorizationSnapshot(value) {
137
+ var _a;
138
+ return Boolean(value &&
139
+ Number.isInteger(value.userId) &&
140
+ value.userId > 0 &&
141
+ Number.isInteger(value.homeClientId) &&
142
+ value.homeClientId > 0 &&
143
+ Number.isInteger(value.clientId) &&
144
+ value.clientId > 0 &&
145
+ typeof value.clientName === 'string' &&
146
+ typeof value.clientAlias === 'string' &&
147
+ Array.isArray(value.roles) &&
148
+ value.roles.length > 0 &&
149
+ value.roles.every((role) => Number.isInteger(role.roleId) &&
150
+ role.roleId > 0 &&
151
+ typeof role.roleName === 'string' &&
152
+ Number.isInteger(role.moduleId) &&
153
+ role.moduleId > 0 &&
154
+ typeof role.moduleName === 'string') &&
155
+ Array.isArray(value.privileges) &&
156
+ value.privileges.every((privilege) => typeof privilege === 'string') &&
157
+ ((_a = value.identity) === null || _a === void 0 ? void 0 : _a.id) === value.userId &&
158
+ value.identity.homeClientId === value.homeClientId &&
159
+ typeof value.cachedAt === 'string');
160
+ }
161
+ };
162
+ exports.RedisTenantStateStore = RedisTenantStateStore;
163
+ exports.RedisTenantStateStore = RedisTenantStateStore = RedisTenantStateStore_1 = __decorate([
164
+ (0, common_1.Injectable)()
165
+ ], RedisTenantStateStore);
@@ -0,0 +1,15 @@
1
+ import { TenantAuthenticationType } from './tenant.types';
2
+ export interface TenantAuditMetadata {
3
+ actorUserId: number | null;
4
+ originalClientId: number | null;
5
+ effectiveClientId: number;
6
+ authenticationType: TenantAuthenticationType;
7
+ impersonationReason: string | null;
8
+ correlationId: string;
9
+ service: string;
10
+ operation: string;
11
+ route?: string;
12
+ entityType?: string;
13
+ entityId?: string | number;
14
+ result?: 'success' | 'failure';
15
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,3 @@
1
+ export declare function tenantAuthorizationKey(clientId: number, userId: number): string;
2
+ export declare function revokedAccessTokenKey(jti: string): string;
3
+ export declare function preAuthTokenKey(jti: string): string;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tenantAuthorizationKey = tenantAuthorizationKey;
4
+ exports.revokedAccessTokenKey = revokedAccessTokenKey;
5
+ exports.preAuthTokenKey = preAuthTokenKey;
6
+ const common_1 = require("@nestjs/common");
7
+ const TOKEN_IDENTIFIER = /^[A-Za-z0-9._:-]{1,128}$/;
8
+ function positiveInteger(value, field) {
9
+ if (!Number.isInteger(value) || value <= 0) {
10
+ throw new common_1.UnauthorizedException(`Invalid ${field}`);
11
+ }
12
+ return value;
13
+ }
14
+ function tokenIdentifier(value) {
15
+ if (!TOKEN_IDENTIFIER.test(value || '')) {
16
+ throw new common_1.UnauthorizedException('Invalid token identifier');
17
+ }
18
+ return value;
19
+ }
20
+ function tenantAuthorizationKey(clientId, userId) {
21
+ return `client:${positiveInteger(clientId, 'clientId')}:authz:user:${positiveInteger(userId, 'userId')}`;
22
+ }
23
+ function revokedAccessTokenKey(jti) {
24
+ return `security:access-token:revoked:${tokenIdentifier(jti)}`;
25
+ }
26
+ function preAuthTokenKey(jti) {
27
+ return `security:pre-auth:${tokenIdentifier(jti)}`;
28
+ }
@@ -0,0 +1,24 @@
1
+ import { Repository } from 'typeorm';
2
+ import { Client } from '../../entities/client.entity';
3
+ import { UserRoles } from '../../entities/user-roles.entity';
4
+ import { Users } from '../../entities/usr.entity';
5
+ import { TenantAuthorizationStore } from './tenant-authorization.store';
6
+ import { ResolvedTenantAuthorization } from './tenant-authorization.types';
7
+ export declare const TENANT_AUTHORIZATION_TTL_SECONDS = 60;
8
+ export declare class TenantAuthorizationService {
9
+ private readonly store;
10
+ private readonly userRepository;
11
+ private readonly clientRepository;
12
+ private readonly userRoleRepository;
13
+ private readonly logger;
14
+ constructor(store: TenantAuthorizationStore, userRepository: Repository<Users>, clientRepository: Repository<Client>, userRoleRepository: Repository<UserRoles>);
15
+ resolve(userId: number, clientId: number, expectedHomeClientId: number): Promise<ResolvedTenantAuthorization>;
16
+ resolveImpersonation(userId: number, homeClientId: number, targetClientId: number): Promise<ResolvedTenantAuthorization>;
17
+ invalidate(userId: number, clientId: number): Promise<void>;
18
+ invalidateMany(clientId: number, userIds: readonly number[]): Promise<void>;
19
+ private loadFromDatabase;
20
+ private readCache;
21
+ private writeCache;
22
+ private assertPositiveInteger;
23
+ private isFresh;
24
+ }
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
+ return new (P || (P = Promise))(function (resolve, reject) {
17
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
21
+ });
22
+ };
23
+ var TenantAuthorizationService_1;
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.TenantAuthorizationService = exports.TENANT_AUTHORIZATION_TTL_SECONDS = void 0;
26
+ const common_1 = require("@nestjs/common");
27
+ const typeorm_1 = require("@nestjs/typeorm");
28
+ const typeorm_2 = require("typeorm");
29
+ const client_entity_1 = require("../../entities/client.entity");
30
+ const user_roles_entity_1 = require("../../entities/user-roles.entity");
31
+ const usr_entity_1 = require("../../entities/usr.entity");
32
+ const tenant_constants_1 = require("./tenant.constants");
33
+ const tenant_authorization_keys_1 = require("./tenant-authorization.keys");
34
+ const tenant_authorization_store_1 = require("./tenant-authorization.store");
35
+ exports.TENANT_AUTHORIZATION_TTL_SECONDS = 60;
36
+ let TenantAuthorizationService = TenantAuthorizationService_1 = class TenantAuthorizationService {
37
+ constructor(store, userRepository, clientRepository, userRoleRepository) {
38
+ this.store = store;
39
+ this.userRepository = userRepository;
40
+ this.clientRepository = clientRepository;
41
+ this.userRoleRepository = userRoleRepository;
42
+ this.logger = new common_1.Logger(TenantAuthorizationService_1.name);
43
+ }
44
+ resolve(userId, clientId, expectedHomeClientId) {
45
+ return __awaiter(this, void 0, void 0, function* () {
46
+ var _a;
47
+ this.assertPositiveInteger(userId);
48
+ this.assertPositiveInteger(clientId);
49
+ this.assertPositiveInteger(expectedHomeClientId);
50
+ const key = (0, tenant_authorization_keys_1.tenantAuthorizationKey)(clientId, userId);
51
+ const cached = yield this.readCache(key);
52
+ if (cached &&
53
+ cached.userId === userId &&
54
+ cached.clientId === clientId &&
55
+ cached.homeClientId === expectedHomeClientId &&
56
+ ((_a = cached.identity) === null || _a === void 0 ? void 0 : _a.id) === userId &&
57
+ cached.identity.homeClientId === expectedHomeClientId &&
58
+ this.isFresh(cached.cachedAt) &&
59
+ cached.roles.length > 0) {
60
+ return { identity: cached.identity, snapshot: cached };
61
+ }
62
+ const resolved = yield this.loadFromDatabase(userId, clientId, expectedHomeClientId);
63
+ yield this.writeCache(key, resolved.snapshot);
64
+ return resolved;
65
+ });
66
+ }
67
+ resolveImpersonation(userId, homeClientId, targetClientId) {
68
+ return __awaiter(this, void 0, void 0, function* () {
69
+ if (homeClientId !== tenant_constants_1.NEWTECH_CLIENT_ID ||
70
+ targetClientId === tenant_constants_1.NEWTECH_CLIENT_ID) {
71
+ throw new common_1.UnauthorizedException();
72
+ }
73
+ const origin = yield this.resolve(userId, homeClientId, homeClientId);
74
+ const isNewtechMaster = origin.snapshot.roles.some((role) => role.moduleName.toLowerCase() === 'root' &&
75
+ role.roleName.toLowerCase() === 'sysadmin');
76
+ const targetClient = yield this.clientRepository.findOne({
77
+ where: { id: targetClientId, deletedAt: (0, typeorm_2.IsNull)() },
78
+ });
79
+ if (!isNewtechMaster || !targetClient) {
80
+ throw new common_1.UnauthorizedException();
81
+ }
82
+ const snapshot = {
83
+ userId,
84
+ homeClientId,
85
+ clientId: targetClientId,
86
+ clientName: targetClient.name,
87
+ clientAlias: targetClient.alias,
88
+ roles: [
89
+ {
90
+ roleId: 0,
91
+ roleName: tenant_constants_1.TENANT_IMPERSONATOR_ROLE,
92
+ moduleId: 0,
93
+ moduleName: tenant_constants_1.TENANT_IMPERSONATOR_ROLE,
94
+ },
95
+ ],
96
+ privileges: [],
97
+ identity: origin.identity,
98
+ cachedAt: new Date().toISOString(),
99
+ };
100
+ return { identity: origin.identity, snapshot };
101
+ });
102
+ }
103
+ invalidate(userId, clientId) {
104
+ return __awaiter(this, void 0, void 0, function* () {
105
+ yield this.store.delete((0, tenant_authorization_keys_1.tenantAuthorizationKey)(clientId, userId));
106
+ });
107
+ }
108
+ invalidateMany(clientId, userIds) {
109
+ return __awaiter(this, void 0, void 0, function* () {
110
+ const keys = Array.from(new Set(userIds)).map((userId) => (0, tenant_authorization_keys_1.tenantAuthorizationKey)(clientId, userId));
111
+ if (keys.length > 0) {
112
+ yield this.store.deleteMany(keys);
113
+ }
114
+ });
115
+ }
116
+ loadFromDatabase(userId, clientId, expectedHomeClientId) {
117
+ return __awaiter(this, void 0, void 0, function* () {
118
+ const [user, client, assignments] = yield Promise.all([
119
+ this.userRepository.findOne({ where: { id: userId } }),
120
+ this.clientRepository.findOne({
121
+ where: { id: clientId, deletedAt: (0, typeorm_2.IsNull)() },
122
+ }),
123
+ this.userRoleRepository
124
+ .createQueryBuilder('assignment')
125
+ .innerJoinAndSelect('assignment.role', 'role', 'role.client_id = assignment.client_id')
126
+ .innerJoinAndSelect('role.module', 'module', 'module.is_active = true')
127
+ .leftJoinAndSelect('role.privileges', 'definition', 'definition.client_id = assignment.client_id')
128
+ .leftJoinAndSelect('definition.privilege', 'privilege', 'privilege.client_id = assignment.client_id AND privilege."IS_ACTIVE" <> 0')
129
+ .where('assignment."USER_ID" = :userId', { userId })
130
+ .andWhere('assignment.client_id = :clientId', { clientId })
131
+ .getMany(),
132
+ ]);
133
+ if (!user ||
134
+ !Number(user.is_active) ||
135
+ user.clientId !== expectedHomeClientId ||
136
+ !client ||
137
+ assignments.length === 0) {
138
+ throw new common_1.UnauthorizedException();
139
+ }
140
+ const roles = assignments.map((assignment) => {
141
+ var _a, _b, _c, _d, _e, _f;
142
+ return ({
143
+ roleId: Number(assignment.roleId || ((_a = assignment.role) === null || _a === void 0 ? void 0 : _a.id)),
144
+ roleName: (_b = assignment.role) === null || _b === void 0 ? void 0 : _b.roleName,
145
+ moduleId: Number((_d = (_c = assignment.role) === null || _c === void 0 ? void 0 : _c.module) === null || _d === void 0 ? void 0 : _d.id),
146
+ moduleName: (_f = (_e = assignment.role) === null || _e === void 0 ? void 0 : _e.module) === null || _f === void 0 ? void 0 : _f.moduleName,
147
+ });
148
+ });
149
+ if (roles.some((role) => !Number.isInteger(role.roleId) ||
150
+ role.roleId <= 0 ||
151
+ !role.roleName ||
152
+ !Number.isInteger(role.moduleId) ||
153
+ role.moduleId <= 0 ||
154
+ !role.moduleName)) {
155
+ throw new common_1.UnauthorizedException();
156
+ }
157
+ const privileges = Array.from(new Set(assignments.flatMap((assignment) => {
158
+ var _a;
159
+ return (((_a = assignment.role) === null || _a === void 0 ? void 0 : _a.privileges) || [])
160
+ .map((definition) => { var _a; return (_a = definition.privilege) === null || _a === void 0 ? void 0 : _a.privilege; })
161
+ .filter((privilege) => Boolean(privilege));
162
+ }))).sort();
163
+ const identity = {
164
+ id: user.id,
165
+ homeClientId: user.clientId,
166
+ firstName: user.first_name,
167
+ username: user.username,
168
+ lastName: user.last_name,
169
+ division: user.division,
170
+ lob: user.lob,
171
+ fullName: user.fullName,
172
+ ntgid: user.ntgid,
173
+ profile: user.profile,
174
+ passwordExpired: user.password_expired,
175
+ viewEvaluations: user.viewEvaluations,
176
+ ern: user.ern,
177
+ };
178
+ const snapshot = {
179
+ userId,
180
+ homeClientId: user.clientId,
181
+ clientId,
182
+ clientName: client.name,
183
+ clientAlias: client.alias,
184
+ roles,
185
+ privileges,
186
+ identity,
187
+ cachedAt: new Date().toISOString(),
188
+ };
189
+ return { identity, snapshot };
190
+ });
191
+ }
192
+ readCache(key) {
193
+ return __awaiter(this, void 0, void 0, function* () {
194
+ try {
195
+ return yield this.store.get(key);
196
+ }
197
+ catch (_a) {
198
+ this.logger.warn('Authorization cache read failed; falling back to PostgreSQL');
199
+ return null;
200
+ }
201
+ });
202
+ }
203
+ writeCache(key, snapshot) {
204
+ return __awaiter(this, void 0, void 0, function* () {
205
+ try {
206
+ yield this.store.set(key, snapshot, exports.TENANT_AUTHORIZATION_TTL_SECONDS);
207
+ }
208
+ catch (_a) {
209
+ this.logger.warn('Authorization cache write failed; continuing with PostgreSQL result');
210
+ }
211
+ });
212
+ }
213
+ assertPositiveInteger(value) {
214
+ if (!Number.isInteger(value) || value <= 0) {
215
+ throw new common_1.UnauthorizedException();
216
+ }
217
+ }
218
+ isFresh(cachedAt) {
219
+ const ageMilliseconds = Date.now() - Date.parse(cachedAt);
220
+ return (Number.isFinite(ageMilliseconds) &&
221
+ ageMilliseconds >= 0 &&
222
+ ageMilliseconds <= exports.TENANT_AUTHORIZATION_TTL_SECONDS * 1000);
223
+ }
224
+ };
225
+ exports.TenantAuthorizationService = TenantAuthorizationService;
226
+ exports.TenantAuthorizationService = TenantAuthorizationService = TenantAuthorizationService_1 = __decorate([
227
+ (0, common_1.Injectable)(),
228
+ __param(0, (0, common_1.Inject)(tenant_authorization_store_1.TENANT_AUTHORIZATION_STORE)),
229
+ __param(1, (0, typeorm_1.InjectRepository)(usr_entity_1.Users)),
230
+ __param(2, (0, typeorm_1.InjectRepository)(client_entity_1.Client)),
231
+ __param(3, (0, typeorm_1.InjectRepository)(user_roles_entity_1.UserRoles)),
232
+ __metadata("design:paramtypes", [Object, typeorm_2.Repository,
233
+ typeorm_2.Repository,
234
+ typeorm_2.Repository])
235
+ ], TenantAuthorizationService);
@@ -0,0 +1,8 @@
1
+ import { TenantAuthorizationSnapshot } from './tenant-authorization.types';
2
+ export declare const TENANT_AUTHORIZATION_STORE: unique symbol;
3
+ export interface TenantAuthorizationStore {
4
+ get(key: string): Promise<TenantAuthorizationSnapshot | null>;
5
+ set(key: string, value: TenantAuthorizationSnapshot, ttlSeconds: number): Promise<void>;
6
+ delete(key: string): Promise<void>;
7
+ deleteMany(keys: readonly string[]): Promise<void>;
8
+ }
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TENANT_AUTHORIZATION_STORE = void 0;
4
+ exports.TENANT_AUTHORIZATION_STORE = Symbol('TENANT_AUTHORIZATION_STORE');
@@ -0,0 +1,36 @@
1
+ export interface TenantRoleAuthorization {
2
+ roleId: number;
3
+ roleName: string;
4
+ moduleId: number;
5
+ moduleName: string;
6
+ }
7
+ export interface TenantAuthorizationSnapshot {
8
+ userId: number;
9
+ homeClientId: number;
10
+ clientId: number;
11
+ clientName: string;
12
+ clientAlias: string;
13
+ roles: TenantRoleAuthorization[];
14
+ privileges: string[];
15
+ identity: TenantAuthorizationIdentity;
16
+ cachedAt: string;
17
+ }
18
+ export interface TenantAuthorizationIdentity {
19
+ id: number;
20
+ homeClientId: number;
21
+ firstName?: string;
22
+ username?: string;
23
+ lastName?: string;
24
+ division?: string;
25
+ lob?: string;
26
+ fullName?: string;
27
+ ntgid?: string;
28
+ profile?: string;
29
+ passwordExpired?: number;
30
+ viewEvaluations?: boolean;
31
+ ern?: string;
32
+ }
33
+ export interface ResolvedTenantAuthorization {
34
+ identity: TenantAuthorizationIdentity;
35
+ snapshot: TenantAuthorizationSnapshot;
36
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,3 @@
1
+ export declare class MissingTenantContextError extends Error {
2
+ constructor();
3
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MissingTenantContextError = void 0;
4
+ class MissingTenantContextError extends Error {
5
+ constructor() {
6
+ super('Tenant context is required for this operation');
7
+ this.name = MissingTenantContextError.name;
8
+ }
9
+ }
10
+ exports.MissingTenantContextError = MissingTenantContextError;
@@ -0,0 +1,9 @@
1
+ import { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common';
2
+ import { Observable } from 'rxjs';
3
+ import { TenantContextStorage } from './tenant-context.storage';
4
+ export declare class TenantContextInterceptor implements NestInterceptor {
5
+ private readonly tenantContextStorage;
6
+ constructor(tenantContextStorage: TenantContextStorage);
7
+ intercept(context: ExecutionContext, next: CallHandler): Observable<unknown>;
8
+ private fromAuthenticatedUser;
9
+ }
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.TenantContextInterceptor = void 0;
13
+ const crypto_1 = require("crypto");
14
+ const common_1 = require("@nestjs/common");
15
+ const rxjs_1 = require("rxjs");
16
+ const tenant_context_storage_1 = require("./tenant-context.storage");
17
+ let TenantContextInterceptor = class TenantContextInterceptor {
18
+ constructor(tenantContextStorage) {
19
+ this.tenantContextStorage = tenantContextStorage;
20
+ }
21
+ intercept(context, next) {
22
+ if (context.getType() !== 'http') {
23
+ return next.handle();
24
+ }
25
+ const request = context.switchToHttp().getRequest();
26
+ const state = request.tenantContext || this.fromAuthenticatedUser(request);
27
+ if (!state) {
28
+ return next.handle();
29
+ }
30
+ request.tenantContext = Object.freeze(state);
31
+ return new rxjs_1.Observable((subscriber) => {
32
+ const subscription = this.tenantContextStorage.run(state, () => next.handle().subscribe(subscriber));
33
+ return () => subscription.unsubscribe();
34
+ });
35
+ }
36
+ fromAuthenticatedUser(request) {
37
+ var _a, _b, _c, _d;
38
+ if (!request.user || request.user === true) {
39
+ return undefined;
40
+ }
41
+ const user = request.user;
42
+ if (!Number.isInteger(user.clientId) || user.clientId <= 0) {
43
+ throw new common_1.UnauthorizedException();
44
+ }
45
+ const correlationHeader = (_a = request.headers) === null || _a === void 0 ? void 0 : _a['x-correlation-id'];
46
+ const presentedCorrelationId = Array.isArray(correlationHeader)
47
+ ? correlationHeader[0]
48
+ : correlationHeader;
49
+ const correlationId = presentedCorrelationId &&
50
+ /^[A-Za-z0-9._:-]{1,128}$/.test(presentedCorrelationId)
51
+ ? presentedCorrelationId
52
+ : (0, crypto_1.randomUUID)();
53
+ return {
54
+ clientId: user.clientId,
55
+ originalClientId: (_b = user.originalClientId) !== null && _b !== void 0 ? _b : null,
56
+ actorUserId: user.id,
57
+ authenticationType: 'jwt',
58
+ impersonatedAt: (_c = user.impersonatedAt) !== null && _c !== void 0 ? _c : null,
59
+ impersonationReason: (_d = user.impersonationReason) !== null && _d !== void 0 ? _d : null,
60
+ correlationId,
61
+ roles: user.roles || [],
62
+ };
63
+ }
64
+ };
65
+ exports.TenantContextInterceptor = TenantContextInterceptor;
66
+ exports.TenantContextInterceptor = TenantContextInterceptor = __decorate([
67
+ (0, common_1.Injectable)(),
68
+ __metadata("design:paramtypes", [tenant_context_storage_1.TenantContextStorage])
69
+ ], TenantContextInterceptor);
@@ -0,0 +1,15 @@
1
+ import { TenantContextStorage } from './tenant-context.storage';
2
+ import { TenantAuthenticationType, TenantContextState } from './tenant.types';
3
+ export declare class TenantContext {
4
+ private readonly storage;
5
+ constructor(storage: TenantContextStorage);
6
+ getState(): Readonly<TenantContextState>;
7
+ tryGetState(): Readonly<TenantContextState> | undefined;
8
+ getClientId(): number;
9
+ getOriginalClientId(): number | null;
10
+ getActorUserId(): number | null;
11
+ getAuthenticationType(): TenantAuthenticationType;
12
+ getImpersonationReason(): string | null;
13
+ getCorrelationId(): string;
14
+ isImpersonating(): boolean;
15
+ }