@kne/fastify-account 1.0.0-alpha.0 → 1.0.0-alpha.10

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 (42) hide show
  1. package/README.md +636 -5
  2. package/index.js +13 -4
  3. package/libs/controllers/account.js +8 -7
  4. package/libs/controllers/admin.js +16 -15
  5. package/libs/controllers/adminPermission.js +42 -35
  6. package/libs/controllers/adminRole.js +13 -12
  7. package/libs/controllers/adminTenant.js +39 -36
  8. package/libs/controllers/tenant.js +16 -4
  9. package/libs/controllers/user.js +23 -1
  10. package/libs/models/admin-role.js +4 -8
  11. package/libs/models/application.js +16 -10
  12. package/libs/models/login-log.js +4 -8
  13. package/libs/models/permission.js +7 -9
  14. package/libs/models/tenant-application.js +8 -10
  15. package/libs/models/tenant-org.js +5 -9
  16. package/libs/models/tenant-permission.js +7 -9
  17. package/libs/models/tenant-role-application.js +15 -10
  18. package/libs/models/tenant-role-permission.js +11 -9
  19. package/libs/models/tenant-role.js +5 -9
  20. package/libs/models/tenant-share-group-permission.js +5 -9
  21. package/libs/models/tenant-share-group.js +5 -9
  22. package/libs/models/tenant-source-user-share-group.js +5 -9
  23. package/libs/models/tenant-token.js +7 -9
  24. package/libs/models/tenant-user-org.js +11 -10
  25. package/libs/models/tenant-user-role.js +11 -10
  26. package/libs/models/tenant-user-share-group.js +6 -10
  27. package/libs/models/tenant-user.js +35 -16
  28. package/libs/models/tenant.js +17 -9
  29. package/libs/models/user-account.js +17 -9
  30. package/libs/models/user.js +27 -17
  31. package/libs/models/verification-code.js +4 -8
  32. package/libs/services/account.js +34 -16
  33. package/libs/services/admin.js +17 -121
  34. package/libs/services/application.js +151 -0
  35. package/libs/services/permission.js +47 -145
  36. package/libs/services/tenant-invite.js +62 -0
  37. package/libs/services/tenant-org.js +97 -0
  38. package/libs/services/tenant-role.js +108 -0
  39. package/libs/services/tenant-user.js +555 -0
  40. package/libs/services/tenant.js +68 -512
  41. package/libs/services/user.js +69 -30
  42. package/package.json +4 -3
@@ -1,9 +1,8 @@
1
- module.exports = (sequelize, DataTypes) => {
2
- return 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,14 +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
  {
24
+ name: 'permission_key',
26
25
  unique: true,
27
- fields: ['tenantId', 'permissionId', 'roleId', 'deletedAt']
26
+ fields: ['tenant_id', 'permission_id', 'role_id', 'deleted_at']
28
27
  }
29
28
  ]
29
+ },
30
+ associate: ({ tenantRolePermission, permission }) => {
31
+ tenantRolePermission.belongsTo(permission, { constraints: false });
30
32
  }
31
- );
33
+ };
32
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
  };
