@tomei/sso 0.56.1 → 0.57.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. package/dist/src/components/index.d.ts +1 -0
  2. package/dist/src/components/index.js +1 -0
  3. package/dist/src/components/index.js.map +1 -1
  4. package/dist/src/components/login-user/login-user.d.ts +4 -0
  5. package/dist/src/components/login-user/login-user.js +61 -0
  6. package/dist/src/components/login-user/login-user.js.map +1 -1
  7. package/dist/src/components/login-user/user.d.ts +12 -4
  8. package/dist/src/components/login-user/user.js +34 -53
  9. package/dist/src/components/login-user/user.js.map +1 -1
  10. package/dist/src/components/user-reporting-hierarchy/index.d.ts +2 -0
  11. package/dist/src/components/user-reporting-hierarchy/index.js +19 -0
  12. package/dist/src/components/user-reporting-hierarchy/index.js.map +1 -0
  13. package/dist/src/components/user-reporting-hierarchy/user-reporting-hierarchy.d.ts +25 -0
  14. package/dist/src/components/user-reporting-hierarchy/user-reporting-hierarchy.js +70 -0
  15. package/dist/src/components/user-reporting-hierarchy/user-reporting-hierarchy.js.map +1 -0
  16. package/dist/src/components/user-reporting-hierarchy/user-reporting-hierarchy.repository.d.ts +7 -0
  17. package/dist/src/components/user-reporting-hierarchy/user-reporting-hierarchy.repository.js +36 -0
  18. package/dist/src/components/user-reporting-hierarchy/user-reporting-hierarchy.repository.js.map +1 -0
  19. package/dist/src/interfaces/user-reporting-hierarchy.interface.d.ts +11 -0
  20. package/dist/src/interfaces/user-reporting-hierarchy.interface.js +3 -0
  21. package/dist/src/interfaces/user-reporting-hierarchy.interface.js.map +1 -0
  22. package/dist/src/models/user-reporting-hierarchy.entity.d.ts +18 -0
  23. package/dist/src/models/user-reporting-hierarchy.entity.js +116 -0
  24. package/dist/src/models/user-reporting-hierarchy.entity.js.map +1 -0
  25. package/dist/tsconfig.tsbuildinfo +1 -1
  26. package/migrations/20250210115636-create-user-reporting-hierarchy.js +76 -0
  27. package/package.json +1 -1
  28. package/src/components/index.ts +1 -0
  29. package/src/components/login-user/login-user.ts +70 -0
  30. package/src/components/login-user/user.ts +44 -76
  31. package/src/components/user-reporting-hierarchy/index.ts +2 -0
  32. package/src/components/user-reporting-hierarchy/user-reporting-hierarchy.repository.ts +30 -0
  33. package/src/components/user-reporting-hierarchy/user-reporting-hierarchy.ts +90 -0
  34. package/src/interfaces/user-reporting-hierarchy.interface.ts +11 -0
  35. package/src/models/user-reporting-hierarchy.entity.ts +102 -0
