@smartsoft001/nestjs v2.66.0
📦 @smartsoft001/nestjs
🚀 Usage
npm install @smartsoft001/nestjs⚙️ Configuration
The library uses the SharedConfig class for authentication and permissions configuration:
Token Configuration
| Field | Type | Description |
|---|---|---|
tokenConfig.secretOrPrivateKey | string | Secret or private key for signing tokens |
tokenConfig.expiredIn | number | Token expiration time in seconds |
Permissions Configuration
| Field | Type | Description |
|---|---|---|
permissions.create | Array<string> | List of permissions for create operations |
permissions.read | Array<string> | List of permissions for read operations |
permissions.update | Array<string> | List of permissions for update operations |
permissions.delete | Array<string> | List of permissions for delete operations |
permissions.[key] | Array<string> | Any additional custom permissions |
Types
export type PermissionType = 'create' | 'read' | 'update' | 'delete' | string;Modules
SharedModule
The SharedModule is a dynamic NestJS module that provides shared configuration and services across the application. It offers two static methods for configuration: forFeature() and forRoot().
forFeature() Method
The forFeature() method configures the module's core functionalities:
static forFeature(config: SharedConfig): DynamicModuleParameters:
config: An object of typeSharedConfigcontaining the module's configuration.
Returns:
A DynamicModule object with the following elements:
- Providers:
SharedConfig,JwtStrategy,PermissionService - Exports:
SharedConfig,PermissionService,JwtStrategy
Example Usage:
import { SharedModule, SharedConfig } from '@smartsoft001/nestjs';
@Module({
imports: [
SharedModule.forFeature({
tokenConfig: {
secretOrPrivateKey: 'secret_key',
expiredIn: 3600,
},
permissions: {
create: ['admin'],
read: ['user', 'admin'],
update: ['admin'],
delete: ['admin'],
},
}),
],
})
export class AppModule {}forRoot() Method
The forRoot() method extends the forFeature() configuration by adding database settings:
static forRoot(config: SharedConfig & {
db: {
host: string;
port: number;
database: string;
username?: string;
password?: string;
};
}): DynamicModuleParameters:
config: An extendedSharedConfigobject that includes additional database settings.
Returns:
A DynamicModule object that imports and exports the forFeature() configuration.
Example Usage:
import { SharedModule, SharedConfig } from '@smartsoft001/nestjs';
@Module({
imports: [
SharedModule.forRoot({
tokenConfig: {
secretOrPrivateKey: 'secret_key',
expiredIn: 3600,
},
permissions: {
create: ['admin'],
read: ['user', 'admin'],
update: ['admin'],
delete: ['admin'],
},
db: {
host: 'localhost',
port: 5432,
database: 'my_database',
username: 'user',
password: 'password',
},
}),
],
})
export class AppModule {}Summary
The SharedModule provides flexible configuration for various use cases, enabling easy sharing of authorization, permissions, and database settings across the entire NestJS application.
Decorators
@User Decorator
The @User decorator is a custom parameter decorator in NestJS that simplifies retrieving the user object from an HTTP request.
Functionality
The @User decorator performs the following actions:
- Extracts the request object (
req) from the execution context. - Returns the
req.uservalue, which typically contains information about the authenticated user.
Usage
The @User decorator can be used in NestJS controllers to easily access user data:
import { Controller, Get } from '@nestjs/common';
import { IUser } from '@smartsoft001/users';
import { User } from './user.decorator';
@Controller('profile')
export class ProfileController {
@Get()
getProfile(@User() user: IUser) {
return user;
}
}Auth
After registering the authentication module, you can use JwtStrategy and PermissionService as follows:
Using JwtStrategy
JwtStrategy is automatically used by AuthGuard('jwt'). You don't need to call it directly. Instead, use it indirectly via the @UseGuards() decorator:
import { Controller, Get, UseGuards } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
@Controller('secure')
@UseGuards(AuthGuard('jwt'))
export class SecureController {
@Get()
getSecureData() {
return 'This is protected content';
}
}Using PermissionService
PermissionService can be injected into controllers or services and used directly. Here are the main usage patterns:
1. Injecting the Service
import { Injectable } from '@nestjs/common';
import { PermissionService } from './permission.service';
@Injectable()
export class SomeService {
constructor(private permissionService: PermissionService) {}
// ...
}2. Validating Permissions
import { User } from './user.decorator';
@Get('admin-panel')
adminPanel(@User() user) {
this.permissionService.valid('admin-panel', user);
return 'Admin Panel';
}3. Handling Errors
try {
this.permissionService.valid('some-action', user);
// Perform the protected action
} catch (error) {
if (error instanceof DomainForbiddenError) {
// Handle lack of permissions
}
throw error;
}4. Using in a Custom Guard
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { PermissionService } from './permission.service';
@Injectable()
export class CustomPermissionGuard implements CanActivate {
constructor(private permissionService: PermissionService) {}
canActivate(context: ExecutionContext): boolean {
const request = context.switchToHttp().getRequest();
const user = request.user;
const requiredPermission = 'some-permission';
try {
this.permissionService.valid(requiredPermission, user);
return true;
} catch (error) {
return false;
}
}
}5. Checking Multiple Permissions
multipleChecks(@User() user) {
this.permissionService.valid('permission1', user);
this.permissionService.valid('permission2', user);
// If both checks pass, perform the action
}Notes
PermissionServicethrows aDomainForbiddenErrorif the required permissions are missing. Always be prepared to handle this exception or let it be caught by a global exception filter.
Filters
AppExceptionFilter Overview
The AppExceptionFilter class implements the ExceptionFilter interface and is used for handling exceptions in a NestJS application.
Functionality
The filter intercepts all exceptions and processes them as follows:
- For
HttpException, it uses the original HTTP status and message. - For
DomainValidationError, it sets a 400 (Bad Request) status. - For
DomainForbiddenError, it sets a 403 (Forbidden) status. - For all other exceptions, it sets a 500 (Internal Server Error) status.
Logging
The filter logs exception details (stack trace or message) using Logger.error().
Response
The filter returns an HTTP response with the appropriate status code and optionally a JSON object containing error details.
Usage
To use this filter globally in a NestJS application, register it in the main module:
import { Module } from '@nestjs/common';
import { APP_FILTER } from '@nestjs/core';
import { AppExceptionFilter } from '@smartsoft001/nestjs';
@Module({
providers: [
{
provide: APP_FILTER,
useClass: AppExceptionFilter,
},
],
})
export class AppModule {}This filter ensures consistent error handling throughout the application, mapping different exception types to appropriate HTTP status codes and formatting responses accordingly.
5 months ago
5 months ago
8 months ago
8 months ago
9 months ago
9 months ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago