diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 86c3f74..2de5846 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -17,8 +17,10 @@ "customizations": { "vscode": { "extensions": [ + "ms-azuretools.vscode-docker", "humao.rest-client", - "esbenp.prettier-vscode" + "esbenp.prettier-vscode", + "prisma.prisma" ] } }, diff --git a/.docker/mysql/init.sql b/.docker/mysql/init.sql new file mode 100644 index 0000000..fbe953f --- /dev/null +++ b/.docker/mysql/init.sql @@ -0,0 +1,2 @@ +CREATE DATABASE IF NOT EXISTS `orders` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci +CREATE DATABASE IF NOT EXISTS `payments` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci \ No newline at end of file diff --git a/.gitignore b/.gitignore index 22f55ad..cd8c379 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,6 @@ lerna-debug.log* !.vscode/settings.json !.vscode/tasks.json !.vscode/launch.json -!.vscode/extensions.json \ No newline at end of file +!.vscode/extensions.json + +.history/ \ No newline at end of file diff --git a/README.md b/README.md index 00a13b1..34b4596 100644 --- a/README.md +++ b/README.md @@ -1,73 +1,15 @@ -

- Nest Logo -

+## Microserviço com Nestjs + Kafka -[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456 -[circleci-url]: https://circleci.com/gh/nestjs/nest +### Fluxo -

A progressive Node.js framework for building efficient and scalable server-side applications.

-

-NPM Version -Package License -NPM Downloads -CircleCI -Coverage -Discord -Backers on Open Collective -Sponsors on Open Collective - - Support us - -

