@stefaninigo/core 0.9.0 → 1.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/README.md +339 -51
- package/dist/libs/stefaninigo/cache/cache-service.interface.d.ts +4 -4
- package/dist/libs/stefaninigo/cache/cache.module.d.ts +1 -5
- package/dist/libs/stefaninigo/cache/cache.module.js +2 -2
- package/dist/libs/stefaninigo/cache/cache.module.js.map +1 -1
- package/dist/libs/stefaninigo/cache/local/{loca.service.d.ts → local.service.d.ts} +6 -4
- package/dist/libs/stefaninigo/cache/local/local.service.js +59 -0
- package/dist/libs/stefaninigo/cache/local/local.service.js.map +1 -0
- package/dist/libs/stefaninigo/config/config.service.d.ts +60 -6
- package/dist/libs/stefaninigo/config/config.service.js +11 -7
- package/dist/libs/stefaninigo/config/config.service.js.map +1 -1
- package/dist/libs/stefaninigo/core/bootstrap/bootstrap.helpers.d.ts +16 -2
- package/dist/libs/stefaninigo/core/bootstrap/bootstrap.helpers.js +47 -7
- package/dist/libs/stefaninigo/core/bootstrap/bootstrap.helpers.js.map +1 -1
- package/dist/libs/stefaninigo/core/config/env.utils.d.ts +3 -0
- package/dist/libs/stefaninigo/core/config/env.utils.js +28 -0
- package/dist/libs/stefaninigo/core/config/env.utils.js.map +1 -0
- package/dist/libs/stefaninigo/core/config/index.d.ts +1 -0
- package/dist/libs/stefaninigo/core/config/index.js +18 -0
- package/dist/libs/stefaninigo/core/config/index.js.map +1 -0
- package/dist/libs/stefaninigo/core/context/index.d.ts +2 -0
- package/dist/libs/stefaninigo/core/context/index.js +19 -0
- package/dist/libs/stefaninigo/core/context/index.js.map +1 -0
- package/dist/libs/stefaninigo/core/context/request-context.d.ts +11 -0
- package/dist/libs/stefaninigo/core/context/request-context.js +14 -0
- package/dist/libs/stefaninigo/core/context/request-context.js.map +1 -0
- package/dist/libs/stefaninigo/core/context/request-context.middleware.d.ts +5 -0
- package/dist/libs/stefaninigo/core/context/request-context.middleware.js +27 -0
- package/dist/libs/stefaninigo/core/context/request-context.middleware.js.map +1 -0
- package/dist/libs/stefaninigo/core/dtos/index.d.ts +1 -0
- package/dist/libs/stefaninigo/core/dtos/index.js +1 -0
- package/dist/libs/stefaninigo/core/dtos/index.js.map +1 -1
- package/dist/libs/stefaninigo/core/dtos/paginated-result.dto.d.ts +11 -0
- package/dist/libs/stefaninigo/core/dtos/paginated-result.dto.js +56 -0
- package/dist/libs/stefaninigo/core/dtos/paginated-result.dto.js.map +1 -0
- package/dist/libs/stefaninigo/core/dtos/problem-details.dto.d.ts +1 -0
- package/dist/libs/stefaninigo/core/dtos/problem-details.dto.js +18 -10
- package/dist/libs/stefaninigo/core/dtos/problem-details.dto.js.map +1 -1
- package/dist/libs/stefaninigo/core/errors/http.error.d.ts +2 -2
- package/dist/libs/stefaninigo/core/errors/http.error.js +7 -3
- package/dist/libs/stefaninigo/core/errors/http.error.js.map +1 -1
- package/dist/libs/stefaninigo/core/filters/http-exception.filter.d.ts +9 -0
- package/dist/libs/stefaninigo/core/filters/http-exception.filter.js +90 -0
- package/dist/libs/stefaninigo/core/filters/http-exception.filter.js.map +1 -0
- package/dist/libs/stefaninigo/core/filters/index.d.ts +1 -0
- package/dist/libs/stefaninigo/core/filters/index.js +18 -0
- package/dist/libs/stefaninigo/core/filters/index.js.map +1 -0
- package/dist/libs/stefaninigo/core/health/health.module.js +2 -1
- package/dist/libs/stefaninigo/core/health/health.module.js.map +1 -1
- package/dist/libs/stefaninigo/core/health/health.service.d.ts +2 -2
- package/dist/libs/stefaninigo/core/health/health.types.d.ts +1 -0
- package/dist/libs/stefaninigo/core/health/health.types.js.map +1 -1
- package/dist/libs/stefaninigo/core/index.d.ts +4 -0
- package/dist/libs/stefaninigo/core/index.js +4 -0
- package/dist/libs/stefaninigo/core/index.js.map +1 -1
- package/dist/libs/stefaninigo/core/interceptors/logging.interceptor.js +15 -10
- package/dist/libs/stefaninigo/core/interceptors/logging.interceptor.js.map +1 -1
- package/dist/libs/stefaninigo/core/interceptors/problem-details.interceptor.d.ts +1 -5
- package/dist/libs/stefaninigo/core/interceptors/problem-details.interceptor.js +27 -88
- package/dist/libs/stefaninigo/core/interceptors/problem-details.interceptor.js.map +1 -1
- package/dist/libs/stefaninigo/core/interceptors/problem-details.utils.d.ts +6 -0
- package/dist/libs/stefaninigo/core/interceptors/problem-details.utils.js +70 -0
- package/dist/libs/stefaninigo/core/interceptors/problem-details.utils.js.map +1 -0
- package/dist/libs/stefaninigo/core/interceptors/response.interceptor.js +2 -2
- package/dist/libs/stefaninigo/core/interceptors/response.interceptor.js.map +1 -1
- package/dist/libs/stefaninigo/core/logger/index.d.ts +1 -0
- package/dist/libs/stefaninigo/core/logger/index.js +18 -0
- package/dist/libs/stefaninigo/core/logger/index.js.map +1 -0
- package/dist/libs/stefaninigo/core/logger/traced-logger.d.ts +7 -0
- package/dist/libs/stefaninigo/core/logger/traced-logger.js +21 -0
- package/dist/libs/stefaninigo/core/logger/traced-logger.js.map +1 -0
- package/dist/libs/stefaninigo/database/database-service.interface.d.ts +20 -23
- package/dist/libs/stefaninigo/database/database-service.interface.js +0 -16
- package/dist/libs/stefaninigo/database/database-service.interface.js.map +1 -1
- package/dist/libs/stefaninigo/database/database.module.d.ts +2 -6
- package/dist/libs/stefaninigo/database/database.module.js +1 -1
- package/dist/libs/stefaninigo/database/database.module.js.map +1 -1
- package/dist/libs/stefaninigo/database/dynamodb/dynamodb.service.d.ts +12 -10
- package/dist/libs/stefaninigo/database/dynamodb/dynamodb.service.js +8 -14
- package/dist/libs/stefaninigo/database/dynamodb/dynamodb.service.js.map +1 -1
- package/dist/libs/stefaninigo/database/index.js.map +1 -1
- package/dist/libs/stefaninigo/database/mongodb/mongodb.service.d.ts +5 -3
- package/dist/libs/stefaninigo/database/mongodb/mongodb.service.js +43 -21
- package/dist/libs/stefaninigo/database/mongodb/mongodb.service.js.map +1 -1
- package/dist/libs/stefaninigo/database/postgresdb/postgresdb.services.d.ts +9 -6
- package/dist/libs/stefaninigo/database/postgresdb/postgresdb.services.js +43 -31
- package/dist/libs/stefaninigo/database/postgresdb/postgresdb.services.js.map +1 -1
- package/dist/libs/stefaninigo/events/event-bus/event-bus.module.d.ts +2 -0
- package/dist/libs/stefaninigo/events/event-bus/event-bus.module.js +22 -0
- package/dist/libs/stefaninigo/events/event-bus/event-bus.module.js.map +1 -0
- package/dist/libs/stefaninigo/events/event-bus/event-bus.service.d.ts +21 -0
- package/dist/libs/stefaninigo/events/event-bus/event-bus.service.js +130 -0
- package/dist/libs/stefaninigo/events/event-bus/event-bus.service.js.map +1 -0
- package/dist/libs/stefaninigo/events/event-bus/event-bus.types.d.ts +13 -0
- package/dist/libs/stefaninigo/{messaging/messagin-service.interface.js → events/event-bus/event-bus.types.js} +1 -1
- package/dist/libs/stefaninigo/events/event-bus/event-bus.types.js.map +1 -0
- package/dist/libs/stefaninigo/events/event-bus/index.d.ts +3 -0
- package/dist/libs/stefaninigo/events/event-bus/index.js +20 -0
- package/dist/libs/stefaninigo/events/event-bus/index.js.map +1 -0
- package/dist/libs/stefaninigo/events/index.d.ts +1 -0
- package/dist/libs/stefaninigo/events/index.js +1 -0
- package/dist/libs/stefaninigo/events/index.js.map +1 -1
- package/dist/libs/stefaninigo/events/types/domain-events.d.ts +3 -145
- package/dist/libs/stefaninigo/index.d.ts +2 -3
- package/dist/libs/stefaninigo/index.js +2 -2
- package/dist/libs/stefaninigo/index.js.map +1 -1
- package/dist/libs/stefaninigo/messaging/index.d.ts +2 -2
- package/dist/libs/stefaninigo/messaging/index.js +2 -2
- package/dist/libs/stefaninigo/messaging/index.js.map +1 -1
- package/dist/libs/stefaninigo/messaging/{messagin-service.interface.d.ts → messaging-service.interface.d.ts} +1 -1
- package/dist/libs/stefaninigo/messaging/messaging-service.interface.js +3 -0
- package/dist/libs/stefaninigo/messaging/messaging-service.interface.js.map +1 -0
- package/dist/libs/stefaninigo/messaging/{messagin.module.d.ts → messaging.module.d.ts} +2 -6
- package/dist/libs/stefaninigo/messaging/{messagin.module.js → messaging.module.js} +2 -2
- package/dist/libs/stefaninigo/messaging/messaging.module.js.map +1 -0
- package/dist/libs/stefaninigo/messaging/sns/sns.service.d.ts +3 -5
- package/dist/libs/stefaninigo/messaging/sns/sns.service.js +2 -26
- package/dist/libs/stefaninigo/messaging/sns/sns.service.js.map +1 -1
- package/dist/libs/stefaninigo/messaging/sqs/sqs.service.d.ts +3 -2
- package/dist/libs/stefaninigo/messaging/sqs/sqs.service.js +20 -8
- package/dist/libs/stefaninigo/messaging/sqs/sqs.service.js.map +1 -1
- package/dist/libs/stefaninigo/storage/s3/s3-services.d.ts +2 -0
- package/dist/libs/stefaninigo/storage/s3/s3-services.js +36 -8
- package/dist/libs/stefaninigo/storage/s3/s3-services.js.map +1 -1
- package/dist/libs/stefaninigo/storage/storage.interface.d.ts +1 -0
- package/dist/libs/stefaninigo/storage/storage.module.js +1 -1
- package/dist/libs/stefaninigo/storage/storage.module.js.map +1 -1
- package/dist/libs/stefaninigo/transport/index.d.ts +1 -1
- package/dist/libs/stefaninigo/transport/index.js +1 -1
- package/dist/libs/stefaninigo/transport/index.js.map +1 -1
- package/dist/libs/stefaninigo/transport/{trasnport.module.d.ts → transport.module.d.ts} +8 -7
- package/dist/libs/stefaninigo/transport/{trasnport.module.js → transport.module.js} +8 -12
- package/dist/libs/stefaninigo/transport/transport.module.js.map +1 -0
- package/dist/libs/stefaninigo/transport/web-socket/aws/aws-ws-transport.service.d.ts +2 -2
- package/dist/libs/stefaninigo/transport/web-socket/aws/aws-ws-transport.service.js +0 -4
- package/dist/libs/stefaninigo/transport/web-socket/aws/aws-ws-transport.service.js.map +1 -1
- package/package.json +8 -3
- package/dist/libs/stefaninigo/cache/local/loca.service.js +0 -30
- package/dist/libs/stefaninigo/cache/local/loca.service.js.map +0 -1
- package/dist/libs/stefaninigo/messaging/messagin-service.interface.js.map +0 -1
- package/dist/libs/stefaninigo/messaging/messagin.module.js.map +0 -1
- package/dist/libs/stefaninigo/transport/trasnport.module.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,73 +1,361 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/l/@nestjs/core.svg" alt="Package License" /></a>
|
|
12
|
-
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/dm/@nestjs/common.svg" alt="NPM Downloads" /></a>
|
|
13
|
-
<a href="https://circleci.com/gh/nestjs/nest" target="_blank"><img src="https://img.shields.io/circleci/build/github/nestjs/nest/master" alt="CircleCI" /></a>
|
|
14
|
-
<a href="https://coveralls.io/github/nestjs/nest?branch=master" target="_blank"><img src="https://coveralls.io/repos/github/nestjs/nest/badge.svg?branch=master#9" alt="Coverage" /></a>
|
|
15
|
-
<a href="https://discord.gg/G7Qnnhy" target="_blank"><img src="https://img.shields.io/badge/discord-online-brightgreen.svg" alt="Discord"/></a>
|
|
16
|
-
<a href="https://opencollective.com/nest#backer" target="_blank"><img src="https://opencollective.com/nest/backers/badge.svg" alt="Backers on Open Collective" /></a>
|
|
17
|
-
<a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://opencollective.com/nest/sponsors/badge.svg" alt="Sponsors on Open Collective" /></a>
|
|
18
|
-
<a href="https://paypal.me/kamilmysliwiec" target="_blank"><img src="https://img.shields.io/badge/Donate-PayPal-ff3f59.svg"/></a>
|
|
19
|
-
<a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://img.shields.io/badge/Support%20us-Open%20Collective-41B883.svg" alt="Support us"></a>
|
|
20
|
-
<a href="https://twitter.com/nestframework" target="_blank"><img src="https://img.shields.io/twitter/follow/nestframework.svg?style=social&label=Follow"></a>
|
|
21
|
-
</p>
|
|
22
|
-
<!--[](https://opencollective.com/nest#backer)
|
|
23
|
-
[](https://opencollective.com/nest#sponsor)-->
|
|
24
|
-
|
|
25
|
-
## Description
|
|
26
|
-
|
|
27
|
-
[Nest](https://github.com/nestjs/nest) framework TypeScript starter repository.
|
|
1
|
+
# stefaninigo
|
|
2
|
+
|
|
3
|
+
Enterprise-grade NestJS library for the StefaniniGo microservice ecosystem. Provides database access, file storage, caching, messaging, real-time transport, event-driven architecture, geolocation utilities, health checks, and standardized request/response handling -- all through a unified **Strategy + DynamicModule** pattern.
|
|
4
|
+
|
|
5
|
+
## Design Philosophy
|
|
6
|
+
|
|
7
|
+
- **Transversal** -- shared foundation for all microservices in the ecosystem.
|
|
8
|
+
- **Generic** -- no business logic; only infrastructure concerns.
|
|
9
|
+
- **Provider-agnostic** -- every infrastructure module defines a **service interface**; concrete implementations (strategies) are swappable without touching consumer code.
|
|
10
|
+
- **Easy integration** -- `forRootAsync()` one-liner registration, `@Inject('token')` consumption.
|
|
28
11
|
|
|
29
12
|
## Installation
|
|
30
13
|
|
|
31
14
|
```bash
|
|
32
|
-
|
|
15
|
+
npm install stefaninigo
|
|
33
16
|
```
|
|
34
17
|
|
|
35
|
-
##
|
|
18
|
+
## Quick Start
|
|
36
19
|
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
|
|
20
|
+
```typescript
|
|
21
|
+
// app.module.ts
|
|
22
|
+
import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';
|
|
23
|
+
import { ConfigModule } from '@nestjs/config';
|
|
24
|
+
import {
|
|
25
|
+
DatabaseModule,
|
|
26
|
+
StorageModule,
|
|
27
|
+
CacheModule,
|
|
28
|
+
EventBusModule,
|
|
29
|
+
HealthModule,
|
|
30
|
+
TraceIdMiddleware,
|
|
31
|
+
RequestContextMiddleware,
|
|
32
|
+
LoggingInterceptor,
|
|
33
|
+
ResponseInterceptor,
|
|
34
|
+
ProblemDetailsInterceptor,
|
|
35
|
+
} from 'stefaninigo';
|
|
36
|
+
import { APP_INTERCEPTOR } from '@nestjs/core';
|
|
37
|
+
import configuration from './config/configuration';
|
|
38
|
+
|
|
39
|
+
@Module({
|
|
40
|
+
imports: [
|
|
41
|
+
ConfigModule.forRoot({ load: [configuration], isGlobal: true }),
|
|
40
42
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
+
// Database -- MongoDB provider with injection token 'db'
|
|
44
|
+
DatabaseModule.forRootAsync([
|
|
45
|
+
{ name: 'db', provider: DatabaseModule.PROVIDERS.MONGODB },
|
|
46
|
+
]),
|
|
43
47
|
|
|
44
|
-
|
|
45
|
-
|
|
48
|
+
// Storage -- S3 provider with injection token 'storage'
|
|
49
|
+
StorageModule.forRootAsync([
|
|
50
|
+
{ name: 'storage', provider: StorageModule.PROVIDERS.S3 },
|
|
51
|
+
]),
|
|
52
|
+
|
|
53
|
+
// Cache -- Redis provider with injection token 'cache'
|
|
54
|
+
CacheModule.forRootAsync([
|
|
55
|
+
{ name: 'cache', provider: CacheModule.PROVIDERS.REDIS },
|
|
56
|
+
]),
|
|
57
|
+
|
|
58
|
+
// Event bus -- global module, no forRoot needed
|
|
59
|
+
EventBusModule,
|
|
60
|
+
|
|
61
|
+
// Health checks
|
|
62
|
+
HealthModule.forRoot({
|
|
63
|
+
config: {
|
|
64
|
+
serviceName: 'my-service',
|
|
65
|
+
version: '1.0.0',
|
|
66
|
+
database: {
|
|
67
|
+
token: 'db',
|
|
68
|
+
collection: 'health',
|
|
69
|
+
timeoutMs: 3000,
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
}),
|
|
73
|
+
],
|
|
74
|
+
providers: [
|
|
75
|
+
// Interceptor chain (order matters -- first registered runs outermost)
|
|
76
|
+
{ provide: APP_INTERCEPTOR, useClass: LoggingInterceptor },
|
|
77
|
+
{ provide: APP_INTERCEPTOR, useClass: ResponseInterceptor },
|
|
78
|
+
{ provide: APP_INTERCEPTOR, useClass: ProblemDetailsInterceptor },
|
|
79
|
+
],
|
|
80
|
+
})
|
|
81
|
+
export class AppModule implements NestModule {
|
|
82
|
+
configure(consumer: MiddlewareConsumer) {
|
|
83
|
+
consumer
|
|
84
|
+
.apply(TraceIdMiddleware, RequestContextMiddleware)
|
|
85
|
+
.forRoutes('*');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
46
88
|
```
|
|
47
89
|
|
|
48
|
-
|
|
90
|
+
```typescript
|
|
91
|
+
// main.ts
|
|
92
|
+
import { NestFactory } from '@nestjs/core';
|
|
93
|
+
import { AppModule } from './app.module';
|
|
94
|
+
import {
|
|
95
|
+
createStandardValidationPipe,
|
|
96
|
+
setupSwagger,
|
|
97
|
+
setupCors,
|
|
98
|
+
} from 'stefaninigo';
|
|
49
99
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
$ pnpm run test
|
|
100
|
+
async function bootstrap() {
|
|
101
|
+
const app = await NestFactory.create(AppModule);
|
|
53
102
|
|
|
54
|
-
|
|
55
|
-
|
|
103
|
+
app.useGlobalPipes(createStandardValidationPipe());
|
|
104
|
+
app.setGlobalPrefix('api/v1/my-service');
|
|
105
|
+
setupCors(app);
|
|
106
|
+
setupSwagger(app, {
|
|
107
|
+
title: 'My Service',
|
|
108
|
+
description: 'API docs',
|
|
109
|
+
version: '1.0.0',
|
|
110
|
+
});
|
|
56
111
|
|
|
57
|
-
|
|
58
|
-
|
|
112
|
+
await app.listen(3000);
|
|
113
|
+
}
|
|
114
|
+
bootstrap();
|
|
59
115
|
```
|
|
60
116
|
|
|
61
|
-
##
|
|
117
|
+
## Modules
|
|
118
|
+
|
|
119
|
+
| Module | Pattern | Providers | Description |
|
|
120
|
+
|--------|---------|-----------|-------------|
|
|
121
|
+
| [`DatabaseModule`](libs/stefaninigo/src/database/ARCHITECTURE.md) | Strategy + DynamicModule | MongoDB, DynamoDB, PostgreSQL | Provider-agnostic data access layer |
|
|
122
|
+
| [`StorageModule`](libs/stefaninigo/src/storage/ARCHITECTURE.md) | Strategy + DynamicModule | S3 | File upload, download, presigned URLs |
|
|
123
|
+
| [`CacheModule`](libs/stefaninigo/src/cache/ARCHITECTURE.md) | Strategy + DynamicModule | Redis, Local (in-memory) | Key-value caching with TTL |
|
|
124
|
+
| [`MessagingModule`](libs/stefaninigo/src/messaging/ARCHITECTURE.md) | Strategy + DynamicModule | SNS, SQS | Pub/sub and point-to-point messaging |
|
|
125
|
+
| [`TransportModule`](libs/stefaninigo/src/transport/ARCHITECTURE.md) | Strategy + DynamicModule | AWS API Gateway WebSocket | Real-time bidirectional communication |
|
|
126
|
+
| [`EventBusModule`](libs/stefaninigo/src/events/ARCHITECTURE.md) | `@Global` module | log, SNS, SQS | Toggleable domain event publishing |
|
|
127
|
+
| [`HealthModule`](libs/stefaninigo/src/core/ARCHITECTURE.md) | DynamicModule | -- | K8s liveness, readiness, detailed health |
|
|
128
|
+
| [Core](libs/stefaninigo/src/core/ARCHITECTURE.md) | Interceptors + Middleware | -- | Tracing, logging, RFC 7807 errors, response format |
|
|
129
|
+
| [Config](libs/stefaninigo/src/config/ARCHITECTURE.md) | Service | -- | Centralized config resolver for all modules |
|
|
130
|
+
| [Geo](libs/stefaninigo/src/geo/ARCHITECTURE.md) | Pure utilities | -- | GeoJSON types, Haversine distance, bounding boxes |
|
|
131
|
+
|
|
132
|
+
## Architecture
|
|
133
|
+
|
|
134
|
+
### Strategy Pattern
|
|
135
|
+
|
|
136
|
+
Every infrastructure module (`DatabaseModule`, `StorageModule`, `CacheModule`, `MessagingModule`, `TransportModule`) follows the same pattern:
|
|
137
|
+
|
|
138
|
+
1. A **service interface** defines the contract (e.g. `DatabaseService`, `StorageService`, `CacheServiceInterface`).
|
|
139
|
+
2. **Concrete strategies** implement that interface per provider (e.g. `MongoDBService`, `DynamoDBService`, `PostgreService`).
|
|
140
|
+
3. The module exposes `forRootAsync(providers[])` which takes an array of `{ name, provider }` configs.
|
|
141
|
+
4. Each entry creates a named NestJS provider you inject with `@Inject('name')`.
|
|
142
|
+
|
|
143
|
+
```typescript
|
|
144
|
+
// Register two databases with different tokens
|
|
145
|
+
DatabaseModule.forRootAsync([
|
|
146
|
+
{ name: 'mainDb', provider: DatabaseModule.PROVIDERS.MONGODB },
|
|
147
|
+
{ name: 'analyticsDb', provider: DatabaseModule.PROVIDERS.MONGODB, configKey: 'analytics' },
|
|
148
|
+
{ name: 'dynamoDb', provider: DatabaseModule.PROVIDERS.DYNAMODB },
|
|
149
|
+
])
|
|
150
|
+
|
|
151
|
+
// Inject in a service
|
|
152
|
+
constructor(@Inject('mainDb') private readonly db: DatabaseService) {}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Interceptor Chain
|
|
156
|
+
|
|
157
|
+
Interceptors execute in registration order on the request path and in reverse on the response/error path:
|
|
158
|
+
|
|
159
|
+
```
|
|
160
|
+
Request Flow:
|
|
161
|
+
Client --> LoggingInterceptor --> ResponseInterceptor --> ProblemDetailsInterceptor --> Controller
|
|
162
|
+
|
|
163
|
+
Response Flow (success):
|
|
164
|
+
Controller --> ProblemDetailsInterceptor (pass-through) --> ResponseInterceptor (wraps: {success, message}) --> LoggingInterceptor (logs duration) --> Client
|
|
165
|
+
|
|
166
|
+
Error Flow:
|
|
167
|
+
Controller throws --> ProblemDetailsInterceptor (converts to RFC 7807) --> ResponseInterceptor (pass-through if ProblemDetails) --> LoggingInterceptor (logs error) --> Client
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
| Interceptor | Responsibility |
|
|
171
|
+
|-------------|---------------|
|
|
172
|
+
| `LoggingInterceptor` | Logs request entry/exit, duration, errors. Includes traceId, controller, handler. Emits structured metrics. |
|
|
173
|
+
| `ResponseInterceptor` | Wraps successful responses as `{ success: true, message: data }`. Wraps non-ProblemDetails errors as `{ success: false, error, message, statusCode }`. |
|
|
174
|
+
| `ProblemDetailsInterceptor` | Converts all errors to RFC 7807 ProblemDetails format. Sanitizes sensitive body fields. Adds `debugInfo` in development mode. |
|
|
175
|
+
|
|
176
|
+
### Distributed Tracing
|
|
177
|
+
|
|
178
|
+
Full request lifecycle tracing through `AsyncLocalStorage`:
|
|
179
|
+
|
|
180
|
+
```
|
|
181
|
+
Incoming Request
|
|
182
|
+
|
|
|
183
|
+
v
|
|
184
|
+
TraceIdMiddleware -- reads/generates X-Trace-ID, attaches to req & res header
|
|
185
|
+
|
|
|
186
|
+
v
|
|
187
|
+
RequestContextMiddleware -- creates RequestContext in AsyncLocalStorage (traceId, userId, language, startTime)
|
|
188
|
+
|
|
|
189
|
+
v
|
|
190
|
+
TracedLogger -- extends NestJS Logger, auto-prefixes [traceId] to every log line
|
|
191
|
+
|
|
|
192
|
+
v
|
|
193
|
+
LoggingInterceptor -- reads traceId for structured logging
|
|
194
|
+
|
|
|
195
|
+
v
|
|
196
|
+
ProblemDetailsInterceptor -- embeds traceId in error responses
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
```typescript
|
|
200
|
+
// Use TracedLogger in any service for automatic traceId injection
|
|
201
|
+
import { TracedLogger } from 'stefaninigo';
|
|
202
|
+
|
|
203
|
+
export class TicketService {
|
|
204
|
+
private readonly logger = new TracedLogger(TicketService.name);
|
|
205
|
+
|
|
206
|
+
findOne(id: string) {
|
|
207
|
+
this.logger.log(`Finding ticket ${id}`);
|
|
208
|
+
// Output: [a1b2c3d4-...] Finding ticket TK-001
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Or access context directly
|
|
213
|
+
import { getRequestContext, getTraceId } from 'stefaninigo';
|
|
214
|
+
|
|
215
|
+
const ctx = getRequestContext(); // { traceId, userId, language, startTime }
|
|
216
|
+
const traceId = getTraceId(); // shortcut
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### Event-Driven Architecture
|
|
220
|
+
|
|
221
|
+
`EventBusModule` is a `@Global` module with 3 publishing strategies, toggled via environment variables:
|
|
222
|
+
|
|
223
|
+
```
|
|
224
|
+
EventBusService.publish(event)
|
|
225
|
+
|
|
|
226
|
+
|-- strategy = 'log' --> Logger output (default, zero infra)
|
|
227
|
+
|-- strategy = 'sns' --> AWS SNS topic (fan-out)
|
|
228
|
+
|-- strategy = 'sqs' --> AWS SQS queue (point-to-point)
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
```typescript
|
|
232
|
+
import { EventBusService } from 'stefaninigo';
|
|
233
|
+
import { randomUUID } from 'crypto';
|
|
234
|
+
|
|
235
|
+
@Injectable()
|
|
236
|
+
export class TicketService {
|
|
237
|
+
constructor(private readonly eventBus: EventBusService) {}
|
|
238
|
+
|
|
239
|
+
async create(dto: CreateTicketDto) {
|
|
240
|
+
const ticket = await this.repo.create(dto);
|
|
241
|
+
|
|
242
|
+
await this.eventBus.publish({
|
|
243
|
+
eventId: randomUUID(),
|
|
244
|
+
eventType: 'ticket.created',
|
|
245
|
+
timestamp: new Date().toISOString(),
|
|
246
|
+
providerId: dto.providerId,
|
|
247
|
+
source: 'tickets-service',
|
|
248
|
+
data: { ticketId: ticket.id, clientId: dto.clientId },
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
return ticket;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
The library provides typed domain event interfaces for: tickets, routes, geofence, technicians, inventory, clients, locations, contacts, categories, and config. See `events/types/domain-events.ts`.
|
|
257
|
+
|
|
258
|
+
## Environment Variables
|
|
259
|
+
|
|
260
|
+
### Database
|
|
261
|
+
|
|
262
|
+
| Variable | Provider | Description |
|
|
263
|
+
|----------|----------|-------------|
|
|
264
|
+
| `database.mongodb.uri` | MongoDB | Connection URI |
|
|
265
|
+
| `database.mongodb.dbName` | MongoDB | Default database name |
|
|
266
|
+
| `database.mongodb.updateAllFields` | MongoDB | Replace vs merge on update |
|
|
267
|
+
| `database.mongodb.returnUpdatedDocument` | MongoDB | Return doc after update |
|
|
268
|
+
| `database.dynamodb.region` | DynamoDB | AWS region |
|
|
269
|
+
| `database.dynamodb.accessKeyId` | DynamoDB | AWS access key |
|
|
270
|
+
| `database.dynamodb.secretAccessKey` | DynamoDB | AWS secret key |
|
|
271
|
+
| `database.postgres.host` | PostgreSQL | Host |
|
|
272
|
+
| `database.postgres.port` | PostgreSQL | Port |
|
|
273
|
+
| `database.postgres.username` | PostgreSQL | Username |
|
|
274
|
+
| `database.postgres.password` | PostgreSQL | Password |
|
|
275
|
+
| `database.postgres.database` | PostgreSQL | Database name |
|
|
276
|
+
|
|
277
|
+
### Storage
|
|
278
|
+
|
|
279
|
+
| Variable | Provider | Description |
|
|
280
|
+
|----------|----------|-------------|
|
|
281
|
+
| `storage.s3.region` | S3 | AWS region |
|
|
282
|
+
| `storage.s3.accessKeyId` | S3 | AWS access key |
|
|
283
|
+
| `storage.s3.secretAccessKey` | S3 | AWS secret key |
|
|
284
|
+
| `storage.s3.bucket` | S3 | Bucket name |
|
|
285
|
+
| `storage.s3.containerPath` | S3 | Default key prefix |
|
|
286
|
+
| `storage.s3.expiresIn` | S3 | Presigned URL expiry in seconds (default: 3600) |
|
|
287
|
+
|
|
288
|
+
### Cache
|
|
289
|
+
|
|
290
|
+
| Variable | Provider | Description |
|
|
291
|
+
|----------|----------|-------------|
|
|
292
|
+
| `cache.redis.host` | Redis | Redis host |
|
|
293
|
+
| `cache.redis.port` | Redis | Redis port |
|
|
294
|
+
|
|
295
|
+
### Messaging
|
|
296
|
+
|
|
297
|
+
| Variable | Provider | Description |
|
|
298
|
+
|----------|----------|-------------|
|
|
299
|
+
| `message.sns.region` | SNS | AWS region |
|
|
300
|
+
| `message.sns.accessKeyId` | SNS | AWS access key |
|
|
301
|
+
| `message.sns.secretAccessKey` | SNS | AWS secret key |
|
|
302
|
+
| `message.sqs.region` | SQS | AWS region |
|
|
303
|
+
| `message.sqs.accessKeyId` | SQS | AWS access key |
|
|
304
|
+
| `message.sqs.secretAccessKey` | SQS | AWS secret key |
|
|
305
|
+
| `message.sqs.queueUrl` | SQS | Default queue URL |
|
|
306
|
+
| `message.sqs.MaxNumberOfMessages` | SQS | Max messages per poll (default: 10) |
|
|
307
|
+
| `message.sqs.WaitTimeSeconds` | SQS | Long poll wait (default: 20) |
|
|
308
|
+
| `message.sqs.pollInterval` | SQS | Poll interval ms (default: 10000) |
|
|
309
|
+
|
|
310
|
+
### Transport
|
|
311
|
+
|
|
312
|
+
| Variable | Provider | Description |
|
|
313
|
+
|----------|----------|-------------|
|
|
314
|
+
| `transport.aws_ws.domain` | AWS WebSocket | API Gateway WebSocket endpoint |
|
|
315
|
+
|
|
316
|
+
### EventBus
|
|
317
|
+
|
|
318
|
+
| Variable | Default | Description |
|
|
319
|
+
|----------|---------|-------------|
|
|
320
|
+
| `EVENTS_ENABLED` | `false` | Enable/disable event publishing |
|
|
321
|
+
| `EVENTS_STRATEGY` | `log` | Strategy: `log`, `sns`, or `sqs` |
|
|
322
|
+
| `EVENTS_SNS_TOPIC_ARN` | -- | SNS topic ARN (when strategy=sns) |
|
|
323
|
+
| `EVENTS_SQS_QUEUE_URL` | -- | SQS queue URL (when strategy=sqs) |
|
|
324
|
+
|
|
325
|
+
### Core
|
|
326
|
+
|
|
327
|
+
| Variable | Default | Description |
|
|
328
|
+
|----------|---------|-------------|
|
|
329
|
+
| `NODE_ENV` | `development` | Controls debug info in error responses |
|
|
330
|
+
| `CORS_ORIGINS` | `*` | Comma-separated allowed origins |
|
|
331
|
+
|
|
332
|
+
## Module Documentation
|
|
333
|
+
|
|
334
|
+
Each module has its own ARCHITECTURE.md with detailed API reference, usage examples, and configuration:
|
|
62
335
|
|
|
63
|
-
|
|
336
|
+
- [Core -- Interceptors, Middleware, Context, Logger, Errors, Health](libs/stefaninigo/src/core/ARCHITECTURE.md)
|
|
337
|
+
- [Database -- MongoDB, DynamoDB, PostgreSQL](libs/stefaninigo/src/database/ARCHITECTURE.md)
|
|
338
|
+
- [Storage -- S3 file operations](libs/stefaninigo/src/storage/ARCHITECTURE.md)
|
|
339
|
+
- [Cache -- Redis and Local providers](libs/stefaninigo/src/cache/ARCHITECTURE.md)
|
|
340
|
+
- [Messaging -- AWS SNS and SQS](libs/stefaninigo/src/messaging/ARCHITECTURE.md)
|
|
341
|
+
- [Events -- Domain event bus](libs/stefaninigo/src/events/ARCHITECTURE.md)
|
|
342
|
+
- [Transport -- WebSocket and HTTP](libs/stefaninigo/src/transport/ARCHITECTURE.md)
|
|
343
|
+
- [Config -- Centralized configuration resolver](libs/stefaninigo/src/config/ARCHITECTURE.md)
|
|
344
|
+
- [Geo -- GeoJSON, distance, bounding boxes](libs/stefaninigo/src/geo/ARCHITECTURE.md)
|
|
64
345
|
|
|
65
|
-
##
|
|
346
|
+
## Tech Stack
|
|
66
347
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
348
|
+
| Dependency | Version | Purpose |
|
|
349
|
+
|------------|---------|---------|
|
|
350
|
+
| NestJS | 11.x | Framework |
|
|
351
|
+
| TypeScript | 5.x | Language |
|
|
352
|
+
| MongoDB driver | 6.x | MongoDB provider |
|
|
353
|
+
| pg | 8.x | PostgreSQL provider |
|
|
354
|
+
| AWS SDK v3 | 3.x | S3, SNS, SQS, DynamoDB, API Gateway |
|
|
355
|
+
| ioredis | 5.x | Redis provider |
|
|
356
|
+
| axios | 1.x | HTTP transport |
|
|
357
|
+
| ws | 8.x | WebSocket transport |
|
|
70
358
|
|
|
71
359
|
## License
|
|
72
360
|
|
|
73
|
-
|
|
361
|
+
UNLICENSED -- Internal use only.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export interface CacheServiceInterface<T = any> {
|
|
2
|
-
set(key: string, value: T, ttl?: number): void
|
|
3
|
-
get(key: string): T | undefined
|
|
4
|
-
delete(key: string): void
|
|
5
|
-
clear(): void
|
|
2
|
+
set(key: string, value: T, ttl?: number): Promise<void>;
|
|
3
|
+
get(key: string): Promise<T | undefined>;
|
|
4
|
+
delete(key: string): Promise<void>;
|
|
5
|
+
clear(): Promise<void>;
|
|
6
6
|
}
|
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
import { DynamicModule } from '@nestjs/common';
|
|
2
2
|
import { CacheServiceInterface } from './cache-service.interface';
|
|
3
|
-
declare const cacheStrategies:
|
|
4
|
-
[key: string]: new (config: {
|
|
5
|
-
[key: string]: any;
|
|
6
|
-
}) => CacheServiceInterface;
|
|
7
|
-
};
|
|
3
|
+
declare const cacheStrategies: Record<string, new (config: Record<string, any>) => CacheServiceInterface>;
|
|
8
4
|
interface CacheProviderConfig {
|
|
9
5
|
name: string;
|
|
10
6
|
provider: keyof typeof cacheStrategies;
|
|
@@ -10,7 +10,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
10
10
|
exports.CacheModule = void 0;
|
|
11
11
|
const common_1 = require("@nestjs/common");
|
|
12
12
|
const redis_service_1 = require("./redis/redis.service");
|
|
13
|
-
const
|
|
13
|
+
const local_service_1 = require("./local/local.service");
|
|
14
14
|
const config_1 = require("../config");
|
|
15
15
|
const config_2 = require("@nestjs/config");
|
|
16
16
|
const PROVIDERS = {
|
|
@@ -19,7 +19,7 @@ const PROVIDERS = {
|
|
|
19
19
|
};
|
|
20
20
|
const cacheStrategies = {
|
|
21
21
|
[PROVIDERS.REDIS]: redis_service_1.RedisCacheService,
|
|
22
|
-
[PROVIDERS.LOCAL]:
|
|
22
|
+
[PROVIDERS.LOCAL]: local_service_1.LocalCacheService,
|
|
23
23
|
};
|
|
24
24
|
let CacheModule = CacheModule_1 = class CacheModule {
|
|
25
25
|
static forRootAsync(providers) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.module.js","sourceRoot":"","sources":["../../../../libs/stefaninigo/src/cache/cache.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAiE;AACjE,yDAA0D;AAE1D,
|
|
1
|
+
{"version":3,"file":"cache.module.js","sourceRoot":"","sources":["../../../../libs/stefaninigo/src/cache/cache.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAiE;AACjE,yDAA0D;AAE1D,yDAA0D;AAC1D,sCAAqD;AACrD,2CAA+C;AAE/C,MAAM,SAAS,GAAG;IAChB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;CACf,CAAC;AAEF,MAAM,eAAe,GAA+E;IAClG,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,iCAAiB;IACpC,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,iCAAiB;CACrC,CAAC;AAWK,IAAM,WAAW,mBAAjB,MAAM,WAAW;IAGtB,MAAM,CAAC,YAAY,CAAC,SAAgC;QAClD,MAAM,cAAc,GAAe,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;YACtE,MAAM,iBAAiB,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;YAEpD,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;YACzD,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,UAAU,EAAE,CAAC,aAAuC,EAAE,EAAE,CAAC,IAAI,iBAAiB,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBACvH,MAAM,EAAE,CAAC,iCAAwB,EAAE,sBAAa,CAAC;aAClD,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,MAAM,EAAE,aAAW;YACnB,SAAS,EAAE,cAAc;YACzB,OAAO,EAAE,cAAc;SACxB,CAAC;IACJ,CAAC;;AAvBU,kCAAW;AACf,qBAAS,GAAG,SAAS,AAAZ,CAAa;sBADlB,WAAW;IAJvB,IAAA,eAAM,EAAC;QACN,SAAS,EAAE,CAAC,iCAAwB,EAAE,sBAAa,CAAC;QACpD,OAAO,EAAE,CAAC,iCAAwB,EAAE,sBAAa,CAAC;KACnD,CAAC;GACW,WAAW,CAwBvB"}
|
|
@@ -2,11 +2,13 @@ import { CacheServiceInterface } from '../cache-service.interface';
|
|
|
2
2
|
export declare class LocalCacheService implements CacheServiceInterface {
|
|
3
3
|
private readonly config;
|
|
4
4
|
private cache;
|
|
5
|
+
private timers;
|
|
5
6
|
constructor(config: {
|
|
6
7
|
ttl?: number;
|
|
7
8
|
});
|
|
8
|
-
set(key: string, value: any, ttl?: number): void
|
|
9
|
-
get(key: string): any |
|
|
10
|
-
delete(key: string): void
|
|
11
|
-
clear(): void
|
|
9
|
+
set(key: string, value: any, ttl?: number): Promise<void>;
|
|
10
|
+
get(key: string): Promise<any | undefined>;
|
|
11
|
+
delete(key: string): Promise<void>;
|
|
12
|
+
clear(): Promise<void>;
|
|
13
|
+
destroy(): void;
|
|
12
14
|
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LocalCacheService = void 0;
|
|
4
|
+
class LocalCacheService {
|
|
5
|
+
constructor(config) {
|
|
6
|
+
this.config = config;
|
|
7
|
+
this.cache = new Map();
|
|
8
|
+
this.timers = new Map();
|
|
9
|
+
}
|
|
10
|
+
async set(key, value, ttl) {
|
|
11
|
+
const expirationTime = ttl || this.config.ttl || 86400000;
|
|
12
|
+
const existingTimer = this.timers.get(key);
|
|
13
|
+
if (existingTimer) {
|
|
14
|
+
clearTimeout(existingTimer);
|
|
15
|
+
}
|
|
16
|
+
this.cache.set(key, { value, expiresAt: Date.now() + expirationTime });
|
|
17
|
+
const timer = setTimeout(() => {
|
|
18
|
+
this.cache.delete(key);
|
|
19
|
+
this.timers.delete(key);
|
|
20
|
+
}, expirationTime);
|
|
21
|
+
if (timer.unref) {
|
|
22
|
+
timer.unref();
|
|
23
|
+
}
|
|
24
|
+
this.timers.set(key, timer);
|
|
25
|
+
}
|
|
26
|
+
async get(key) {
|
|
27
|
+
const cached = this.cache.get(key);
|
|
28
|
+
if (!cached || cached.expiresAt < Date.now()) {
|
|
29
|
+
this.cache.delete(key);
|
|
30
|
+
const timer = this.timers.get(key);
|
|
31
|
+
if (timer) {
|
|
32
|
+
clearTimeout(timer);
|
|
33
|
+
this.timers.delete(key);
|
|
34
|
+
}
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
return cached.value;
|
|
38
|
+
}
|
|
39
|
+
async delete(key) {
|
|
40
|
+
this.cache.delete(key);
|
|
41
|
+
const timer = this.timers.get(key);
|
|
42
|
+
if (timer) {
|
|
43
|
+
clearTimeout(timer);
|
|
44
|
+
this.timers.delete(key);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
async clear() {
|
|
48
|
+
for (const timer of this.timers.values()) {
|
|
49
|
+
clearTimeout(timer);
|
|
50
|
+
}
|
|
51
|
+
this.timers.clear();
|
|
52
|
+
this.cache.clear();
|
|
53
|
+
}
|
|
54
|
+
destroy() {
|
|
55
|
+
this.clear();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
exports.LocalCacheService = LocalCacheService;
|
|
59
|
+
//# sourceMappingURL=local.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local.service.js","sourceRoot":"","sources":["../../../../../libs/stefaninigo/src/cache/local/local.service.ts"],"names":[],"mappings":";;;AAEA,MAAa,iBAAiB;IAI5B,YAA6B,MAAwB;QAAxB,WAAM,GAAN,MAAM,CAAkB;QAH7C,UAAK,GAAqB,IAAI,GAAG,EAAE,CAAC;QACpC,WAAM,GAAgC,IAAI,GAAG,EAAE,CAAC;IAEA,CAAC;IAEzD,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAU,EAAE,GAAY;QAC7C,MAAM,cAAc,GAAG,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,QAAQ,CAAC;QAG1D,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,aAAa,EAAE,CAAC;YAClB,YAAY,CAAC,aAAa,CAAC,CAAC;QAC9B,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,cAAc,EAAE,CAAC,CAAC;QAEvE,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC,EAAE,cAAc,CAAC,CAAC;QAGnB,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAChB,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,KAAK,EAAE,CAAC;gBACV,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,KAAK,EAAE,CAAC;YACV,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAOD,OAAO;QACL,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;CACF;AArED,8CAqEC"}
|
|
@@ -1,20 +1,74 @@
|
|
|
1
1
|
import { ConfigService } from '@nestjs/config';
|
|
2
|
+
export interface MongoDBProviderConfig {
|
|
3
|
+
uri: string;
|
|
4
|
+
dbName: string;
|
|
5
|
+
updateAllFields?: boolean;
|
|
6
|
+
returnUpdatedDocument?: boolean;
|
|
7
|
+
maxPoolSize?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface DynamoDBProviderConfig {
|
|
10
|
+
region: string;
|
|
11
|
+
accessKeyId: string;
|
|
12
|
+
secretAccessKey: string;
|
|
13
|
+
updateAllFields?: boolean;
|
|
14
|
+
returnUpdatedDocument?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface PostgresProviderConfig {
|
|
17
|
+
host: string;
|
|
18
|
+
port: number;
|
|
19
|
+
username: string;
|
|
20
|
+
password: string;
|
|
21
|
+
database: string;
|
|
22
|
+
synchronize?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface S3ProviderConfig {
|
|
25
|
+
region: string;
|
|
26
|
+
accessKeyId: string;
|
|
27
|
+
secretAccessKey: string;
|
|
28
|
+
bucket: string;
|
|
29
|
+
containerPath: string;
|
|
30
|
+
expiresIn?: number;
|
|
31
|
+
}
|
|
32
|
+
export interface RedisProviderConfig {
|
|
33
|
+
host: string;
|
|
34
|
+
port: number;
|
|
35
|
+
password?: string;
|
|
36
|
+
db?: number;
|
|
37
|
+
tls?: boolean;
|
|
38
|
+
}
|
|
39
|
+
export interface SQSProviderConfig {
|
|
40
|
+
region: string;
|
|
41
|
+
queueUrl: string;
|
|
42
|
+
accessKeyId: string;
|
|
43
|
+
secretAccessKey: string;
|
|
44
|
+
MaxNumberOfMessages?: number;
|
|
45
|
+
WaitTimeSeconds?: number;
|
|
46
|
+
pollInterval?: number;
|
|
47
|
+
}
|
|
48
|
+
export interface SNSProviderConfig {
|
|
49
|
+
region: string;
|
|
50
|
+
accessKeyId: string;
|
|
51
|
+
secretAccessKey: string;
|
|
52
|
+
}
|
|
53
|
+
export interface WsProviderConfig {
|
|
54
|
+
domain: string;
|
|
55
|
+
}
|
|
2
56
|
export declare class StefaniniGoConfigService {
|
|
3
57
|
private configService;
|
|
4
58
|
constructor(configService: ConfigService);
|
|
5
59
|
storage: {
|
|
6
|
-
getConfig: (provider:
|
|
60
|
+
getConfig: (provider: string) => S3ProviderConfig | undefined;
|
|
7
61
|
};
|
|
8
62
|
database: {
|
|
9
|
-
getConfig: (provider: string, configKey?: string) =>
|
|
63
|
+
getConfig: (provider: string, configKey?: string) => MongoDBProviderConfig | DynamoDBProviderConfig | PostgresProviderConfig | undefined;
|
|
10
64
|
};
|
|
11
65
|
cache: {
|
|
12
|
-
getConfig: (provider:
|
|
66
|
+
getConfig: (provider: string) => RedisProviderConfig | undefined;
|
|
13
67
|
};
|
|
14
|
-
|
|
15
|
-
getConfig: (provider:
|
|
68
|
+
messaging: {
|
|
69
|
+
getConfig: (provider: string) => SQSProviderConfig | SNSProviderConfig | undefined;
|
|
16
70
|
};
|
|
17
71
|
transport: {
|
|
18
|
-
getConfig: (provider:
|
|
72
|
+
getConfig: (provider: string) => WsProviderConfig | Record<string, never> | undefined;
|
|
19
73
|
};
|
|
20
74
|
}
|