@ferreirasw/yoke-common 0.1.0
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.
- package/CHANGELOG.md +20 -0
- package/README.md +393 -0
- package/dist/dto/index.d.ts +2 -0
- package/dist/dto/index.js +19 -0
- package/dist/dto/index.js.map +1 -0
- package/dist/dto/paginated-result.interface.d.ts +23 -0
- package/dist/dto/paginated-result.interface.js +30 -0
- package/dist/dto/paginated-result.interface.js.map +1 -0
- package/dist/dto/pagination.dto.d.ts +12 -0
- package/dist/dto/pagination.dto.js +82 -0
- package/dist/dto/pagination.dto.js.map +1 -0
- package/dist/enums/action.enum.d.ts +10 -0
- package/dist/enums/action.enum.js +15 -0
- package/dist/enums/action.enum.js.map +1 -0
- package/dist/enums/benchmark.enum.d.ts +8 -0
- package/dist/enums/benchmark.enum.js +13 -0
- package/dist/enums/benchmark.enum.js.map +1 -0
- package/dist/enums/coverage-type.enum.d.ts +7 -0
- package/dist/enums/coverage-type.enum.js +12 -0
- package/dist/enums/coverage-type.enum.js.map +1 -0
- package/dist/enums/fund-status.enum.d.ts +4 -0
- package/dist/enums/fund-status.enum.js +9 -0
- package/dist/enums/fund-status.enum.js.map +1 -0
- package/dist/enums/index.d.ts +10 -0
- package/dist/enums/index.js +24 -0
- package/dist/enums/index.js.map +1 -0
- package/dist/enums/insurer-status.enum.d.ts +5 -0
- package/dist/enums/insurer-status.enum.js +10 -0
- package/dist/enums/insurer-status.enum.js.map +1 -0
- package/dist/enums/modality.enum.d.ts +5 -0
- package/dist/enums/modality.enum.js +10 -0
- package/dist/enums/modality.enum.js.map +1 -0
- package/dist/enums/product-status.enum.d.ts +5 -0
- package/dist/enums/product-status.enum.js +10 -0
- package/dist/enums/product-status.enum.js.map +1 -0
- package/dist/enums/quotation-status.enum.d.ts +6 -0
- package/dist/enums/quotation-status.enum.js +11 -0
- package/dist/enums/quotation-status.enum.js.map +1 -0
- package/dist/enums/risk-profile.enum.d.ts +6 -0
- package/dist/enums/risk-profile.enum.js +11 -0
- package/dist/enums/risk-profile.enum.js.map +1 -0
- package/dist/enums/tax-regime.enum.d.ts +5 -0
- package/dist/enums/tax-regime.enum.js +10 -0
- package/dist/enums/tax-regime.enum.js.map +1 -0
- package/dist/filters/http-exception.filter.d.ts +11 -0
- package/dist/filters/http-exception.filter.js +105 -0
- package/dist/filters/http-exception.filter.js.map +1 -0
- package/dist/filters/index.d.ts +1 -0
- package/dist/filters/index.js +18 -0
- package/dist/filters/index.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/interceptors/index.d.ts +1 -0
- package/dist/interceptors/index.js +18 -0
- package/dist/interceptors/index.js.map +1 -0
- package/dist/interceptors/logging.interceptor.d.ts +18 -0
- package/dist/interceptors/logging.interceptor.js +74 -0
- package/dist/interceptors/logging.interceptor.js.map +1 -0
- package/dist/interfaces/api-response.interface.d.ts +22 -0
- package/dist/interfaces/api-response.interface.js +35 -0
- package/dist/interfaces/api-response.interface.js.map +1 -0
- package/dist/interfaces/index.d.ts +1 -0
- package/dist/interfaces/index.js +18 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/messaging/constants/exchanges.d.ts +11 -0
- package/dist/messaging/constants/exchanges.js +14 -0
- package/dist/messaging/constants/exchanges.js.map +1 -0
- package/dist/messaging/constants/index.d.ts +2 -0
- package/dist/messaging/constants/index.js +19 -0
- package/dist/messaging/constants/index.js.map +1 -0
- package/dist/messaging/constants/routing-keys.d.ts +28 -0
- package/dist/messaging/constants/routing-keys.js +31 -0
- package/dist/messaging/constants/routing-keys.js.map +1 -0
- package/dist/messaging/index.d.ts +3 -0
- package/dist/messaging/index.js +20 -0
- package/dist/messaging/index.js.map +1 -0
- package/dist/messaging/services/base-events.service.d.ts +24 -0
- package/dist/messaging/services/base-events.service.js +116 -0
- package/dist/messaging/services/base-events.service.js.map +1 -0
- package/dist/messaging/services/index.d.ts +1 -0
- package/dist/messaging/services/index.js +18 -0
- package/dist/messaging/services/index.js.map +1 -0
- package/dist/messaging/types/account-messages.d.ts +18 -0
- package/dist/messaging/types/account-messages.js +3 -0
- package/dist/messaging/types/account-messages.js.map +1 -0
- package/dist/messaging/types/base-message.d.ts +6 -0
- package/dist/messaging/types/base-message.js +3 -0
- package/dist/messaging/types/base-message.js.map +1 -0
- package/dist/messaging/types/index.d.ts +5 -0
- package/dist/messaging/types/index.js +22 -0
- package/dist/messaging/types/index.js.map +1 -0
- package/dist/messaging/types/product-messages.d.ts +71 -0
- package/dist/messaging/types/product-messages.js +3 -0
- package/dist/messaging/types/product-messages.js.map +1 -0
- package/dist/messaging/types/quotation-messages.d.ts +35 -0
- package/dist/messaging/types/quotation-messages.js +3 -0
- package/dist/messaging/types/quotation-messages.js.map +1 -0
- package/dist/messaging/types/user-messages.d.ts +42 -0
- package/dist/messaging/types/user-messages.js +3 -0
- package/dist/messaging/types/user-messages.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +18 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/validation.utils.d.ts +8 -0
- package/dist/utils/validation.utils.js +101 -0
- package/dist/utils/validation.utils.js.map +1 -0
- package/package.json +70 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
- Initial project setup with TypeScript configuration
|
|
12
|
+
- Project structure for shared utilities and messaging infrastructure
|
|
13
|
+
|
|
14
|
+
## [0.1.0] - 2026-01-09
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
- Initial package setup
|
|
18
|
+
- TypeScript configuration
|
|
19
|
+
- ESLint and Prettier configuration
|
|
20
|
+
- Jest test configuration
|
package/README.md
ADDED
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
# @ferreirasw/yoke-common
|
|
2
|
+
|
|
3
|
+
Shared utilities, types, and messaging infrastructure for Yoke microservices.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @ferreirasw/yoke-common
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
- **Enums**: Shared enums for business logic (Modality, TaxRegime, RiskProfile, Status enums, etc.)
|
|
14
|
+
- **Messaging**: RabbitMQ infrastructure with exchanges, routing keys, and message types
|
|
15
|
+
- **DTOs**: Standardized DTOs for pagination and API responses
|
|
16
|
+
- **Filters**: Global exception filters for consistent error handling
|
|
17
|
+
- **Interceptors**: Logging interceptors for request/response tracking
|
|
18
|
+
- **Utilities**: Common validation and formatting utilities (CPF, CNPJ, currency, etc.)
|
|
19
|
+
|
|
20
|
+
## Table of Contents
|
|
21
|
+
|
|
22
|
+
- [Enums](#enums)
|
|
23
|
+
- [Messaging (RabbitMQ)](#messaging-rabbitmq)
|
|
24
|
+
- [DTOs and Interfaces](#dtos-and-interfaces)
|
|
25
|
+
- [Filters and Interceptors](#filters-and-interceptors)
|
|
26
|
+
- [Utilities](#utilities)
|
|
27
|
+
- [Publishing Updates](#publishing-updates)
|
|
28
|
+
|
|
29
|
+
## Enums
|
|
30
|
+
|
|
31
|
+
All shared enums for consistent business logic across microservices.
|
|
32
|
+
|
|
33
|
+
### Usage Example
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
import {
|
|
37
|
+
Modality,
|
|
38
|
+
TaxRegime,
|
|
39
|
+
RiskProfile,
|
|
40
|
+
ProductStatus,
|
|
41
|
+
QuotationStatus,
|
|
42
|
+
} from '@ferreirasw/yoke-common';
|
|
43
|
+
|
|
44
|
+
// Use in your entities
|
|
45
|
+
@Entity()
|
|
46
|
+
export class Product {
|
|
47
|
+
@Column({ type: 'enum', enum: Modality })
|
|
48
|
+
modality: Modality;
|
|
49
|
+
|
|
50
|
+
@Column({ type: 'enum', enum: TaxRegime })
|
|
51
|
+
taxRegime: TaxRegime;
|
|
52
|
+
|
|
53
|
+
@Column({ type: 'enum', enum: ProductStatus, default: ProductStatus.ACTIVE })
|
|
54
|
+
status: ProductStatus;
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Available Enums
|
|
59
|
+
|
|
60
|
+
- `Modality`: PGBL, VGBL, ANY
|
|
61
|
+
- `TaxRegime`: PROGRESSIVE, REGRESSIVE, ANY
|
|
62
|
+
- `RiskProfile`: CONSERVATIVE, MODERATE, BOLD, AGGRESSIVE
|
|
63
|
+
- `ProductStatus`: ACTIVE, INACTIVE, SUSPENDED
|
|
64
|
+
- `QuotationStatus`: PENDING, COMPLETED, EXPIRED, CANCELLED
|
|
65
|
+
- `FundStatus`: ACTIVE, INACTIVE
|
|
66
|
+
- `InsurerStatus`: ACTIVE, INACTIVE, SUSPENDED
|
|
67
|
+
- `CoverageType`: DEATH, DISABILITY, TERM_PENSION, LIFETIME_INCOME, TEMPORARY_INCOME
|
|
68
|
+
- `Benchmark`: CDI, SELIC, IPCA, IBOVESPA, IBRX, IGPM
|
|
69
|
+
- `Action` (CASL): Manage, Create, Read, ReadAll, Update, UpdateAll, Delete, DeleteAll
|
|
70
|
+
|
|
71
|
+
## Messaging (RabbitMQ)
|
|
72
|
+
|
|
73
|
+
Centralized RabbitMQ infrastructure for event-driven communication between microservices.
|
|
74
|
+
|
|
75
|
+
### Exchanges and Routing Keys
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
import { EXCHANGES, ROUTING_KEYS } from '@ferreirasw/yoke-common';
|
|
79
|
+
|
|
80
|
+
// Publish an event
|
|
81
|
+
await eventsService.publishEvent(
|
|
82
|
+
EXCHANGES.PRODUCT,
|
|
83
|
+
ROUTING_KEYS.PRODUCT_CREATED,
|
|
84
|
+
{ productId: '123', name: 'Product A' }
|
|
85
|
+
);
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### BaseEventsService
|
|
89
|
+
|
|
90
|
+
Extend the `BaseEventsService` in your microservice:
|
|
91
|
+
|
|
92
|
+
```typescript
|
|
93
|
+
import { Injectable } from '@nestjs/common';
|
|
94
|
+
import { ConfigService } from '@nestjs/config';
|
|
95
|
+
import { BaseEventsService, EXCHANGES } from '@ferreirasw/yoke-common';
|
|
96
|
+
|
|
97
|
+
@Injectable()
|
|
98
|
+
export class ProductEventsService extends BaseEventsService {
|
|
99
|
+
constructor(configService: ConfigService) {
|
|
100
|
+
super(configService, 'ProductEventsService');
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
protected async setupExchanges(channel: any): Promise<void> {
|
|
104
|
+
// Assert your service's exchanges
|
|
105
|
+
await channel.assertExchange(EXCHANGES.PRODUCT, 'topic', { durable: true });
|
|
106
|
+
await channel.assertExchange(EXCHANGES.FUND, 'topic', { durable: true });
|
|
107
|
+
await channel.assertExchange(EXCHANGES.COVERAGE, 'topic', { durable: true });
|
|
108
|
+
await channel.assertExchange(EXCHANGES.INSURER, 'topic', { durable: true });
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Then register in your module:
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
import { Module } from '@nestjs/common';
|
|
117
|
+
import { ProductEventsService } from './events/product-events.service';
|
|
118
|
+
|
|
119
|
+
@Module({
|
|
120
|
+
providers: [ProductEventsService],
|
|
121
|
+
exports: [ProductEventsService],
|
|
122
|
+
})
|
|
123
|
+
export class EventsModule {}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### Message Types
|
|
127
|
+
|
|
128
|
+
Type-safe message interfaces for all events:
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
import {
|
|
132
|
+
ProductCreatedMessage,
|
|
133
|
+
EXCHANGES,
|
|
134
|
+
ROUTING_KEYS,
|
|
135
|
+
} from '@ferreirasw/yoke-common';
|
|
136
|
+
|
|
137
|
+
const message: ProductCreatedMessage = {
|
|
138
|
+
productId: product.id,
|
|
139
|
+
insurerId: product.insurerId,
|
|
140
|
+
name: product.name,
|
|
141
|
+
description: product.description,
|
|
142
|
+
modality: product.modality,
|
|
143
|
+
taxRegime: product.taxRegime,
|
|
144
|
+
status: product.status,
|
|
145
|
+
minContribution: product.minContribution,
|
|
146
|
+
maxContribution: product.maxContribution,
|
|
147
|
+
entryFee: product.entryFee,
|
|
148
|
+
administrationFee: product.administrationFee,
|
|
149
|
+
timestamp: Date.now(),
|
|
150
|
+
source: 'product-microservice',
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
await this.eventsService.publishEvent(
|
|
154
|
+
EXCHANGES.PRODUCT,
|
|
155
|
+
ROUTING_KEYS.PRODUCT_CREATED,
|
|
156
|
+
message
|
|
157
|
+
);
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## DTOs and Interfaces
|
|
161
|
+
|
|
162
|
+
### Pagination
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
import {
|
|
166
|
+
PaginationDto,
|
|
167
|
+
PaginatedResult,
|
|
168
|
+
PaginationHelper,
|
|
169
|
+
} from '@ferreirasw/yoke-common';
|
|
170
|
+
|
|
171
|
+
// In your controller
|
|
172
|
+
@Get()
|
|
173
|
+
async findAll(@Query() pagination: PaginationDto) {
|
|
174
|
+
const [data, total] = await this.productService.findAll(pagination);
|
|
175
|
+
|
|
176
|
+
return PaginationHelper.createResult(
|
|
177
|
+
data,
|
|
178
|
+
total,
|
|
179
|
+
pagination.page,
|
|
180
|
+
pagination.limit
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// In your service
|
|
185
|
+
async findAll(pagination: PaginationDto) {
|
|
186
|
+
const offset = pagination.getOffset();
|
|
187
|
+
const limit = pagination.getLimit();
|
|
188
|
+
|
|
189
|
+
const [data, total] = await this.repository.findAndCount({
|
|
190
|
+
skip: offset,
|
|
191
|
+
take: limit,
|
|
192
|
+
order: {
|
|
193
|
+
[pagination.sortBy || 'createdAt']: pagination.sortOrder || 'DESC',
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
return [data, total];
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### API Responses
|
|
202
|
+
|
|
203
|
+
```typescript
|
|
204
|
+
import {
|
|
205
|
+
ApiResponse,
|
|
206
|
+
ResponseBuilder,
|
|
207
|
+
} from '@ferreirasw/yoke-common';
|
|
208
|
+
|
|
209
|
+
// Success response
|
|
210
|
+
@Post()
|
|
211
|
+
async create(@Body() createDto: CreateProductDto) {
|
|
212
|
+
const product = await this.productService.create(createDto);
|
|
213
|
+
return ResponseBuilder.success(product, 'Product created successfully');
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Error response (usually handled by exception filter)
|
|
217
|
+
throw new BadRequestException(
|
|
218
|
+
ResponseBuilder.error('VALIDATION_FAILED', 'Invalid input data')
|
|
219
|
+
);
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
## Filters and Interceptors
|
|
223
|
+
|
|
224
|
+
### Exception Filter
|
|
225
|
+
|
|
226
|
+
```typescript
|
|
227
|
+
// In main.ts
|
|
228
|
+
import { AllExceptionsFilter } from '@ferreirasw/yoke-common';
|
|
229
|
+
|
|
230
|
+
async function bootstrap() {
|
|
231
|
+
const app = await NestFactory.create(AppModule);
|
|
232
|
+
|
|
233
|
+
// Register global exception filter
|
|
234
|
+
app.useGlobalFilters(new AllExceptionsFilter());
|
|
235
|
+
|
|
236
|
+
await app.listen(3000);
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
### Logging Interceptor
|
|
241
|
+
|
|
242
|
+
```typescript
|
|
243
|
+
// In main.ts
|
|
244
|
+
import { LoggingInterceptor } from '@ferreirasw/yoke-common';
|
|
245
|
+
|
|
246
|
+
async function bootstrap() {
|
|
247
|
+
const app = await NestFactory.create(AppModule);
|
|
248
|
+
|
|
249
|
+
// Register global logging interceptor
|
|
250
|
+
app.useGlobalInterceptors(
|
|
251
|
+
new LoggingInterceptor({
|
|
252
|
+
logRequestBody: process.env.NODE_ENV === 'development',
|
|
253
|
+
logResponseData: false, // Disable in production for security
|
|
254
|
+
})
|
|
255
|
+
);
|
|
256
|
+
|
|
257
|
+
await app.listen(3000);
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## Utilities
|
|
262
|
+
|
|
263
|
+
### Validation Utilities
|
|
264
|
+
|
|
265
|
+
```typescript
|
|
266
|
+
import {
|
|
267
|
+
isValidCPF,
|
|
268
|
+
isValidCNPJ,
|
|
269
|
+
formatCPF,
|
|
270
|
+
formatCNPJ,
|
|
271
|
+
formatCurrency,
|
|
272
|
+
calculateAge,
|
|
273
|
+
} from '@ferreirasw/yoke-common';
|
|
274
|
+
|
|
275
|
+
// Validate CPF
|
|
276
|
+
if (isValidCPF('123.456.789-09')) {
|
|
277
|
+
console.log('Valid CPF');
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// Validate CNPJ
|
|
281
|
+
if (isValidCNPJ('11.222.333/0001-81')) {
|
|
282
|
+
console.log('Valid CNPJ');
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Format values
|
|
286
|
+
const formattedCPF = formatCPF('12345678909'); // '123.456.789-09'
|
|
287
|
+
const formattedCNPJ = formatCNPJ('11222333000181'); // '11.222.333/0001-81'
|
|
288
|
+
const formattedPrice = formatCurrency(1234.56); // 'R$ 1.234,56'
|
|
289
|
+
|
|
290
|
+
// Calculate age
|
|
291
|
+
const age = calculateAge(new Date('1990-01-15')); // 36 (as of 2026)
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
## Publishing Updates
|
|
295
|
+
|
|
296
|
+
### Prerequisites
|
|
297
|
+
|
|
298
|
+
1. Login to npm with ferreirasw account:
|
|
299
|
+
|
|
300
|
+
```bash
|
|
301
|
+
npm login
|
|
302
|
+
# Enter credentials for ferreirasw
|
|
303
|
+
npm whoami # Should output: ferreirasw
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### Publishing Workflow
|
|
307
|
+
|
|
308
|
+
1. **Make your changes** to the codebase
|
|
309
|
+
|
|
310
|
+
2. **Update CHANGELOG.md** with your changes
|
|
311
|
+
|
|
312
|
+
3. **Bump the version** using semantic versioning:
|
|
313
|
+
|
|
314
|
+
```bash
|
|
315
|
+
# For bug fixes (0.1.0 -> 0.1.1)
|
|
316
|
+
npm version patch
|
|
317
|
+
|
|
318
|
+
# For new features (0.1.0 -> 0.2.0)
|
|
319
|
+
npm version minor
|
|
320
|
+
|
|
321
|
+
# For breaking changes (0.1.0 -> 1.0.0)
|
|
322
|
+
npm version major
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
4. **Build and publish**:
|
|
326
|
+
|
|
327
|
+
```bash
|
|
328
|
+
npm run build
|
|
329
|
+
npm publish --access public
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
5. **Push to git with tags**:
|
|
333
|
+
|
|
334
|
+
```bash
|
|
335
|
+
git push origin main --tags
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
### Using in Microservices
|
|
339
|
+
|
|
340
|
+
After publishing, install in your microservices:
|
|
341
|
+
|
|
342
|
+
```bash
|
|
343
|
+
cd /path/to/account-microservice
|
|
344
|
+
npm install @ferreirasw/yoke-common@latest
|
|
345
|
+
|
|
346
|
+
cd /path/to/product-microservice
|
|
347
|
+
npm install @ferreirasw/yoke-common@latest
|
|
348
|
+
|
|
349
|
+
cd /path/to/quotation-microservice
|
|
350
|
+
npm install @ferreirasw/yoke-common@latest
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
### Updating Microservices
|
|
354
|
+
|
|
355
|
+
When a new version is published:
|
|
356
|
+
|
|
357
|
+
```bash
|
|
358
|
+
npm update @ferreirasw/yoke-common
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
Or install a specific version:
|
|
362
|
+
|
|
363
|
+
```bash
|
|
364
|
+
npm install @ferreirasw/yoke-common@0.2.0
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
## Development
|
|
368
|
+
|
|
369
|
+
### Building
|
|
370
|
+
|
|
371
|
+
```bash
|
|
372
|
+
npm run build
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
### Linting
|
|
376
|
+
|
|
377
|
+
```bash
|
|
378
|
+
npm run lint
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
### Formatting
|
|
382
|
+
|
|
383
|
+
```bash
|
|
384
|
+
npm run format
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
## License
|
|
388
|
+
|
|
389
|
+
MIT
|
|
390
|
+
|
|
391
|
+
## Support
|
|
392
|
+
|
|
393
|
+
For issues or questions, please create an issue in the repository.
|
|
@@ -0,0 +1,19 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./pagination.dto"), exports);
|
|
18
|
+
__exportStar(require("./paginated-result.interface"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dto/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAIA,mDAAiC;AACjC,+DAA6C"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface PaginationMeta {
|
|
2
|
+
page: number;
|
|
3
|
+
limit: number;
|
|
4
|
+
total: number;
|
|
5
|
+
totalPages: number;
|
|
6
|
+
hasNextPage: boolean;
|
|
7
|
+
hasPreviousPage: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface PaginatedResult<T> {
|
|
10
|
+
data: T[];
|
|
11
|
+
meta: PaginationMeta;
|
|
12
|
+
}
|
|
13
|
+
export interface PaginatedResponse<T> {
|
|
14
|
+
data: T[];
|
|
15
|
+
total: number;
|
|
16
|
+
page: number;
|
|
17
|
+
limit: number;
|
|
18
|
+
totalPages: number;
|
|
19
|
+
}
|
|
20
|
+
export declare class PaginationHelper {
|
|
21
|
+
static createResult<T>(data: T[], total: number, page: number, limit: number): PaginatedResult<T>;
|
|
22
|
+
static toSimpleResponse<T>(result: PaginatedResult<T>): PaginatedResponse<T>;
|
|
23
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PaginationHelper = void 0;
|
|
4
|
+
class PaginationHelper {
|
|
5
|
+
static createResult(data, total, page, limit) {
|
|
6
|
+
const totalPages = Math.ceil(total / limit);
|
|
7
|
+
return {
|
|
8
|
+
data,
|
|
9
|
+
meta: {
|
|
10
|
+
page,
|
|
11
|
+
limit,
|
|
12
|
+
total,
|
|
13
|
+
totalPages,
|
|
14
|
+
hasNextPage: page < totalPages,
|
|
15
|
+
hasPreviousPage: page > 1,
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
static toSimpleResponse(result) {
|
|
20
|
+
return {
|
|
21
|
+
data: result.data,
|
|
22
|
+
total: result.meta.total,
|
|
23
|
+
page: result.meta.page,
|
|
24
|
+
limit: result.meta.limit,
|
|
25
|
+
totalPages: result.meta.totalPages,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.PaginationHelper = PaginationHelper;
|
|
30
|
+
//# sourceMappingURL=paginated-result.interface.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paginated-result.interface.js","sourceRoot":"","sources":["../../src/dto/paginated-result.interface.ts"],"names":[],"mappings":";;;AA4EA,MAAa,gBAAgB;IAU3B,MAAM,CAAC,YAAY,CAAI,IAAS,EAAE,KAAa,EAAE,IAAY,EAAE,KAAa;QAC1E,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;QAE5C,OAAO;YACL,IAAI;YACJ,IAAI,EAAE;gBACJ,IAAI;gBACJ,KAAK;gBACL,KAAK;gBACL,UAAU;gBACV,WAAW,EAAE,IAAI,GAAG,UAAU;gBAC9B,eAAe,EAAE,IAAI,GAAG,CAAC;aAC1B;SACF,CAAC;IACJ,CAAC;IAQD,MAAM,CAAC,gBAAgB,CAAI,MAA0B;QACnD,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK;YACxB,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI;YACtB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK;YACxB,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU;SACnC,CAAC;IACJ,CAAC;CACF;AAzCD,4CAyCC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
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.PaginationDto = exports.SortOrder = void 0;
|
|
13
|
+
const class_validator_1 = require("class-validator");
|
|
14
|
+
const class_transformer_1 = require("class-transformer");
|
|
15
|
+
const swagger_1 = require("@nestjs/swagger");
|
|
16
|
+
var SortOrder;
|
|
17
|
+
(function (SortOrder) {
|
|
18
|
+
SortOrder["ASC"] = "ASC";
|
|
19
|
+
SortOrder["DESC"] = "DESC";
|
|
20
|
+
})(SortOrder || (exports.SortOrder = SortOrder = {}));
|
|
21
|
+
class PaginationDto {
|
|
22
|
+
constructor() {
|
|
23
|
+
this.page = 1;
|
|
24
|
+
this.limit = 10;
|
|
25
|
+
this.sortOrder = SortOrder.DESC;
|
|
26
|
+
}
|
|
27
|
+
getOffset() {
|
|
28
|
+
return ((this.page ?? 1) - 1) * (this.limit ?? 10);
|
|
29
|
+
}
|
|
30
|
+
getLimit() {
|
|
31
|
+
return this.limit ?? 10;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.PaginationDto = PaginationDto;
|
|
35
|
+
__decorate([
|
|
36
|
+
(0, swagger_1.ApiPropertyOptional)({
|
|
37
|
+
description: 'Page number (starting from 1)',
|
|
38
|
+
minimum: 1,
|
|
39
|
+
default: 1,
|
|
40
|
+
example: 1,
|
|
41
|
+
}),
|
|
42
|
+
(0, class_validator_1.IsOptional)(),
|
|
43
|
+
(0, class_transformer_1.Type)(() => Number),
|
|
44
|
+
(0, class_validator_1.IsInt)(),
|
|
45
|
+
(0, class_validator_1.Min)(1),
|
|
46
|
+
__metadata("design:type", Number)
|
|
47
|
+
], PaginationDto.prototype, "page", void 0);
|
|
48
|
+
__decorate([
|
|
49
|
+
(0, swagger_1.ApiPropertyOptional)({
|
|
50
|
+
description: 'Number of items per page',
|
|
51
|
+
minimum: 1,
|
|
52
|
+
maximum: 100,
|
|
53
|
+
default: 10,
|
|
54
|
+
example: 10,
|
|
55
|
+
}),
|
|
56
|
+
(0, class_validator_1.IsOptional)(),
|
|
57
|
+
(0, class_transformer_1.Type)(() => Number),
|
|
58
|
+
(0, class_validator_1.IsInt)(),
|
|
59
|
+
(0, class_validator_1.Min)(1),
|
|
60
|
+
(0, class_validator_1.Max)(100),
|
|
61
|
+
__metadata("design:type", Number)
|
|
62
|
+
], PaginationDto.prototype, "limit", void 0);
|
|
63
|
+
__decorate([
|
|
64
|
+
(0, swagger_1.ApiPropertyOptional)({
|
|
65
|
+
description: 'Field to sort by',
|
|
66
|
+
example: 'createdAt',
|
|
67
|
+
}),
|
|
68
|
+
(0, class_validator_1.IsOptional)(),
|
|
69
|
+
__metadata("design:type", String)
|
|
70
|
+
], PaginationDto.prototype, "sortBy", void 0);
|
|
71
|
+
__decorate([
|
|
72
|
+
(0, swagger_1.ApiPropertyOptional)({
|
|
73
|
+
description: 'Sort order (ascending or descending)',
|
|
74
|
+
enum: SortOrder,
|
|
75
|
+
default: SortOrder.DESC,
|
|
76
|
+
example: SortOrder.DESC,
|
|
77
|
+
}),
|
|
78
|
+
(0, class_validator_1.IsOptional)(),
|
|
79
|
+
(0, class_validator_1.IsEnum)(SortOrder),
|
|
80
|
+
__metadata("design:type", String)
|
|
81
|
+
], PaginationDto.prototype, "sortOrder", void 0);
|
|
82
|
+
//# sourceMappingURL=pagination.dto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.dto.js","sourceRoot":"","sources":["../../src/dto/pagination.dto.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAsE;AACtE,yDAAyC;AACzC,6CAAsD;AAKtD,IAAY,SAGX;AAHD,WAAY,SAAS;IACnB,wBAAW,CAAA;IACX,0BAAa,CAAA;AACf,CAAC,EAHW,SAAS,yBAAT,SAAS,QAGpB;AAQD,MAAa,aAAa;IAA1B;QAWE,SAAI,GAAY,CAAC,CAAC;QAclB,UAAK,GAAY,EAAE,CAAC;QAiBpB,cAAS,GAAe,SAAS,CAAC,IAAI,CAAC;IAezC,CAAC;IAVC,SAAS;QACP,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAKD,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC1B,CAAC;CACF;AAzDD,sCAyDC;AA9CC;IAVC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,+BAA+B;QAC5C,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,CAAC;KACX,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAClB,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAG,EAAC,CAAC,CAAC;;2CACW;AAclB;IAZC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,0BAA0B;QACvC,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,GAAG;QACZ,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;KACZ,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAI,EAAC,GAAG,EAAE,CAAC,MAAM,CAAC;IAClB,IAAA,uBAAK,GAAE;IACP,IAAA,qBAAG,EAAC,CAAC,CAAC;IACN,IAAA,qBAAG,EAAC,GAAG,CAAC;;4CACW;AAOpB;IALC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,kBAAkB;QAC/B,OAAO,EAAE,WAAW;KACrB,CAAC;IACD,IAAA,4BAAU,GAAE;;6CACG;AAUhB;IARC,IAAA,6BAAmB,EAAC;QACnB,WAAW,EAAE,sCAAsC;QACnD,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,SAAS,CAAC,IAAI;QACvB,OAAO,EAAE,SAAS,CAAC,IAAI;KACxB,CAAC;IACD,IAAA,4BAAU,GAAE;IACZ,IAAA,wBAAM,EAAC,SAAS,CAAC;;gDACqB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Action = void 0;
|
|
4
|
+
var Action;
|
|
5
|
+
(function (Action) {
|
|
6
|
+
Action["Manage"] = "manage";
|
|
7
|
+
Action["Create"] = "create";
|
|
8
|
+
Action["Read"] = "read";
|
|
9
|
+
Action["ReadAll"] = "read_all";
|
|
10
|
+
Action["Update"] = "update";
|
|
11
|
+
Action["UpdateAll"] = "update_all";
|
|
12
|
+
Action["Delete"] = "delete";
|
|
13
|
+
Action["DeleteAll"] = "delete_all";
|
|
14
|
+
})(Action || (exports.Action = Action = {}));
|
|
15
|
+
//# sourceMappingURL=action.enum.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action.enum.js","sourceRoot":"","sources":["../../src/enums/action.enum.ts"],"names":[],"mappings":";;;AAgBA,IAAY,MASX;AATD,WAAY,MAAM;IAChB,2BAAiB,CAAA;IACjB,2BAAiB,CAAA;IACjB,uBAAa,CAAA;IACb,8BAAoB,CAAA;IACpB,2BAAiB,CAAA;IACjB,kCAAwB,CAAA;IACxB,2BAAiB,CAAA;IACjB,kCAAwB,CAAA;AAC1B,CAAC,EATW,MAAM,sBAAN,MAAM,QASjB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Benchmark = void 0;
|
|
4
|
+
var Benchmark;
|
|
5
|
+
(function (Benchmark) {
|
|
6
|
+
Benchmark["CDI"] = "CDI";
|
|
7
|
+
Benchmark["SELIC"] = "SELIC";
|
|
8
|
+
Benchmark["IPCA"] = "IPCA";
|
|
9
|
+
Benchmark["IBOVESPA"] = "IBOVESPA";
|
|
10
|
+
Benchmark["IBRX"] = "IBRX";
|
|
11
|
+
Benchmark["IGPM"] = "IGPM";
|
|
12
|
+
})(Benchmark || (exports.Benchmark = Benchmark = {}));
|
|
13
|
+
//# sourceMappingURL=benchmark.enum.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark.enum.js","sourceRoot":"","sources":["../../src/enums/benchmark.enum.ts"],"names":[],"mappings":";;;AAYA,IAAY,SAOX;AAPD,WAAY,SAAS;IACnB,wBAAW,CAAA;IACX,4BAAe,CAAA;IACf,0BAAa,CAAA;IACb,kCAAqB,CAAA;IACrB,0BAAa,CAAA;IACb,0BAAa,CAAA;AACf,CAAC,EAPW,SAAS,yBAAT,SAAS,QAOpB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CoverageType = void 0;
|
|
4
|
+
var CoverageType;
|
|
5
|
+
(function (CoverageType) {
|
|
6
|
+
CoverageType["DEATH"] = "morte";
|
|
7
|
+
CoverageType["DISABILITY"] = "invalidez";
|
|
8
|
+
CoverageType["TERM_PENSION"] = "pensao_por_prazo_certo";
|
|
9
|
+
CoverageType["LIFETIME_INCOME"] = "renda_vitalicia";
|
|
10
|
+
CoverageType["TEMPORARY_INCOME"] = "renda_temporaria";
|
|
11
|
+
})(CoverageType || (exports.CoverageType = CoverageType = {}));
|
|
12
|
+
//# sourceMappingURL=coverage-type.enum.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coverage-type.enum.js","sourceRoot":"","sources":["../../src/enums/coverage-type.enum.ts"],"names":[],"mappings":";;;AAWA,IAAY,YAMX;AAND,WAAY,YAAY;IACtB,+BAAe,CAAA;IACf,wCAAwB,CAAA;IACxB,uDAAuC,CAAA;IACvC,mDAAmC,CAAA;IACnC,qDAAqC,CAAA;AACvC,CAAC,EANW,YAAY,4BAAZ,YAAY,QAMvB"}
|