FIX: sending access token to role function to evaluate editing permissions

This commit is contained in:
Gabriel Rosa
2022-08-01 09:17:08 -03:00
parent d76a2b4ab8
commit ebbfe0abff
9 changed files with 164 additions and 78 deletions
+7 -7
View File
@@ -36,7 +36,7 @@
"passport-hubspot-oauth2": "^1.0.3", "passport-hubspot-oauth2": "^1.0.3",
"passport-mailchimp": "^1.1.0", "passport-mailchimp": "^1.1.0",
"protospack": "2.5.2", "protospack": "2.5.2",
"protospack-v2": "3.9.0-beta.7", "protospack-v2": "3.9.6",
"reflect-metadata": "^0.1.13", "reflect-metadata": "^0.1.13",
"rimraf": "^3.0.2", "rimraf": "^3.0.2",
"rxjs": "^7.5.5", "rxjs": "^7.5.5",
@@ -9015,9 +9015,9 @@
} }
}, },
"node_modules/protospack-v2": { "node_modules/protospack-v2": {
"version": "3.9.0-beta.7", "version": "3.9.6",
"resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.9.0-beta.7.tgz", "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.9.6.tgz",
"integrity": "sha512-QZqFz0Kc5pgcHOhNs4O6JG2kMZKDvY+7RwEdniRfb75ZSy/7BRJXLJUzB7Kjj1poIUM12n+gUg3kj3n00Gwegg==", "integrity": "sha512-7aSYhzxlly6GPGmCH2JsNDB3Z6rOPhmY5iK5n1Ich3WLLgsOmGAXJH2zWD9IUfjhKKwBZGvitdewpBVyCvAg0A==",
"dependencies": { "dependencies": {
"@grpc/grpc-js": "^1.6.7", "@grpc/grpc-js": "^1.6.7",
"rxjs": "^7.5.5", "rxjs": "^7.5.5",
@@ -17245,9 +17245,9 @@
} }
}, },
"protospack-v2": { "protospack-v2": {
"version": "3.9.0-beta.7", "version": "3.9.6",
"resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.9.0-beta.7.tgz", "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.9.6.tgz",
"integrity": "sha512-QZqFz0Kc5pgcHOhNs4O6JG2kMZKDvY+7RwEdniRfb75ZSy/7BRJXLJUzB7Kjj1poIUM12n+gUg3kj3n00Gwegg==", "integrity": "sha512-7aSYhzxlly6GPGmCH2JsNDB3Z6rOPhmY5iK5n1Ich3WLLgsOmGAXJH2zWD9IUfjhKKwBZGvitdewpBVyCvAg0A==",
"requires": { "requires": {
"@grpc/grpc-js": "^1.6.7", "@grpc/grpc-js": "^1.6.7",
"rxjs": "^7.5.5", "rxjs": "^7.5.5",
+1 -1
View File
@@ -51,7 +51,7 @@
"passport-hubspot-oauth2": "^1.0.3", "passport-hubspot-oauth2": "^1.0.3",
"passport-mailchimp": "^1.1.0", "passport-mailchimp": "^1.1.0",
"protospack": "2.5.2", "protospack": "2.5.2",
"protospack-v2": "3.9.0-beta.7", "protospack-v2": "3.9.6",
"reflect-metadata": "^0.1.13", "reflect-metadata": "^0.1.13",
"rimraf": "^3.0.2", "rimraf": "^3.0.2",
"rxjs": "^7.5.5", "rxjs": "^7.5.5",
@@ -121,6 +121,7 @@ export class AuthenticationGuard
customer_id: accessTokenPayload.customer_id, customer_id: accessTokenPayload.customer_id,
customer_name: accessTokenPayload.customer_name, customer_name: accessTokenPayload.customer_name,
customer_tier: accessTokenPayload.customer_tier, customer_tier: accessTokenPayload.customer_tier,
access_token: accessToken,
}; };
// TODO: for backwards compatibility. remove in the future // TODO: for backwards compatibility. remove in the future
request.body.info = { request.body.info = {
+1
View File
@@ -10,6 +10,7 @@ export interface RequestUser {
customer_id: string; customer_id: string;
customer_name: string; customer_name: string;
customer_tier: string; customer_tier: string;
access_token: string;
} }
export const User: (options?: { required?: boolean }) => ParameterDecorator = export const User: (options?: { required?: boolean }) => ParameterDecorator =
+2
View File
@@ -19,6 +19,8 @@ export class RoleDto {
createdAt: string; createdAt: string;
@ApiProperty() @ApiProperty()
updatedAt: string; updatedAt: string;
@ApiProperty()
isPublic: boolean;
@ApiProperty({ type: () => Customer }) @ApiProperty({ type: () => Customer })
customer?: Customer; customer?: Customer;
} }
+9 -9
View File
@@ -77,7 +77,7 @@ export class RolesController {
) { ) {
this.logger.info('searchRoles', { user }); this.logger.info('searchRoles', { user });
this.rolesService.setLanguage(language); this.rolesService.setLanguage(language);
return await this.rolesService.roleSearch(filters, user.customer_id); return await this.rolesService.roleSearch(filters, user);
} }
@Post() @Post()
@@ -90,7 +90,7 @@ export class RolesController {
) { ) {
this.logger.info('createRole', { user }); this.logger.info('createRole', { user });
this.rolesService.setLanguage(language); this.rolesService.setLanguage(language);
return await this.rolesService.createRole(body, user.customer_id); return await this.rolesService.createRole(body, user);
} }
@Put('permissions') @Put('permissions')
@@ -103,7 +103,7 @@ export class RolesController {
) { ) {
this.logger.info('grantPermissionsToRole', { user }); this.logger.info('grantPermissionsToRole', { user });
this.rolesService.setLanguage(language); this.rolesService.setLanguage(language);
return await this.rolesService.grantPermissionsToRole(body); return await this.rolesService.grantPermissionsToRole(body, user);
} }
@Delete('permissions') @Delete('permissions')
@@ -116,7 +116,7 @@ export class RolesController {
) { ) {
this.logger.info('revokePermissionsToRole', { user }); this.logger.info('revokePermissionsToRole', { user });
this.rolesService.setLanguage(language); this.rolesService.setLanguage(language);
return await this.rolesService.revokePermissionFromRole(body); return await this.rolesService.revokePermissionFromRole(body, user);
} }
@Patch('permissions') @Patch('permissions')
@@ -129,7 +129,7 @@ export class RolesController {
) { ) {
this.logger.info('setRolePermissions', { user }); this.logger.info('setRolePermissions', { user });
this.rolesService.setLanguage(language); this.rolesService.setLanguage(language);
return this.rolesService.setRolePermissions(body); return this.rolesService.setRolePermissions(body, user);
} }
@Patch('users') @Patch('users')
@@ -142,7 +142,7 @@ export class RolesController {
) { ) {
this.logger.info('setRoleUsers', { user }); this.logger.info('setRoleUsers', { user });
this.rolesService.setLanguage(language); this.rolesService.setLanguage(language);
return this.rolesService.setRoleUsers(body); return this.rolesService.setRoleUsers(body, user);
} }
@Get(':id') @Get(':id')
@@ -155,7 +155,7 @@ export class RolesController {
) { ) {
this.logger.info('getRoleById', { user }); this.logger.info('getRoleById', { user });
this.rolesService.setLanguage(language); this.rolesService.setLanguage(language);
return await this.rolesService.getRolesById(id); return await this.rolesService.getRolesById(id, user);
} }
@Delete(':id') @Delete(':id')
@@ -167,7 +167,7 @@ export class RolesController {
) { ) {
this.logger.info('deleteRole', { user }); this.logger.info('deleteRole', { user });
this.rolesService.setLanguage(language); this.rolesService.setLanguage(language);
return await this.rolesService.removeRole(id); return await this.rolesService.removeRole(id, user);
} }
@Patch(':id') @Patch(':id')
@@ -181,6 +181,6 @@ export class RolesController {
) { ) {
this.logger.info('updateRole', { user }); this.logger.info('updateRole', { user });
this.rolesService.setLanguage(language); this.rolesService.setLanguage(language);
return this.rolesService.updateRole(id, body); return this.rolesService.updateRole(id, body, user);
} }
} }
+133 -61
View File
@@ -12,12 +12,23 @@ import {
UpdateRoleReq, UpdateRoleReq,
} from './dto/entities'; } from './dto/entities';
import { DadosferaLogger } from 'dadosfera-logs'; import { DadosferaLogger } from 'dadosfera-logs';
import { Metadata } from '@grpc/grpc-js';
import { ClientGrpc } from '@nestjs/microservices'; import { ClientGrpc } from '@nestjs/microservices';
import { Permission } from 'protospack-v2/dist/lib/Duc/interfaces/entities';
import { lastValueFrom } from 'rxjs'; import { lastValueFrom } from 'rxjs';
import { PermissionsService } from '../permissions/permissions.service'; import { PermissionsService } from '../permissions/permissions.service';
import { UserRole } from 'protospack-v2/dist/lib/Duc/interfaces/entities';
import { LanguageEnum } from 'src/utils/languages.enum'; import { LanguageEnum } from 'src/utils/languages.enum';
import { RequestUser } from 'src/authentication/user.decorator';
interface GetRolesPermissionsName {
id: string;
name: string;
description: string;
permissions: Permission[];
isPublic?: boolean;
createdAt: string;
updatedAt: string;
}
@Injectable() @Injectable()
export class RolesService { export class RolesService {
logger: any; logger: any;
@@ -41,16 +52,28 @@ export class RolesService {
ProtoServices.RolesProtoService, ProtoServices.RolesProtoService,
); );
} }
async getRolesById(id: string) {
async getRolesById(id: string, { access_token }: RequestUser) {
const meta = new Metadata();
meta.add('access_token', access_token);
const role = await lastValueFrom( const role = await lastValueFrom(
this.rolesClientService.RoleFindOneById({ this.rolesClientService.RoleFindOneById(
id, {
}), id,
},
meta,
),
); );
const [roleTreated] = this.getRolesPermissionsName([role.role]); const [roleTreated] = this.getRolesPermissionsName([role.role]);
return { role: roleTreated }; return { role: roleTreated };
} }
async roleSearch(filters: GetRolesByCustomerReq, customerId: string) {
async roleSearch(
filters: GetRolesByCustomerReq,
{ customer_id, access_token }: RequestUser,
) {
const meta = new Metadata();
meta.add('access_token', access_token);
let { permissionId: permissionIds } = filters; let { permissionId: permissionIds } = filters;
if (permissionIds && !Array.isArray(permissionIds)) if (permissionIds && !Array.isArray(permissionIds))
permissionIds = [permissionIds]; permissionIds = [permissionIds];
@@ -64,109 +87,154 @@ export class RolesService {
return seqId; return seqId;
}) || []; }) || [];
const roles = await lastValueFrom( const roles = await lastValueFrom(
this.rolesClientService.RoleSearch({ this.rolesClientService.RoleSearch(
customerId, {
getUsers: isGetUsers, customerId: customer_id,
permissionIds: [], getUsers: isGetUsers,
permissionSeqIds, permissionIds: [],
}), permissionSeqIds,
},
meta,
),
); );
const rolesTreated = this.getRolesPermissionsName(roles.roles); const rolesTreated = this.getRolesPermissionsName(roles.roles);
return { roles: rolesTreated }; return { roles: rolesTreated };
} }
async createRole(data: CreateRoleReq, customerId: string) { async createRole(
data: CreateRoleReq,
{ customer_id, access_token }: RequestUser,
) {
const meta = new Metadata();
meta.add('access_token', access_token);
const { description, name, permissionIds, userIds } = data; const { description, name, permissionIds, userIds } = data;
const role = await lastValueFrom( const role = await lastValueFrom(
this.rolesClientService.RoleCreate({ this.rolesClientService.RoleCreate(
customerId, {
name, customerId: customer_id,
permissionIds: [], name,
permissionSeqIds: permissionIds, permissionIds: [],
description, permissionSeqIds: permissionIds,
userIds, description,
}), userIds,
},
meta,
),
); );
const [roleTreated] = this.getRolesPermissionsName([role.role]); const [roleTreated] = this.getRolesPermissionsName([role.role]);
return { role: roleTreated }; return { role: roleTreated };
} }
async removeRole(id: string) { async removeRole(id: string, { access_token }: RequestUser) {
return lastValueFrom(this.rolesClientService.RoleRemove({ id })); const meta = new Metadata();
meta.add('access_token', access_token);
return lastValueFrom(this.rolesClientService.RoleRemove({ id }, meta));
} }
async grantPermissionsToRole({ async grantPermissionsToRole(
roleId, { roleId, permissionIds }: GrantPermissionsToRoleReq,
permissionIds, { access_token }: RequestUser,
}: GrantPermissionsToRoleReq) { ) {
const meta = new Metadata();
meta.add('access_token', access_token);
const role = await lastValueFrom( const role = await lastValueFrom(
this.rolesClientService.GrantPermissionsToRole({ this.rolesClientService.GrantPermissionsToRole(
permissionIds: [], {
roleId, permissionIds: [],
permissionSeqIds: permissionIds, roleId,
}), permissionSeqIds: permissionIds,
},
meta,
),
); );
const [roleTreated] = this.getRolesPermissionsName([role.role]); const [roleTreated] = this.getRolesPermissionsName([role.role]);
return { role: roleTreated }; return { role: roleTreated };
} }
async revokePermissionFromRole({ async revokePermissionFromRole(
roleId, { roleId, permissionIds }: RevokePermissionsFromRoleReq,
permissionIds, { access_token }: RequestUser,
}: RevokePermissionsFromRoleReq) { ) {
const meta = new Metadata();
meta.add('access_token', access_token);
const role = await lastValueFrom( const role = await lastValueFrom(
this.rolesClientService.RevokePermissionsFromRole({ this.rolesClientService.RevokePermissionsFromRole(
permissionIds: [], {
roleId, permissionIds: [],
permissionSeqIds: permissionIds, roleId,
}), permissionSeqIds: permissionIds,
},
meta,
),
); );
const [roleTreated] = this.getRolesPermissionsName([role.role]); const [roleTreated] = this.getRolesPermissionsName([role.role]);
return { role: roleTreated }; return { role: roleTreated };
} }
async updateRole(id: string, req: UpdateRoleReq) { async updateRole(
id: string,
req: UpdateRoleReq,
{ access_token }: RequestUser,
) {
const meta = new Metadata();
meta.add('access_token', access_token);
const { description, name } = req; const { description, name } = req;
const role = await lastValueFrom( const role = await lastValueFrom(
this.rolesClientService.RoleUpdate({ this.rolesClientService.RoleUpdate(
id, {
description, id,
name, description,
}), name,
},
meta,
),
); );
const [roleTreated] = this.getRolesPermissionsName([role.role]); const [roleTreated] = this.getRolesPermissionsName([role.role]);
return { role: roleTreated }; return { role: roleTreated };
} }
async setRolePermissions(req: SetRolePermissionsReq) { async setRolePermissions(
req: SetRolePermissionsReq,
{ access_token }: RequestUser,
) {
const meta = new Metadata();
meta.add('access_token', access_token);
const { roleId: id, permissionIds } = req; const { roleId: id, permissionIds } = req;
const clearPermissions = const clearPermissions =
Array.isArray(permissionIds) && permissionIds.length === 0; Array.isArray(permissionIds) && permissionIds.length === 0;
const role = await lastValueFrom( const role = await lastValueFrom(
this.rolesClientService.RoleSetPermissions({ this.rolesClientService.RoleSetPermissions(
id, {
permissionSeqIds: permissionIds, id,
clearPermissions, permissionSeqIds: permissionIds,
}), clearPermissions,
},
meta,
),
); );
const [roleTreated] = this.getRolesPermissionsName([role.role]); const [roleTreated] = this.getRolesPermissionsName([role.role]);
return { role: roleTreated }; return { role: roleTreated };
} }
async setRoleUsers(req: SetRoleUsersReq) { async setRoleUsers(req: SetRoleUsersReq, { access_token }: RequestUser) {
const meta = new Metadata();
meta.add('access_token', access_token);
const { roleId: id, userIds } = req; const { roleId: id, userIds } = req;
const clearUsers = Array.isArray(userIds) && userIds.length === 0; const clearUsers = Array.isArray(userIds) && userIds.length === 0;
const role = await lastValueFrom( const role = await lastValueFrom(
this.rolesClientService.RoleSetUsers({ this.rolesClientService.RoleSetUsers(
id, {
userIds, id,
clearUsers, userIds,
}), clearUsers,
},
meta,
),
); );
const [roleTreated] = this.getRolesPermissionsName([role.role]); const [roleTreated] = this.getRolesPermissionsName([role.role]);
return { role: roleTreated }; return { role: roleTreated };
} }
getRolesPermissionsName(roles: UserRole[]): RoleDto[] { getRolesPermissionsName(roles: GetRolesPermissionsName[]): RoleDto[] {
const newRoles: RoleDto[] = []; const newRoles: RoleDto[] = [];
for (const role of roles) { for (const role of roles) {
const allPermissions = this.permissionsService.getAllPermissions( const allPermissions = this.permissionsService.getAllPermissions(
@@ -180,7 +248,11 @@ export class RolesService {
id: p.seqid, id: p.seqid,
}; };
}); });
const newRole: RoleDto = { ...role, permissions: newPermissions }; const newRole: RoleDto = {
...role,
permissions: newPermissions,
isPublic: role.isPublic,
};
newRoles.push(newRole); newRoles.push(newRole);
} }
return newRoles; return newRoles;
+8
View File
@@ -136,10 +136,18 @@ export function EnrichErrorCode(code: string) {
code, code,
}; };
case ErrorCodes.ROLE.NOT_FOUND: case ErrorCodes.ROLE.NOT_FOUND:
case ErrorCodes.ROLE.FROM_ANOTHER_CUSTOMER:
return { return {
statusCode: HttpStatus.NOT_FOUND, statusCode: HttpStatus.NOT_FOUND,
error: 'Grupo não encontrado', error: 'Grupo não encontrado',
message: 'Grupo solicitado não encontrado', message: 'Grupo solicitado não encontrado',
code: ErrorCodes.ROLE.NOT_FOUND,
};
case ErrorCodes.ROLE.CANNOT_EDIT_PUBLIC_ROLE:
return {
statusCode: HttpStatus.FORBIDDEN,
error: 'Grupo público',
message: 'Você não tem permissão para editar esse grupo',
code, code,
}; };
case ErrorCodes.USER.NOT_FOUND: case ErrorCodes.USER.NOT_FOUND:
+2
View File
@@ -16,6 +16,8 @@ export const AUTH = {
export const ROLE = { export const ROLE = {
ALREADY_EXIST: 'ROLE.ALREADY_EXISTS', ALREADY_EXIST: 'ROLE.ALREADY_EXISTS',
NOT_FOUND: 'ROLE.NOT_FOUND', NOT_FOUND: 'ROLE.NOT_FOUND',
FROM_ANOTHER_CUSTOMER: 'ROLE.FROM_ANOTHER_CUSTOMER',
CANNOT_EDIT_PUBLIC_ROLE: 'ROLE.CANNOT_EDIT_PUBLIC_ROLE',
}; };
export const USER = { export const USER = {