@@ -1,7 +1,6 @@
1
- module.exports = (sequelize, DataTypes) => {
2
- return sequelize.define(
3
- 'tenantToken',
4
- {
1
+ module.exports = ({ DataTypes }) => {
2
+ return {
3
+ model: {
5
4
  tenantId: {
6
5
  type: DataTypes.UUID,
7
6
  allowNull: false
@@ -15,18 +14,17 @@ module.exports = (sequelize, DataTypes) => {
15
14
  type: DataTypes.INTEGER,
16
15
  allowNull: false //10:邀请用户加入租户
17
16
  },
18
- createTenantUserId: {
17
+ createdTenantUserId: {
19
18
  type: DataTypes.UUID
20
19
  }
21
20
  },
22
- {
23
- paranoid: true,
21
+ options: {
24
22
  indexes: [
25
23
  {
26
24
  unique: true,
27
- fields: ['tenantId', 'token', 'type', 'deletedAt']
25
+ fields: ['tenant_id', 'token', 'type', 'deleted_at']
28
26
  }
29
27
  ]
30
28
  }
31
- );
29
+ };
32
30
  };
@@ -1,22 +1,23 @@
1
- module.exports = (sequelize, DataTypes) => {
2
- return sequelize.define(
3
- 'tenantUserOrg',
4
- {
1
+ module.exports = ({ DataTypes }) => {
2
+ return {
3
+ model: {
4
+ id: {
5
+ type: DataTypes.INTEGER,
6
+ autoIncrement: true,
7
+ primaryKey: true
8
+ },
5
9
  tenantId: {
6
- type: DataTypes.STRING,
10
+ type: DataTypes.UUID,
7
11
  allowNull: false
8
12
  },
9
13
  tenantUserId: {
10
- type: DataTypes.STRING,
14
+ type: DataTypes.UUID,
11
15
  allowNull: false
12
16
  },
13
17
  tenantOrgId: {
14
18
  type: DataTypes.INTEGER,
15
19
  allowNull: false
16
20
  }
17
- },
18
- {
19
- paranoid: true
20
21
  }
21
- );
22
+ };
22
23
  };
@@ -1,22 +1,23 @@
1
- module.exports = (sequelize, DataTypes) => {
2
- return sequelize.define(
3
- 'tenantUserRole',
4
- {
1
+ module.exports = ({ DataTypes }) => {
2
+ return {
3
+ model: {
4
+ id: {
5
+ type: DataTypes.INTEGER,
6
+ autoIncrement: true,
7
+ primaryKey: true
8
+ },
5
9
  tenantId: {
6
- type: DataTypes.STRING,
10
+ type: DataTypes.UUID,
7
11
  allowNull: false
8
12
  },
9
13
  tenantUserId: {
10
- type: DataTypes.STRING,
14
+ type: DataTypes.UUID,
11
15
  allowNull: false
12
16
  },
13
17
  tenantRoleId: {
14
18
  type: DataTypes.INTEGER,
15
19
  allowNull: false
16
20
  }
17
- },
18
- {
19
- paranoid: true
20
21
  }
21
- );
22
+ };
22
23
  };
@@ -1,22 +1,18 @@
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: {
10
- type: DataTypes.STRING,
9
+ type: DataTypes.UUID,
11
10
  allowNull: false
12
11
  },
13
12
  tenantShareGroupId: {
14
13
  type: DataTypes.INTEGER,
15
14
  allowNull: false
16
15
  }
17
- },
18
- {
19
- paranoid: true
20
16
  }
21
- );
17
+ };
22
18
  };
@@ -1,12 +1,15 @@
1
- module.exports = (sequelize, DataTypes) => {
2
- const tenantUser = sequelize.define(
3
- 'tenantUser',
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
  userId: {
11
14
  type: DataTypes.UUID,
12
15
  allowNull: false
@@ -36,21 +39,37 @@ module.exports = (sequelize, DataTypes) => {
36
39
  defaultValue: 0 //0:正常,11:已禁用,12:已关闭,
37
40
  }
38
41
  },
39
- {
40
- paranoid: true,
42
+ options: {
41
43
  indexes: [
42
44
  {
43
45
  unique: true,
44
- fields: ['tenantId', 'userId', 'deletedAt']
46
+ fields: ['uuid', 'deleted_at']
47
+ },
48
+ {
49
+ unique: true,
50
+ fields: ['tenant_id', 'user_id', 'deleted_at']
45
51
  }
46
52
  ]
53
+ },
54
+ associate: ({ user, tenantRole, tenantUser, tenantUserRole, tenantOrg, tenantUserOrg }) => {
55
+ tenantUser.belongsToMany(tenantRole, {
56
+ through: tenantUserRole,
57
+ foreignKey: 'tenantUserId',
58
+ otherKey: 'tenantRoleId',
59
+ sourceKey: 'uuid',
60
+ constraints: false
61
+ });
62
+ tenantUser.belongsToMany(tenantOrg, {
63
+ through: tenantUserOrg,
64
+ foreignKey: 'tenantUserId',
65
+ otherKey: 'tenantOrgId',
66
+ sourceKey: 'uuid',
67
+ constraints: false
68
+ });
69
+ tenantUser.belongsTo(user, {
70
+ targetKey: 'uuid',
71
+ constraints: false
72
+ });
47
73
  }
48
- );
49
-
50
- tenantUser.associate = ({ user, tenantRole, tenantUser, tenantUserRole, tenantOrg, tenantUserOrg }) => {
51
- tenantUser.belongsToMany(tenantRole, { through: tenantUserRole });
52
- tenantUser.belongsToMany(tenantOrg, { through: tenantUserOrg });
53
- tenantUser.belongsTo(user);
54
74
  };
55
- return tenantUser;
56
75
  };
@@ -1,12 +1,15 @@
1
- module.exports = (sequelize, DataTypes) => {
2
- return sequelize.define(
3
- 'tenant',
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
  name: {
11
14
  type: DataTypes.STRING,
12
15
  allowNull: false
@@ -31,8 +34,13 @@ module.exports = (sequelize, DataTypes) => {
31
34
  },
32
35
  description: DataTypes.TEXT
33
36
  },
34
- {
35
- paranoid: true
37
+ options: {
38
+ indexes: [
39
+ {
40
+ unique: true,
41
+ fields: ['uuid', 'deleted_at']
42
+ }
43
+ ]
36
44
  }
37
- );
45
+ };
38
46
  };
@@ -1,12 +1,15 @@
1
- module.exports = (sequelize, DataTypes) => {
2
- return sequelize.define(
3
- 'userAccount',
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
  password: {
11
14
  type: DataTypes.STRING,
12
15
  allowNull: false
@@ -19,8 +22,13 @@ module.exports = (sequelize, DataTypes) => {
19
22
  type: DataTypes.UUID //用户修改密码时重新生成一条数据,该字段用于记录这个账号之前是属于哪个账号的
20
23
  }
21
24
  },
22
- {
23
- paranoid: true
25
+ options: {
26
+ indexes: [
27
+ {
28
+ unique: true,
29
+ fields: ['uuid', 'deleted_at']
30
+ }
31
+ ]
24
32
  }
25
- );
33
+ };
26
34
  };
@@ -1,12 +1,15 @@
1
- module.exports = (sequelize, DataTypes) => {
2
- const user = sequelize.define(
3
- 'user',
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
  nickname: DataTypes.STRING,
11
14
  email: DataTypes.STRING,
12
15
  phone: DataTypes.STRING,
@@ -26,25 +29,32 @@ module.exports = (sequelize, DataTypes) => {
26
29
  birthday: DataTypes.DATE,
27
30
  description: DataTypes.TEXT
28
31
  },
29
- {
30
- paranoid: true,
32
+ options: {
31
33
  indexes: [
32
34
  {
33
35
  unique: true,
34
- fields: ['email', 'deletedAt']
36
+ fields: ['uuid', 'deleted_at']
35
37
  },
36
38
  {
37
39
  unique: true,
38
- fields: ['phone', 'deletedAt']
40
+ fields: ['email', 'deleted_at']
41
+ },
42
+ {
43
+ unique: true,
44
+ fields: ['phone', 'deleted_at']
39
45
  }
40
46
  ]
47
+ },
48
+ associate: ({ adminRole, user, tenant, tenantUser }) => {
49
+ user.hasOne(adminRole, { foreignKey: 'userId', sourceKey: 'uuid', constraints: false });
50
+ user.belongsToMany(tenant, {
51
+ through: { model: tenantUser, unique: false },
52
+ otherKey: 'tenantId',
53
+ foreignKey: 'userId',
54
+ targetKey: 'uuid',
55
+ sourceKey: 'uuid',
56
+ constraints: false
57
+ });
41
58
  }
42
- );
43
-
44
- user.associate = ({ adminRole, user, tenant, tenantUser }) => {
45
- user.hasOne(adminRole, { foreignKey: 'userId' });
46
- user.belongsToMany(tenant, { through: { model: tenantUser, unique: false } });
47
59
  };
48
-
49
- return user;
50
60
  };
@@ -1,7 +1,6 @@
1
- module.exports = (sequelize, DataTypes) => {
2
- return sequelize.define(
3
- 'verificationCode',
4
- {
1
+ module.exports = ({ DataTypes }) => {
2
+ return {
3
+ model: {
5
4
  name: {
6
5
  type: DataTypes.STRING,
7
6
  allowNull: false
@@ -18,9 +17,6 @@ module.exports = (sequelize, DataTypes) => {
18
17
  type: DataTypes.INTEGER,
19
18
  defaultValue: 0 //0:未验证,1:已验证,2:已过期
20
19
  }
21
- },
22
- {
23
- paranoid: true
24
20
  }
25
- );
21
+ };
26
22
  };
@@ -1,6 +1,7 @@
1
1
  const fp = require('fastify-plugin');
2
2
  const dayjs = require('dayjs');
3
3
  const bcrypt = require('bcryptjs');
4
+ const crypto = require('crypto');
4
5
 
5
6
  function generateRandom6DigitNumber() {
6
7
  const randomNumber = Math.random() * 1000000;
@@ -12,9 +13,10 @@ function userNameIsEmail(username) {
12
13
  }
13
14
 
14
15
  module.exports = fp(async (fastify, options) => {
16
+ const { models, services } = fastify.account;
15
17
  const login = async ({ username, password, ip }) => {
16
18
  const isEmail = userNameIsEmail(username);
17
- const user = await fastify.account.models.user.findOne({
19
+ const user = await models.user.findOne({
18
20
  where: Object.assign(
19
21
  {},
20
22
  isEmail
@@ -38,16 +40,23 @@ module.exports = fp(async (fastify, options) => {
38
40
 
39
41
  await passwordAuthentication({ accountId: user.userAccountId, password });
40
42
 
41
- await fastify.account.models.loginLog.create({
42
- userId: user.id,
43
+ await models.loginLog.create({
44
+ userId: user.uuid,
43
45
  ip
44
46
  });
45
47
 
46
- return fastify.jwt.sign({ payload: { id: user.id } });
48
+ return {
49
+ token: fastify.jwt.sign({ payload: { id: user.uuid } }),
50
+ user: Object.assign({}, user.get({ plain: true }), { id: user.uuid })
51
+ };
47
52
  };
48
53
 
49
54
  const passwordAuthentication = async ({ accountId, password }) => {
50
- const userAccount = await fastify.account.models.userAccount.findByPk(accountId);
55
+ const userAccount = await models.userAccount.findOne({
56
+ where: {
57
+ uuid: accountId
58
+ }
59
+ });
51
60
  if (!userAccount) {
52
61
  throw new Error('账号不存在');
53
62
  }
@@ -68,23 +77,31 @@ module.exports = fp(async (fastify, options) => {
68
77
  };
69
78
  };
70
79
 
80
+ const md5 = value => {
81
+ const hash = crypto.createHash('md5');
82
+ hash.update(value);
83
+ return hash.digest('hex');
84
+ };
85
+
71
86
  const resetPassword = async ({ userId, password }) => {
72
- const userInfo = await fastify.account.models.user.findByPk(userId);
87
+ const userInfo = await models.user.findOne({
88
+ where: { uuid: userId }
89
+ });
73
90
  if (!userInfo) {
74
91
  throw new Error('用户不存在');
75
92
  }
76
- const account = await fastify.account.models.userAccount.create(
93
+ const account = await models.userAccount.create(
77
94
  Object.assign({}, await passwordEncryption(password), {
78
95
  belongToUserId: userId
79
96
  })
80
97
  );
81
98
 
82
- await userInfo.update({ userAccountId: account.id });
99
+ await userInfo.update({ userAccountId: account.uuid });
83
100
  };
84
101
 
85
102
  const register = async ({ avatar, nickname, gender, birthday, description, phone, email, code, password, status, invitationCode }) => {
86
103
  const type = phone ? 0 : 1;
87
- const verificationCode = await fastify.account.models.verificationCode.findOne({
104
+ const verificationCode = await models.verificationCode.findOne({
88
105
  where: {
89
106
  name: type === 0 ? phone : email,
90
107
  type,
@@ -99,7 +116,7 @@ module.exports = fp(async (fastify, options) => {
99
116
  verificationCode.status = 2;
100
117
  await verificationCode.save();
101
118
 
102
- return await fastify.account.services.user.addUser({
119
+ return await services.user.addUser({
103
120
  avatar,
104
121
  nickname,
105
122
  gender,
@@ -117,7 +134,7 @@ module.exports = fp(async (fastify, options) => {
117
134
 
118
135
  // 这里写发送逻辑
119
136
 
120
- await fastify.account.models.verificationCode.update(
137
+ await models.verificationCode.update(
121
138
  {
122
139
  status: 2
123
140
  },
@@ -130,7 +147,7 @@ module.exports = fp(async (fastify, options) => {
130
147
  }
131
148
  );
132
149
 
133
- await fastify.account.models.verificationCode.create({
150
+ await models.verificationCode.create({
134
151
  name: email,
135
152
  type: 1,
136
153
  code
@@ -140,7 +157,7 @@ module.exports = fp(async (fastify, options) => {
140
157
  };
141
158
 
142
159
  const verificationCodeValidate = async ({ name, type, code }) => {
143
- const verificationCode = await fastify.account.models.verificationCode.findOne({
160
+ const verificationCode = await models.verificationCode.findOne({
144
161
  where: {
145
162
  name,
146
163
  type,
@@ -165,7 +182,7 @@ module.exports = fp(async (fastify, options) => {
165
182
 
166
183
  // 这里写发送逻辑
167
184
 
168
- await fastify.account.models.verificationCode.update(
185
+ await models.verificationCode.update(
169
186
  {
170
187
  status: 2
171
188
  },
@@ -178,7 +195,7 @@ module.exports = fp(async (fastify, options) => {
178
195
  }
179
196
  );
180
197
 
181
- await fastify.account.models.verificationCode.create({
198
+ await models.verificationCode.create({
182
199
  name: phone,
183
200
  type: 0,
184
201
  code
@@ -187,7 +204,8 @@ module.exports = fp(async (fastify, options) => {
187
204
  return code;
188
205
  };
189
206
 
190
- fastify.account.services.account = {
207
+ services.account = {
208
+ md5,
191
209
  login,
192
210
  register,
193
211
  sendEmailCode,