@tomei/sso 0.2.1 → 0.2.3

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 (153) hide show
  1. package/.commitlintrc.json +22 -22
  2. package/.prettierrc +4 -4
  3. package/Jenkinsfile +42 -0
  4. package/README.md +23 -23
  5. package/__tests__/unit/components/login-history/login-history.repository.spec.ts +95 -95
  6. package/__tests__/unit/components/login-user/login-user.spec.ts +223 -223
  7. package/__tests__/unit/components/login-user/user.repository.spec.ts +81 -81
  8. package/__tests__/unit/components/password-hash/password-hash.service.spec.ts +31 -32
  9. package/__tests__/unit/components/system-access/system-access.repository.spec.ts +78 -78
  10. package/__tests__/unit/redis-client/redis.service.spec.ts +23 -23
  11. package/__tests__/unit/session/session.service.spec.ts +27 -27
  12. package/create-sso-user.sql +39 -39
  13. package/dist/__tests__/unit/components/login-history/login-history.repository.spec.d.ts +1 -1
  14. package/dist/__tests__/unit/components/login-history/login-history.repository.spec.js +98 -98
  15. package/dist/__tests__/unit/components/login-user/login-user.spec.d.ts +1 -1
  16. package/dist/__tests__/unit/components/login-user/login-user.spec.js +207 -207
  17. package/dist/__tests__/unit/components/login-user/login-user.spec.js.map +1 -1
  18. package/dist/__tests__/unit/components/login-user/user.repository.spec.d.ts +1 -1
  19. package/dist/__tests__/unit/components/login-user/user.repository.spec.js +77 -77
  20. package/dist/__tests__/unit/components/password-hash/password-hash.service.spec.d.ts +1 -1
  21. package/dist/__tests__/unit/components/password-hash/password-hash.service.spec.js +37 -37
  22. package/dist/__tests__/unit/components/password-hash/password-hash.service.spec.js.map +1 -1
  23. package/dist/__tests__/unit/components/system/system.repository.spec.d.ts +1 -1
  24. package/dist/__tests__/unit/components/system/system.repository.spec.js +84 -84
  25. package/dist/__tests__/unit/components/system-access/system-access.repository.spec.d.ts +1 -1
  26. package/dist/__tests__/unit/components/system-access/system-access.repository.spec.js +74 -74
  27. package/dist/__tests__/unit/redis-client/redis.service.spec.d.ts +1 -1
  28. package/dist/__tests__/unit/redis-client/redis.service.spec.js +31 -31
  29. package/dist/__tests__/unit/session/session.service.spec.d.ts +1 -1
  30. package/dist/__tests__/unit/session/session.service.spec.js +35 -35
  31. package/dist/index.d.ts +1 -1
  32. package/dist/index.js +17 -17
  33. package/dist/src/components/index.d.ts +7 -7
  34. package/dist/src/components/index.js +23 -23
  35. package/dist/src/components/login-history/index.d.ts +1 -1
  36. package/dist/src/components/login-history/index.js +17 -17
  37. package/dist/src/components/login-history/login-history.repository.d.ts +9 -9
  38. package/dist/src/components/login-history/login-history.repository.js +49 -49
  39. package/dist/src/components/login-user/index.d.ts +3 -3
  40. package/dist/src/components/login-user/index.js +19 -19
  41. package/dist/src/components/login-user/interfaces/index.d.ts +1 -1
  42. package/dist/src/components/login-user/interfaces/index.js +17 -17
  43. package/dist/src/components/login-user/interfaces/user-info.interface.d.ts +9 -9
  44. package/dist/src/components/login-user/interfaces/user-info.interface.js +2 -2
  45. package/dist/src/components/login-user/login-user.d.ts +41 -41
  46. package/dist/src/components/login-user/login-user.js +332 -331
  47. package/dist/src/components/login-user/login-user.js.map +1 -1
  48. package/dist/src/components/login-user/user.repository.d.ts +9 -9
  49. package/dist/src/components/login-user/user.repository.js +49 -49
  50. package/dist/src/components/password-hash/index.d.ts +2 -2
  51. package/dist/src/components/password-hash/index.js +18 -18
  52. package/dist/src/components/password-hash/interfaces/index.d.ts +1 -1
  53. package/dist/src/components/password-hash/interfaces/index.js +17 -17
  54. package/dist/src/components/password-hash/interfaces/password-hash-service.interface.d.ts +4 -4
  55. package/dist/src/components/password-hash/interfaces/password-hash-service.interface.js +2 -2
  56. package/dist/src/components/password-hash/password-hash.service.d.ts +6 -6
  57. package/dist/src/components/password-hash/password-hash.service.js +27 -27
  58. package/dist/src/components/system/index.d.ts +1 -1
  59. package/dist/src/components/system/index.js +17 -17
  60. package/dist/src/components/system/system.repository.d.ts +9 -9
  61. package/dist/src/components/system/system.repository.js +49 -49
  62. package/dist/src/components/system-access/index.d.ts +1 -1
  63. package/dist/src/components/system-access/index.js +17 -17
  64. package/dist/src/components/system-access/system-access.repository.d.ts +9 -9
  65. package/dist/src/components/system-access/system-access.repository.js +49 -49
  66. package/dist/src/components/user-group/index.d.ts +1 -1
  67. package/dist/src/components/user-group/index.js +17 -17
  68. package/dist/src/components/user-group/user-group.repository.d.ts +9 -9
  69. package/dist/src/components/user-group/user-group.repository.js +49 -49
  70. package/dist/src/components/user-user-group/index.d.ts +1 -1
  71. package/dist/src/components/user-user-group/index.js +17 -17
  72. package/dist/src/components/user-user-group/user-user-group.repository.d.ts +9 -9
  73. package/dist/src/components/user-user-group/user-user-group.repository.js +49 -49
  74. package/dist/src/index.d.ts +6 -6
  75. package/dist/src/index.js +23 -23
  76. package/dist/src/interfaces/index.d.ts +2 -2
  77. package/dist/src/interfaces/index.js +18 -18
  78. package/dist/src/interfaces/system-login.interface.d.ts +6 -6
  79. package/dist/src/interfaces/system-login.interface.js +2 -2
  80. package/dist/src/interfaces/user-session.interface.d.ts +4 -4
  81. package/dist/src/interfaces/user-session.interface.js +2 -2
  82. package/dist/src/mail/index.d.ts +2 -2
  83. package/dist/src/mail/index.js +18 -18
  84. package/dist/src/mail/interfaces/index.d.ts +2 -2
  85. package/dist/src/mail/interfaces/index.js +18 -18
  86. package/dist/src/mail/interfaces/send-mail.interface.d.ts +8 -8
  87. package/dist/src/mail/interfaces/send-mail.interface.js +2 -2
  88. package/dist/src/mail/interfaces/send-new-login-alert.interface.d.ts +6 -6
  89. package/dist/src/mail/interfaces/send-new-login-alert.interface.js +2 -2
  90. package/dist/src/mail/mail.d.ts +7 -7
  91. package/dist/src/mail/mail.js +48 -48
  92. package/dist/src/mail/mail.service.d.ts +7 -7
  93. package/dist/src/mail/mail.service.js +41 -41
  94. package/dist/src/prisma-client/__mocks__/prisma.d.ts +3 -3
  95. package/dist/src/prisma-client/__mocks__/prisma.js +13 -13
  96. package/dist/src/prisma-client/client.d.ts +3 -3
  97. package/dist/src/prisma-client/client.js +5 -5
  98. package/dist/src/prisma-client/index.d.ts +1 -1
  99. package/dist/src/prisma-client/index.js +17 -17
  100. package/dist/src/redis-client/__mocks__/jest-initial-setup.d.ts +1 -1
  101. package/dist/src/redis-client/__mocks__/jest-initial-setup.js +4 -4
  102. package/dist/src/redis-client/__mocks__/redis-mock.d.ts +2 -2
  103. package/dist/src/redis-client/__mocks__/redis-mock.js +22 -22
  104. package/dist/src/redis-client/index.d.ts +1 -1
  105. package/dist/src/redis-client/index.js +17 -17
  106. package/dist/src/redis-client/redis.service.d.ts +7 -7
  107. package/dist/src/redis-client/redis.service.js +55 -55
  108. package/dist/src/session/index.d.ts +2 -2
  109. package/dist/src/session/index.js +18 -18
  110. package/dist/src/session/interfaces/index.d.ts +1 -1
  111. package/dist/src/session/interfaces/index.js +17 -17
  112. package/dist/src/session/interfaces/session-service.interface.d.ts +5 -5
  113. package/dist/src/session/interfaces/session-service.interface.js +2 -2
  114. package/dist/src/session/session.service.d.ts +9 -9
  115. package/dist/src/session/session.service.js +51 -51
  116. package/dist/tsconfig.tsbuildinfo +1 -1
  117. package/package.json +69 -69
  118. package/sampledotenv +7 -7
  119. package/src/components/index.ts +7 -7
  120. package/src/components/login-history/index.ts +1 -1
  121. package/src/components/login-history/login-history.repository.ts +33 -33
  122. package/src/components/login-user/index.ts +4 -4
  123. package/src/components/login-user/interfaces/user-info.interface.ts +9 -9
  124. package/src/components/login-user/login-user.ts +5 -2
  125. package/src/components/login-user/user.repository.ts +33 -33
  126. package/src/components/password-hash/index.ts +2 -2
  127. package/src/components/password-hash/interfaces/password-hash-service.interface.ts +4 -4
  128. package/src/components/password-hash/password-hash.service.ts +14 -14
  129. package/src/components/system/index.ts +1 -1
  130. package/src/components/system/system.repository.ts +33 -33
  131. package/src/components/system-access/index.ts +1 -1
  132. package/src/components/system-access/system-access.repository.ts +33 -33
  133. package/src/components/user-group/user-group.repository.ts +33 -33
  134. package/src/components/user-user-group/user-user-group.repository.ts +33 -33
  135. package/src/index.ts +7 -7
  136. package/src/interfaces/index.ts +2 -2
  137. package/src/interfaces/system-login.interface.ts +6 -6
  138. package/src/interfaces/user-session.interface.ts +5 -5
  139. package/src/mail/index.ts +2 -2
  140. package/src/mail/interfaces/index.ts +2 -2
  141. package/src/mail/interfaces/send-mail.interface.ts +8 -8
  142. package/src/mail/interfaces/send-new-login-alert.interface.ts +6 -6
  143. package/src/mail/mail.service.ts +33 -33
  144. package/src/mail/mail.ts +40 -40
  145. package/src/prisma-client/__mocks__/prisma.ts +15 -15
  146. package/src/prisma-client/client.ts +3 -3
  147. package/src/redis-client/__mocks__/jest-initial-setup.ts +2 -2
  148. package/src/redis-client/__mocks__/redis-mock.ts +28 -28
  149. package/src/session/index.ts +2 -2
  150. package/src/session/interfaces/index.ts +1 -1
  151. package/src/session/interfaces/session-service.interface.ts +6 -6
  152. package/src/session/session.service.ts +45 -45
  153. package/tsconfig.build.json +5 -5
