@kne/fastify-account 1.0.0-alpha.2 → 1.0.0-alpha.20

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 (54) hide show
  1. package/README.md +2506 -803
  2. package/index.js +61 -8
  3. package/libs/controllers/account.js +221 -37
  4. package/libs/controllers/admin.js +92 -17
  5. package/libs/controllers/adminPermission.js +188 -38
  6. package/libs/controllers/adminTenant.js +44 -257
  7. package/libs/controllers/adminTenantCompany.js +53 -0
  8. package/libs/controllers/adminTenantOrg.js +71 -0
  9. package/libs/controllers/{adminRole.js → adminTenantRole.js} +15 -12
  10. package/libs/controllers/adminTenantUser.js +169 -0
  11. package/libs/controllers/requestLog.js +77 -0
  12. package/libs/controllers/tenant.js +4 -14
  13. package/libs/controllers/tenantCompany.js +54 -0
  14. package/libs/controllers/tenantOrg.js +65 -0
  15. package/libs/controllers/tenantRole.js +219 -0
  16. package/libs/controllers/tenantUser.js +169 -0
  17. package/libs/controllers/user.js +4 -3
  18. package/libs/models/admin-role.js +4 -8
  19. package/libs/models/application.js +16 -10
  20. package/libs/models/company-info.js +25 -0
  21. package/libs/models/login-log.js +11 -9
  22. package/libs/models/permission.js +7 -9
  23. package/libs/models/request-log.js +43 -0
  24. package/libs/models/tenant-application.js +8 -10
  25. package/libs/models/tenant-org.js +5 -9
  26. package/libs/models/tenant-permission.js +7 -9
  27. package/libs/models/tenant-role-application.js +13 -13
  28. package/libs/models/tenant-role-permission.js +9 -14
  29. package/libs/models/tenant-role.js +5 -9
  30. package/libs/models/tenant-share-group-permission.js +5 -9
  31. package/libs/models/tenant-share-group.js +5 -9
  32. package/libs/models/tenant-source-user-share-group.js +5 -9
  33. package/libs/models/tenant-token.js +7 -9
  34. package/libs/models/tenant-user-org.js +11 -10
  35. package/libs/models/tenant-user-role.js +11 -10
  36. package/libs/models/tenant-user-share-group.js +6 -10
  37. package/libs/models/tenant-user.js +35 -16
  38. package/libs/models/tenant.js +17 -9
  39. package/libs/models/user-account.js +17 -9
  40. package/libs/models/user.js +27 -17
  41. package/libs/models/verification-code.js +8 -10
  42. package/libs/services/account.js +95 -71
  43. package/libs/services/admin.js +38 -122
  44. package/libs/services/application.js +170 -0
  45. package/libs/services/permission.js +161 -163
  46. package/libs/services/request-log.js +37 -0
  47. package/libs/services/tenant-company.js +54 -0
  48. package/libs/services/tenant-invite.js +62 -0
  49. package/libs/services/tenant-org.js +118 -0
  50. package/libs/services/tenant-role.js +109 -0
  51. package/libs/services/tenant-user.js +578 -0
  52. package/libs/services/tenant.js +69 -670
  53. package/libs/services/user.js +109 -33
  54. package/package.json +3 -3
