From 7c3fdd2fda0b7303f70ea580bdb09e97805b7df3 Mon Sep 17 00:00:00 2001 From: harshithnrao Date: Wed, 19 Mar 2025 17:03:51 +0530 Subject: [PATCH] redis for cache --- package-lock.json | 183 +++++++++++++++++++++++++-- package.json | 5 +- src/app-config/app-config.service.ts | 8 ++ src/app-config/config.json | 5 + src/app-config/config.local.json | 5 + src/app.module.ts | 4 +- src/app.service.ts | 15 ++- src/common/Utility.ts | 1 + src/common/common.service.ts | 2 + src/main.ts | 1 + src/redis/redis.controller.ts | 19 +++ src/redis/redis.module.ts | 11 ++ src/redis/redis.provider.ts | 24 ++++ src/redis/redis.service.ts | 17 +++ 14 files changed, 283 insertions(+), 17 deletions(-) create mode 100644 src/redis/redis.controller.ts create mode 100644 src/redis/redis.module.ts create mode 100644 src/redis/redis.provider.ts create mode 100644 src/redis/redis.service.ts diff --git a/package-lock.json b/package-lock.json index 5b8cc98..e4b67e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,9 @@ "license": "UNLICENSED", "dependencies": { "@nestjs/axios": "^4.0.0", - "@nestjs/common": "^10.0.0", + "@nestjs/common": "^10.4.15", "@nestjs/config": "^3.3.0", - "@nestjs/core": "^10.0.0", + "@nestjs/core": "^10.4.15", "@nestjs/jwt": "^11.0.0", "@nestjs/passport": "^11.0.5", "@nestjs/platform-express": "^10.0.0", @@ -20,6 +20,7 @@ "@nestjs/typeorm": "^10.0.1", "dotenv": "^16.3.1", "handlebars": "^4.7.8", + "ioredis": "^5.6.0", "moment": "^2.30.1", "nodemailer": "^6.9.9", "otp-generator": "^4.0.1", @@ -965,6 +966,12 @@ "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, + "node_modules/@ioredis/commands": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==", + "license": "MIT" + }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -1760,12 +1767,13 @@ } }, "node_modules/@nestjs/common": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.3.0.tgz", - "integrity": "sha512-DGv34UHsZBxCM3H5QGE2XE/+oLJzz5+714JQjBhjD9VccFlQs3LRxo/epso4l7nJIiNlZkPyIUC8WzfU/5RTsQ==", + "version": "10.4.15", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.4.15.tgz", + "integrity": "sha512-vaLg1ZgwhG29BuLDxPA9OAcIlgqzp9/N8iG0wGapyUNTf4IY4O6zAHgN6QalwLhFxq7nOI021vdRojR1oF3bqg==", + "license": "MIT", "dependencies": { "iterare": "1.2.1", - "tslib": "2.6.2", + "tslib": "2.8.1", "uid": "2.0.2" }, "funding": { @@ -1775,7 +1783,7 @@ "peerDependencies": { "class-transformer": "*", "class-validator": "*", - "reflect-metadata": "^0.1.12", + "reflect-metadata": "^0.1.12 || ^0.2.0", "rxjs": "^7.1.0" }, "peerDependenciesMeta": { @@ -1787,6 +1795,12 @@ } } }, + "node_modules/@nestjs/common/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@nestjs/config": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/@nestjs/config/-/config-3.3.0.tgz", @@ -3866,6 +3880,15 @@ "node": ">=6" } }, + "node_modules/cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -4206,6 +4229,15 @@ "node": ">=0.4.0" } }, + "node_modules/denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.10" + } + }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -5775,6 +5807,30 @@ "node": ">=10.13.0" } }, + "node_modules/ioredis": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.6.0.tgz", + "integrity": "sha512-tBZlIIWbndeWBWCXWZiqtOF/yxf6yZX3tAlTJ7nfo5jhd6dctNxF7QnYlZLZ1a0o0pDoen7CgZqO+zjNaFbJAg==", + "license": "MIT", + "dependencies": { + "@ioredis/commands": "^1.1.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ioredis" + } + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -6892,12 +6948,24 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", + "license": "MIT" + }, "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", "license": "MIT" }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "license": "MIT" + }, "node_modules/lodash.isboolean": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", @@ -8218,6 +8286,27 @@ "node": ">= 10.13.0" } }, + "node_modules/redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "license": "MIT", + "dependencies": { + "redis-errors": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/reflect-metadata": { "version": "0.1.14", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", @@ -8944,6 +9033,12 @@ "node": ">=8" } }, + "node_modules/standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", + "license": "MIT" + }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -11085,6 +11180,11 @@ "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, + "@ioredis/commands": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", + "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" + }, "@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -11672,13 +11772,20 @@ } }, "@nestjs/common": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.3.0.tgz", - "integrity": "sha512-DGv34UHsZBxCM3H5QGE2XE/+oLJzz5+714JQjBhjD9VccFlQs3LRxo/epso4l7nJIiNlZkPyIUC8WzfU/5RTsQ==", + "version": "10.4.15", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.4.15.tgz", + "integrity": "sha512-vaLg1ZgwhG29BuLDxPA9OAcIlgqzp9/N8iG0wGapyUNTf4IY4O6zAHgN6QalwLhFxq7nOI021vdRojR1oF3bqg==", "requires": { "iterare": "1.2.1", - "tslib": "2.6.2", + "tslib": "2.8.1", "uid": "2.0.2" + }, + "dependencies": { + "tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + } } }, "@nestjs/config": { @@ -13199,6 +13306,11 @@ "shallow-clone": "^3.0.0" } }, + "cluster-key-slot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", + "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -13437,6 +13549,11 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" }, + "denque": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" + }, "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -14556,6 +14673,22 @@ "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true }, + "ioredis": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.6.0.tgz", + "integrity": "sha512-tBZlIIWbndeWBWCXWZiqtOF/yxf6yZX3tAlTJ7nfo5jhd6dctNxF7QnYlZLZ1a0o0pDoen7CgZqO+zjNaFbJAg==", + "requires": { + "@ioredis/commands": "^1.1.1", + "cluster-key-slot": "^1.1.0", + "debug": "^4.3.4", + "denque": "^2.1.0", + "lodash.defaults": "^4.2.0", + "lodash.isarguments": "^3.1.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0", + "standard-as-callback": "^2.1.0" + } + }, "ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -15410,11 +15543,21 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" + }, "lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" + }, "lodash.isboolean": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", @@ -16362,6 +16505,19 @@ "resolve": "^1.20.0" } }, + "redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==" + }, + "redis-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", + "requires": { + "redis-errors": "^1.0.0" + } + }, "reflect-metadata": { "version": "0.1.14", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", @@ -16869,6 +17025,11 @@ } } }, + "standard-as-callback": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", + "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" + }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", diff --git a/package.json b/package.json index a967785..395f130 100644 --- a/package.json +++ b/package.json @@ -24,9 +24,9 @@ }, "dependencies": { "@nestjs/axios": "^4.0.0", - "@nestjs/common": "^10.0.0", + "@nestjs/common": "^10.4.15", "@nestjs/config": "^3.3.0", - "@nestjs/core": "^10.0.0", + "@nestjs/core": "^10.4.15", "@nestjs/jwt": "^11.0.0", "@nestjs/passport": "^11.0.5", "@nestjs/platform-express": "^10.0.0", @@ -34,6 +34,7 @@ "@nestjs/typeorm": "^10.0.1", "dotenv": "^16.3.1", "handlebars": "^4.7.8", + "ioredis": "^5.6.0", "moment": "^2.30.1", "nodemailer": "^6.9.9", "otp-generator": "^4.0.1", diff --git a/src/app-config/app-config.service.ts b/src/app-config/app-config.service.ts index 6a38469..aee2120 100644 --- a/src/app-config/app-config.service.ts +++ b/src/app-config/app-config.service.ts @@ -49,4 +49,12 @@ export class AppConfigService { getVapidConfig(){ return configMaster[this.defaultEnv].vapidConfig; } + + getRedisConfig(){ + return configMaster[this.defaultEnv].redisConfig; + } + + getSwaggerConfig(){ + return configMaster[this.defaultEnv].swaggerConfig; + } } diff --git a/src/app-config/config.json b/src/app-config/config.json index 6df3f03..acc632d 100644 --- a/src/app-config/config.json +++ b/src/app-config/config.json @@ -55,6 +55,11 @@ "email": "mailto:example@domain.com", "publicKey": "BPcIQx6jQlD0m2WA5qzXnHtKtsBhvIf_aRf6foXx3ESiw2Tks6b8tVzzX3hHwerGtWy4togFEiJtk5X-Sq36uVQ", "privateKey": "v-pRrypniFnPn6UOyDNIKatxoHCI6aqsXCM86L7aTfY" + }, + "redisConfig":{ + "host":"localhost", + "port":6379, + "db":0 } } } \ No newline at end of file diff --git a/src/app-config/config.local.json b/src/app-config/config.local.json index 6df3f03..acc632d 100644 --- a/src/app-config/config.local.json +++ b/src/app-config/config.local.json @@ -55,6 +55,11 @@ "email": "mailto:example@domain.com", "publicKey": "BPcIQx6jQlD0m2WA5qzXnHtKtsBhvIf_aRf6foXx3ESiw2Tks6b8tVzzX3hHwerGtWy4togFEiJtk5X-Sq36uVQ", "privateKey": "v-pRrypniFnPn6UOyDNIKatxoHCI6aqsXCM86L7aTfY" + }, + "redisConfig":{ + "host":"localhost", + "port":6379, + "db":0 } } } \ No newline at end of file diff --git a/src/app.module.ts b/src/app.module.ts index d3abbef..9d14597 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -21,6 +21,7 @@ import { TicketModule } from './ticket/ticket.module'; import { TicketPricingModule } from './ticketPricing/ticketPricing.module'; import { TimeSlotModule } from './timeSlot/timeSlot.module'; import { PushSubscriptionModule } from './push-subscription/push-subscription.module'; +import { RedisModule } from './redis/redis.module'; @Module({ imports: [ @@ -40,7 +41,8 @@ import { PushSubscriptionModule } from './push-subscription/push-subscription.mo TicketPricingModule, TimeSlotModule, UserModule, - PushSubscriptionModule + PushSubscriptionModule, + RedisModule ], controllers: [AppController, AppConfigController], diff --git a/src/app.service.ts b/src/app.service.ts index 439b552..08142f6 100644 --- a/src/app.service.ts +++ b/src/app.service.ts @@ -45,9 +45,18 @@ export class AppService { const jwtConfig = this.configService.getJwtConfig(); this.commonService.jwtConfig = jwtConfig; Utility.jwtConfig = jwtConfig; - // const urlConfig = this.configService.getUrlConfig(); - // this.commonService.urlConfig = urlConfig; - // Utility.urlConfig = urlConfig; + + const vapidConfig = this.configService.getVapidConfig(); + this.commonService.vapidConfig = vapidConfig; + Utility.vapidConfig = vapidConfig; + + const swaggerConfig = this.configService.getSwaggerConfig(); + this.commonService.swaggerConfig = swaggerConfig; + Utility.swaggerConfig = swaggerConfig; + + const redisConfig = this.configService.getRedisConfig(); + this.commonService.redisConfig = redisConfig; + Utility.redisConfig = redisConfig; } getModels() { diff --git a/src/common/Utility.ts b/src/common/Utility.ts index f27ce8b..7748da7 100644 --- a/src/common/Utility.ts +++ b/src/common/Utility.ts @@ -23,4 +23,5 @@ export class Utility { }; static urlConfig:any; static vapidConfig: any; + static redisConfig: any; } \ No newline at end of file diff --git a/src/common/common.service.ts b/src/common/common.service.ts index a38186e..6c73b19 100644 --- a/src/common/common.service.ts +++ b/src/common/common.service.ts @@ -10,6 +10,8 @@ export class CommonService { urlConfig:any; jwtConfig:any; vapidConfig:any; + redisConfig:any; + swaggerConfig:any; constructor() { } diff --git a/src/main.ts b/src/main.ts index 669de3c..9bbea93 100644 --- a/src/main.ts +++ b/src/main.ts @@ -11,6 +11,7 @@ async function bootstrap() { Utility.fileConfig = configMaster.local.fileConfig; Utility.swaggerConfig = configMaster.local.swaggerConfig; Utility.vapidConfig = configMaster.local.vapidConfig; + Utility.redisConfig = configMaster.local.redisConfig; const app = await NestFactory.create(AppModule, { cors: true }); diff --git a/src/redis/redis.controller.ts b/src/redis/redis.controller.ts new file mode 100644 index 0000000..d40308d --- /dev/null +++ b/src/redis/redis.controller.ts @@ -0,0 +1,19 @@ +import { Controller, Get, Param, Post, Body } from '@nestjs/common'; +import { RedisService } from './redis.service'; + +@Controller('redis') +export class RedisController { + constructor(private readonly redisService: RedisService) { } + + @Post('set') + async setValue(@Body() body: { key: string; value: string }) { + await this.redisService.set(body.key, body.value); + return { message: 'Value set in Redis' }; + } + + @Get('get/:key') + async getValue(@Param('key') key: string) { + const value = await this.redisService.get(key); + return { value }; + } +} diff --git a/src/redis/redis.module.ts b/src/redis/redis.module.ts new file mode 100644 index 0000000..4a10c52 --- /dev/null +++ b/src/redis/redis.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { RedisProvider } from './redis.provider'; +import { RedisController } from './redis.controller'; +import { RedisService } from './redis.service'; + +@Module({ + controllers: [RedisController], + providers: [RedisService, RedisProvider], + exports: [RedisProvider], +}) +export class RedisModule { } diff --git a/src/redis/redis.provider.ts b/src/redis/redis.provider.ts new file mode 100644 index 0000000..0780063 --- /dev/null +++ b/src/redis/redis.provider.ts @@ -0,0 +1,24 @@ +import { Injectable, Global } from '@nestjs/common'; +import Redis from 'ioredis'; +import { Utility } from 'src/common/Utility'; + +@Global() +@Injectable() +export class RedisProvider { + private redisClient: Redis; + + constructor() { + this.redisClient = new Redis({ + host: Utility.redisConfig.host, + port: Utility.redisConfig.port, + db: Utility.redisConfig.db, + }); + + this.redisClient.on('connect', () => console.log('connected to redis')); + this.redisClient.on('error', (err) => console.error('error:', err)); + } + + get client() { + return this.redisClient; + } +} diff --git a/src/redis/redis.service.ts b/src/redis/redis.service.ts new file mode 100644 index 0000000..cd60b3a --- /dev/null +++ b/src/redis/redis.service.ts @@ -0,0 +1,17 @@ +import { Injectable } from '@nestjs/common'; +import { RedisProvider } from './redis.provider'; + +@Injectable() +export class RedisService { + constructor(private readonly redisProvider: RedisProvider) {} + + async set(key: string, value: string): Promise { + const client = this.redisProvider.client; + await client.set(key, value, ); + } + + async get(key: string): Promise { + const client = this.redisProvider.client; + return client.get(key); + } +}