- +1. Orders publica mensagem no Kafka -## Description +2. Payments consome mensagem do Kafka (pagamento realizado) -[Nest](https://github.com/nestjs/nest) framework TypeScript starter repository. +3. Payments processou o pagamento -## Installation +4. Payments publicou mensagem no Kafka -```bash -$ npm install -``` +5. Orders consome mensagem no Kafka (pagamento realizado) -## Running the app - -```bash -# development -$ npm run start - -# watch mode -$ npm run start:dev - -# production mode -$ npm run start:prod -``` - -## Test - -```bash -# unit tests -$ npm run test - -# e2e tests -$ npm run test:e2e - -# test coverage -$ npm run test:cov -``` - -## Support - -Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support). - -## Stay in touch - -- Author - [Kamil Myśliwiec](https://kamilmysliwiec.com) -- Website - [https://nestjs.com](https://nestjs.com/) -- Twitter - [@nestframework](https://twitter.com/nestframework) - -## License - -Nest is [MIT licensed](LICENSE). +6. Orders altera o status do pedido \ No newline at end of file diff --git a/api.http b/api.http index 6f3dd47..d7a523c 100644 --- a/api.http +++ b/api.http @@ -1 +1,13 @@ -GET http://localhost:3000/ \ No newline at end of file +GET http://localhost:3000/orders + +### +POST http://localhost:3000/orders +Content-Type: application/json + +{ + "client_id": 1, + "price": 100 +} + +### +GET http://localhost:3001/payments \ No newline at end of file diff --git a/apps/orders/.gitignore b/apps/orders/.gitignore new file mode 100644 index 0000000..11ddd8d --- /dev/null +++ b/apps/orders/.gitignore @@ -0,0 +1,3 @@ +node_modules +# Keep environment variables out of version control +.env diff --git a/apps/orders/prisma/migrations/20231002114824_init/migration.sql b/apps/orders/prisma/migrations/20231002114824_init/migration.sql new file mode 100644 index 0000000..bb34193 --- /dev/null +++ b/apps/orders/prisma/migrations/20231002114824_init/migration.sql @@ -0,0 +1,10 @@ +-- CreateTable +CREATE TABLE `Order` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `price` INTEGER NOT NULL, + `client_id` INTEGER NOT NULL, + `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `status` ENUM('PENDING', 'PAYED', 'CANCELLED') NOT NULL, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; diff --git a/apps/orders/prisma/migrations/migration_lock.toml b/apps/orders/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..e5a788a --- /dev/null +++ b/apps/orders/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "mysql" \ No newline at end of file diff --git a/apps/orders/prisma/schema.prisma b/apps/orders/prisma/schema.prisma new file mode 100644 index 0000000..9e41823 --- /dev/null +++ b/apps/orders/prisma/schema.prisma @@ -0,0 +1,26 @@ +// This is your Prisma schema file, +// learn more about it in the docs: https://pris.ly/d/prisma-schema + +generator client { + provider = "prisma-client-js" + output = "../../../node_modules/.prisma/client/orders" +} + +datasource db { + provider = "mysql" + url = env("DATABASE_URL") +} + +model Order { + id Int @id @default(autoincrement()) + price Int + client_id Int + created_at DateTime @default(now()) + status OrderStatus +} + +enum OrderStatus { + PENDING + PAYED + CANCELLED +} diff --git a/apps/orders/src/main.ts b/apps/orders/src/main.ts index 0b93421..91702ba 100644 --- a/apps/orders/src/main.ts +++ b/apps/orders/src/main.ts @@ -1,8 +1,22 @@ import { NestFactory } from '@nestjs/core'; import { OrdersModule } from './orders.module'; +import { MicroserviceOptions, Transport } from '@nestjs/microservices'; async function bootstrap() { const app = await NestFactory.create(OrdersModule); + app.connectMicroservice({ + transport: Transport.KAFKA, + options: { + client: { + brokers: ['kafka:29092'] + }, + consumer: { + groupId: 'orders-consumer', + } + } + }) + + await app.startAllMicroservices() await app.listen(3000); } bootstrap(); diff --git a/apps/orders/src/orders.controller.ts b/apps/orders/src/orders.controller.ts index 2d2343a..fac4717 100644 --- a/apps/orders/src/orders.controller.ts +++ b/apps/orders/src/orders.controller.ts @@ -1,12 +1,29 @@ -import { Controller, Get } from '@nestjs/common'; +import { Body, Controller, Get, Post } from '@nestjs/common'; import { OrdersService } from './orders.service'; +import { Prisma, OrderStatus } from '.prisma/client/orders'; +import { MessagePattern, Payload } from '@nestjs/microservices'; -@Controller() +@Controller('orders') export class OrdersController { constructor(private readonly ordersService: OrdersService) {} @Get() - getHello(): string { - return this.ordersService.getHello(); + getHello(): Promise { + return this.ordersService.all(); + } + + @Post() + create(@Body() data: Prisma.OrderCreateInput): Promise { + return this.ordersService.create(data); + } + + @MessagePattern('payments') + async complete(@Payload() message: any) { + await this.ordersService.complete( + message.order_id, + message.status === 'APPROVED' + ? OrderStatus.PAYED + : OrderStatus.CANCELLED, + ); } } diff --git a/apps/orders/src/orders.module.ts b/apps/orders/src/orders.module.ts index 2b8c162..cd8de2d 100644 --- a/apps/orders/src/orders.module.ts +++ b/apps/orders/src/orders.module.ts @@ -1,9 +1,22 @@ import { Module } from '@nestjs/common'; import { OrdersController } from './orders.controller'; import { OrdersService } from './orders.service'; +import { PrismaModule } from './prisma/prisma.module'; +import { ClientsModule, Transport } from '@nestjs/microservices'; @Module({ - imports: [], + imports: [PrismaModule, ClientsModule.register([ + { + name: 'ORDERS_SERVICE', + transport: Transport.KAFKA, + options: { + client: { + clientId: 'orders', + brokers: ['kafka:29092'] + } + } + } + ])], controllers: [OrdersController], providers: [OrdersService], }) diff --git a/apps/orders/src/orders.service.ts b/apps/orders/src/orders.service.ts index 1291824..0d629bc 100644 --- a/apps/orders/src/orders.service.ts +++ b/apps/orders/src/orders.service.ts @@ -1,8 +1,38 @@ -import { Injectable } from '@nestjs/common'; +import { Inject, Injectable } from '@nestjs/common'; +import { PrismaService } from './prisma/prisma/prisma.service'; +import { Prisma, OrderStatus } from '.prisma/client/orders'; +import { ClientKafka } from '@nestjs/microservices'; +import { lastValueFrom } from 'rxjs'; @Injectable() export class OrdersService { - getHello(): string { - return 'Hello World!'; + constructor( + private prismaService: PrismaService, + @Inject('ORDERS_SERVICE') private kafkaClient: ClientKafka, + ) {} + + all(): Promise { + return this.prismaService.order.findMany(); + } + + async create(data: Prisma.OrderCreateInput): Promise { + const order = await this.prismaService.order.create({ + data: { + ...data, + status: OrderStatus.PENDING, + }, + }); + + console.log(order); + + await lastValueFrom(this.kafkaClient.emit('orders', order)); + return order; + } + + complete(id: number, status: OrderStatus) { + return this.prismaService.order.update({ + where: { id }, + data: { status }, + }); } } diff --git a/apps/orders/src/prisma/prisma.module.ts b/apps/orders/src/prisma/prisma.module.ts new file mode 100644 index 0000000..75664ab --- /dev/null +++ b/apps/orders/src/prisma/prisma.module.ts @@ -0,0 +1,9 @@ +import { Global, Module } from '@nestjs/common'; +import { PrismaService } from './prisma/prisma.service'; + +@Global() +@Module({ + providers: [PrismaService], + exports: [PrismaService] +}) +export class PrismaModule {} diff --git a/apps/orders/src/prisma/prisma/prisma.service.ts b/apps/orders/src/prisma/prisma/prisma.service.ts new file mode 100644 index 0000000..cf87db6 --- /dev/null +++ b/apps/orders/src/prisma/prisma/prisma.service.ts @@ -0,0 +1,17 @@ +import { Injectable, OnModuleInit } from '@nestjs/common'; +import { PrismaClient } from '.prisma/client/orders'; + +@Injectable() +export class PrismaService extends PrismaClient implements OnModuleInit { + + async onModuleInit() { + await this.$connect(); + } + + async enableShutdownHooks(app: any) { + process.on("beforeExit", async () => { + await app.close(); + }) + } + +} diff --git a/apps/payments/.gitignore b/apps/payments/.gitignore new file mode 100644 index 0000000..11ddd8d --- /dev/null +++ b/apps/payments/.gitignore @@ -0,0 +1,3 @@ +node_modules +# Keep environment variables out of version control +.env diff --git a/apps/payments/prisma/migrations/20231002165823_payments/migration.sql b/apps/payments/prisma/migrations/20231002165823_payments/migration.sql new file mode 100644 index 0000000..6f1de46 --- /dev/null +++ b/apps/payments/prisma/migrations/20231002165823_payments/migration.sql @@ -0,0 +1,11 @@ +-- CreateTable +CREATE TABLE `Payment` ( + `id` INTEGER NOT NULL AUTO_INCREMENT, + `amount` DOUBLE NOT NULL, + `order_id` INTEGER NOT NULL, + `client_id` INTEGER NOT NULL, + `create_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), + `status` ENUM('APPROVED', 'REJECT') NOT NULL, + + PRIMARY KEY (`id`) +) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; diff --git a/apps/payments/prisma/migrations/migration_lock.toml b/apps/payments/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..e5a788a --- /dev/null +++ b/apps/payments/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) +provider = "mysql" \ No newline at end of file diff --git a/apps/payments/prisma/schema.prisma b/apps/payments/prisma/schema.prisma new file mode 100644 index 0000000..84e2419 --- /dev/null +++ b/apps/payments/prisma/schema.prisma @@ -0,0 +1,26 @@ +// This is your Prisma schema file, +// learn more about it in the docs: https://pris.ly/d/prisma-schema + +generator client { + provider = "prisma-client-js" + output = "../../../node_modules/.prisma/client/payments" +} + +datasource db { + provider = "mysql" + url = env("DATABASE_URL") +} + +model Payment { + id Int @id @default(autoincrement()) + amount Float + order_id Int + client_id Int + create_at DateTime @default(now()) + status PaymentStatus +} + +enum PaymentStatus { + APPROVED + REJECT +} diff --git a/apps/payments/src/main.ts b/apps/payments/src/main.ts new file mode 100644 index 0000000..9c40f4e --- /dev/null +++ b/apps/payments/src/main.ts @@ -0,0 +1,22 @@ +import { NestFactory } from '@nestjs/core'; +import { PaymentsModule } from './payments.module'; +import { MicroserviceOptions, Transport } from '@nestjs/microservices'; + +async function bootstrap() { + const app = await NestFactory.create(PaymentsModule); + app.connectMicroservice({ + transport: Transport.KAFKA, + options: { + client: { + brokers: ['kafka:29092'] + }, + consumer: { + groupId: 'payments-consumer', + } + } + }) + + await app.startAllMicroservices() + await app.listen(3001); +} +bootstrap(); diff --git a/apps/payments/src/payments.controller.ts b/apps/payments/src/payments.controller.ts new file mode 100644 index 0000000..e0845ff --- /dev/null +++ b/apps/payments/src/payments.controller.ts @@ -0,0 +1,24 @@ +import { Controller, Get, Post } from '@nestjs/common'; +import { PaymentsService } from './payments.service'; +import { MessagePattern, Payload } from '@nestjs/microservices'; + +@Controller('payments') +export class PaymentsController { + constructor(private readonly paymentsService: PaymentsService) {} + + @Get() + all(): Promise { + return this.paymentsService.all(); + } + + @MessagePattern('orders') + async payment(@Payload() message) { + await this.paymentsService.payment({ + amount: message.price, + order_id: message.id, + client_id: message.client_id, + status: null + }) + } + +} diff --git a/apps/payments/src/payments.module.ts b/apps/payments/src/payments.module.ts new file mode 100644 index 0000000..f25b353 --- /dev/null +++ b/apps/payments/src/payments.module.ts @@ -0,0 +1,26 @@ +import { Module } from '@nestjs/common'; +import { PaymentsController } from './payments.controller'; +import { PaymentsService } from './payments.service'; +import { PrismaModule } from './prisma/prisma.module'; +import { ClientsModule, Transport } from '@nestjs/microservices'; + +@Module({ + imports: [ + PrismaModule, + ClientsModule.register([ + { + name: 'PAYMENTS_SERVICE', + transport: Transport.KAFKA, + options: { + client: { + clientId: 'payments', + brokers: ['kafka:29092'], + }, + }, + }, + ]), + ], + controllers: [PaymentsController], + providers: [PaymentsService], +}) +export class PaymentsModule {} diff --git a/apps/payments/src/payments.service.ts b/apps/payments/src/payments.service.ts new file mode 100644 index 0000000..eab351a --- /dev/null +++ b/apps/payments/src/payments.service.ts @@ -0,0 +1,28 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { PrismaService } from './prisma/prisma/prisma.service'; +import { Prisma, PaymentStatus } from '.prisma/client/payments'; +import { ClientKafka } from '@nestjs/microservices'; +import { lastValueFrom } from 'rxjs'; + +@Injectable() +export class PaymentsService { + constructor( + private prismaService: PrismaService, + @Inject('PAYMENTS_SERVICE') private kafkaClient: ClientKafka, + ) {} + + all() { + return this.prismaService.payment.findMany(); + } + + async payment(data: Prisma.PaymentCreateInput) { + const payment = await this.prismaService.payment.create({ + data: { + ...data, + status: PaymentStatus.APPROVED, + }, + }); + await lastValueFrom(this.kafkaClient.emit('payments', payment)) + return payment; + } +} diff --git a/apps/payments/src/prisma/prisma.module.ts b/apps/payments/src/prisma/prisma.module.ts new file mode 100644 index 0000000..75664ab --- /dev/null +++ b/apps/payments/src/prisma/prisma.module.ts @@ -0,0 +1,9 @@ +import { Global, Module } from '@nestjs/common'; +import { PrismaService } from './prisma/prisma.service'; + +@Global() +@Module({ + providers: [PrismaService], + exports: [PrismaService] +}) +export class PrismaModule {} diff --git a/apps/payments/src/prisma/prisma/prisma.service.ts b/apps/payments/src/prisma/prisma/prisma.service.ts new file mode 100644 index 0000000..d6d0354 --- /dev/null +++ b/apps/payments/src/prisma/prisma/prisma.service.ts @@ -0,0 +1,17 @@ +import { Injectable, OnModuleInit } from '@nestjs/common'; +import { PrismaClient } from '.prisma/client/payments'; + +@Injectable() +export class PrismaService extends PrismaClient implements OnModuleInit { + + async onModuleInit() { + await this.$connect(); + } + + async enableShutdownHooks(app: any) { + process.on("beforeExit", async () => { + await app.close(); + }) + } + +} diff --git a/apps/payments/test/app.e2e-spec.ts b/apps/payments/test/app.e2e-spec.ts new file mode 100644 index 0000000..8c9de08 --- /dev/null +++ b/apps/payments/test/app.e2e-spec.ts @@ -0,0 +1,24 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import * as request from 'supertest'; +import { PaymentsModule } from './../src/payments.module'; + +describe('PaymentsController (e2e)', () => { + let app: INestApplication; + + beforeEach(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [PaymentsModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('/ (GET)', () => { + return request(app.getHttpServer()) + .get('/') + .expect(200) + .expect('Hello World!'); + }); +}); diff --git a/apps/payments/test/jest-e2e.json b/apps/payments/test/jest-e2e.json new file mode 100644 index 0000000..e9d912f --- /dev/null +++ b/apps/payments/test/jest-e2e.json @@ -0,0 +1,9 @@ +{ + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": ".", + "testEnvironment": "node", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + } +} diff --git a/apps/payments/tsconfig.app.json b/apps/payments/tsconfig.app.json new file mode 100644 index 0000000..35b10b0 --- /dev/null +++ b/apps/payments/tsconfig.app.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "declaration": false, + "outDir": "../../dist/apps/payments" + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] +} diff --git a/docker-compose.yml b/docker-compose.yml index 5b44148..f68cc9d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -55,4 +55,10 @@ services: CONTROL_CENTER_INTERNAL_TOPICS_PARTITIONS: 1 CONTROL_CENTER_MONITORING_INTERCEPTOR_TOPIC_PARTITIONS: 1 CONFLUENT_METRICS_TOPIC_REPLICATION: 1 - PORT: 9021 \ No newline at end of file + PORT: 9021 + mysql: + image: mysql:8.0.30-debian + environment: + - MYSQL_ROOT_PASSWORD=root + volumes: + - ././docker/mysql:/docker-entrypoint-initdb.d \ No newline at end of file diff --git a/nest-cli.json b/nest-cli.json index 86c1982..8ad7bf4 100644 --- a/nest-cli.json +++ b/nest-cli.json @@ -18,6 +18,15 @@ "compilerOptions": { "tsConfigPath": "apps/orders/tsconfig.app.json" } + }, + "payments": { + "type": "application", + "root": "apps/payments", + "entryFile": "main", + "sourceRoot": "apps/payments/src", + "compilerOptions": { + "tsConfigPath": "apps/payments/tsconfig.app.json" + } } } } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index d88a346..dcbfb86 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,10 @@ "dependencies": { "@nestjs/common": "^10.0.0", "@nestjs/core": "^10.0.0", + "@nestjs/microservices": "^10.2.6", "@nestjs/platform-express": "^10.0.0", + "@prisma/client": "^5.3.1", + "kafkajs": "^2.2.4", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.1" }, @@ -1528,6 +1531,63 @@ } } }, + "node_modules/@nestjs/microservices": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/@nestjs/microservices/-/microservices-10.2.6.tgz", + "integrity": "sha512-Ef5Tv0arRSXmMwzlOvXHZEoOS8QlftIrDVrLkpcR6x5Q3BaKrkGOKBet6w2JbssX4eEGt2nw4dy/TbzN9pQYFw==", + "dependencies": { + "iterare": "1.2.1", + "tslib": "2.6.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@grpc/grpc-js": "*", + "@nestjs/common": "^10.0.0", + "@nestjs/core": "^10.0.0", + "@nestjs/websockets": "^10.0.0", + "amqp-connection-manager": "*", + "amqplib": "*", + "cache-manager": "*", + "ioredis": "*", + "kafkajs": "*", + "mqtt": "*", + "nats": "*", + "reflect-metadata": "^0.1.12", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@grpc/grpc-js": { + "optional": true + }, + "@nestjs/websockets": { + "optional": true + }, + "amqp-connection-manager": { + "optional": true + }, + "amqplib": { + "optional": true + }, + "cache-manager": { + "optional": true + }, + "ioredis": { + "optional": true + }, + "kafkajs": { + "optional": true + }, + "mqtt": { + "optional": true + }, + "nats": { + "optional": true + } + } + }, "node_modules/@nestjs/platform-express": { "version": "10.2.6", "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.2.6.tgz", @@ -1719,6 +1779,31 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/@prisma/client": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-5.3.1.tgz", + "integrity": "sha512-ArOKjHwdFZIe1cGU56oIfy7wRuTn0FfZjGuU/AjgEBOQh+4rDkB6nF+AGHP8KaVpkBIiHGPQh3IpwQ3xDMdO0Q==", + "hasInstallScript": true, + "dependencies": { + "@prisma/engines-version": "5.3.1-2.61e140623197a131c2a6189271ffee05a7aa9a59" + }, + "engines": { + "node": ">=16.13" + }, + "peerDependencies": { + "prisma": "*" + }, + "peerDependenciesMeta": { + "prisma": { + "optional": true + } + } + }, + "node_modules/@prisma/engines-version": { + "version": "5.3.1-2.61e140623197a131c2a6189271ffee05a7aa9a59", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-5.3.1-2.61e140623197a131c2a6189271ffee05a7aa9a59.tgz", + "integrity": "sha512-y5qbUi3ql2Xg7XraqcXEdMHh0MocBfnBzDn5GbV1xk23S3Mq8MGs+VjacTNiBh3dtEdUERCrUUG7Z3QaJ+h79w==" + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -5817,6 +5902,14 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/kafkajs": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/kafkajs/-/kafkajs-2.2.4.tgz", + "integrity": "sha512-j/YeapB1vfPT2iOIUn/vxdyKEuhuY2PxMBvf5JWux6iSaukAccrMtXEY/Lb7OvavDhOWME589bpLrEdnVHjfjA==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/keyv": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", diff --git a/package.json b/package.json index 98e6e15..df1f39f 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,10 @@ "dependencies": { "@nestjs/common": "^10.0.0", "@nestjs/core": "^10.0.0", + "@nestjs/microservices": "^10.2.6", "@nestjs/platform-express": "^10.0.0", + "@prisma/client": "^5.3.1", + "kafkajs": "^2.2.4", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.1" },