@@ -0,0 +1,76 @@
1
+ 'use strict';
2
+
3
+ /** @type {import('sequelize-cli').Migration} */
4
+ module.exports = {
5
+ async up(queryInterface, Sequelize) {
6
+ await queryInterface.createTable('sso_UserReportingHierarchy', {
7
+ UserReportingHierarchyId: {
8
+ type: Sequelize.INTEGER,
9
+ allowNull: false,
10
+ primaryKey: true,
11
+ autoIncrement: true,
12
+ },
13
+ ReportingUserId: {
14
+ type: Sequelize.INTEGER,
15
+ allowNull: false,
16
+ references: {
17
+ model: 'sso_User',
18
+ key: 'UserId',
19
+ },
20
+ onUpdate: 'CASCADE',
21
+ onDelete: 'CASCADE',
22
+ },
23
+ UserId: {
24
+ type: Sequelize.INTEGER,
25
+ allowNull: false,
26
+ references: {
27
+ model: 'sso_User',
28
+ key: 'UserId',
29
+ },
30
+ onUpdate: 'CASCADE',
31
+ onDelete: 'CASCADE',
32
+ },
33
+ Rank: {
34
+ type: Sequelize.TINYINT,
35
+ allowNull: false,
36
+ },
37
+ Status: {
38
+ type: Sequelize.STRING(10),
39
+ allowNull: false,
40
+ defaultValue: 'Active',
41
+ },
42
+ CreatedById: {
43
+ type: Sequelize.INTEGER,
44
+ allowNull: false,
45
+ references: {
46
+ model: 'sso_User',
47
+ key: 'UserId',
48
+ },
49
+ onUpdate: 'CASCADE',
50
+ onDelete: 'CASCADE',
51
+ },
52
+ CreatedAt: {
53
+ type: Sequelize.DATE,
54
+ allowNull: false,
55
+ },
56
+ UpdatedById: {
57
+ type: Sequelize.INTEGER,
58
+ allowNull: false,
59
+ references: {
60
+ model: 'sso_User',
61
+ key: 'UserId',
62
+ },
63
+ onUpdate: 'CASCADE',
64
+ onDelete: 'CASCADE',
65
+ },
66
+ UpdatedAt: {
67
+ type: Sequelize.DATE,
68
+ allowNull: false,
69
+ },
70
+ });
71
+ },
72
+
73
+ async down(queryInterface) {
74
+ await queryInterface.dropTable('sso_UserReportingHierarchy');
75
+ },
76
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tomei/sso",
3
- "version": "0.56.1",
3
+ "version": "0.57.0",
4
4
  "description": "Tomei SSO Package",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -15,5 +15,6 @@ export * from './system-privilege';
15
15
  export * from './group';
16
16
  export * from './api-key';
17
17
  export * from './group-reporting-user';
18
+ export * from './user-reporting-hierarchy';
18
19
 
19
20
  //test ci
@@ -7,6 +7,7 @@ import { RedisService } from '../../redis-client/redis.service';
7
7
  import { UserRepository } from './user.repository';
8
8
  import { IUserAttr, IUserInfo } from './interfaces/user-info.interface';
9
9
  import Staff from '../../models/staff.entity';
10
+ import UserModel from '../../models/user.entity';
10
11
  import { createHash, randomBytes } from 'crypto';
11
12
 
12
13
  export class LoginUser extends User implements ILoginUser {
@@ -157,4 +158,73 @@ export class LoginUser extends User implements ILoginUser {
157
158
  throw error;
158
159
  }
159
160
  }
161
+
162
+ async getProfile(dbTransaction: any) {
163
+ const user = await User._Repository.findOne({
164
+ where: {
165
+ UserId: this.UserId,
166
+ Status: 'Active',
167
+ },
168
+ include: [
169
+ {
170
+ model: Staff,
171
+ },
172
+ ],
173
+ transaction: dbTransaction,
174
+ });
175
+ return user;
176
+ }
177
+
178
+ public static async getGroups(loginUser: User, dbTransaction: any) {
179
+ // This method will retrieve all user groups.
180
+
181
+ // Part 2: Retrieve User Groups & Returns
182
+ const userGroups = await User._UserGroupRepo.findAll({
183
+ where: {
184
+ UserId: loginUser.ObjectId,
185
+ Status: 'Active',
186
+ },
187
+ include: [{ model: UserModel, as: 'User' }, { model: GroupModel }],
188
+ transaction: dbTransaction,
189
+ });
190
+
191
+ return userGroups;
192
+ }
193
+
194
+ public static async getSystems(loginUser: User, dbTransaction: any) {
195
+ // This method will retrieve all system records which user has accessed to.
196
+
197
+ // Part 2: Retrieve System Access
198
+ const groups = await this.getGroups(loginUser, dbTransaction);
199
+ const systemAccess = await User.combineSystemAccess(
200
+ loginUser,
201
+ dbTransaction,
202
+ groups,
203
+ );
204
+ const output = [];
205
+ if (systemAccess) {
206
+ for (let i = 0; i < systemAccess.length; i++) {
207
+ const system = await User._SystemRepository.findOne({
208
+ where: {
209
+ SystemCode: systemAccess[i].SystemCode,
210
+ Status: 'Active',
211
+ },
212
+ });
213
+ output.push({
214
+ UserSystemAccessId: systemAccess[i].UserSystemAccessId,
215
+ UserId: systemAccess[i].UserId,
216
+ SystemCode: systemAccess[i].SystemCode,
217
+ Status: systemAccess[i].Status,
218
+ CreatedById: systemAccess[i].CreatedById,
219
+ UpdatedById: systemAccess[i].UpdatedById,
220
+ CreatedAt: systemAccess[i].CreatedAt,
221
+ UpdatedAt: systemAccess[i].UpdatedAt,
222
+ System: system,
223
+ });
224
+ }
225
+ }
226
+
227
+ // Part 3: Map Result to System Object
228
+ return output;
229
+ }
160
230
  }
