-
Notifications
You must be signed in to change notification settings - Fork 13
Expand file tree
/
Copy pathpermission.js
More file actions
56 lines (47 loc) · 2.23 KB
/
Copy pathpermission.js
File metadata and controls
56 lines (47 loc) · 2.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
const { ActionTransport } = require('@microfleet/core');
const union = require('lodash/union');
const difference = require('lodash/difference');
const { checkOrganizationExists } = require('../../../utils/organization');
const redisKey = require('../../../utils/key');
const handlePipeline = require('../../../utils/pipeline-error');
const getUserId = require('../../../utils/userData/get-user-id');
const UserMetadata = require('../../../utils/metadata/user');
const { ErrorUserNotMember, USERS_METADATA, ORGANIZATIONS_MEMBERS } = require('../../../constants');
/**
* @api {amqp} <prefix>.members.permission Sets permission levels for a given user
* @apiVersion 1.0.0
* @apiName members.permission
* @apiGroup Organizations
*
* @apiDescription Sets permission levels for a given user.
*
* @apiParam (Payload) {String} organizationId - organization id.
* @apiParam (Payload) {String} username - organization member email.
* @apiParam (Payload) {Object} permission - metadata operations,
* supports `$set string[]`, `$remove string[]`
*/
async function setOrganizationMemberPermission({ params }) {
const { redis, config } = this;
const { organizationId, username, permission } = params;
const { audience } = config.organizations;
const userId = await getUserId.call(this, username);
const memberMetadataKey = redisKey(userId, USERS_METADATA, audience);
const userPermissions = await redis.hget(memberMetadataKey, organizationId);
if (!userPermissions) {
throw ErrorUserNotMember;
}
let permissions = userPermissions.length ? [] : JSON.parse(userPermissions);
const { $set = [], $remove = [] } = permission;
permissions = union(permissions, $set);
permissions = difference(permissions, $remove);
permissions = JSON.stringify(permissions);
const pipeline = redis.pipeline();
UserMetadata
.using(userId, audience, pipeline)
.update(organizationId, permissions);
pipeline.hset(redisKey(organizationId, ORGANIZATIONS_MEMBERS, userId), 'permissions', permissions);
return pipeline.exec().then(handlePipeline);
}
setOrganizationMemberPermission.allowed = checkOrganizationExists;
setOrganizationMemberPermission.transports = [ActionTransport.amqp, ActionTransport.internal];
module.exports = setOrganizationMemberPermission;