diff --git a/package-lock.json b/package-lock.json index 17c0447..b92a6c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "@nestjs/config": "^0.6.2", "@nestjs/core": "^7.5.1", "@nestjs/graphql": "^7.9.8", + "@nestjs/microservices": "^7.6.15", "@nestjs/platform-express": "^7.5.1", "@nestjs/typeorm": "^7.1.5", "@neuralegion/class-sanitizer": "^0.3.2", @@ -32,6 +33,7 @@ "observable-to-async-generator": "^1.0.1-rc", "pg": "^8.5.1", "ramda": "^0.27.1", + "redis": "^3.0.2", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^6.6.3", @@ -48,6 +50,7 @@ "@types/jest": "^26.0.15", "@types/js-yaml": "^4.0.0", "@types/node": "^14.14.6", + "@types/redis": "^2.8.28", "@types/supertest": "^2.0.10", "@typescript-eslint/eslint-plugin": "^4.6.1", "@typescript-eslint/parser": "^4.6.1", @@ -2719,6 +2722,64 @@ "reflect-metadata": "^0.1.12" } }, + "node_modules/@nestjs/microservices": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@nestjs/microservices/-/microservices-7.6.15.tgz", + "integrity": "sha512-WwjNvnudta+YKQOVnzkJGAggME1a8LsnoBZDzorYi4kCFs+U53viRsoidQUBR4oDYIu3IKkJmB9OCStHrK4PTw==", + "dependencies": { + "iterare": "1.2.1", + "json-socket": "0.3.0", + "tslib": "2.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^7.0.0", + "@nestjs/core": "^7.0.0", + "@nestjs/websockets": "^7.0.0", + "amqp-connection-manager": "*", + "amqplib": "*", + "cache-manager": "*", + "grpc": "*", + "kafkajs": "*", + "mqtt": "*", + "nats": "*", + "redis": "*", + "reflect-metadata": "^0.1.12", + "rxjs": "^6.0.0" + }, + "peerDependenciesMeta": { + "@nestjs/websockets": { + "optional": true + }, + "amqp-connection-manager": { + "optional": true + }, + "amqplib": { + "optional": true + }, + "cache-manager": { + "optional": true + }, + "grpc": { + "optional": true + }, + "kafkajs": { + "optional": true + }, + "mqtt": { + "optional": true + }, + "nats": { + "optional": true + }, + "redis": { + "optional": true + } + } + }, "node_modules/@nestjs/platform-express": { "version": "7.6.15", "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-7.6.15.tgz", @@ -3426,6 +3487,15 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" }, + "node_modules/@types/redis": { + "version": "2.8.28", + "resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.28.tgz", + "integrity": "sha512-8l2gr2OQ969ypa7hFOeKqtFoY70XkHxISV0pAwmQ2nm6CSPb1brmTmqJCGGrekCo+pAZyWlNXr+Kvo6L/1wijA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/serve-static": { "version": "1.13.9", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", @@ -10000,6 +10070,11 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "node_modules/json-socket": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/json-socket/-/json-socket-0.3.0.tgz", + "integrity": "sha512-jc8ZbUnYIWdxERFWQKVgwSLkGSe+kyzvmYxwNaRgx/c8NNyuHes4UHnPM3LUrAFXUx1BhNJ94n1h/KCRlbvV0g==" + }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -12033,6 +12108,24 @@ "node": ">= 0.10" } }, + "node_modules/redis": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/redis/-/redis-3.0.2.tgz", + "integrity": "sha512-PNhLCrjU6vKVuMOyFu7oSP296mwBkcE6lrAjruBYG5LgdSqtRBoVQIylrMyVZD/lkF24RSNNatzvYag6HRBHjQ==", + "dependencies": { + "denque": "^1.4.1", + "redis-commands": "^1.5.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-redis" + } + }, "node_modules/redis-commands": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", @@ -17790,6 +17883,16 @@ "integrity": "sha512-TVtd/aTb7EqPhVczdeuvzF9dY0fyE3ivvCstc2eO+AkNqrfzSG1kXYYiUUznKjd0qDa8g2TmPSmHUQ21AXsV1Q==", "requires": {} }, + "@nestjs/microservices": { + "version": "7.6.15", + "resolved": "https://registry.npmjs.org/@nestjs/microservices/-/microservices-7.6.15.tgz", + "integrity": "sha512-WwjNvnudta+YKQOVnzkJGAggME1a8LsnoBZDzorYi4kCFs+U53viRsoidQUBR4oDYIu3IKkJmB9OCStHrK4PTw==", + "requires": { + "iterare": "1.2.1", + "json-socket": "0.3.0", + "tslib": "2.1.0" + } + }, "@nestjs/platform-express": { "version": "7.6.15", "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-7.6.15.tgz", @@ -18406,6 +18509,15 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" }, + "@types/redis": { + "version": "2.8.28", + "resolved": "https://registry.npmjs.org/@types/redis/-/redis-2.8.28.tgz", + "integrity": "sha512-8l2gr2OQ969ypa7hFOeKqtFoY70XkHxISV0pAwmQ2nm6CSPb1brmTmqJCGGrekCo+pAZyWlNXr+Kvo6L/1wijA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/serve-static": { "version": "1.13.9", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.9.tgz", @@ -23463,6 +23575,11 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, + "json-socket": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/json-socket/-/json-socket-0.3.0.tgz", + "integrity": "sha512-jc8ZbUnYIWdxERFWQKVgwSLkGSe+kyzvmYxwNaRgx/c8NNyuHes4UHnPM3LUrAFXUx1BhNJ94n1h/KCRlbvV0g==" + }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -25034,6 +25151,17 @@ "resolve": "^1.1.6" } }, + "redis": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/redis/-/redis-3.0.2.tgz", + "integrity": "sha512-PNhLCrjU6vKVuMOyFu7oSP296mwBkcE6lrAjruBYG5LgdSqtRBoVQIylrMyVZD/lkF24RSNNatzvYag6HRBHjQ==", + "requires": { + "denque": "^1.4.1", + "redis-commands": "^1.5.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0" + } + }, "redis-commands": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz", diff --git a/package.json b/package.json index a826c32..9d68e27 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "@nestjs/config": "^0.6.2", "@nestjs/core": "^7.5.1", "@nestjs/graphql": "^7.9.8", + "@nestjs/microservices": "^7.6.15", "@nestjs/platform-express": "^7.5.1", "@nestjs/typeorm": "^7.1.5", "@neuralegion/class-sanitizer": "^0.3.2", @@ -45,6 +46,7 @@ "observable-to-async-generator": "^1.0.1-rc", "pg": "^8.5.1", "ramda": "^0.27.1", + "redis": "^3.0.2", "reflect-metadata": "^0.1.13", "rimraf": "^3.0.2", "rxjs": "^6.6.3", @@ -61,6 +63,7 @@ "@types/jest": "^26.0.15", "@types/js-yaml": "^4.0.0", "@types/node": "^14.14.6", + "@types/redis": "^2.8.28", "@types/supertest": "^2.0.10", "@typescript-eslint/eslint-plugin": "^4.6.1", "@typescript-eslint/parser": "^4.6.1", diff --git a/src/main.ts b/src/main.ts index ed4d24d..bb9b5d1 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,6 +1,7 @@ import { ValidationPipe } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { NestFactory } from '@nestjs/core'; +import { Transport } from '@nestjs/microservices'; import { AppModule } from './app.module'; import { HttpExceptionFilter } from './commons/filters/all.exception-filter'; import { SanitizePipe } from './commons/pipes/sanitize.pipe'; @@ -8,6 +9,19 @@ import { SanitizePipe } from './commons/pipes/sanitize.pipe'; async function bootstrap() { const app = await NestFactory.create(AppModule, { bodyParser: false }); const configService = app.get(ConfigService); + + app.connectMicroservice({ + transport: Transport.REDIS, + options: { + retryAttempts: 5, + retryDelay: 3000, + host: configService.get('db.redis.host', 'localhost'), + port: configService.get('db.redis.port', 6379), + password: configService.get('db.redis.password', ''), + keyPrefix: configService.get('db.redis.prefix', 'fennec') + ':', + }, + }); + app.useGlobalPipes(new SanitizePipe()); app.useGlobalPipes( new ValidationPipe({