@@ -15,7 +15,6 @@ import { ApplicationConfig, ComponentConfig } from '@tomei/config';
15
15
  import { ICheckUserInfoDuplicatedQuery } from './interfaces/check-user-info-duplicated.interface';
16
16
  import { Op, where } from 'sequelize';
17
17
  import { ActionEnum, Activity } from '@tomei/activity-history';
18
- import UserModel from '../../models/user.entity';
19
18
  import GroupModel from '../../models/group.entity';
20
19
  import { GroupSystemAccessRepository } from '../group-system-access/group-system-access.repository';
21
20
  import { GroupRepository } from '../group/group.repository';
@@ -34,6 +33,8 @@ import { LoginUser } from './login-user';
34
33
  import { SessionService } from '../../session/session.service';
35
34
  import { createHash, randomBytes, randomUUID } from 'crypto';
36
35
  import { AuthContext } from 'types';
36
+ import UserModel from '../../models/user.entity';
37
+ import { UserReportingHierarchyRepository } from '../user-reporting-hierarchy/user-reporting-hierarchy.repository';
37
38
 
38
39
  export class User extends UserBase {
39
40
  ObjectId: string;
@@ -74,10 +75,12 @@ export class User extends UserBase {
74
75
  private static _GroupObjectPrivilegeRepo =
75
76
  new GroupObjectPrivilegeRepository();
76
77
 
77
- private static _SystemRepository = new SystemRepository();
78
+ protected static _SystemRepository = new SystemRepository();
78
79
  protected static _UserSystemAccessRepo = new UserSystemAccessRepository();
79
80
  private static _GroupSystemAccessRepo = new GroupSystemAccessRepository();
80
81
  private static _GroupRepo = new GroupRepository();
82
+ protected static _UserReportingHierarchyRepo =
83
+ new UserReportingHierarchyRepository();
81
84
 
82
85
  private _dbTransaction: any;
83
86
 
@@ -1738,32 +1741,6 @@ export class User extends UserBase {
1738
1741
  );
1739
1742
  }
1740
1743
 
1741
- public static async getGroups(loginUser: User, dbTransaction: any) {
1742
- // This method will retrieve all user groups.
1743
-
1744
- // Part 1: Privilege Checking
1745
- const systemCode = ApplicationConfig.getComponentConfigValue('system-code');
1746
- const isPrivileged = await loginUser.checkPrivileges(
1747
- systemCode,
1748
- 'UserGroup - List Own',
1749
- );
1750
- if (!isPrivileged) {
1751
- throw new Error('You do not have permission to list UserGroup.');
1752
- }
1753
-
1754
- // Part 2: Retrieve User Groups & Returns
1755
- const userGroups = await User._UserGroupRepo.findAll({
1756
- where: {
1757
- UserId: loginUser.ObjectId,
1758
- Status: 'Active',
1759
- },
1760
- include: [{ model: UserModel, as: 'User' }, { model: GroupModel }],
1761
- transaction: dbTransaction,
1762
- });
1763
-
1764
- return userGroups;
1765
- }
1766
-
1767
1744
  protected static async getInheritedSystemAccess(
1768
1745
  dbTransaction: any,
1769
1746
  group: GroupModel,
@@ -1801,7 +1778,7 @@ export class User extends UserBase {
1801
1778
  return systemAccesses;
1802
1779
  }
1803
1780
 
1804
- private static async combineSystemAccess(
1781
+ protected static async combineSystemAccess(
1805
1782
  loginUser: User,
1806
1783
  dbTransaction: any,
1807
1784
  groups: any,
@@ -1839,53 +1816,6 @@ export class User extends UserBase {
1839
1816
  return Array.from(uniqueAccess) as ISystemAccess[];
1840
1817
  }
1841
1818
 
1842
- public static async getSystems(loginUser: User, dbTransaction: any) {
1843
- // This method will retrieve all system records which user has accessed to.
1844
-
1845
- // Part 1: Privilege Checking
1846
- const systemCode = ApplicationConfig.getComponentConfigValue('system-code');
1847
- const isPrivileged = await loginUser.checkPrivileges(
1848
- systemCode,
1849
- 'System – List Own',
1850
- );
1851
- if (!isPrivileged) {
1852
- throw new Error('You do not have permission to list UserGroup.');
1853
- }
1854
-
1855
- // Part 2: Retrieve System Access
1856
- const groups = await User.getGroups(loginUser, dbTransaction);
1857
- const systemAccess = await User.combineSystemAccess(
1858
- loginUser,
1859
- dbTransaction,
1860
- groups,
1861
- );
1862
- const output = [];
1863
- if (systemAccess) {
1864
- for (let i = 0; i < systemAccess.length; i++) {
1865
- const system = await User._SystemRepository.findOne({
1866
- where: {
1867
- SystemCode: systemAccess[i].SystemCode,
1868
- Status: 'Active',
1869
- },
1870
- });
1871
- output.push({
1872
- UserSystemAccessId: systemAccess[i].UserSystemAccessId,
1873
- UserId: systemAccess[i].UserId,
1874
- SystemCode: systemAccess[i].SystemCode,
1875
- Status: systemAccess[i].Status,
1876
- CreatedById: systemAccess[i].CreatedById,
1877
- UpdatedById: systemAccess[i].UpdatedById,
1878
- CreatedAt: systemAccess[i].CreatedAt,
1879
- UpdatedAt: systemAccess[i].UpdatedAt,
1880
- System: system,
1881
- });
1882
- }
1883
- }
1884
-
1885
- // Part 3: Map Result to System Object
1886
- return output;
1887
- }
1888
-
1889
1819
  //This method will check if user enable 2FA or not.
1890
1820
  private static async check2FA(loginUser: User, dbTransaction: any) {
1891
1821
  try {
@@ -2908,4 +2838,42 @@ export class User extends UserBase {
2908
2838
  throw error;
2909
2839
  }
2910
2840
  }
2841
+
2842
+ public async getReportingUser(dbTransaction: any): Promise<
2843
+ {
2844
+ Email: string;
2845
+ ContactNo: string;
2846
+ Name: string;
2847
+ Rank: number;
2848
+ }[]
2849
+ > {
2850
+ try {
2851
+ const data = await User._UserReportingHierarchyRepo.findAll({
2852
+ where: {
2853
+ ReportingUserId: this.UserId,
2854
+ },
2855
+ include: [
2856
+ {
2857
+ model: UserModel,
2858
+ as: 'User',
2859
+ attributes: ['Email', 'ContactNo', 'FullName'],
2860
+ },
2861
+ ],
2862
+ transaction: dbTransaction,
2863
+ });
2864
+
2865
+ //format the data
2866
+ const result = data.map((item) => {
2867
+ return {
2868
+ Email: item.User.Email,
2869
+ ContactNo: item.User.ContactNo,
2870
+ Name: item.User.FullName,
2871
+ Rank: item.Rank,
2872
+ };
2873
+ });
2874
+ return result;
2875
+ } catch (error) {
2876
+ throw error;
2877
+ }
2878
+ }
2911
2879
  }
@@ -0,0 +1,2 @@
1
+ export * from './user-reporting-hierarchy';
2
+ export * from './user-reporting-hierarchy.repository';
@@ -0,0 +1,30 @@
1
+ import UserReportingHierarchyModel from '../../models/user-reporting-hierarchy.entity';
2
+ import { RepositoryBase, IRepositoryBase } from '@tomei/general';
3
+
4
+ export class UserReportingHierarchyRepository
5
+ extends RepositoryBase<UserReportingHierarchyModel>
6
+ implements IRepositoryBase<UserReportingHierarchyModel>
7
+ {
8
+ constructor() {
9
+ super(UserReportingHierarchyModel);
10
+ }
11
+
12
+ async findByPk(
13
+ id: string,
14
+ options?: any,
15
+ ): Promise<UserReportingHierarchyModel> {
16
+ return await UserReportingHierarchyModel.findByPk(parseInt(id), options);
17
+ }
18
+
19
+ async destroy(
20
+ UserReportingHierarchyId: number,
21
+ dbTransaction: any,
22
+ ): Promise<void> {
23
+ await UserReportingHierarchyModel.destroy({
24
+ where: {
25
+ UserReportingHierarchyId: UserReportingHierarchyId,
26
+ },
27
+ transaction: dbTransaction,
28
+ });
29
+ }
30
+ }
@@ -0,0 +1,90 @@
1
+ import { ClassError, ObjectBase } from '@tomei/general';
2
+ import { IUserReportingHierarchyAttr } from '../../interfaces/user-reporting-hierarchy.interface';
3
+ import { UserReportingHierarchyRepository } from './user-reporting-hierarchy.repository';
4
+
5
+ export class UserReportingHierarchy
6
+ extends ObjectBase
7
+ implements IUserReportingHierarchyAttr
8
+ {
9
+ ObjectId: string;
10
+ ObjectName: string;
11
+ ObjectType = 'UserReportingHierarchy';
12
+ TableName = 'sso_UserReportingHierarchy';
13
+ ReportingUserId: number;
14
+ UserId: number;
15
+ Rank: number;
16
+ Status: string;
17
+ private _CreatedById: number;
18
+ private _CreatedAt: Date;
19
+ private _UpdatedById: number;
20
+ private _UpdatedAt: Date;
21
+
22
+ private static _Repo = new UserReportingHierarchyRepository();
23
+
24
+ get UserReportingHierarchyId(): number {
25
+ return parseInt(this.ObjectId);
26
+ }
27
+
28
+ set UserReportingHierarchyId(value: number) {
29
+ this.ObjectId = value.toString();
30
+ }
31
+
32
+ get CreatedById(): number {
33
+ return this._CreatedById;
34
+ }
35
+
36
+ get CreatedAt(): Date {
37
+ return this._CreatedAt;
38
+ }
39
+
40
+ get UpdatedById(): number {
41
+ return this._UpdatedById;
42
+ }
43
+
44
+ get UpdatedAt(): Date {
45
+ return this._UpdatedAt;
46
+ }
47
+
48
+ private constructor(params?: IUserReportingHierarchyAttr) {
49
+ super();
50
+ if (params) {
51
+ this.ObjectId = params.UserReportingHierarchyId.toString();
52
+ this.ReportingUserId = params.ReportingUserId;
53
+ this.UserId = params.UserId;
54
+ this.Rank = params.Rank;
55
+ this.Status = params.Status;
56
+ this._CreatedById = params.CreatedById;
57
+ this._CreatedAt = params.CreatedAt;
58
+ this._UpdatedById = params.UpdatedById;
59
+ this._UpdatedAt = params.UpdatedAt;
60
+ }
61
+ }
62
+
63
+ public static async init(
64
+ userReportingHierarchyId: number,
65
+ dbTransaction?: any,
66
+ ): Promise<UserReportingHierarchy> {
67
+ try {
68
+ if (userReportingHierarchyId) {
69
+ const data = await UserReportingHierarchy._Repo.findByPk(
70
+ userReportingHierarchyId.toString(),
71
+ dbTransaction,
72
+ );
73
+ if (!data) {
74
+ throw new ClassError(
75
+ 'UserReportingHierarchy',
76
+ 'UserReportingHierarchyErrMsg01',
77
+ 'UserReportingHierarchy not found',
78
+ 'init',
79
+ 400,
80
+ );
81
+ }
82
+
83
+ return new UserReportingHierarchy(data.get({ plain: true }));
84
+ }
85
+ return new UserReportingHierarchy();
86
+ } catch (error) {
87
+ throw error;
88
+ }
89
+ }
90
+ }
@@ -0,0 +1,11 @@
1
+ export interface IUserReportingHierarchyAttr {
2
+ UserReportingHierarchyId: number;
3
+ ReportingUserId: number;
4
+ UserId: number;
5
+ Rank: number;
6
+ Status: string;
7
+ CreatedById: number;
8
+ CreatedAt: Date;
9
+ UpdatedById: number;
10
+ UpdatedAt: Date;
11
+ }
@@ -0,0 +1,102 @@
1
+ import {
2
+ BelongsTo,
3
+ Column,
4
+ CreatedAt,
5
+ DataType,
6
+ ForeignKey,
7
+ Model,
8
+ Table,
9
+ UpdatedAt,
10
+ } from 'sequelize-typescript';
11
+ import User from './user.entity';
12
+ import GroupModel from './group.entity';
13
+ import { IUserReportingHierarchyAttr } from '../interfaces/user-reporting-hierarchy.interface';
14
+
15
+ @Table({
16
+ tableName: 'sso_UserReportingHierarchy',
17
+ timestamps: true,
18
+ createdAt: 'CreatedAt',
19
+ updatedAt: 'UpdatedAt',
20
+ })
21
+ export default class UserReportingHierarchyModel
22
+ extends Model
23
+ implements IUserReportingHierarchyAttr
24
+ {
25
+ @Column({
26
+ primaryKey: true,
27
+ allowNull: false,
28
+ type: DataType.INTEGER,
29
+ autoIncrement: true,
30
+ })
31
+ UserReportingHierarchyId: number;
32
+
33
+ @ForeignKey(() => User)
34
+ @Column({
35
+ allowNull: false,
36
+ type: DataType.INTEGER,
37
+ })
38
+ UserId: number;
39
+
40
+ @ForeignKey(() => User)
41
+ @Column({
42
+ allowNull: false,
43
+ type: DataType.INTEGER,
44
+ })
45
+ ReportingUserId: number;
46
+
47
+ @Column({
48
+ allowNull: false,
49
+ type: DataType.TINYINT,
50
+ })
51
+ Rank: number;
52
+
53
+ @Column({
54
+ allowNull: false,
55
+ type: DataType.CHAR(10),
56
+ })
57
+ Status: string;
58
+
59
+ @ForeignKey(() => User)
60
+ @Column({
61
+ allowNull: false,
62
+ type: DataType.INTEGER,
63
+ })
64
+ CreatedById: number;
65
+
66
+ @ForeignKey(() => User)
67
+ @Column({
68
+ allowNull: false,
69
+ type: DataType.INTEGER,
70
+ })
71
+ UpdatedById: number;
72
+
73
+ @CreatedAt
74
+ CreatedAt: Date;
75
+
76
+ @UpdatedAt
77
+ UpdatedAt: Date;
78
+
79
+ @BelongsTo(() => User, {
80
+ as: 'CreatedByUser',
81
+ foreignKey: 'CreatedById',
82
+ })
83
+ CreatedByUser: User;
84
+
85
+ @BelongsTo(() => User, {
86
+ as: 'ReportingUser',
87
+ foreignKey: 'ReportingUserId',
88
+ })
89
+ ReportingUser: User;
90
+
91
+ @BelongsTo(() => User, {
92
+ as: 'UpdatedByUser',
93
+ foreignKey: 'UpdatedById',
94
+ })
95
+ UpdatedByUser: User;
96
+
97
+ @BelongsTo(() => User, {
98
+ as: 'User',
99
+ foreignKey: 'UserId',
100
+ })
101
+ User: User;
102
+ }