@@ -0,0 +1,169 @@
1
+ const fp = require('fastify-plugin');
2
+
3
+ module.exports = fp(async (fastify, options) => {
4
+ const { authenticate, services } = fastify.account;
5
+
6
+ fastify.get(
7
+ `${options.prefix}/tenant/getTenantUserList`,
8
+ {
9
+ onRequest: [authenticate.user, authenticate.tenant],
10
+ schema: {
11
+ query: {
12
+ type: 'object',
13
+ properties: {
14
+ filter: {
15
+ type: 'object',
16
+ properties: {
17
+ name: { type: 'string' }
18
+ }
19
+ },
20
+ currentPage: { type: 'number' },
21
+ perPage: { type: 'number' }
22
+ }
23
+ }
24
+ }
25
+ },
26
+ async request => {
27
+ const { id: tenantId } = request.tenantInfo.tenant;
28
+ const { filter, currentPage, perPage } = Object.assign(
29
+ {},
30
+ {
31
+ filter: {},
32
+ currentPage: 1,
33
+ perPage: 20
34
+ },
35
+ request.query
36
+ );
37
+ return await services.tenantUser.getTenantUserList({ tenantId, currentPage, perPage, filter });
38
+ }
39
+ );
40
+
41
+ fastify.post(
42
+ `${options.prefix}/tenant/addTenantUser`,
43
+ {
44
+ onRequest: [authenticate.user, authenticate.tenant],
45
+ schema: {
46
+ body: {
47
+ type: 'object',
48
+ required: ['userId', 'name'],
49
+ properties: {
50
+ roleIds: { type: 'array', items: { type: 'number' }, default: [] },
51
+ orgIds: {
52
+ type: 'array',
53
+ items: { type: 'number' },
54
+ default: []
55
+ },
56
+ userId: { type: 'string' },
57
+ name: { type: 'string' },
58
+ avatar: { type: 'string' },
59
+ phone: { type: 'string' },
60
+ email: { type: 'string' },
61
+ description: { type: 'string' }
62
+ }
63
+ }
64
+ }
65
+ },
66
+ async request => {
67
+ const { id: tenantId } = request.tenantInfo.tenant;
68
+ await services.tenantUser.addTenantUser(Object.assign({}, request.body, { tenantId }));
69
+ return {};
70
+ }
71
+ );
72
+
73
+ fastify.post(
74
+ `${options.prefix}/tenant/saveTenantUser`,
75
+ {
76
+ onRequest: [authenticate.user, authenticate.tenant],
77
+ schema: {
78
+ body: {
79
+ type: 'object',
80
+ required: ['name'],
81
+ properties: {
82
+ roleIds: { type: 'array', items: { type: 'number' }, default: [] },
83
+ orgIds: {
84
+ type: 'array',
85
+ items: { type: 'number' },
86
+ default: []
87
+ },
88
+ name: { type: 'string' },
89
+ avatar: { type: 'string' },
90
+ phone: { type: 'string' },
91
+ email: { type: 'string' },
92
+ description: { type: 'string' }
93
+ }
94
+ }
95
+ }
96
+ },
97
+ async request => {
98
+ const { id: tenantId } = request.tenantInfo.tenant;
99
+ await services.tenantUser.saveTenantUser(Object.assign({}, request.body, { tenantId }));
100
+ return {};
101
+ }
102
+ );
103
+
104
+ fastify.post(
105
+ `${options.prefix}/tenant/deleteTenantUser`,
106
+ {
107
+ onRequest: [authenticate.user, authenticate.tenant],
108
+ schema: {
109
+ body: {
110
+ type: 'object',
111
+ required: ['tenantUserId'],
112
+ properties: {
113
+ tenantUserId: { type: 'string' }
114
+ }
115
+ }
116
+ }
117
+ },
118
+ async request => {
119
+ const { id: tenantId } = request.tenantInfo.tenant;
120
+ const { tenantUserId } = request.body;
121
+ await services.tenantUser.deleteTenantUser({ tenantId, tenantUserId });
122
+ return {};
123
+ }
124
+ );
125
+
126
+ fastify.post(
127
+ `${options.prefix}/tenant/closeTenantUser`,
128
+ {
129
+ onRequest: [authenticate.user, authenticate.tenant],
130
+ schema: {
131
+ body: {
132
+ type: 'object',
133
+ required: ['tenantUserId'],
134
+ properties: {
135
+ tenantUserId: { type: 'string' }
136
+ }
137
+ }
138
+ }
139
+ },
140
+ async request => {
141
+ const { id: tenantId } = request.tenantInfo.tenant;
142
+ const { tenantUserId } = request.body;
143
+ await services.tenantUser.closeTenantUser({ tenantId, tenantUserId });
144
+ return {};
145
+ }
146
+ );
147
+
148
+ fastify.post(
149
+ `${options.prefix}/tenant/openTenantUser`,
150
+ {
151
+ onRequest: [authenticate.user, authenticate.tenant],
152
+ schema: {
153
+ body: {
154
+ type: 'object',
155
+ required: ['tenantUserId'],
156
+ properties: {
157
+ tenantUserId: { type: 'string' }
158
+ }
159
+ }
160
+ }
161
+ },
162
+ async request => {
163
+ const { id: tenantId } = request.tenantInfo.tenant;
164
+ const { tenantUserId } = request.body;
165
+ await services.tenantUser.openTenantUser({ tenantId, tenantUserId });
166
+ return {};
167
+ }
168
+ );
169
+ });
@@ -1,9 +1,10 @@
1
1
  const fp = require('fastify-plugin');
