@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,
|
|
6
|
-
|
|
5
|
+
type: DataTypes.UUID,
|
|
6
|
+
allowNull: false
|
|
7
|
+
},
|
|
8
|
+
tenantId: {
|
|
7
9
|
type: DataTypes.UUID
|
|
8
|
-
},
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
},
|
|
11
|
+
type: {
|
|
12
|
+
type: DataTypes.STRING,
|
|
13
|
+
comment: 'user,tenant,admin'
|
|
14
|
+
},
|
|
15
|
+
applicationId: {
|
|
11
16
|
type: DataTypes.UUID
|
|
12
|
-
},
|
|
13
|
-
|
|
14
|
-
|
|
17
|
+
},
|
|
18
|
+
action: {
|
|
19
|
+
type: DataTypes.STRING
|
|
20
|
+
},
|
|
21
|
+
summary: {
|
|
15
22
|
type: DataTypes.TEXT
|
|
16
23
|
}
|
|
17
|
-
},
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
77
|
-
|
|
110
|
+
let app = await services.application.getApplicationByCode({ code: application.code });
|
|
78
111
|
if (!app) {
|
|
79
|
-
|
|
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
|
|
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
|
|
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
|
});
|