@tomei/sso 0.1.1 → 0.2.0

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 (67) hide show
  1. package/README.md +20 -3
  2. package/__tests__/unit/components/login-history/login-history.repository.spec.ts +95 -0
  3. package/__tests__/unit/components/login-user/login-user.spec.ts +223 -0
  4. package/__tests__/unit/components/login-user/user.repository.spec.ts +81 -0
  5. package/__tests__/unit/components/password-hash/password-hash.service.spec.ts +33 -0
  6. package/__tests__/unit/components/system/system.repository.spec.ts +88 -0
  7. package/__tests__/unit/components/system-access/system-access.repository.spec.ts +78 -0
  8. package/__tests__/unit/redis-client/redis.service.spec.ts +24 -0
  9. package/__tests__/unit/session/session.service.spec.ts +27 -0
  10. package/create-sso-user.sql +8 -3
  11. package/dist/__tests__/unit/components/login-user/login-user.spec.d.ts +1 -0
  12. package/dist/__tests__/unit/components/login-user/login-user.spec.js +208 -0
  13. package/dist/__tests__/unit/components/login-user/login-user.spec.js.map +1 -0
  14. package/dist/tsconfig.tsbuildinfo +1 -1
  15. package/jest.config.js +15 -0
  16. package/package.json +21 -3
  17. package/prisma/migrations/0_init/migration.sql +512 -521
  18. package/prisma/migrations/20230528161352_create_user_user_group_and_add_new_column/migration.sql +35 -0
  19. package/prisma/migrations/20230606091407_create_login_histories_table/migration.sql +17 -0
  20. package/prisma/migrations/migration_lock.toml +2 -2
  21. package/prisma/schema.prisma +519 -436
  22. package/sampledotenv +8 -0
  23. package/src/components/index.ts +7 -0
  24. package/src/components/login-history/index.ts +1 -0
  25. package/src/components/login-history/login-history.repository.ts +33 -0
  26. package/src/components/login-user/index.ts +4 -0
  27. package/src/components/login-user/interfaces/index.ts +1 -0
  28. package/src/components/login-user/interfaces/user-info.interface.ts +9 -0
  29. package/src/components/login-user/login-user.ts +427 -0
  30. package/src/components/login-user/user.repository.ts +33 -0
  31. package/src/components/password-hash/index.ts +2 -0
  32. package/src/components/password-hash/interfaces/index.ts +1 -0
  33. package/src/components/password-hash/interfaces/password-hash-service.interface.ts +4 -0
  34. package/src/components/password-hash/password-hash.service.ts +14 -0
  35. package/src/components/system/index.ts +1 -0
  36. package/src/components/system/system.repository.ts +33 -0
  37. package/src/components/system-access/index.ts +1 -0
  38. package/src/components/system-access/system-access.repository.ts +33 -0
  39. package/src/components/user-group/index.ts +1 -0
  40. package/src/components/user-group/user-group.repository.ts +33 -0
  41. package/src/components/user-user-group/index.ts +1 -0
  42. package/src/components/user-user-group/user-user-group.repository.ts +33 -0
  43. package/src/index.ts +7 -0
  44. package/src/interfaces/index.ts +2 -0
  45. package/src/interfaces/system-login.interface.ts +6 -0
  46. package/src/interfaces/user-session.interface.ts +5 -0
  47. package/src/mail/index.ts +2 -0
  48. package/src/mail/interfaces/index.ts +2 -0
  49. package/src/mail/interfaces/send-mail.interface.ts +8 -0
  50. package/src/mail/interfaces/send-new-login-alert.interface.ts +6 -0
  51. package/src/mail/mail.service.ts +33 -0
  52. package/src/mail/mail.ts +40 -0
  53. package/src/prisma-client/__mocks__/prisma.ts +15 -0
  54. package/src/prisma-client/client.ts +3 -0
  55. package/src/prisma-client/index.ts +1 -0
  56. package/src/redis-client/__mocks__/jest-initial-setup.ts +2 -0
  57. package/src/redis-client/__mocks__/redis-mock.ts +28 -0
  58. package/src/redis-client/index.ts +1 -0
  59. package/src/redis-client/redis.service.ts +48 -0
  60. package/src/session/index.ts +2 -0
  61. package/src/session/interfaces/index.ts +1 -0
  62. package/src/session/interfaces/session-service.interface.ts +6 -0
  63. package/src/session/session.service.ts +45 -0
  64. package/tsconfig.json +7 -3
  65. package/dist/index.d.ts +0 -0
  66. package/dist/index.js +0 -1
  67. package/dist/index.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
 
