@flusys/nestjs-auth 7.1.0 → 8.0.0-beta.1

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 (270) hide show
  1. package/README.md +1 -1
  2. package/config/index.d.ts +3 -3
  3. package/config/message-keys.d.ts +2 -0
  4. package/controllers/authentication.controller.d.ts +5 -5
  5. package/controllers/branch.controller.d.ts +2 -2
  6. package/controllers/company-selection.controller.d.ts +4 -4
  7. package/controllers/company.controller.d.ts +2 -2
  8. package/controllers/email-verification.controller.d.ts +6 -6
  9. package/controllers/index.d.ts +9 -9
  10. package/controllers/social-auth-config.controller.d.ts +2 -2
  11. package/controllers/social-auth.controller.d.ts +3 -3
  12. package/controllers/user-permission.controller.d.ts +5 -4
  13. package/controllers/user.controller.d.ts +7 -7
  14. package/docs/auth-swagger.config.d.ts +2 -2
  15. package/docs/index.d.ts +1 -1
  16. package/dtos/index.d.ts +6 -6
  17. package/dtos/social-auth.dto.d.ts +1 -1
  18. package/entities/company-branch.entity.d.ts +1 -1
  19. package/entities/company.entity.d.ts +1 -1
  20. package/entities/index.d.ts +14 -14
  21. package/entities/pending-registration.entity.d.ts +1 -1
  22. package/entities/user-company-permission.entity.d.ts +4 -4
  23. package/enums/index.d.ts +2 -2
  24. package/fesm/118.js +1230 -0
  25. package/fesm/120.js +2197 -0
  26. package/fesm/24.js +4389 -0
  27. package/fesm/370.js +1163 -0
  28. package/fesm/446.js +877 -0
  29. package/fesm/chunks/117.js +69 -0
  30. package/fesm/config/index.js +244 -3
  31. package/fesm/controllers/index.js +27 -9
  32. package/fesm/docs/index.js +479 -1
  33. package/fesm/dtos/index.js +123 -6
  34. package/fesm/entities/index.js +68 -22
  35. package/fesm/enums/index.js +53 -2
  36. package/fesm/helpers/index.js +115 -2
  37. package/fesm/index.js +1437 -13
  38. package/fesm/interceptors/index.js +508 -2
  39. package/fesm/interfaces/index.js +75 -8
  40. package/fesm/modules/index.js +546 -1
  41. package/fesm/runtime.js +134 -0
  42. package/fesm/services/index.js +67 -11
  43. package/helpers/auth-response.mapper.d.ts +3 -3
  44. package/helpers/index.d.ts +2 -2
  45. package/helpers/token.helper.d.ts +2 -2
  46. package/index.d.ts +13 -13
  47. package/interceptors/clear-token.interceptor.d.ts +2 -2
  48. package/interceptors/index.d.ts +2 -2
  49. package/interceptors/set-token.interceptor.d.ts +2 -2
  50. package/interfaces/auth-module-options.interface.d.ts +3 -3
  51. package/interfaces/authentication.interface.d.ts +3 -3
  52. package/interfaces/company-branch.interface.d.ts +2 -2
  53. package/interfaces/company.interface.d.ts +1 -1
  54. package/interfaces/index.d.ts +8 -8
  55. package/interfaces/social-auth.interface.d.ts +2 -2
  56. package/interfaces/user-enricher.interface.d.ts +3 -3
  57. package/modules/auth.module.d.ts +4 -4
  58. package/modules/index.d.ts +1 -1
  59. package/package.json +32 -39
  60. package/providers/facebook.social-provider.d.ts +2 -2
  61. package/providers/google.social-provider.d.ts +2 -2
  62. package/providers/index.d.ts +1 -1
  63. package/providers/linkedin.social-provider.d.ts +2 -2
  64. package/providers/microsoft.social-provider.d.ts +2 -2
  65. package/providers/social-provider.registry.d.ts +2 -2
  66. package/services/auth-config.service.d.ts +3 -3
  67. package/services/auth-datasource.provider.d.ts +3 -3
  68. package/services/auth-email.service.d.ts +3 -3
  69. package/services/authentication.service.d.ts +12 -12
  70. package/services/branch.service.d.ts +7 -7
  71. package/services/company.service.d.ts +6 -6
  72. package/services/index.d.ts +11 -11
  73. package/services/social-auth-config.service.d.ts +6 -6
  74. package/services/social-auth.service.d.ts +5 -5
  75. package/services/user-permission.service.d.ts +8 -4
  76. package/services/user.service.d.ts +7 -7
  77. package/strategies/jwt.strategy.d.ts +4 -4
  78. package/validators/password.validator.d.ts +1 -1
  79. package/cjs/config/auth.constants.js +0 -49
  80. package/cjs/config/event-actions.js +0 -47
  81. package/cjs/config/index.js +0 -20
  82. package/cjs/config/message-keys.js +0 -135
  83. package/cjs/controllers/authentication.controller.js +0 -427
  84. package/cjs/controllers/authentication.controller.spec.js +0 -219
  85. package/cjs/controllers/branch.controller.js +0 -102
  86. package/cjs/controllers/branch.controller.spec.js +0 -134
  87. package/cjs/controllers/company-selection.controller.js +0 -198
  88. package/cjs/controllers/company-selection.controller.spec.js +0 -84
  89. package/cjs/controllers/company.controller.js +0 -102
  90. package/cjs/controllers/company.controller.spec.js +0 -131
  91. package/cjs/controllers/email-verification.controller.js +0 -224
  92. package/cjs/controllers/email-verification.controller.spec.js +0 -142
  93. package/cjs/controllers/index.js +0 -26
  94. package/cjs/controllers/social-auth-config.controller.js +0 -107
  95. package/cjs/controllers/social-auth.controller.js +0 -175
  96. package/cjs/controllers/social-auth.controller.spec.js +0 -79
  97. package/cjs/controllers/user-permission.controller.js +0 -223
  98. package/cjs/controllers/user-permission.controller.spec.js +0 -138
  99. package/cjs/controllers/user.controller.js +0 -438
  100. package/cjs/controllers/user.controller.spec.js +0 -204
  101. package/cjs/docs/auth-swagger.config.js +0 -461
  102. package/cjs/docs/auth-swagger.config.spec.js +0 -130
  103. package/cjs/docs/index.js +0 -18
  104. package/cjs/dtos/authentication.dto.js +0 -755
  105. package/cjs/dtos/company-branch.dto.js +0 -294
  106. package/cjs/dtos/company.dto.js +0 -298
  107. package/cjs/dtos/index.js +0 -23
  108. package/cjs/dtos/social-auth.dto.js +0 -318
  109. package/cjs/dtos/user-permission.dto.js +0 -358
  110. package/cjs/dtos/user.dto.js +0 -413
  111. package/cjs/entities/app-user.entity.js +0 -25
  112. package/cjs/entities/company-branch.entity.js +0 -163
  113. package/cjs/entities/company.entity.js +0 -146
  114. package/cjs/entities/index.js +0 -67
  115. package/cjs/entities/index.spec.js +0 -84
  116. package/cjs/entities/pending-registration.entity.js +0 -135
  117. package/cjs/entities/social-auth-config.entity.js +0 -102
  118. package/cjs/entities/user-company-permission.entity.js +0 -153
  119. package/cjs/entities/user-token.entity.js +0 -120
  120. package/cjs/enums/index.js +0 -19
  121. package/cjs/enums/social-provider-type.enum.js +0 -17
  122. package/cjs/enums/user-org-permission-type.enum.js +0 -15
  123. package/cjs/helpers/auth-response.mapper.js +0 -46
  124. package/cjs/helpers/auth-response.mapper.spec.js +0 -139
  125. package/cjs/helpers/index.js +0 -19
  126. package/cjs/helpers/token.helper.js +0 -58
  127. package/cjs/helpers/token.helper.spec.js +0 -86
  128. package/cjs/index.js +0 -30
  129. package/cjs/interceptors/clear-token.interceptor.js +0 -73
  130. package/cjs/interceptors/clear-token.interceptor.spec.js +0 -107
  131. package/cjs/interceptors/index.js +0 -19
  132. package/cjs/interceptors/set-token.interceptor.js +0 -107
  133. package/cjs/interceptors/set-token.interceptor.spec.js +0 -165
  134. package/cjs/interfaces/auth-email-provider.interface.js +0 -45
  135. package/cjs/interfaces/auth-module-options.interface.js +0 -4
  136. package/cjs/interfaces/authentication.interface.js +0 -4
  137. package/cjs/interfaces/company-branch.interface.js +0 -4
  138. package/cjs/interfaces/company.interface.js +0 -4
  139. package/cjs/interfaces/index.js +0 -25
  140. package/cjs/interfaces/social-auth.interface.js +0 -4
  141. package/cjs/interfaces/user-enricher.interface.js +0 -4
  142. package/cjs/interfaces/user.interface.js +0 -4
  143. package/cjs/modules/auth.module.js +0 -208
  144. package/cjs/modules/auth.module.spec.js +0 -258
  145. package/cjs/modules/index.js +0 -18
  146. package/cjs/providers/facebook.social-provider.js +0 -73
  147. package/cjs/providers/google.social-provider.js +0 -68
  148. package/cjs/providers/index.js +0 -18
  149. package/cjs/providers/linkedin.social-provider.js +0 -66
  150. package/cjs/providers/microsoft.social-provider.js +0 -78
  151. package/cjs/providers/oauth-http.util.js +0 -107
  152. package/cjs/providers/social-provider.registry.js +0 -24
  153. package/cjs/providers/social-provider.registry.spec.js +0 -135
  154. package/cjs/services/auth-config.service.js +0 -113
  155. package/cjs/services/auth-config.service.spec.js +0 -100
  156. package/cjs/services/auth-datasource.provider.js +0 -138
  157. package/cjs/services/auth-datasource.provider.spec.js +0 -191
  158. package/cjs/services/auth-email.service.js +0 -539
  159. package/cjs/services/auth-email.service.spec.js +0 -456
  160. package/cjs/services/authentication.service.js +0 -1203
  161. package/cjs/services/authentication.service.spec.js +0 -1020
  162. package/cjs/services/branch.service.js +0 -153
  163. package/cjs/services/branch.service.spec.js +0 -169
  164. package/cjs/services/company-selection-session.service.js +0 -121
  165. package/cjs/services/company-selection-session.service.spec.js +0 -90
  166. package/cjs/services/company.service.js +0 -140
  167. package/cjs/services/company.service.spec.js +0 -127
  168. package/cjs/services/index.js +0 -28
  169. package/cjs/services/social-auth-config.service.js +0 -103
  170. package/cjs/services/social-auth-config.service.spec.js +0 -71
  171. package/cjs/services/social-auth.service.js +0 -310
  172. package/cjs/services/social-auth.service.spec.js +0 -310
  173. package/cjs/services/user-permission.service.js +0 -236
  174. package/cjs/services/user-permission.service.spec.js +0 -254
  175. package/cjs/services/user.service.js +0 -671
  176. package/cjs/services/user.service.spec.js +0 -718
  177. package/cjs/strategies/jwt.strategy.js +0 -140
  178. package/cjs/strategies/jwt.strategy.spec.js +0 -166
  179. package/cjs/validators/password.validator.js +0 -45
  180. package/cjs/validators/password.validator.spec.js +0 -161
  181. package/fesm/config/auth.constants.js +0 -14
  182. package/fesm/config/event-actions.js +0 -26
  183. package/fesm/config/message-keys.js +0 -99
  184. package/fesm/controllers/authentication.controller.js +0 -417
  185. package/fesm/controllers/authentication.controller.spec.js +0 -215
  186. package/fesm/controllers/branch.controller.js +0 -92
  187. package/fesm/controllers/branch.controller.spec.js +0 -130
  188. package/fesm/controllers/company-selection.controller.js +0 -188
  189. package/fesm/controllers/company-selection.controller.spec.js +0 -80
  190. package/fesm/controllers/company.controller.js +0 -92
  191. package/fesm/controllers/company.controller.spec.js +0 -127
  192. package/fesm/controllers/email-verification.controller.js +0 -214
  193. package/fesm/controllers/email-verification.controller.spec.js +0 -138
  194. package/fesm/controllers/social-auth-config.controller.js +0 -97
  195. package/fesm/controllers/social-auth.controller.js +0 -165
  196. package/fesm/controllers/social-auth.controller.spec.js +0 -75
  197. package/fesm/controllers/user-permission.controller.js +0 -213
  198. package/fesm/controllers/user-permission.controller.spec.js +0 -134
  199. package/fesm/controllers/user.controller.js +0 -428
  200. package/fesm/controllers/user.controller.spec.js +0 -200
  201. package/fesm/docs/auth-swagger.config.js +0 -454
  202. package/fesm/docs/auth-swagger.config.spec.js +0 -126
  203. package/fesm/dtos/authentication.dto.js +0 -683
  204. package/fesm/dtos/company-branch.dto.js +0 -279
  205. package/fesm/dtos/company.dto.js +0 -283
  206. package/fesm/dtos/social-auth.dto.js +0 -282
  207. package/fesm/dtos/user-permission.dto.js +0 -339
  208. package/fesm/dtos/user.dto.js +0 -391
  209. package/fesm/entities/app-user.entity.js +0 -15
  210. package/fesm/entities/company-branch.entity.js +0 -153
  211. package/fesm/entities/company.entity.js +0 -136
  212. package/fesm/entities/index.spec.js +0 -80
  213. package/fesm/entities/pending-registration.entity.js +0 -125
  214. package/fesm/entities/social-auth-config.entity.js +0 -92
  215. package/fesm/entities/user-company-permission.entity.js +0 -136
  216. package/fesm/entities/user-token.entity.js +0 -104
  217. package/fesm/enums/social-provider-type.enum.js +0 -7
  218. package/fesm/enums/user-org-permission-type.enum.js +0 -5
  219. package/fesm/helpers/auth-response.mapper.js +0 -25
  220. package/fesm/helpers/auth-response.mapper.spec.js +0 -135
  221. package/fesm/helpers/token.helper.js +0 -40
  222. package/fesm/helpers/token.helper.spec.js +0 -82
  223. package/fesm/interceptors/clear-token.interceptor.js +0 -63
  224. package/fesm/interceptors/clear-token.interceptor.spec.js +0 -103
  225. package/fesm/interceptors/set-token.interceptor.js +0 -98
  226. package/fesm/interceptors/set-token.interceptor.spec.js +0 -161
  227. package/fesm/interfaces/auth-email-provider.interface.js +0 -38
  228. package/fesm/interfaces/auth-module-options.interface.js +0 -3
  229. package/fesm/interfaces/authentication.interface.js +0 -1
  230. package/fesm/interfaces/company-branch.interface.js +0 -1
  231. package/fesm/interfaces/company.interface.js +0 -1
  232. package/fesm/interfaces/social-auth.interface.js +0 -1
  233. package/fesm/interfaces/user-enricher.interface.js +0 -4
  234. package/fesm/interfaces/user.interface.js +0 -1
  235. package/fesm/modules/auth.module.js +0 -198
  236. package/fesm/modules/auth.module.spec.js +0 -254
  237. package/fesm/providers/facebook.social-provider.js +0 -63
  238. package/fesm/providers/google.social-provider.js +0 -58
  239. package/fesm/providers/index.js +0 -1
  240. package/fesm/providers/linkedin.social-provider.js +0 -56
  241. package/fesm/providers/microsoft.social-provider.js +0 -68
  242. package/fesm/providers/oauth-http.util.js +0 -77
  243. package/fesm/providers/social-provider.registry.js +0 -14
  244. package/fesm/providers/social-provider.registry.spec.js +0 -131
  245. package/fesm/services/auth-config.service.js +0 -103
  246. package/fesm/services/auth-config.service.spec.js +0 -96
  247. package/fesm/services/auth-datasource.provider.js +0 -87
  248. package/fesm/services/auth-datasource.provider.spec.js +0 -187
  249. package/fesm/services/auth-email.service.js +0 -488
  250. package/fesm/services/auth-email.service.spec.js +0 -411
  251. package/fesm/services/authentication.service.js +0 -1152
  252. package/fesm/services/authentication.service.spec.js +0 -975
  253. package/fesm/services/branch.service.js +0 -143
  254. package/fesm/services/branch.service.spec.js +0 -165
  255. package/fesm/services/company-selection-session.service.js +0 -111
  256. package/fesm/services/company-selection-session.service.spec.js +0 -86
  257. package/fesm/services/company.service.js +0 -130
  258. package/fesm/services/company.service.spec.js +0 -123
  259. package/fesm/services/social-auth-config.service.js +0 -93
  260. package/fesm/services/social-auth-config.service.spec.js +0 -67
  261. package/fesm/services/social-auth.service.js +0 -300
  262. package/fesm/services/social-auth.service.spec.js +0 -265
  263. package/fesm/services/user-permission.service.js +0 -226
  264. package/fesm/services/user-permission.service.spec.js +0 -250
  265. package/fesm/services/user.service.js +0 -620
  266. package/fesm/services/user.service.spec.js +0 -673
  267. package/fesm/strategies/jwt.strategy.js +0 -130
  268. package/fesm/strategies/jwt.strategy.spec.js +0 -162
  269. package/fesm/validators/password.validator.js +0 -48
  270. package/fesm/validators/password.validator.spec.js +0 -157
