@kne/fastify-account 1.0.0-alpha.18 → 1.0.0-alpha.19

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.
@@ -353,4 +353,27 @@ module.exports = fp(async (fastify, options) => {
353
353
  return {};
354
354
  }
355
355
  );
356
+
357
+ fastify.post(
358
+ `${options.prefix}/admin/copyPermissions`,
359
+ {
360
+ onRequest: [authenticate.user, authenticate.admin],
361
+ schema: {
362
+ tags: ['管理后台-权限'],
363
+ summary: '复制应用权限到目标应用',
364
+ body: {
365
+ type: 'object',
366
+ required: ['applicationId', 'originApplicationId'],
367
+ properties: {
368
+ applicationId: { type: 'string' },
369
+ originApplicationId: { type: 'string' }
370
+ }
371
+ }
372
+ }
373
+ },
374
+ async request => {
375
+ await services.permission.copyPermissions(request.body);
376
+ return {};
377
+ }
378
+ );
356
379
  });
@@ -2,26 +2,38 @@ module.exports = ({ DataTypes }) => {
2
2
  return {
3
3
  model: {
4
4
  userId: {
5
- type: DataTypes.UUID, allowNull: false
6
- }, tenantId: {
5
+ type: DataTypes.UUID,
6
+ allowNull: false
7
+ },
8
+ tenantId: {
7
9
  type: DataTypes.UUID
8
- }, type: {
9
- type: DataTypes.STRING, comment: 'user,tenant,admin'
10
- }, applicationId: {
10
+ },
11
+ type: {
12
+ type: DataTypes.STRING,
13
+ comment: 'user,tenant,admin'
14
+ },
15
+ applicationId: {
11
16
  type: DataTypes.UUID
12
- }, action: {
13
- type: DataTypes.TEXT
14
- }, summary: {
17
+ },
18
+ action: {
19
+ type: DataTypes.STRING
20
+ },
21
+ summary: {
15
22
  type: DataTypes.TEXT
16
23
  }
17
- }, options: {
18
- indexes: [{
19
- fields: ['user_id', 'type']
20
- }, {
21
- fields: ['tenant_id', 'type']
22
- }, {
23
- fields: ['action', 'type']
24
- }]
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
+ ]
25
37
  }
26
38
  };
27
39
  };
@@ -68,62 +68,75 @@ module.exports = fp(async (fastify, options) => {
68
68
  });
69
69
  };
70
70
 
71
+ const importPermissionsToApplication = async ({ applicationId, permissions }) => {
72
+ const permissionsPidMapping = groupBy(permissions, 'pid');
73
+ const pidMapping = {};
74
+ for (let pid of await Promise.all(Object.keys(permissionsPidMapping).sort())) {
75
+ const targetPid = pid === '0' ? 0 : pidMapping[pid];
76
+ await Promise.all(
77
+ permissionsPidMapping[pid].map(async item => {
78
+ const originPermission = await models.permission.findOne({
79
+ where: {
80
+ pid: targetPid,
81
+ code: item.code,
82
+ applicationId
83
+ }
84
+ });
85
+ if (originPermission) {
86
+ pidMapping[item.id] = originPermission.id;
87
+ return;
88
+ }
89
+ const newPermission = await services.permission.addPermission({
90
+ applicationId,
91
+ pid: targetPid,
92
+ code: item.code,
93
+ name: item.name,
94
+ type: item.type,
95
+ isModule: item.isModule,
96
+ isMust: item.isMust,
97
+ description: item.description
98
+ });
99
+ pidMapping[item.id] = newPermission.id;
100
+ })
101
+ );
102
+ }
103
+ };
104
+
71
105
  const parsePermissionListJSON = async ({ file }) => {
72
106
  const data = JSON.parse(await file.toBuffer());
73
107
  await Promise.all(
74
108
  data.map(async application => {
75
109
  const { permissions, ...other } = application;
76
- const app = await services.application.getApplicationByCode({ code: application.code });
77
-
110
+ let app = await services.application.getApplicationByCode({ code: application.code });
78
111
  if (!app) {
79
- const newApplication = await services.application.addApplication(other);
80
- const permissionsPidMapping = groupBy(permissions, 'pid');
81
- const addPermissions = async (pid, applicationId) =>
82
- await Promise.all(
83
- (get(permissionsPidMapping, pid) || []).map(async ({ id, ...permissionProps }) => {
84
- const permission = await services.permission.addPermission(
85
- Object.assign({}, permissionProps, {
86
- applicationId,
87
- pid
88
- })
89
- );
90
- await addPermissions(permission.id, applicationId);
91
- })
92
- );
93
- await addPermissions(0, newApplication.uuid);
94
- } else {
95
- const permissionsPidMapping = groupBy(permissions, 'pid');
96
- const addPermissions = async (pid, applicationId, importPid) => {
97
- await Promise.all(
98
- (get(permissionsPidMapping, importPid || pid) || []).map(async ({ id, ...permissionProps }) => {
99
- const current = await models.permission.findOne({ where: { code: permissionProps.code, pid } });
100
- if (current) {
101
- await addPermissions(current.id, applicationId, id);
102
- } else {
103
- const permission = await services.permission.addPermission(
104
- Object.assign({}, permissionProps, {
105
- applicationId,
106
- pid
107
- })
108
- );
109
- await addPermissions(permission.id, applicationId);
110
- }
111
- })
112
- );
113
- };
114
- await addPermissions(0, app.uuid);
112
+ app = await services.application.addApplication(other);
115
113
  }
114
+ await services.permission.importPermissionsToApplication({ applicationId: app.uuid, permissions });
116
115
  return app;
117
116
  })
118
117
  );
119
118
  return data;
120
119
  };
121
120
 
122
- const exportPermissionList = async ({ applicationIds, tenantId }) => {
121
+ const copyPermissions = async ({ applicationId, originApplicationId }) => {
122
+ if (applicationId === originApplicationId) {
123
+ throw new Error('复制对象不能和自己相同');
124
+ }
125
+ await services.application.getApplication({ id: originApplicationId });
126
+ await services.application.getApplication({ id: applicationId });
127
+ const permissions = await models.permission.findAll({
128
+ where: { applicationId: originApplicationId }
129
+ });
130
+ await services.permission.importPermissionsToApplication({ applicationId, permissions });
131
+ };
132
+
133
+ const exportPermissionList = async ({ applicationIds }) => {
123
134
  return await Promise.all(
124
135
  (applicationIds || []).map(async applicationId => {
125
136
  let application = await services.application.getApplication({ id: applicationId });
126
- application.permissions = await services.permission.getPermissionList({ applicationId, tenantId });
137
+ application.permissions = await models.permission.findAll({
138
+ where: { applicationId }
139
+ });
127
140
  return application;
128
141
  })
129
142
  );
@@ -442,6 +455,9 @@ module.exports = fp(async (fastify, options) => {
442
455
  saveTenantPermissionList,
443
456
  saveRolePermissionList,
444
457
  getTenantPermissionList,
445
- getRolePermissionList
458
+ getRolePermissionList,
459
+ parsePermissionListJSON,
460
+ copyPermissions,
461
+ importPermissionsToApplication
446
462
  };
447
463
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kne/fastify-account",
3
- "version": "1.0.0-alpha.18",
3
+ "version": "1.0.0-alpha.19",
4
4
  "description": "fastify的用户管理账号等实现",
5
5
  "main": "index.js",
6
6
  "scripts": {