2
- -- Create sso-user
2
+ -- example to create sso-user
3
3
  CREATE USER 'sso_user'@'environment' IDENTIFIED BY 'password';
4
4
 
5
- -- Grant access to sso table
5
+ -- example to grant neccesary access to run migration
6
6
  GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES on production.sso_authorization_codes TO 'sso_user'@'localhost' WITH GRANT OPTION;
7
7
  GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES on production.sso_bearer_tokens TO 'sso_user'@'localhost' WITH GRANT OPTION;
8
8
  GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES on production.sso_building_types TO 'sso_user'@'localhost' WITH GRANT OPTION;
@@ -32,4 +32,9 @@ GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES on product
32
32
  GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES on production.sso_users TO 'sso_user'@'localhost' WITH GRANT OPTION;
33
33
  GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES on production.sso_usersystemprivilege TO 'sso_user'@'localhost' WITH GRANT OPTION;
34
34
  GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES on production.sso_usersystemrole TO 'sso_user'@'localhost' WITH GRANT OPTION;
35
- GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES on production._prisma_migrations TO 'sso_user'@'localhost' WITH GRANT OPTION;
35
+ GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES on production.sso_UserUserGroup TO 'sso_user'@'localhost' WITH GRANT OPTION;
36
+ GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES on production._prisma_migrations TO 'sso_user'@'localhost' WITH GRANT OPTION;
37
+
38
+
39
+ -- Grant user to create, alter, drop, references on the database (required for creating shadow tables)
40
+ GRANT CREATE, ALTER, DROP, REFERENCES ON shadow_database.* TO 'sso_user'@'localhost' WITH GRANT OPTION;
@@ -0,0 +1,208 @@
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
+ const src_1 = require("../../../../src");
13
+ const login_user_1 = require("../../../../src/components/login-user/login-user");
14
+ const user_repository_1 = require("../../../../src/components/login-user/user.repository");
15
+ const password_hash_service_1 = require("../../../../src/components/password-hash/password-hash.service");
16
+ const mail_service_1 = require("../../../../src/mail/mail.service");
17
+ describe('login-user', () => {
18
+ const user = {
19
+ id: 755,
20
+ email: 'ezcash+florence@tomei.com.my',
21
+ password: '$argon2id$v=19$m=4096,t=3,p=1$571ilUAi9n5g393m/NqKbQ$2bMnLtMCIVTjHWHGEDxI2wo+A3mrL3N5rTxDJ6ydPi8',
22
+ status: null,
23
+ defaultPasswordChanged: false,
24
+ firstLoginAt: new Date('2023-01-10T07:57:10.000Z'),
25
+ createdAt: new Date('2023-01-10T07:57:10.000Z'),
26
+ updatedAt: new Date('2023-01-10T08:58:15.000Z'),
27
+ groupCode: 'EZCFT',
28
+ staffs: [
29
+ {
30
+ id: 740,
31
+ staffId: 'EZC003',
32
+ fullName: 'EZC Florence',
33
+ preferredName: 'EZC Florence',
34
+ email: 'ezcash+florence@tomei.com.my',
35
+ staffTypeId: 1,
36
+ jobTitle: 'EZC Finance',
37
+ carPlate: '',
38
+ mobile: '60123456',
39
+ floor: null,
40
+ extension: null,
41
+ isCharge: false,
42
+ status: 'active',
43
+ userId: 755,
44
+ buildingId: 20,
45
+ departmentId: 110,
46
+ companyId: 70,
47
+ createdById: 74,
48
+ updatedById: 74,
49
+ createdAt: new Date('2023-01-10T07:57:10.000Z'),
50
+ updatedAt: new Date('2023-01-10T07:57:10.000Z'),
51
+ image: null,
52
+ idNo: '123123123',
53
+ fullAddress: 'Lorem Address',
54
+ },
55
+ ],
56
+ userSystemPrivileges: [
57
+ {
58
+ userId: 22,
59
+ privilegeId: 'ckymxuh8t000137t011w89zgk',
60
+ isInheritedYN: 'N',
61
+ isRevokedYN: 'N',
62
+ createdAt: new Date('2022-04-18T04:07:40.000Z'),
63
+ updatedAt: new Date('2022-04-18T04:07:40.000Z'),
64
+ systemPrivilege: {
65
+ privilegeId: 'ckymxuh8t000137t011w89zgk',
66
+ systemId: 11,
67
+ code: 'Own',
68
+ module: null,
69
+ description: 'Allows the user to only view consignments belonging to themselves',
70
+ createdAt: new Date('2022-01-20T12:16:26.000Z'),
71
+ updatedAt: new Date('2022-01-20T12:16:26.000Z'),
72
+ },
73
+ },
74
+ ],
75
+ };
76
+ const system = {
77
+ id: 175,
78
+ code: 'EZC',
79
+ name: 'EzCash',
80
+ description: 'Tomei Money Lending System',
81
+ accessUrl: 'https://app.ezcash.com.my:22443/staff/login',
82
+ googlePlayUrl: '',
83
+ appleStoreUrl: '',
84
+ apiKey: 'VqS9ks2Lwvqd7HrVUMMIP2q7zaEH689HCPaEaFUQLmiRoZnt',
85
+ logo: 'https://sso-api.tomei.com.my/upload/2023/01/10/FJ3DoHdRZKjf2bGkgA4E-BrowserIcon.png',
86
+ status: 'active',
87
+ visible: true,
88
+ createdAt: new Date('2023-01-09T00:45:57.000Z'),
89
+ updatedAt: new Date('2023-01-10T06:28:56.000Z'),
90
+ apiSecret: '$argon2id$v=19$m=4096,t=3,p=1$lqxfk/ujftswf2jSEu156g$j2IShE/BZUUoH/1jrvt3GGRSy0rA8HilJvK17e6vdFY',
91
+ updatedById: 61,
92
+ createdById: 100,
93
+ };
94
+ const systemAccess = {
95
+ userId: 755,
96
+ systemId: 175,
97
+ updatedAt: new Date('2023-01-09T00:45:57.000'),
98
+ };
99
+ const session = {
100
+ systemLogins: [
101
+ {
102
+ id: '175',
103
+ code: 'EZC',
104
+ sessionId: 'ckymxuh8t000137t011w89zgk',
105
+ privileges: [
106
+ 'Terminate',
107
+ 'Download - Agreement',
108
+ 'Disbursement - Confirmation',
109
+ 'Invoice Payment Received',
110
+ 'Download - Disbursement Receipt',
111
+ 'Download - Stamping Receipt',
112
+ 'Installment Payment Received',
113
+ 'View Transaction History',
114
+ 'Menu - Loans',
115
+ 'Loan - Full Settlement',
116
+ 'View Billing',
117
+ 'Loan - Retrieve List',
118
+ 'Loan - View Details',
119
+ 'Loan - Retrieve Outstanding',
120
+ 'Loan - View Mandate Details',
121
+ 'Loan Document - Retrieve List',
122
+ 'Loan Document - View',
123
+ 'Loan Document - Download',
124
+ 'Application - View Details',
125
+ 'Simple Loan Schedule - Get Overdue Schedules',
126
+ 'Simple Loan Schedule - Get Schedule Payment Details',
127
+ 'Retrieve Media List',
128
+ 'Retrieve Customer List',
129
+ 'View Loan Activity',
130
+ 'Activate Installment',
131
+ 'Manual Payment Receipt',
132
+ 'Customer Documents - View',
133
+ ],
134
+ },
135
+ ],
136
+ };
137
+ jest.mock('crypto', () => {
138
+ return {
139
+ randomUUID: jest.fn().mockReturnValue('ckymxuh8t000137t011w89zgk'),
140
+ };
141
+ });
142
+ jest
143
+ .spyOn(user_repository_1.UserRepository.prototype, 'findOne')
144
+ .mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
145
+ return user;
146
+ }));
147
+ jest
148
+ .spyOn(password_hash_service_1.PasswordHashService.prototype, 'verify')
149
+ .mockImplementation((password, hash) => __awaiter(void 0, void 0, void 0, function* () {
150
+ if (password === 'Abcd@1234') {
151
+ return true;
152
+ }
153
+ else {
154
+ return false;
155
+ }
156
+ }));
157
+ jest
158
+ .spyOn(src_1.SystemRepository.prototype, 'findOne')
159
+ .mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
160
+ return system;
161
+ }));
162
+ jest
163
+ .spyOn(mail_service_1.MailService.prototype, 'sendNewLoginAlertEmail')
164
+ .mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () { }));
165
+ jest
166
+ .spyOn(login_user_1.LoginUser.prototype, 'getPrivileges')
167
+ .mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
168
+ return session.systemLogins[0].privileges;
169
+ }));
170
+ jest
171
+ .spyOn(src_1.SystemAccessRepository.prototype, 'findOne')
172
+ .mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
173
+ return systemAccess;
174
+ }));
175
+ jest
176
+ .spyOn(src_1.LoginHistoryRepository.prototype, 'findAll')
177
+ .mockImplementation(() => __awaiter(void 0, void 0, void 0, function* () {
178
+ const data = [];
179
+ return data;
180
+ }));
181
+ it('should return login-user service when instansiated', () => __awaiter(void 0, void 0, void 0, function* () {
182
+ const loginUser = yield login_user_1.LoginUser.init();
183
+ expect(loginUser).toBeDefined();
184
+ }));
185
+ it('should able to do login process when no session is already available', () => __awaiter(void 0, void 0, void 0, function* () {
186
+ const loginUser = yield login_user_1.LoginUser.init('755');
187
+ const result = yield loginUser.login('EZC', 'ezcash+florence@tomei.com.my', 'Abcd@1234', '1.1.1.1');
188
+ expect(result).toEqual('ckymxuh8t000137t011w89zgk');
189
+ }));
190
+ it('should able to do login process when session is already available', () => __awaiter(void 0, void 0, void 0, function* () {
191
+ jest
192
+ .spyOn(src_1.SessionService.prototype, 'retrieveUserSession')
193
+ .mockImplementationOnce((userId) => __awaiter(void 0, void 0, void 0, function* () {
194
+ if (userId === '755') {
195
+ return session;
196
+ }
197
+ else {
198
+ return {
199
+ systemLogins: [],
200
+ };
201
+ }
202
+ }));
203
+ const loginUser = yield login_user_1.LoginUser.init('755');
204
+ const result = yield loginUser.login('EZC', 'ezcash+florence@tomei.com.my', 'Abcd@1234', '1.1.1.1');
205
+ expect(result).toEqual('ckymxuh8t000137t011w89zgk');
206
+ }));
207
+ });
208
+ //# sourceMappingURL=login-user.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login-user.spec.js","sourceRoot":"","sources":["../../../../../__tests__/unit/components/login-user/login-user.spec.ts"],"names":[],"mappings":"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"}