2
2
  module.exports = fp(async (fastify, options) => {
3
+ const { authenticate, services } = fastify.account;
3
4
  fastify.get(
4
5
  `${options.prefix}/getUserInfo`,
5
6
  {
6
- onRequest: [fastify.account.authenticate.user]
7
+ onRequest: [authenticate.user]
7
8
  },
8
9
  async request => {
9
10
  return { userInfo: request.userInfo };
@@ -13,7 +14,7 @@ module.exports = fp(async (fastify, options) => {
13
14
  fastify.post(
14
15
  `${options.prefix}/setCurrentTenantId`,
15
16
  {
16
- onRequest: [fastify.account.authenticate.user],
17
+ onRequest: [authenticate.user],
17
18
  schema: {
18
19
  body: {
19
20
  type: 'object',
@@ -26,7 +27,7 @@ module.exports = fp(async (fastify, options) => {
26
27
  },
27
28
  async request => {
28
29
  const { tenantId } = request.body;
29
- await fastify.account.services.user.setCurrentTenantId({ id: request.userInfo.id, tenantId });
30
+ await services.user.setCurrentTenantId({ id: request.userInfo.id, tenantId });
30
31
  return {};
31
32
  }
32
33
  );
@@ -1,7 +1,6 @@
1
- module.exports = (sequelize, DataTypes) => {
2
- return sequelize.define(
3
- 'adminRole',
4
- {
1
+ module.exports = ({ DataTypes }) => {
2
+ return {
3
+ model: {
5
4
  userId: {
6
5
  type: DataTypes.UUID,
7
6
  allowNull: false
@@ -11,9 +10,6 @@ module.exports = (sequelize, DataTypes) => {
11
10
  allowNull: false
12
11
  },
13
12
  target: DataTypes.STRING
14
- },
15
- {
16
- paranoid: true
17
13
  }
18
- );
14
+ };
19
15
  };
@@ -1,12 +1,15 @@
1
- module.exports = (sequelize, DataTypes) => {
2
- return sequelize.define(
3
- 'application',
4
- {
1
+ module.exports = ({ DataTypes }) => {
2
+ return {
3
+ model: {
5
4
  id: {
6
- type: DataTypes.UUID,
7
- defaultValue: DataTypes.UUIDV4,
5
+ type: DataTypes.INTEGER,
6
+ autoIncrement: true,
8
7
  primaryKey: true
9
8
  },
9
+ uuid: {
10
+ type: DataTypes.UUID,
11
+ defaultValue: DataTypes.UUIDV4
12
+ },
10
13
  avatar: DataTypes.STRING,
11
14
  name: {
12
15
  type: DataTypes.STRING,
@@ -23,14 +26,17 @@ module.exports = (sequelize, DataTypes) => {
23
26
  defaultValue: 0
24
27
  }
25
28
  },
26
- {
27
- paranoid: true,
29
+ options: {
28
30
  indexes: [
29
31
  {
30
32
  unique: true,
31
- fields: ['code', 'deletedAt']
33
+ fields: ['code', 'deleted_at']
34
+ },
35
+ {
36
+ unique: true,
37
+ fields: ['uuid', 'deleted_at']
32
38
  }
33
39
  ]
34
40
  }
35
- );
41
+ };
36
42
  };
@@ -0,0 +1,25 @@
1
+ module.exports = ({ DataTypes }) => {
2
+ return {
3
+ model: {
4
+ tenantId: {
5
+ type: DataTypes.UUID,
6
+ allowNull: false
7
+ },
8
+ name: {
9
+ type: DataTypes.STRING
10
+ },
11
+ shortName: {
12
+ type: DataTypes.STRING
13
+ },
14
+ themeColor: {
15
+ type: DataTypes.STRING
16
+ },
17
+ logo: {
18
+ type: DataTypes.STRING
19
+ },
20
+ description: {
21
+ type: DataTypes.TEXT
22
+ }
23
+ }
24
+ };
25
+ };
@@ -1,15 +1,17 @@
1
- module.exports = (sequelize, DataTypes) => {
2
- return sequelize.define(
3
- 'loginLog',
4
- {
1
+ module.exports = ({ DataTypes }) => {
2
+ return {
3
+ model: {
5
4
  userId: {
6
5
  type: DataTypes.UUID,
7
6
  allowNull: false
8
7
  },
9
- ip: DataTypes.STRING
10
- },
11
- {
12
- paranoid: true
8
+ ip: DataTypes.STRING,
9
+ currentTenantId: {
10
+ type: DataTypes.UUID
11
+ },
12
+ applicationId: {
13
+ type: DataTypes.UUID
14
+ }
13
15
  }
14
- );
16
+ };
15
17
  };
@@ -1,9 +1,8 @@
1
- module.exports = (sequelize, DataTypes) => {
2
- return sequelize.define(
3
- 'permission',
4
- {
1
+ module.exports = ({ DataTypes }) => {
2
+ return {
3
+ model: {
5
4
  applicationId: {
6
- type: DataTypes.STRING,
5
+ type: DataTypes.UUID,
7
6
  allowNull: false
8
7
  },
9
8
  code: {
@@ -40,14 +39,13 @@ module.exports = (sequelize, DataTypes) => {
40
39
  defaultValue: 0
41
40
  }
42
41
  },
43
- {
44
- paranoid: true,
42
+ options: {
45
43
  indexes: [
46
44
  {
47
45
  unique: true,
48
- fields: ['code', 'applicationId', 'pid', 'deletedAt']
46
+ fields: ['code', 'application_id', 'pid', 'deleted_at']
49
47
  }
50
48
  ]
51
49
  }
52
- );
50
+ };
53
51
  };
@@ -0,0 +1,43 @@
1
+ module.exports = ({ DataTypes }) => {
2
+ return {
3
+ model: {
4
+ userId: {
5
+ type: DataTypes.UUID,
6
+ allowNull: false
7
+ },
8
+ tenantId: {
9
+ type: DataTypes.UUID
10
+ },
11
+ type: {
12
+ type: DataTypes.STRING,
13
+ comment: 'user,tenant,admin'
14
+ },
15
+ applicationId: {
16
+ type: DataTypes.UUID
17
+ },
18
+ action: {
19
+ type: DataTypes.STRING
20
+ },
21
+ summary: {
22
+ type: DataTypes.TEXT
23
+ }
24
+ },
25
+ options: {
26
+ indexes: [
27
+ {
28
+ fields: ['user_id', 'type']
29
+ },
30
+ {
31
+ fields: ['tenant_id', 'type']
32
+ },
33
+ {
34
+ fields: ['action', 'type']
35
+ }
36
+ ]
37
+ },
38
+ associate: ({ requestLog, application, user }) => {
39
+ requestLog.belongsTo(application, { targetKey: 'uuid', constraints: false });
40
+ requestLog.belongsTo(user, { targetKey: 'uuid', constraints: false });
41
+ }
42
+ };
43
+ };
@@ -1,13 +1,12 @@
1
- module.exports = (sequelize, DataTypes) => {
2
- return sequelize.define(
3
- 'tenantApplication',
4
- {
1
+ module.exports = ({ DataTypes }) => {
2
+ return {
3
+ model: {
5
4
  tenantId: {
6
- type: DataTypes.STRING,
5
+ type: DataTypes.UUID,
7
6
  allowNull: false
8
7
  },
9
8
  applicationId: {
10
- type: DataTypes.INTEGER,
9
+ type: DataTypes.UUID,
11
10
  allowNull: false
12
11
  },
13
12
  status: {
@@ -15,14 +14,13 @@ module.exports = (sequelize, DataTypes) => {
15
14
  defaultValue: 0 //0:开启 11:关闭
16
15
  }
17
16
  },
18
- {
19
- paranoid: true,
17
+ options: {
20
18
  indexes: [
21
19
  {
22
20
  unique: true,
23
- fields: ['tenantId', 'applicationId', 'deletedAt']
21
+ fields: ['tenant_id', 'application_id', 'deleted_at']
24
22
  }
25
23
  ]
26
24
  }
27
- );
25
+ };
28
26
  };
@@ -1,9 +1,8 @@
1
- module.exports = (sequelize, DataTypes) => {
2
- return sequelize.define(
3
- 'tenantOrg',
4
- {
1
+ module.exports = ({ DataTypes }) => {
2
+ return {
3
+ model: {
5
4
  tenantId: {
6
- type: DataTypes.STRING,
5
+ type: DataTypes.UUID,
7
6
  allowNull: false
8
7
  },
9
8
  name: {
@@ -22,9 +21,6 @@ module.exports = (sequelize, DataTypes) => {
22
21
  type: DataTypes.INTEGER,
23
22
  defaultValue: 0
24
23
  }
25
- },
26
- {
27
- paranoid: true
28
24
  }
29
- );
25
+ };
30
26
  };
@@ -1,9 +1,8 @@
1
- module.exports = (sequelize, DataTypes) => {
2
- return sequelize.define(
3
- 'tenantPermission',
4
- {
1
+ module.exports = ({ DataTypes }) => {
2
+ return {
3
+ model: {
5
4
  tenantId: {
6
- type: DataTypes.STRING,
5
+ type: DataTypes.UUID,
7
6
  allowNull: false
8
7
  },
9
8
  permissionId: {
@@ -15,14 +14,13 @@ module.exports = (sequelize, DataTypes) => {
15
14
  defaultValue: 0 //0:开启 11:关闭
16
15
  }
17
16
  },
18
- {
19
- paranoid: true,
17
+ options: {
20
18
  indexes: [
21
19
  {
22
20
  unique: true,
23
- fields: ['tenantId', 'permissionId', 'deletedAt']
21
+ fields: ['tenant_id', 'permission_id', 'deleted_at']
24
22
  }
25
23
  ]
26
24
  }
27
- );
25
+ };
28
26
  };
@@ -1,13 +1,12 @@
1
- module.exports = (sequelize, DataTypes) => {
2
- const tenantRoleApplication = sequelize.define(
3
- 'tenantRoleApplication',
4
- {
1
+ module.exports = ({ DataTypes }) => {
2
+ return {
3
+ model: {
5
4
  tenantId: {
6
- type: DataTypes.STRING,
5
+ type: DataTypes.UUID,
7
6
  allowNull: false
8
7
  },
9
8
  applicationId: {
10
- type: DataTypes.INTEGER,
9
+ type: DataTypes.UUID,
11
10
  allowNull: false
12
11
  },
13
12
  roleId: {
@@ -19,19 +18,20 @@ module.exports = (sequelize, DataTypes) => {
19
18
  defaultValue: 0 //0:开启 11:关闭
20
19
  }
21
20
  },
22
- {
23
- paranoid: true,
21
+ options: {
24
22
  indexes: [
25
23
  {
26
24
  name: 'application_key',
27
25
  unique: true,
28
- fields: ['tenantId', 'applicationId', 'roleId', 'deletedAt']
26
+ fields: ['tenant_id', 'application_id', 'role_id', 'deleted_at']
29
27
  }
30
28
  ]
29
+ },
30
+ associate: ({ tenantRoleApplication, application }) => {
31
+ tenantRoleApplication.belongsTo(application, {
32
+ targetKey: 'uuid',
33
+ constraints: false
34
+ });
31
35
  }
32
- );
33
- tenantRoleApplication.associate = ({ tenantRoleApplication, application }) => {
34
- tenantRoleApplication.belongsTo(application);
35
36
  };
36
- return tenantRoleApplication;
37
37
  };
@@ -1,9 +1,8 @@
1
- module.exports = (sequelize, DataTypes) => {
2
- const tenantRolePermission = sequelize.define(
3
- 'tenantRolePermission',
4
- {
1
+ module.exports = ({ DataTypes }) => {
2
+ return {
3
+ model: {
5
4
  tenantId: {
6
- type: DataTypes.STRING,
5
+ type: DataTypes.UUID,
7
6
  allowNull: false
8
7
  },
9
8
  permissionId: {
@@ -19,21 +18,17 @@ module.exports = (sequelize, DataTypes) => {
19
18
  defaultValue: 0 //0:开启 11:关闭
20
19
  }
21
20
  },
22
- {
23
- paranoid: true,
21
+ options: {
24
22
  indexes: [
25
23
  {
26
24
  name: 'permission_key',
27
25
  unique: true,
28
- fields: ['tenantId', 'permissionId', 'roleId', 'deletedAt']
26
+ fields: ['tenant_id', 'permission_id', 'role_id', 'deleted_at']
29
27
  }
30
28
  ]
29
+ },
30
+ associate: ({ tenantRolePermission, permission }) => {
31
+ tenantRolePermission.belongsTo(permission, { constraints: false });
31
32
  }
32
- );
33
-
34
- tenantRolePermission.associate = ({ tenantRolePermission, permission }) => {
35
- tenantRolePermission.belongsTo(permission);
36
33
  };
37
-
38
- return tenantRolePermission;
39
34
  };
@@ -1,9 +1,8 @@
1
- module.exports = (sequelize, DataTypes) => {
2
- return sequelize.define(
3
- 'tenantRole',
4
- {
1
+ module.exports = ({ DataTypes }) => {
2
+ return {
3
+ model: {
5
4
  tenantId: {
6
- type: DataTypes.STRING,
5
+ type: DataTypes.UUID,
7
6
  allowNull: false
8
7
  },
9
8
  name: {
@@ -19,9 +18,6 @@ module.exports = (sequelize, DataTypes) => {
19
18
  defaultValue: 0 //0:用户自定义,1:系统默认
20
19
  },
21
20
  description: DataTypes.TEXT
22
- },
23
- {
24
- paranoid: true
25
21
  }
26
- );
22
+ };
27
23
  };
@@ -1,9 +1,8 @@
1
- module.exports = (sequelize, DataTypes) => {
2
- return sequelize.define(
3
- 'tenantShareGroup',
4
- {
1
+ module.exports = ({ DataTypes }) => {
2
+ return {
3
+ model: {
5
4
  tenantId: {
6
- type: DataTypes.STRING,
5
+ type: DataTypes.UUID,
7
6
  allowNull: false
8
7
  },
9
8
  tenantShareGroupId: {
@@ -14,9 +13,6 @@ module.exports = (sequelize, DataTypes) => {
14
13
  type: DataTypes.INTEGER,
15
14
  allowNull: false
16
15
  }
17
- },
18
- {
19
- paranoid: true
20
16
  }
21
- );
17
+ };
22
18
  };
@@ -1,9 +1,8 @@
1
- module.exports = (sequelize, DataTypes) => {
2
- return sequelize.define(
3
- 'tenantShareGroup',
4
- {
1
+ module.exports = ({ DataTypes }) => {
2
+ return {
3
+ model: {
5
4
  tenantId: {
6
- type: DataTypes.STRING,
5
+ type: DataTypes.UUID,
7
6
  allowNull: false
8
7
  },
9
8
  name: {
@@ -14,9 +13,6 @@ module.exports = (sequelize, DataTypes) => {
14
13
  type: DataTypes.INTEGER,
15
14
  defaultValue: 0
16
15
  }
17
- },
18
- {
19
- paranoid: true
20
16
  }
21
- );
17
+ };
22
18
  };
@@ -1,9 +1,8 @@
1
- module.exports = (sequelize, DataTypes) => {
2
- return sequelize.define(
3
- 'tenantUserShareGroup',
4
- {
1
+ module.exports = ({ DataTypes }) => {
2
+ return {
3
+ model: {
5
4
  tenantId: {
6
- type: DataTypes.STRING,
5
+ type: DataTypes.UUID,
7
6
  allowNull: false
8
7
  },
9
8
  tenantUserId: {
@@ -14,9 +13,6 @@ module.exports = (sequelize, DataTypes) => {
14
13
  type: DataTypes.INTEGER,
15
14
  allowNull: false
16
15
  }
17
- },
18
- {
19
- paranoid: true
20
16
  }
21
- );
17
+ };
22
18
  };