@@ -1,671 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", {
3
- value: true
4
- });
5
- Object.defineProperty(exports, "UserService", {
6
- enumerable: true,
7
- get: function() {
8
- return UserService;
9
- }
10
- });
11
- const _nestjsshared = require("@flusys/nestjs-shared");
12
- const _classes = require("@flusys/nestjs-shared/classes");
13
- const _constants = require("@flusys/nestjs-shared/constants");
14
- const _interfaces = require("@flusys/nestjs-shared/interfaces");
15
- const _modules = require("@flusys/nestjs-shared/modules");
16
- const _common = require("@nestjs/common");
17
- const _bcrypt = /*#__PURE__*/ _interop_require_wildcard(require("bcrypt"));
18
- const _config = require("../config");
19
- const _userdto = require("../dtos/user.dto");
20
- const _appuserentity = require("../entities/app-user.entity");
21
- const _usercompanypermissionentity = require("../entities/user-company-permission.entity");
22
- const _enums = require("../enums");
23
- const _userenricherinterface = require("../interfaces/user-enricher.interface");
24
- const _authconfigservice = require("./auth-config.service");
25
- const _authdatasourceprovider = require("./auth-datasource.provider");
26
- function _define_property(obj, key, value) {
27
- if (key in obj) {
28
- Object.defineProperty(obj, key, {
29
- value: value,
30
- enumerable: true,
31
- configurable: true,
32
- writable: true
33
- });
34
- } else {
35
- obj[key] = value;
36
- }
37
- return obj;
38
- }
39
- function _getRequireWildcardCache(nodeInterop) {
40
- if (typeof WeakMap !== "function") return null;
41
- var cacheBabelInterop = new WeakMap();
42
- var cacheNodeInterop = new WeakMap();
43
- return (_getRequireWildcardCache = function(nodeInterop) {
44
- return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
45
- })(nodeInterop);
46
- }
47
- function _interop_require_wildcard(obj, nodeInterop) {
48
- if (!nodeInterop && obj && obj.__esModule) {
49
- return obj;
50
- }
51
- if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
52
- return {
53
- default: obj
54
- };
55
- }
56
- var cache = _getRequireWildcardCache(nodeInterop);
57
- if (cache && cache.has(obj)) {
58
- return cache.get(obj);
59
- }
60
- var newObj = {
61
- __proto__: null
62
- };
63
- var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
64
- for(var key in obj){
65
- if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
66
- var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
67
- if (desc && (desc.get || desc.set)) {
68
- Object.defineProperty(newObj, key, desc);
69
- } else {
70
- newObj[key] = obj[key];
71
- }
72
- }
73
- }
74
- newObj.default = obj;
75
- if (cache) {
76
- cache.set(obj, newObj);
77
- }
78
- return newObj;
79
- }
80
- function _ts_decorate(decorators, target, key, desc) {
81
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
82
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
83
- 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;
84
- return c > 3 && r && Object.defineProperty(target, key, r), r;
85
- }
86
- function _ts_metadata(k, v) {
87
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
88
- }
89
- function _ts_param(paramIndex, decorator) {
90
- return function(target, key) {
91
- decorator(target, key, paramIndex);
92
- };
93
- }
94
- let UserService = class UserService extends _classes.ApiService {
95
- async ensureDataSourceRepository() {
96
- await super.ensureDataSourceRepository();
97
- const isCompanyFeatureEnabled = this.authConfig.isCompanyFeatureEnabled();
98
- if (isCompanyFeatureEnabled && !this.permissionRepository) {
99
- [this.permissionRepository] = await this.resolveRepositories([
100
- _usercompanypermissionentity.UserCompanyPermission
101
- ]);
102
- }
103
- if (!this.dataSource) {
104
- this.dataSource = await this.getDataSourceProvider().getDataSource();
105
- }
106
- }
107
- async getUserForProfile(userId, user) {
108
- if (userId !== user.id) {
109
- throw new _common.ForbiddenException({
110
- message: "Cannot access another user's profile",
111
- messageKey: _config.AUTH_MESSAGES.PROFILE_ACCESS_DENIED
112
- });
113
- }
114
- await this.ensureDataSourceRepository();
115
- const userEntity = await this.repository.findOne({
116
- where: {
117
- id: userId
118
- }
119
- });
120
- if (!userEntity) {
121
- throw new _common.NotFoundException({
122
- message: 'User not found',
123
- messageKey: _config.USER_MESSAGES.NOT_FOUND
124
- });
125
- }
126
- return userEntity;
127
- }
128
- async verifyEmail(id) {
129
- await this.ensureDataSourceRepository();
130
- await this.repository.update(id, {
131
- emailVerified: true
132
- });
133
- await Promise.all([
134
- this.clearCacheForAll(),
135
- this.clearCacheForId([
136
- {
137
- id
138
- }
139
- ])
140
- ]);
141
- }
142
- async verifyPhone(id) {
143
- await this.ensureDataSourceRepository();
144
- await this.repository.update(id, {
145
- phoneVerified: true
146
- });
147
- await Promise.all([
148
- this.clearCacheForAll(),
149
- this.clearCacheForId([
150
- {
151
- id
152
- }
153
- ])
154
- ]);
155
- }
156
- async updateStatus(id, isActive, user) {
157
- await this.ensureDataSourceRepository();
158
- const isCompanyFeatureEnabled = this.authConfig.isCompanyFeatureEnabled();
159
- if (isCompanyFeatureEnabled && user?.companyId && this.permissionRepository) {
160
- const permission = await this.permissionRepository.findOne({
161
- where: {
162
- userId: id,
163
- permissionType: _enums.PermissionType.COMPANY,
164
- targetId: user.companyId
165
- }
166
- });
167
- if (!permission) {
168
- throw new _common.NotFoundException({
169
- message: 'User company permission not found',
170
- messageKey: _config.USER_PERMISSION_MESSAGES.PERMISSION_NOT_FOUND,
171
- messageVariables: {
172
- type: 'User company'
173
- }
174
- });
175
- }
176
- permission.isActive = isActive;
177
- await this.permissionRepository.save(permission);
178
- } else {
179
- await this.repository.update(id, {
180
- isActive
181
- });
182
- }
183
- await Promise.all([
184
- this.clearCacheForAll(),
185
- this.clearCacheForId([
186
- {
187
- id
188
- }
189
- ])
190
- ]);
191
- }
192
- async convertSingleDtoToEntity(dto, user) {
193
- const entity = await super.convertSingleDtoToEntity(dto, user);
194
- if ('password' in dto && dto.password) {
195
- entity.password = await _bcrypt.hash(dto.password, _config.BCRYPT_SALT_ROUNDS);
196
- }
197
- return entity;
198
- }
199
- convertEntityToResponseDto(entity, isRaw) {
200
- if (isRaw) {
201
- return this.convertRawToResponseDto(entity);
202
- }
203
- return this.convertEntityToDto(entity);
204
- }
205
- convertRawToResponseDto(raw) {
206
- const isActive = raw.appuser_companyIsActive !== undefined ? Boolean(raw.appuser_companyIsActive) : raw.appuser_is_active;
207
- return {
208
- id: raw.appuser_id,
209
- name: raw.appuser_name,
210
- phone: raw.appuser_phone,
211
- email: raw.appuser_email,
212
- profilePictureId: raw.appuser_profile_picture_id,
213
- isActive,
214
- emailVerified: raw.appuser_email_verified,
215
- phoneVerified: raw.appuser_phone_verified,
216
- lastLoginAt: raw.appuser_last_login_at,
217
- additionalFields: raw.appuser_additional_fields,
218
- createdAt: raw.appuser_created_at,
219
- updatedAt: raw.appuser_updated_at,
220
- deletedAt: raw.appuser_deleted_at,
221
- createdById: raw.appuser_created_by_id,
222
- updatedById: raw.appuser_updated_by_id,
223
- deletedById: raw.appuser_deleted_by_id
224
- };
225
- }
226
- convertEntityToDto(entity) {
227
- return {
228
- id: entity.id,
229
- name: entity.name,
230
- phone: entity.phone,
231
- email: entity.email,
232
- profilePictureId: entity.profilePictureId,
233
- isActive: entity.isActive,
234
- emailVerified: entity.emailVerified,
235
- phoneVerified: entity.phoneVerified,
236
- lastLoginAt: entity.lastLoginAt,
237
- additionalFields: entity.additionalFields,
238
- createdAt: entity.createdAt,
239
- updatedAt: entity.updatedAt,
240
- deletedAt: entity.deletedAt,
241
- createdById: entity.createdById,
242
- updatedById: entity.updatedById,
243
- deletedById: entity.deletedById
244
- };
245
- }
246
- convertEntityListToResponseListDto(entities, isRaw) {
247
- return entities.map((entity)=>this.convertEntityToResponseDto(entity, isRaw));
248
- }
249
- async getFilterQuery(query, filter, _user) {
250
- for (const [key, value] of Object.entries(filter)){
251
- if (key === 'actionCode' || key === 'isActive') {
252
- continue; // real continue
253
- }
254
- query.andWhere(`${this.entityName}.${key} = :value`, {
255
- value
256
- });
257
- }
258
- return {
259
- query,
260
- isRaw: false
261
- };
262
- }
263
- async getGlobalSearchQuery(query, search, _user) {
264
- query.andWhere('(appuser.name LIKE :search OR appuser.email LIKE :search OR appuser.phone LIKE :search)', {
265
- search: `%${search}%`
266
- });
267
- return {
268
- query,
269
- isRaw: false
270
- };
271
- }
272
- async getExtraManipulateQuery(query, filterAndPaginationDto, user) {
273
- const superQuery = await super.getExtraManipulateQuery(query, filterAndPaginationDto, user);
274
- const isCompanyFeatureEnabled = this.authConfig.isCompanyFeatureEnabled();
275
- const filter = filterAndPaginationDto?.filter;
276
- // --- Action code filter (applies regardless of company feature) ---
277
- if (filter?.actionCode) {
278
- const actionCode = filter.actionCode;
279
- const companyId = isCompanyFeatureEnabled ? user?.companyId : undefined;
280
- if (isCompanyFeatureEnabled && !companyId) {
281
- // Company feature is on but no companyId — no results should match
282
- query.andWhere('1 = 0');
283
- return {
284
- query,
285
- isRaw: true
286
- };
287
- }
288
- const isPermissionModeFound = this.authConfig.isPermissionModeFound();
289
- if (!isPermissionModeFound) {
290
- // Optionally log a warning so the caller knows the filter was ignored
291
- this.logAdapter.warn(`actionCode filter was requested but permission mode is not set to 'found' — filter ignored`);
292
- } else {
293
- query.andWhere(`EXISTS (
294
- SELECT 1 FROM user_iam_permission perm
295
- WHERE perm.permission_type = 'user_role'
296
- AND perm.source_id = appuser.id
297
- AND perm.target_id IN (
298
- SELECT source_id FROM user_iam_permission
299
- WHERE permission_type = 'role_action'
300
- AND target_id = (SELECT id FROM action WHERE code = :actionCode)
301
- ${isCompanyFeatureEnabled ? 'AND company_id = :actionCompanyId' : ''}
302
- )
303
- ) OR EXISTS (
304
- SELECT 1 FROM user_iam_permission perm
305
- WHERE perm.permission_type = 'user_action'
306
- AND perm.source_id = appuser.id
307
- AND perm.target_id = (SELECT id FROM action WHERE code = :actionCode)
308
- ${isCompanyFeatureEnabled ? 'AND company_id = :actionCompanyId' : ''}
309
- )`, {
310
- actionCode,
311
- ...isCompanyFeatureEnabled && {
312
- actionCompanyId: companyId
313
- }
314
- });
315
- }
316
- }
317
- // --- Non-company path ---
318
- if (!isCompanyFeatureEnabled) {
319
- if (filter?.isActive !== undefined) {
320
- query.andWhere(`${this.entityName}.isActive = :value`, {
321
- value: filter.isActive
322
- });
323
- }
324
- return superQuery;
325
- }
326
- // --- Company feature path ---
327
- if (!user?.companyId || !this.permissionRepository) {
328
- return superQuery;
329
- }
330
- // Add companyIsActive as a selected column
331
- query.addSelect(`(SELECT perm.is_active FROM user_company_permissions perm
332
- WHERE perm.user_id = appuser.id
333
- AND perm.permission_type = :permissionType
334
- AND perm.target_id = :companyId
335
- LIMIT 1)`, 'user_companyIsActive');
336
- query.setParameter('permissionType', _enums.PermissionType.COMPANY);
337
- query.setParameter('companyId', user.companyId);
338
- // Filter by isActive within the company if requested
339
- if (filter?.isActive !== undefined) {
340
- query.andWhere(`EXISTS (
341
- SELECT 1 FROM user_company_permissions perm
342
- WHERE perm.user_id = appuser.id
343
- AND perm.permission_type = :permissionType
344
- AND perm.target_id = :companyId
345
- AND perm.is_active = :isActiveValue
346
- )`, {
347
- permissionType: _enums.PermissionType.COMPANY,
348
- companyId: user.companyId,
349
- isActiveValue: filter.isActive
350
- });
351
- }
352
- // Always restrict to users belonging to this company
353
- query.andWhere(`EXISTS (
354
- SELECT 1 FROM user_company_permissions perm
355
- WHERE perm.user_id = appuser.id
356
- AND perm.permission_type = :permissionType
357
- AND perm.target_id = :companyId
358
- )`, {
359
- permissionType: _enums.PermissionType.COMPANY,
360
- companyId: user.companyId
361
- });
362
- return {
363
- query,
364
- isRaw: true
365
- };
366
- }
367
- async insert(dto, user) {
368
- const isCompanyFeatureEnabled = this.authConfig.isCompanyFeatureEnabled();
369
- if (!isCompanyFeatureEnabled || !this.dataSource || !user?.companyId || !this.permissionRepository) {
370
- return await super.insert(dto, user);
371
- }
372
- const queryRunner = this.dataSource.createQueryRunner();
373
- await queryRunner.connect();
374
- await queryRunner.startTransaction();
375
- try {
376
- const userEntity = await this.convertSingleDtoToEntity(dto, user);
377
- const savedUser = await queryRunner.manager.save(this.repository.target, userEntity);
378
- const existingPermission = await queryRunner.manager.findOne(this.permissionRepository.target, {
379
- where: {
380
- userId: savedUser.id,
381
- permissionType: _enums.PermissionType.COMPANY,
382
- targetId: user.companyId
383
- }
384
- });
385
- if (!existingPermission) {
386
- const permission = queryRunner.manager.create(this.permissionRepository.target, {
387
- userId: savedUser.id,
388
- permissionType: _enums.PermissionType.COMPANY,
389
- targetId: user.companyId,
390
- isActive: dto.isActive ?? true
391
- });
392
- await queryRunner.manager.save(this.permissionRepository.target, permission);
393
- }
394
- if (user.branchId) {
395
- const existingBranchPermission = await queryRunner.manager.findOne(this.permissionRepository.target, {
396
- where: {
397
- userId: savedUser.id,
398
- permissionType: _enums.PermissionType.BRANCH,
399
- targetId: user.branchId
400
- }
401
- });
402
- if (!existingBranchPermission) {
403
- const branchPermission = queryRunner.manager.create(this.permissionRepository.target, {
404
- userId: savedUser.id,
405
- permissionType: _enums.PermissionType.BRANCH,
406
- targetId: user.branchId,
407
- isActive: dto.isActive ?? true
408
- });
409
- await queryRunner.manager.save(this.permissionRepository.target, branchPermission);
410
- }
411
- }
412
- await queryRunner.commitTransaction();
413
- await Promise.all([
414
- this.clearCacheForAll(),
415
- this.clearCacheForId([
416
- savedUser
417
- ])
418
- ]);
419
- return this.convertEntityToResponseDto(savedUser, false);
420
- } catch (error) {
421
- await queryRunner.rollbackTransaction();
422
- throw error;
423
- } finally{
424
- await queryRunner.release();
425
- }
426
- }
427
- async getProfileWithExtras(userId, user) {
428
- const userEntity = await this.getUserForProfile(userId, user);
429
- const userData = this.convertEntityToResponseDto(userEntity, false);
430
- let extras;
431
- if (this.userEnricher?.getProfileExtras) {
432
- extras = await this.userEnricher.getProfileExtras(userId, user);
433
- }
434
- return {
435
- user: userData,
436
- extras
437
- };
438
- }
439
- async getAll(search, filterAndPaginationDto, user) {
440
- const result = await super.getAll(search, filterAndPaginationDto, user);
441
- const enrichedData = await this.getEnrichedList(result.data, user);
442
- return {
443
- data: enrichedData,
444
- total: result.total
445
- };
446
- }
447
- async getEnrichedList(users, user) {
448
- if (this.userEnricher?.enrichListItems) {
449
- return this.userEnricher.enrichListItems(users, user);
450
- }
451
- return users;
452
- }
453
- async getProfileSections() {
454
- if (this.userEnricher?.getProfileSections) {
455
- return this.userEnricher.getProfileSections();
456
- }
457
- return [];
458
- }
459
- async getProfileSectionData(userId, sectionId, user) {
460
- await this.getUserForProfile(userId, user);
461
- if (this.userEnricher?.getProfileSectionData) {
462
- return this.userEnricher.getProfileSectionData(userId, sectionId, user);
463
- }
464
- return null;
465
- }
466
- async updateProfileSection(userId, sectionId, data, user) {
467
- const userEntity = await this.getUserForProfile(userId, user);
468
- if (!this.dataSource) {
469
- throw new _common.BadRequestException({
470
- message: 'DataSource not available',
471
- messageKey: _constants.SYSTEM_MESSAGES.DATASOURCE_NOT_AVAILABLE
472
- });
473
- }
474
- if (!this.userEnricher?.updateProfileSection) {
475
- throw new _common.BadRequestException({
476
- message: 'Profile sections not supported',
477
- messageKey: _config.AUTH_MESSAGES.PROFILE_SECTIONS_NOT_SUPPORTED
478
- });
479
- }
480
- const queryRunner = this.dataSource.createQueryRunner();
481
- await queryRunner.connect();
482
- await queryRunner.startTransaction();
483
- try {
484
- await this.userEnricher.updateProfileSection(userId, sectionId, data, queryRunner);
485
- await queryRunner.commitTransaction();
486
- await Promise.all([
487
- this.clearCacheForAll(),
488
- this.clearCacheForId([
489
- userEntity
490
- ])
491
- ]);
492
- } catch (error) {
493
- await queryRunner.rollbackTransaction();
494
- throw error;
495
- } finally{
496
- await queryRunner.release();
497
- }
498
- }
499
- async getProfileCompletion(userId, user) {
500
- await this.getUserForProfile(userId, user);
501
- if (this.userEnricher?.calculateProfileCompletion) {
502
- return this.userEnricher.calculateProfileCompletion(userId, user);
503
- }
504
- return 100;
505
- }
506
- async profile(dto, user) {
507
- await this.ensureDataSourceRepository();
508
- if (!this.dataSource) {
509
- throw new _common.BadRequestException({
510
- message: 'DataSource not available',
511
- messageKey: _constants.SYSTEM_MESSAGES.DATASOURCE_NOT_AVAILABLE
512
- });
513
- }
514
- const userId = dto.id ?? user.id;
515
- if (dto.extras && this.userEnricher?.validateProfileExtras) {
516
- await this.userEnricher.validateProfileExtras(userId, dto.extras, user);
517
- }
518
- const queryRunner = this.dataSource.createQueryRunner();
519
- await queryRunner.connect();
520
- await queryRunner.startTransaction();
521
- try {
522
- const findUser = await queryRunner.manager.findOne(this.repository.target, {
523
- where: {
524
- id: userId
525
- }
526
- });
527
- if (!findUser) {
528
- throw new _common.NotFoundException({
529
- message: 'User not found',
530
- messageKey: _config.USER_MESSAGES.NOT_FOUND
531
- });
532
- }
533
- if (dto.password) {
534
- const isOwnProfile = !dto.id || dto.id === user.id;
535
- if (isOwnProfile) {
536
- if (!dto.oldPassword) {
537
- throw new _common.BadRequestException({
538
- message: 'Current password is required to change your password',
539
- messageKey: _config.AUTH_MESSAGES.PASSWORD_CHANGE_CURRENT_REQUIRED
540
- });
541
- }
542
- const isPasswordValid = await _bcrypt.compare(dto.oldPassword, findUser.password);
543
- if (!isPasswordValid) {
544
- throw new _common.BadRequestException({
545
- message: 'Current password is incorrect',
546
- messageKey: _config.AUTH_MESSAGES.PASSWORD_CHANGE_INVALID_CURRENT
547
- });
548
- }
549
- }
550
- findUser.password = await _bcrypt.hash(dto.password, _config.BCRYPT_SALT_ROUNDS);
551
- }
552
- const { password, oldPassword, extras, emailVerified, phoneVerified, isActive, ...restDto } = dto;
553
- Object.assign(findUser, restDto);
554
- await queryRunner.manager.save(this.repository.target, findUser);
555
- if (extras && this.userEnricher?.updateProfileExtras) {
556
- await this.userEnricher.updateProfileExtras(userId, extras, queryRunner);
557
- }
558
- await queryRunner.commitTransaction();
559
- await Promise.all([
560
- this.clearCacheForAll(),
561
- this.clearCacheForId([
562
- findUser
563
- ])
564
- ]);
565
- return findUser.id;
566
- } catch (error) {
567
- await queryRunner.rollbackTransaction();
568
- throw error;
569
- } finally{
570
- await queryRunner.release();
571
- }
572
- }
573
- constructor(cacheManager, utilsService, dataSourceProvider, authConfig, userEnricher){
574
- super(_config.AUTH_EVENT_ENTITIES.USER, cacheManager, utilsService, UserService.name, true, _config.AUTH_EVENT_MODULE, dataSourceProvider, _appuserentity.AppUser), _define_property(this, "cacheManager", void 0), _define_property(this, "utilsService", void 0), _define_property(this, "authConfig", void 0), _define_property(this, "userEnricher", void 0), _define_property(this, "permissionRepository", void 0), _define_property(this, "dataSource", void 0), _define_property(this, "logAdapter", void 0), this.cacheManager = cacheManager, this.utilsService = utilsService, this.authConfig = authConfig, this.userEnricher = userEnricher, this.logAdapter = (0, _classes.createModuleLogger)(this.constructor.name);
575
- }
576
- };
577
- _ts_decorate([
578
- (0, _nestjsshared.LogAction)({
579
- action: 'user.verifyEmail',
580
- module: 'auth'
581
- }),
582
- _ts_metadata("design:type", Function),
583
- _ts_metadata("design:paramtypes", [
584
- String
585
- ]),
586
- _ts_metadata("design:returntype", Promise)
587
- ], UserService.prototype, "verifyEmail", null);
588
- _ts_decorate([
589
- (0, _nestjsshared.LogAction)({
590
- action: 'user.verifyPhone',
591
- module: 'auth'
592
- }),
593
- _ts_metadata("design:type", Function),
594
- _ts_metadata("design:paramtypes", [
595
- String
596
- ]),
597
- _ts_metadata("design:returntype", Promise)
598
- ], UserService.prototype, "verifyPhone", null);
599
- _ts_decorate([
600
- (0, _nestjsshared.LogAction)({
601
- action: 'user.updateStatus',
602
- module: 'auth'
603
- }),
604
- _ts_metadata("design:type", Function),
605
- _ts_metadata("design:paramtypes", [
606
- String,
607
- Boolean,
608
- Object
609
- ]),
610
- _ts_metadata("design:returntype", Promise)
611
- ], UserService.prototype, "updateStatus", null);
612
- _ts_decorate([
613
- (0, _nestjsshared.LogAction)({
614
- action: 'user.create',
615
- module: 'auth',
616
- includeParams: false
617
- }),
618
- _ts_metadata("design:type", Function),
619
- _ts_metadata("design:paramtypes", [
620
- typeof _userdto.CreateUserDto === "undefined" ? Object : _userdto.CreateUserDto,
621
- Object
622
- ]),
623
- _ts_metadata("design:returntype", Promise)
624
- ], UserService.prototype, "insert", null);
625
- _ts_decorate([
626
- (0, _nestjsshared.LogAction)({
627
- action: 'user.updateProfileSection',
628
- module: 'auth',
629
- includeParams: false
630
- }),
631
- _ts_metadata("design:type", Function),
632
- _ts_metadata("design:paramtypes", [
633
- String,
634
- String,
635
- typeof Record === "undefined" ? Object : Record,
636
- typeof _interfaces.ILoggedUserInfo === "undefined" ? Object : _interfaces.ILoggedUserInfo
637
- ]),
638
- _ts_metadata("design:returntype", Promise)
639
- ], UserService.prototype, "updateProfileSection", null);
640
- _ts_decorate([
641
- (0, _nestjsshared.LogAction)({
642
- action: 'user.updateProfile',
643
- module: 'auth',
644
- includeParams: false
645
- }),
646
- _ts_metadata("design:type", Function),
647
- _ts_metadata("design:paramtypes", [
648
- Object,
649
- typeof _interfaces.ILoggedUserInfo === "undefined" ? Object : _interfaces.ILoggedUserInfo
650
- ]),
651
- _ts_metadata("design:returntype", Promise)
652
- ], UserService.prototype, "profile", null);
653
- UserService = _ts_decorate([
654
- (0, _common.Injectable)({
655
- scope: _common.Scope.REQUEST
656
- }),
657
- _ts_param(0, (0, _common.Inject)('CACHE_INSTANCE')),
658
- _ts_param(1, (0, _common.Inject)(_modules.UtilsService)),
659
- _ts_param(2, (0, _common.Inject)(_authdatasourceprovider.AuthDataSourceProvider)),
660
- _ts_param(3, (0, _common.Inject)(_authconfigservice.AuthConfigService)),
661
- _ts_param(4, (0, _common.Optional)()),
662
- _ts_param(4, (0, _common.Inject)(_config.USER_ENRICHER)),
663
- _ts_metadata("design:type", Function),
664
- _ts_metadata("design:paramtypes", [
665
- typeof _classes.HybridCache === "undefined" ? Object : _classes.HybridCache,
666
- typeof _modules.UtilsService === "undefined" ? Object : _modules.UtilsService,
667
- typeof _authdatasourceprovider.AuthDataSourceProvider === "undefined" ? Object : _authdatasourceprovider.AuthDataSourceProvider,
668
- typeof _authconfigservice.AuthConfigService === "undefined" ? Object : _authconfigservice.AuthConfigService,
669
- typeof _userenricherinterface.IUserEnricher === "undefined" ? Object : _userenricherinterface.IUserEnricher
670
- ])
671
- ], UserService);