@devstroupe/devkit-nest 1.1.3 → 1.1.5

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.
@@ -1,2 +1,4 @@
1
1
  export * from './permissions.decorator';
2
2
  export * from './permissions.guard';
3
+ export * from './roles.decorator';
4
+ export * from './roles.guard';
@@ -16,3 +16,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./permissions.decorator"), exports);
18
18
  __exportStar(require("./permissions.guard"), exports);
19
+ __exportStar(require("./roles.decorator"), exports);
20
+ __exportStar(require("./roles.guard"), exports);
@@ -0,0 +1,2 @@
1
+ export declare const ROLES_KEY = "roles";
2
+ export declare const Roles: (...roles: string[]) => import("@nestjs/common").CustomDecorator<string>;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Roles = exports.ROLES_KEY = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ exports.ROLES_KEY = 'roles';
6
+ const Roles = (...roles) => (0, common_1.SetMetadata)(exports.ROLES_KEY, roles);
7
+ exports.Roles = Roles;
@@ -0,0 +1,7 @@
1
+ import { CanActivate, ExecutionContext } from '@nestjs/common';
2
+ import { Reflector } from '@nestjs/core';
3
+ export declare class RolesGuard implements CanActivate {
4
+ private reflector;
5
+ constructor(reflector: Reflector);
6
+ canActivate(context: ExecutionContext): boolean;
7
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.RolesGuard = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const core_1 = require("@nestjs/core");
15
+ const roles_decorator_1 = require("./roles.decorator");
16
+ let RolesGuard = class RolesGuard {
17
+ reflector;
18
+ constructor(reflector) {
19
+ this.reflector = reflector;
20
+ }
21
+ canActivate(context) {
22
+ const requiredRoles = this.reflector.getAllAndOverride(roles_decorator_1.ROLES_KEY, [
23
+ context.getHandler(),
24
+ context.getClass(),
25
+ ]);
26
+ if (!requiredRoles || requiredRoles.length === 0) {
27
+ return true;
28
+ }
29
+ const request = context.switchToHttp().getRequest();
30
+ const user = request.user;
31
+ if (!user) {
32
+ return false; // Bloqueia acesso caso não esteja autenticado
33
+ }
34
+ const roleName = typeof user.role === 'object' ? user.role.name : user.role;
35
+ if (!roleName) {
36
+ return false;
37
+ }
38
+ // ADMIN ou Administrador têm bypass automático
39
+ if (roleName === 'ADMIN' || roleName === 'Administrador') {
40
+ return true;
41
+ }
42
+ return requiredRoles.includes(roleName);
43
+ }
44
+ };
45
+ exports.RolesGuard = RolesGuard;
46
+ exports.RolesGuard = RolesGuard = __decorate([
47
+ (0, common_1.Injectable)(),
48
+ __metadata("design:paramtypes", [core_1.Reflector])
49
+ ], RolesGuard);
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const node_test_1 = require("node:test");
37
+ const assert = __importStar(require("node:assert"));
38
+ const roles_guard_1 = require("./roles.guard");
39
+ (0, node_test_1.describe)('RolesGuard', () => {
40
+ const createMockContext = (user) => {
41
+ return {
42
+ switchToHttp: () => ({
43
+ getRequest: () => ({ user }),
44
+ }),
45
+ getHandler: () => ({}),
46
+ getClass: () => ({}),
47
+ };
48
+ };
49
+ (0, node_test_1.test)('deve permitir acesso se não houver roles exigidas', () => {
50
+ const mockReflector = {
51
+ getAllAndOverride: () => undefined,
52
+ };
53
+ const guard = new roles_guard_1.RolesGuard(mockReflector);
54
+ const context = createMockContext({ role: 'USER' });
55
+ const result = guard.canActivate(context);
56
+ assert.strictEqual(result, true);
57
+ });
58
+ (0, node_test_1.test)('deve permitir acesso se o usuário for ADMIN (super admin)', () => {
59
+ const mockReflector = {
60
+ getAllAndOverride: () => ['GERENTE'],
61
+ };
62
+ const guard = new roles_guard_1.RolesGuard(mockReflector);
63
+ const context = createMockContext({ role: 'ADMIN' });
64
+ const result = guard.canActivate(context);
65
+ assert.strictEqual(result, true);
66
+ });
67
+ (0, node_test_1.test)('deve permitir acesso se o usuário for Administrador (super admin)', () => {
68
+ const mockReflector = {
69
+ getAllAndOverride: () => ['GERENTE'],
70
+ };
71
+ const guard = new roles_guard_1.RolesGuard(mockReflector);
72
+ const context = createMockContext({ role: 'Administrador' });
73
+ const result = guard.canActivate(context);
74
+ assert.strictEqual(result, true);
75
+ });
76
+ (0, node_test_1.test)('deve permitir acesso se o usuário tiver a role exigida (role string)', () => {
77
+ const mockReflector = {
78
+ getAllAndOverride: () => ['GERENTE', 'DIRETOR'],
79
+ };
80
+ const guard = new roles_guard_1.RolesGuard(mockReflector);
81
+ const context = createMockContext({ role: 'GERENTE' });
82
+ const result = guard.canActivate(context);
83
+ assert.strictEqual(result, true);
84
+ });
85
+ (0, node_test_1.test)('deve permitir acesso se o usuário tiver a role exigida (role object)', () => {
86
+ const mockReflector = {
87
+ getAllAndOverride: () => ['GERENTE', 'DIRETOR'],
88
+ };
89
+ const guard = new roles_guard_1.RolesGuard(mockReflector);
90
+ const context = createMockContext({ role: { name: 'GERENTE' } });
91
+ const result = guard.canActivate(context);
92
+ assert.strictEqual(result, true);
93
+ });
94
+ (0, node_test_1.test)('deve negar acesso se o usuário não tiver a role exigida', () => {
95
+ const mockReflector = {
96
+ getAllAndOverride: () => ['GERENTE', 'DIRETOR'],
97
+ };
98
+ const guard = new roles_guard_1.RolesGuard(mockReflector);
99
+ const context = createMockContext({ role: 'OPERADOR' });
100
+ const result = guard.canActivate(context);
101
+ assert.strictEqual(result, false);
102
+ });
103
+ (0, node_test_1.test)('deve negar acesso se não houver usuário autenticado na request', () => {
104
+ const mockReflector = {
105
+ getAllAndOverride: () => ['GERENTE'],
106
+ };
107
+ const guard = new roles_guard_1.RolesGuard(mockReflector);
108
+ const context = createMockContext(undefined);
109
+ const result = guard.canActivate(context);
110
+ assert.strictEqual(result, false);
111
+ });
112
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devstroupe/devkit-nest",
3
- "version": "1.1.3",
3
+ "version": "1.1.5",
4
4
  "description": "DevsTroupe Development Kit — NestJS base classes: BaseRepository, BaseCrudController and query parsers",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -32,7 +32,7 @@
32
32
  "@aws-sdk/client-s3": "^3.500.0",
33
33
  "@aws-sdk/s3-request-presigner": "^3.500.0",
34
34
  "jsonwebtoken": "^9.0.2",
35
- "@devstroupe/devkit-core": "1.1.3"
35
+ "@devstroupe/devkit-core": "1.1.5"
36
36
  },
37
37
  "peerDependencies": {
38
38
  "@nestjs/common": "^10.0.0 || ^11.0.0",