11const { ActionTransport } = require ( '@microfleet/core' ) ;
2+ const union = require ( 'lodash/union' ) ;
3+ const difference = require ( 'lodash/difference' ) ;
24const { checkOrganizationExists } = require ( '../../../utils/organization' ) ;
35const redisKey = require ( '../../../utils/key' ) ;
4- const { ErrorUserNotMember, ORGANIZATIONS_MEMBERS } = require ( '../../../constants' ) ;
6+ const handlePipeline = require ( '../../../utils/pipelineError' ) ;
7+ const getUserId = require ( '../../../utils/userData/getUserId' ) ;
8+ const { ErrorUserNotMember, USERS_METADATA , ORGANIZATIONS_MEMBERS } = require ( '../../../constants' ) ;
59
610/**
711 * @api {amqp } <prefix>.members.permission Sets permission levels for a given user
@@ -16,35 +20,33 @@ const { ErrorUserNotMember, ORGANIZATIONS_MEMBERS } = require('../../../constant
1620 * @apiParam (Payload) {Object} permission - metadata operations,
1721 * supports `$set string[]`, `$remove string[]`
1822 */
19- async function addOrganizationMember ( { params } ) {
20- const service = this ;
21- const { redis } = service ;
23+ async function setOrganizationMemberPermission ( { params } ) {
24+ const { redis, config } = this ;
2225 const { organizationId, username, permission } = params ;
26+ const { audience } = config . organizations ;
2327
24- const memberKey = redisKey ( organizationId , ORGANIZATIONS_MEMBERS , username ) ;
25- const userInOrganization = await redis . hget ( memberKey , 'username' ) ;
26- if ( ! userInOrganization ) {
28+ const userId = await getUserId . call ( this , username ) ;
29+ const memberMetadataKey = redisKey ( userId , USERS_METADATA , audience ) ;
30+ const userPermissions = await redis . hget ( memberMetadataKey , organizationId ) ;
31+ if ( ! userPermissions ) {
2732 throw ErrorUserNotMember ;
2833 }
2934
30- const currentPermissions = await redis . hget ( memberKey , 'permissions' ) ;
31- let permissions = currentPermissions === '' ? [ ] : currentPermissions . split ( ',' ) ;
35+ let permissions = userPermissions . length ? [ ] : JSON . parse ( userPermissions ) ;
3236
3337 const { $set = [ ] , $remove = [ ] } = permission ;
3438
35- for ( const permissionItem of $set ) {
36- if ( ! permissions . includes ( permissionItem ) ) {
37- permissions . push ( permissionItem ) ;
38- }
39- }
39+ permissions = union ( permissions , $set ) ;
40+ permissions = difference ( permissions , $remove ) ;
41+ permissions = JSON . stringify ( permissions ) ;
4042
41- for ( const permissionItem of $remove ) {
42- permissions = permissions . filter ( item => item !== permissionItem ) ;
43- }
43+ const pipeline = redis . pipeline ( ) ;
44+ pipeline . hset ( memberMetadataKey , organizationId , permissions ) ;
45+ pipeline . hset ( redisKey ( organizationId , ORGANIZATIONS_MEMBERS , userId ) , 'permissions' , permissions ) ;
4446
45- return redis . hset ( memberKey , 'permissions' , permissions . join ( ',' ) ) ;
47+ return pipeline . exec ( ) . then ( handlePipeline ) ;
4648}
4749
48- addOrganizationMember . allowed = checkOrganizationExists ;
49- addOrganizationMember . transports = [ ActionTransport . amqp , ActionTransport . internal ] ;
50- module . exports = addOrganizationMember ;
50+ setOrganizationMemberPermission . allowed = checkOrganizationExists ;
51+ setOrganizationMemberPermission . transports = [ ActionTransport . amqp , ActionTransport . internal ] ;
52+ module . exports = setOrganizationMemberPermission ;
0 commit comments