@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,62 @@
1
+ const fp = require('fastify-plugin');
2
+ module.exports = fp(async (fastify, options) => {
3
+ const { models, services } = fastify.account;
4
+ const getInviteList = async ({ tenantId, filter, currentPage, perPage }) => {
5
+ const queryFilter = {};
6
+ const { count, rows } = await models.tenantToken.findAndCountAll({
7
+ where: Object.assign({}, queryFilter, { tenantId, type: 10 }),
8
+ offset: perPage * (currentPage - 1),
9
+ limit: perPage
10
+ });
11
+ return { pageData: rows, totalCount: count };
12
+ };
13
+
14
+ const generateTenantToken = async ({ type, tenantId, info, tenantUserId }) => {
15
+ await services.tenant.getTenant({ id: tenantId });
16
+ const token = fastify.jwt.sign({ tenantId });
17
+ return await models.tenantToken.create({
18
+ token,
19
+ tenantId,
20
+ info,
21
+ tenantUserId,
22
+ type
23
+ });
24
+ };
25
+
26
+ const decodeTenantToken = async ({ type, tenantId, token }) => {
27
+ if (
28
+ (await models.tenantToken.count({
29
+ where: {
30
+ type,
31
+ tenantId,
32
+ token
33
+ }
34
+ })) === 0
35
+ ) {
36
+ throw new Error('token已过期');
37
+ }
38
+
39
+ return fastify.jwt.decode(token);
40
+ };
41
+
42
+ const addInviteToken = async ({ info, tenantId, tenantUserId }) => {
43
+ return await generateTenantToken({ info, tenantId, tenantUserId, type: 10 });
44
+ };
45
+
46
+ const deleteInviteToken = async ({ id }) => {
47
+ const token = await models.tenantToken.findByPk(id);
48
+ if (!token) {
49
+ throw new Error('数据不存在');
50
+ }
51
+
52
+ await token.destroy();
53
+ };
54
+
55
+ services.tenantInvite = {
56
+ getInviteList,
57
+ generateTenantToken,
58
+ decodeTenantToken,
59
+ addInviteToken,
60
+ deleteInviteToken
61
+ };
62
+ });
@@ -0,0 +1,118 @@
1
+ const fp = require('fastify-plugin');
2
+ module.exports = fp(async (fastify, options) => {
3
+ const { models, services } = fastify.account;
4
+ const { Op } = fastify.sequelize.Sequelize;
5
+ const getTenantOrgInstance = async ({ id }) => {
6
+ const tenantOrg = await models.tenantOrg.findByPk(id, {
7
+ where: {
8
+ type: 0
9
+ }
10
+ });
11
+
12
+ if (!tenantOrg) {
13
+ throw new Error('该组织不存在');
14
+ }
15
+
16
+ return tenantOrg;
17
+ };
18
+
19
+ const addTenantOrg = async org => {
20
+ if (
21
+ await models.tenantOrg.count({
22
+ where: {
23
+ name: org.name,
24
+ pid: org.pid,
25
+ tenantId: org.tenantId
26
+ }
27
+ })
28
+ ) {
29
+ throw new Error('组织名称在同一父组织下有重复');
30
+ }
31
+
32
+ return await models.tenantOrg.create({
33
+ name: org.name,
34
+ enName: org.enName,
35
+ tenantId: org.tenantId,
36
+ pid: org.pid
37
+ });
38
+ };
39
+
40
+ const saveTenantOrg = async ({ id, tenantId, ...otherInfo }) => {
41
+ const tenantOrg = await getTenantOrgInstance({ id });
42
+ if (tenantId && tenantOrg.tenantId !== tenantId) {
43
+ throw new Error('数据已过期,请刷新页面后重试');
44
+ }
45
+ if (
46
+ await models.tenantOrg.count({
47
+ where: {
48
+ name: otherInfo.name,
49
+ pid: otherInfo.pid,
50
+ [Op.not]: {
51
+ id
52
+ }
53
+ }
54
+ })
55
+ ) {
56
+ throw new Error('组织名称在同一父组织下有重复');
57
+ }
58
+
59
+ if (otherInfo.pid === tenantOrg.id) {
60
+ throw new Error('不能用自己作为自己的父节点');
61
+ }
62
+
63
+ ['name', 'enName', 'pid'].forEach(name => {
64
+ if (otherInfo[name]) {
65
+ tenantOrg[name] = otherInfo[name];
66
+ }
67
+ });
68
+
69
+ await tenantOrg.save();
70
+ };
71
+
72
+ const deleteTenantOrg = async ({ id, tenantId }) => {
73
+ const tenantOrg = await getTenantOrgInstance({ id });
74
+
75
+ if (tenantId && tenantOrg.tenantId !== tenantId) {
76
+ throw new Error('数据已过期,请刷新页面后重试');
77
+ }
78
+
79
+ const count = await models.tenantOrg.count({
80
+ where: { tenantId: tenantOrg.tenantId, pid: id }
81
+ });
82
+
83
+ if (count > 0) {
84
+ throw new Error('组织下有用户或子组织无法删除');
85
+ }
86
+
87
+ await tenantOrg.destroy();
88
+ };
89
+
90
+ const getTenantOrgList = async ({ tenantId }) => {
91
+ const data = await models.tenantOrg.findAll({
92
+ where: { tenantId }
93
+ });
94
+
95
+ return data.map(item => item.get({ plain: true }));
96
+ };
97
+
98
+ const getTenantOrgRoot = async ({ tenantId }) => {
99
+ const data = await models.tenantOrg.findOne({
100
+ where: { tenantId, pid: 0 }
101
+ });
102
+
103
+ if (!data) {
104
+ throw new Error('该租户不存在根节点');
105
+ }
106
+
107
+ return data.get({ plain: true });
108
+ };
109
+
110
+ services.tenantOrg = {
111
+ getTenantOrgInstance,
112
+ addTenantOrg,
113
+ saveTenantOrg,
114
+ deleteTenantOrg,
115
+ getTenantOrgList,
116
+ getTenantOrgRoot
117
+ };
118
+ });
@@ -0,0 +1,109 @@
1
+ const fp = require('fastify-plugin');
2
+ const isNil = require('lodash/isNil');
3
+ module.exports = fp(async (fastify, options) => {
4
+ const { models, services } = fastify.account;
5
+ const { Op } = fastify.sequelize.Sequelize;
6
+
7
+ const getTenantRoleList = async ({ tenantId, currentPage, perPage, filter }) => {
8
+ const queryFilter = {};
9
+ if (!isNil(filter?.type)) {
10
+ queryFilter.type = filter.type;
11
+ }
12
+ const { count, rows } = await models.tenantRole.findAndCountAll({
13
+ where: Object.assign({}, queryFilter, { tenantId }),
14
+ offset: perPage * (currentPage - 1),
15
+ limit: perPage
16
+ });
17
+
18
+ return { pageData: rows, totalCount: count };
19
+ };
20
+
21
+ const getTenantRoleInstance = async ({ id }) => {
22
+ const tenantRole = await models.tenantRole.findByPk(id, {
23
+ where: {
24
+ type: 0
25
+ }
26
+ });
27
+
28
+ if (!tenantRole) {
29
+ throw new Error('角色不存在');
30
+ }
31
+
32
+ return tenantRole;
33
+ };
34
+
35
+ const addTenantRole = async ({ tenantId, name, description }) => {
36
+ await services.tenant.getTenant({ id: tenantId });
37
+
38
+ return await models.tenantRole.create({
39
+ tenantId,
40
+ name,
41
+ description
42
+ });
43
+ };
44
+
45
+ const saveTenantRole = async ({ id, tenantId, ...otherInfo }) => {
46
+ const tenantRole = await getTenantRoleInstance({ id });
47
+
48
+ if (tenantId && tenantRole.tenantId !== tenantId) {
49
+ throw new Error('数据已过期,请刷新页面后重试');
50
+ }
51
+
52
+ ['name', 'description'].forEach(name => {
53
+ if (otherInfo[name]) {
54
+ tenantRole[name] = otherInfo[name];
55
+ }
56
+ });
57
+
58
+ await tenantRole.save();
59
+ };
60
+
61
+ const removeTenantRole = async ({ id, tenantId }) => {
62
+ const tenantRole = await getTenantRoleInstance({ id });
63
+
64
+ if (tenantId && tenantRole.tenantId !== tenantId) {
65
+ throw new Error('数据已过期,请刷新页面后重试');
66
+ }
67
+
68
+ await services.tenantUser.checkTenantRoleUsed({ tenantRoleId: tenantRole.id });
69
+
70
+ if (tenantRole.type === 1) {
71
+ throw new Error('该角色为系统默认角色,不能删除');
72
+ }
73
+
74
+ await tenantRole.destroy();
75
+ };
76
+
77
+ const getPermissionByTenantRoles = async ({ tenantRoleIds }) => {
78
+ const tenantRolePermission = await models.tenantRolePermission.findAll({
79
+ attributes: ['permissionId'],
80
+ include: {
81
+ attributes: ['code', 'name', 'isModule', 'paths'],
82
+ model: models.permission
83
+ },
84
+ where: {
85
+ roleId: {
86
+ [Op.in]: tenantRoleIds
87
+ }
88
+ }
89
+ });
90
+
91
+ return await models.permission.findAll({
92
+ attributes: ['id', 'code', 'name', 'isModule', 'pid', 'applicationId', 'paths'],
93
+ where: {
94
+ id: {
95
+ [Op.in]: tenantRolePermission.map(({ permissionId }) => permissionId)
96
+ }
97
+ }
98
+ });
99
+ };
100
+
101
+ services.tenantRole = {
102
+ getPermissionByTenantRoles,
103
+ getTenantRoleList,
104
+ getTenantRoleInstance,
105
+ addTenantRole,
106
+ saveTenantRole,
107
+ removeTenantRole
108
+ };
109
+ });