@@ -1,332 +1,333 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.LoginUser = void 0;
13
- const general_1 = require("@tomei/general");
14
- const user_repository_1 = require("./user.repository");
15
- const system_repository_1 = require("../system/system.repository");
16
- const system_access_repository_1 = require("../system-access/system-access.repository");
17
- const login_history_repository_1 = require("../login-history/login-history.repository");
18
- const mail_service_1 = require("../../mail/mail.service");
19
- const user_user_group_repository_1 = require("../user-user-group/user-user-group.repository");
20
- const password_hash_service_1 = require("../password-hash/password-hash.service");
21
- const session_service_1 = require("../../session/session.service");
22
- const user_group_repository_1 = require("../user-group/user-group.repository");
23
- class LoginUser extends general_1.ObjectBase {
24
- getDetails() {
25
- return {
26
- FullName: this.FullName,
27
- IDNo: this.IDNo,
28
- IDType: this.IDType,
29
- Email: this.Email,
30
- ContactNo: this.ContactNo,
31
- };
32
- }
33
- constructor(sessionService, dbTransaction, userInfo) {
34
- super();
35
- this.ObjectName = 'User';
36
- this.TableName = 'sso_users';
37
- this._PasswordHashService = new password_hash_service_1.PasswordHashService();
38
- this._MailService = new mail_service_1.MailService();
39
- this._SessionService = sessionService;
40
- if (dbTransaction) {
41
- LoginUser._Repository = new user_repository_1.UserRepository(dbTransaction);
42
- LoginUser._SystemRepository = new system_repository_1.SystemRepository(dbTransaction);
43
- LoginUser._SystemAccessRepository = new system_access_repository_1.SystemAccessRepository(dbTransaction);
44
- LoginUser._LoginHistoryRepository = new login_history_repository_1.LoginHistoryRepository(dbTransaction);
45
- LoginUser._UserUserGroupRepository = new user_user_group_repository_1.UserUserGroupRepository(dbTransaction);
46
- LoginUser._UserGroupRepository = new user_group_repository_1.UserGroupRepository(dbTransaction);
47
- }
48
- if (userInfo) {
49
- this.ObjectId = userInfo.ObjectId;
50
- this.FullName = userInfo.FullName;
51
- this.IDNo = userInfo.IDNo;
52
- this.Email = userInfo.Email;
53
- this.ContactNo = userInfo.ContactNo;
54
- this.Password = userInfo.Password;
55
- this.staffs = userInfo.staffs;
56
- }
57
- }
58
- static init(userId, dbTransaction = null) {
59
- return __awaiter(this, void 0, void 0, function* () {
60
- const sessionService = yield session_service_1.SessionService.init();
61
- if (userId) {
62
- if (dbTransaction) {
63
- LoginUser._Repository = new user_repository_1.UserRepository(dbTransaction);
64
- }
65
- const user = yield LoginUser._Repository.findOne({
66
- where: {
67
- id: Number(userId),
68
- },
69
- include: {
70
- staffs: true,
71
- userSystemPrivileges: {
72
- include: {
73
- systemPrivilege: true,
74
- },
75
- },
76
- },
77
- });
78
- if (user) {
79
- const userInfo = {
80
- ObjectId: user.id,
81
- FullName: user.staffs[0].name,
82
- IDNo: user.staffs[0].idNo,
83
- ContactNo: user.staffs[0].contactNo,
84
- Email: user.staffs[0].email,
85
- Password: user.password,
86
- staffs: user.staffs[0],
87
- };
88
- return new LoginUser(sessionService, dbTransaction, userInfo);
89
- }
90
- else {
91
- throw new Error('User not found');
92
- }
93
- }
94
- return new LoginUser(sessionService, dbTransaction);
95
- });
96
- }
97
- login(systemCode, email, password, ipAddress) {
98
- return __awaiter(this, void 0, void 0, function* () {
99
- if (this.Email !== email) {
100
- throw new Error('Invalid credentials.');
101
- }
102
- const isPasswordValid = yield this._PasswordHashService.verify(password, this.Password);
103
- if (!isPasswordValid) {
104
- throw new Error('Invalid credentials.');
105
- }
106
- const system = yield LoginUser._SystemRepository.findOne({
107
- where: {
108
- code: systemCode,
109
- },
110
- });
111
- if (!system) {
112
- throw new Error('Invalid system code.');
113
- }
114
- yield this.checkSystemAccess(this.ObjectId, system.id);
115
- yield this.alertNewLogin(this.ObjectId, system.id, ipAddress);
116
- const userSession = yield this._SessionService.retrieveUserSession(this.ObjectId);
117
- let systemLogin = userSession.systemLogins.find((system) => system.code === systemCode);
118
- const { randomUUID } = require('crypto');
119
- const sessionId = randomUUID();
120
- if (systemLogin) {
121
- systemLogin = systemLogin.sessionId = sessionId;
122
- userSession.systemLogins.map((system) => system.code === systemCode ? systemLogin : system);
123
- }
124
- else {
125
- const newLogin = {
126
- id: system.id.toString(),
127
- code: system.code,
128
- sessionId: sessionId,
129
- privileges: yield this.getPrivileges(system.code),
130
- };
131
- userSession.systemLogins.push(newLogin);
132
- }
133
- this._SessionService.setUserSession(this.ObjectId, userSession);
134
- yield LoginUser._LoginHistoryRepository.create({
135
- data: {
136
- userId: this.ObjectId,
137
- systemId: system.id,
138
- originIp: ipAddress,
139
- createdAt: new Date(),
140
- },
141
- });
142
- return sessionId;
143
- });
144
- }
145
- checkSystemAccess(userId, systemId) {
146
- return __awaiter(this, void 0, void 0, function* () {
147
- const systemAccess = yield LoginUser._SystemAccessRepository.findOne({
148
- where: {
149
- userId: userId,
150
- systemId: systemId,
151
- },
152
- });
153
- if (!systemAccess) {
154
- throw new Error("User don't have access to the system.");
155
- }
156
- });
157
- }
158
- alertNewLogin(userId, systemId, ipAddress) {
159
- return __awaiter(this, void 0, void 0, function* () {
160
- const userLogins = yield LoginUser._LoginHistoryRepository.findAll({
161
- where: {
162
- userId: userId,
163
- systemId: systemId,
164
- },
165
- });
166
- const gotPreviousLogins = (userLogins === null || userLogins === void 0 ? void 0 : userLogins.length) !== 0;
167
- let ipFound = null;
168
- if (gotPreviousLogins) {
169
- ipFound = userLogins.find((item) => item.ipAddress === ipAddress);
170
- }
171
- if (gotPreviousLogins && !ipFound) {
172
- yield this._MailService.sendNewLoginAlertEmail({
173
- IpAddress: ipAddress,
174
- Email: this.Email,
175
- Name: this.FullName,
176
- LoginDate: new Date(),
177
- });
178
- }
179
- });
180
- }
181
- getPrivileges(systemCode) {
182
- return __awaiter(this, void 0, void 0, function* () {
183
- try {
184
- const system = yield LoginUser._SystemRepository.findOne({
185
- where: {
186
- code: systemCode,
187
- },
188
- });
189
- if (!system) {
190
- throw new Error('Invalid system code.');
191
- }
192
- const userUserGroups = yield this.getUserUserGroupFromDB(system.id);
193
- const userGroupData = userUserGroups.map((u) => u.userGroup);
194
- let privileges = [];
195
- for (const userGroup of userGroupData) {
196
- const groupSystemPrivileges = userGroup.groupSystemPrivileges.map((g) => g.systemPrivilege.code);
197
- const groupRolePrivileges = userGroup.groupRolePrivileges.map((g) => g.systemPrivilege.code);
198
- if (userGroup.groupLevel !== 0) {
199
- const parentTreePrivileges = yield this.getPrivilegesFromUserGroup(userGroup.parentCode);
200
- privileges = [...privileges, ...parentTreePrivileges];
201
- }
202
- privileges = [
203
- ...privileges,
204
- ...groupSystemPrivileges,
205
- ...groupRolePrivileges,
206
- ];
207
- }
208
- const userPrivileges = yield this.getUserPersonalPrivileges(system.id);
209
- privileges = [...privileges, ...userPrivileges];
210
- privileges = [...new Set(privileges)];
211
- return privileges;
212
- }
213
- catch (error) {
214
- throw error;
215
- }
216
- });
217
- }
218
- getPrivilegesFromUserGroup(groupCode) {
219
- return __awaiter(this, void 0, void 0, function* () {
220
- try {
221
- const userGroup = yield this.getUserGroupFromDB(groupCode);
222
- let privileges = [];
223
- privileges = [
224
- ...privileges,
225
- ...userGroup.groupSystemPrivileges.map((g) => g.systemPrivilege.code),
226
- ...userGroup.groupRolePrivileges.map((g) => g.systemPrivilege.code),
227
- ];
228
- const isContinue = userGroup.groupLevel !== 0 &&
229
- userGroup.allowInheritFromParentYN === 'Y';
230
- if (isContinue) {
231
- const recursivePrivileges = yield this.getPrivilegesFromUserGroup(userGroup.parentGroupCode);
232
- privileges = privileges.concat(recursivePrivileges);
233
- }
234
- return privileges;
235
- }
236
- catch (error) {
237
- throw error;
238
- }
239
- });
240
- }
241
- getUserGroupFromDB(groupCode) {
242
- return __awaiter(this, void 0, void 0, function* () {
243
- try {
244
- const userGroup = yield LoginUser._UserGroupRepository.findOne({
245
- where: {
246
- groupCode: groupCode,
247
- },
248
- include: {
249
- groupSystemPrivileges: {
250
- include: {
251
- systemPrivilege: true,
252
- },
253
- },
254
- groupRolePrivileges: {
255
- include: {
256
- systemPrivilege: true,
257
- },
258
- },
259
- },
260
- });
261
- return userGroup;
262
- }
263
- catch (error) {
264
- throw error;
265
- }
266
- });
267
- }
268
- getUserUserGroupFromDB(systemCode) {
269
- return __awaiter(this, void 0, void 0, function* () {
270
- try {
271
- return yield LoginUser._UserUserGroupRepository.findAll({
272
- where: {
273
- userId: this.ObjectId,
274
- systemId: systemCode,
275
- },
276
- include: {
277
- userGroup: {
278
- include: {
279
- groupSystemPrivileges: {
280
- include: {
281
- systemPrivilege: true,
282
- },
283
- },
284
- groupRolePrivileges: {
285
- include: {
286
- systemPrivilege: true,
287
- },
288
- },
289
- },
290
- },
291
- },
292
- });
293
- }
294
- catch (error) {
295
- throw error;
296
- }
297
- });
298
- }
299
- getUserPersonalPrivileges(systemId) {
300
- return __awaiter(this, void 0, void 0, function* () {
301
- try {
302
- const userRole = yield LoginUser._Repository.findOne({
303
- where: {
304
- id: this.ObjectId,
305
- },
306
- include: {
307
- userSystemPrivileges: {
308
- include: {
309
- systemPrivilege: true,
310
- },
311
- },
312
- },
313
- });
314
- let userSystemPrivileges = userRole.userSystemPrivileges.map((u) => u.systemPrivilege);
315
- userSystemPrivileges = userRole.userSystemPrivileges.filter((u) => u.systemPrivilege.systemId === systemId);
316
- const userPrivileges = userSystemPrivileges.map((u) => u.code);
317
- return userPrivileges;
318
- }
319
- catch (error) {
320
- throw error;
321
- }
322
- });
323
- }
324
- }
325
- exports.LoginUser = LoginUser;
326
- LoginUser._Repository = new user_repository_1.UserRepository();
327
- LoginUser._SystemRepository = new system_repository_1.SystemRepository();
328
- LoginUser._SystemAccessRepository = new system_access_repository_1.SystemAccessRepository();
329
- LoginUser._LoginHistoryRepository = new login_history_repository_1.LoginHistoryRepository();
330
- LoginUser._UserUserGroupRepository = new user_user_group_repository_1.UserUserGroupRepository();
331
- LoginUser._UserGroupRepository = new user_group_repository_1.UserGroupRepository();
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.LoginUser = void 0;
13
+ const general_1 = require("@tomei/general");
14
+ const user_repository_1 = require("./user.repository");
15
+ const system_repository_1 = require("../system/system.repository");
16
+ const system_access_repository_1 = require("../system-access/system-access.repository");
17
+ const login_history_repository_1 = require("../login-history/login-history.repository");
18
+ const mail_service_1 = require("../../mail/mail.service");
19
+ const user_user_group_repository_1 = require("../user-user-group/user-user-group.repository");
20
+ const password_hash_service_1 = require("../password-hash/password-hash.service");
21
+ const session_service_1 = require("../../session/session.service");
22
+ const user_group_repository_1 = require("../user-group/user-group.repository");
23
+ class LoginUser extends general_1.ObjectBase {
24
+ getDetails() {
25
+ return {
26
+ FullName: this.FullName,
27
+ IDNo: this.IDNo,
28
+ IDType: this.IDType,
29
+ Email: this.Email,
30
+ ContactNo: this.ContactNo,
31
+ };
32
+ }
33
+ constructor(sessionService, dbTransaction, userInfo) {
34
+ super();
35
+ this.ObjectName = 'User';
36
+ this.TableName = 'sso_users';
37
+ this._PasswordHashService = new password_hash_service_1.PasswordHashService();
38
+ this._MailService = new mail_service_1.MailService();
39
+ this._SessionService = sessionService;
40
+ if (dbTransaction) {
41
+ LoginUser._Repository = new user_repository_1.UserRepository(dbTransaction);
42
+ LoginUser._SystemRepository = new system_repository_1.SystemRepository(dbTransaction);
43
+ LoginUser._SystemAccessRepository = new system_access_repository_1.SystemAccessRepository(dbTransaction);
44
+ LoginUser._LoginHistoryRepository = new login_history_repository_1.LoginHistoryRepository(dbTransaction);
45
+ LoginUser._UserUserGroupRepository = new user_user_group_repository_1.UserUserGroupRepository(dbTransaction);
46
+ LoginUser._UserGroupRepository = new user_group_repository_1.UserGroupRepository(dbTransaction);
47
+ }
48
+ if (userInfo) {
49
+ this.ObjectId = userInfo.ObjectId;
50
+ this.FullName = userInfo.FullName;
51
+ this.IDNo = userInfo.IDNo;
52
+ this.Email = userInfo.Email;
53
+ this.ContactNo = userInfo.ContactNo;
54
+ this.Password = userInfo.Password;
55
+ this.staffs = userInfo.staffs;
56
+ }
57
+ }
58
+ static init(userId, dbTransaction = null) {
59
+ return __awaiter(this, void 0, void 0, function* () {
60
+ const sessionService = yield session_service_1.SessionService.init();
61
+ if (userId) {
62
+ if (dbTransaction) {
63
+ LoginUser._Repository = new user_repository_1.UserRepository(dbTransaction);
64
+ }
65
+ const user = yield LoginUser._Repository.findOne({
66
+ where: {
67
+ id: Number(userId),
68
+ },
69
+ include: {
70
+ staffs: true,
71
+ userSystemPrivileges: {
72
+ include: {
73
+ systemPrivilege: true,
74
+ },
75
+ },
76
+ },
77
+ });
78
+ if (user) {
79
+ const userInfo = {
80
+ ObjectId: user.id,
81
+ FullName: user.staffs[0].name,
82
+ IDNo: user.staffs[0].idNo,
83
+ ContactNo: user.staffs[0].contactNo,
84
+ Email: user.staffs[0].email,
85
+ Password: user.password,
86
+ staffs: user.staffs[0],
87
+ };
88
+ return new LoginUser(sessionService, dbTransaction, userInfo);
89
+ }
90
+ else {
91
+ throw new Error('User not found');
92
+ }
93
+ }
94
+ return new LoginUser(sessionService, dbTransaction);
95
+ });
96
+ }
97
+ login(systemCode, email, password, ipAddress) {
98
+ return __awaiter(this, void 0, void 0, function* () {
99
+ if (this.Email !== email) {
100
+ throw new Error('Invalid credentials.');
101
+ }
102
+ const isPasswordValid = yield this._PasswordHashService.verify(password, this.Password);
103
+ if (!isPasswordValid) {
104
+ throw new Error('Invalid credentials.');
105
+ }
106
+ const system = yield LoginUser._SystemRepository.findOne({
107
+ where: {
108
+ code: systemCode,
109
+ },
110
+ });
111
+ if (!system) {
112
+ throw new Error('Invalid system code.');
113
+ }
114
+ yield this.checkSystemAccess(this.ObjectId, system.id);
115
+ yield this.alertNewLogin(this.ObjectId, system.id, ipAddress);
116
+ const userSession = yield this._SessionService.retrieveUserSession(this.ObjectId);
117
+ let systemLogin = userSession.systemLogins.find((system) => system.code === systemCode);
118
+ const { randomUUID } = require('crypto');
119
+ const sessionId = randomUUID();
120
+ if (systemLogin) {
121
+ systemLogin = systemLogin.sessionId = sessionId;
122
+ userSession.systemLogins.map((system) => system.code === systemCode ? systemLogin : system);
123
+ }
124
+ else {
125
+ const newLogin = {
126
+ id: system.id.toString(),
127
+ code: system.code,
128
+ sessionId: sessionId,
129
+ privileges: yield this.getPrivileges(system.code),
130
+ };
131
+ userSession.systemLogins.push(newLogin);
132
+ }
133
+ this._SessionService.setUserSession(this.ObjectId, userSession);
134
+ yield LoginUser._LoginHistoryRepository.create({
135
+ data: {
136
+ userId: this.ObjectId,
137
+ systemId: system.id,
138
+ originIp: ipAddress,
139
+ createdAt: new Date(),
140
+ },
141
+ });
142
+ return sessionId;
143
+ });
144
+ }
145
+ checkSystemAccess(userId, systemId) {
146
+ return __awaiter(this, void 0, void 0, function* () {
147
+ const systemAccess = yield LoginUser._SystemAccessRepository.findOne({
148
+ where: {
149
+ userId: userId,
150
+ systemId: systemId,
151
+ },
152
+ });
153
+ if (!systemAccess) {
154
+ throw new Error("User don't have access to the system.");
155
+ }
156
+ });
157
+ }
158
+ alertNewLogin(userId, systemId, ipAddress) {
159
+ return __awaiter(this, void 0, void 0, function* () {
160
+ const userLogins = yield LoginUser._LoginHistoryRepository.findAll({
161
+ where: {
162
+ userId: userId,
163
+ systemId: systemId,
164
+ },
165
+ });
166
+ const gotPreviousLogins = (userLogins === null || userLogins === void 0 ? void 0 : userLogins.length) !== 0;
167
+ let ipFound = null;
168
+ if (gotPreviousLogins) {
169
+ ipFound = userLogins.find((item) => item.ipAddress === ipAddress);
170
+ }
171
+ if (gotPreviousLogins && !ipFound) {
172
+ yield this._MailService.sendNewLoginAlertEmail({
173
+ IpAddress: ipAddress,
174
+ Email: this.Email,
175
+ Name: this.FullName,
176
+ LoginDate: new Date(),
177
+ });
178
+ }
179
+ });
180
+ }
181
+ getPrivileges(systemCode) {
182
+ return __awaiter(this, void 0, void 0, function* () {
183
+ try {
184
+ const system = yield LoginUser._SystemRepository.findOne({
185
+ where: {
186
+ code: systemCode,
187
+ },
188
+ });
189
+ if (!system) {
190
+ throw new Error('Invalid system code.');
191
+ }
192
+ const userUserGroups = yield this.getUserUserGroupFromDB(system.id);
193
+ const userGroupData = userUserGroups.map((u) => u.userGroup);
194
+ let privileges = [];
195
+ for (const userGroup of userGroupData) {
196
+ const groupSystemPrivileges = userGroup.groupSystemPrivileges.map((g) => g.systemPrivilege.code);
197
+ const groupRolePrivileges = userGroup.groupRolePrivileges.map((g) => g.systemPrivilege.code);
198
+ if (userGroup.groupLevel !== 0 &&
199
+ userGroup.allowInheritFromParentYN === 'Y') {
200
+ const parentTreePrivileges = yield this.getPrivilegesFromUserGroup(userGroup.parentCode);
201
+ privileges = [...privileges, ...parentTreePrivileges];
202
+ }
203
+ privileges = [
204
+ ...privileges,
205
+ ...groupSystemPrivileges,
206
+ ...groupRolePrivileges,
207
+ ];
208
+ }
209
+ const userPrivileges = yield this.getUserPersonalPrivileges(system.id);
210
+ privileges = [...privileges, ...userPrivileges];
211
+ privileges = [...new Set(privileges)];
212
+ return privileges;
213
+ }
214
+ catch (error) {
215
+ throw error;
216
+ }
217
+ });
218
+ }
219
+ getPrivilegesFromUserGroup(groupCode) {
220
+ return __awaiter(this, void 0, void 0, function* () {
221
+ try {
222
+ const userGroup = yield this.getUserGroupFromDB(groupCode);
223
+ let privileges = [];
224
+ privileges = [
225
+ ...privileges,
226
+ ...userGroup.groupSystemPrivileges.map((g) => g.systemPrivilege.code),
227
+ ...userGroup.groupRolePrivileges.map((g) => g.systemPrivilege.code),
228
+ ];
229
+ const isContinue = userGroup.groupLevel !== 0 &&
230
+ userGroup.allowInheritFromParentYN === 'Y';
231
+ if (isContinue) {
232
+ const recursivePrivileges = yield this.getPrivilegesFromUserGroup(userGroup.parentGroupCode);
233
+ privileges = privileges.concat(recursivePrivileges);
234
+ }
235
+ return privileges;
236
+ }
237
+ catch (error) {
238
+ throw error;
239
+ }
240
+ });
241
+ }
242
+ getUserGroupFromDB(groupCode) {
243
+ return __awaiter(this, void 0, void 0, function* () {
244
+ try {
245
+ const userGroup = yield LoginUser._UserGroupRepository.findOne({
246
+ where: {
247
+ groupCode: groupCode,
248
+ },
249
+ include: {
250
+ groupSystemPrivileges: {
251
+ include: {
252
+ systemPrivilege: true,
253
+ },
254
+ },
255
+ groupRolePrivileges: {
256
+ include: {
257
+ systemPrivilege: true,
258
+ },
259
+ },
260
+ },
261
+ });
262
+ return userGroup;
263
+ }
264
+ catch (error) {
265
+ throw error;
266
+ }
267
+ });
268
+ }
269
+ getUserUserGroupFromDB(systemCode) {
270
+ return __awaiter(this, void 0, void 0, function* () {
271
+ try {
272
+ return yield LoginUser._UserUserGroupRepository.findAll({
273
+ where: {
274
+ userId: this.ObjectId,
275
+ systemId: systemCode,
276
+ },
277
+ include: {
278
+ userGroup: {
279
+ include: {
280
+ groupSystemPrivileges: {
281
+ include: {
282
+ systemPrivilege: true,
283
+ },
284
+ },
285
+ groupRolePrivileges: {
286
+ include: {
287
+ systemPrivilege: true,
288
+ },
289
+ },
290
+ },
291
+ },
292
+ },
293
+ });
294
+ }
295
+ catch (error) {
296
+ throw error;
297
+ }
298
+ });
299
+ }
300
+ getUserPersonalPrivileges(systemId) {
301
+ return __awaiter(this, void 0, void 0, function* () {
302
+ try {
303
+ const userRole = yield LoginUser._Repository.findOne({
304
+ where: {
305
+ id: this.ObjectId,
306
+ },
307
+ include: {
308
+ userSystemPrivileges: {
309
+ include: {
310
+ systemPrivilege: true,
311
+ },
312
+ },
313
+ },
314
+ });
315
+ let userSystemPrivileges = userRole.userSystemPrivileges.map((u) => u.systemPrivilege);
316
+ userSystemPrivileges = userRole.userSystemPrivileges.filter((u) => u.systemPrivilege.systemId === systemId);
317
+ const userPrivileges = userSystemPrivileges.map((u) => u.code);
318
+ return userPrivileges;
319
+ }
320
+ catch (error) {
321
+ throw error;
322
+ }
323
+ });
324
+ }
325
+ }
326
+ exports.LoginUser = LoginUser;
327
+ LoginUser._Repository = new user_repository_1.UserRepository();
328
+ LoginUser._SystemRepository = new system_repository_1.SystemRepository();
329
+ LoginUser._SystemAccessRepository = new system_access_repository_1.SystemAccessRepository();
330
+ LoginUser._LoginHistoryRepository = new login_history_repository_1.LoginHistoryRepository();
331
+ LoginUser._UserUserGroupRepository = new user_user_group_repository_1.UserUserGroupRepository();
332
+ LoginUser._UserGroupRepository = new user_group_repository_1.UserGroupRepository();
332
333
  //# sourceMappingURL=login-user.js.map