<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Deepak Dev</title>
    <description>The latest articles on DEV Community by Deepak Dev (@iamdeepakdev).</description>
    <link>https://dev.to/iamdeepakdev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1000792%2F678b2183-43d0-4216-bd53-56ac2cedb86b.jpeg</url>
      <title>DEV Community: Deepak Dev</title>
      <link>https://dev.to/iamdeepakdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/iamdeepakdev"/>
    <language>en</language>
    <item>
      <title>How to integrate sonarqube with jenkins</title>
      <dc:creator>Deepak Dev</dc:creator>
      <pubDate>Sun, 22 Jan 2023 15:19:56 +0000</pubDate>
      <link>https://dev.to/iamdeepakdev/how-to-integrate-sonarqube-with-jenkins-3ied</link>
      <guid>https://dev.to/iamdeepakdev/how-to-integrate-sonarqube-with-jenkins-3ied</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9weeqact3oza2q545tk3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9weeqact3oza2q545tk3.png" alt="Image description" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://medium.com/@iamdeepakdev/sonarqube-integration-with-jenkins-f7ade6ad82a2" rel="noopener noreferrer"&gt;https://medium.com/@iamdeepakdev/sonarqube-integration-with-jenkins-f7ade6ad82a2&lt;/a&gt;&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>react</category>
      <category>javascript</category>
      <category>android</category>
    </item>
    <item>
      <title>How to implement MQTT in Nest.Js</title>
      <dc:creator>Deepak Dev</dc:creator>
      <pubDate>Sat, 07 Jan 2023 04:16:44 +0000</pubDate>
      <link>https://dev.to/iamdeepakdev/how-to-implement-mqtt-in-nestjs-k2n</link>
      <guid>https://dev.to/iamdeepakdev/how-to-implement-mqtt-in-nestjs-k2n</guid>
      <description>&lt;p&gt;&lt;a href="https://medium.com/@iamdeepakdev/how-to-implement-mqtt-in-nest-js-9ec746406c38" rel="noopener noreferrer"&gt;https://medium.com/@iamdeepakdev/how-to-implement-mqtt-in-nest-js-9ec746406c38&lt;/a&gt;&lt;/p&gt;

</description>
      <category>emptystring</category>
    </item>
    <item>
      <title>How to implement Kafka in Nest.Js ?</title>
      <dc:creator>Deepak Dev</dc:creator>
      <pubDate>Tue, 03 Jan 2023 06:44:31 +0000</pubDate>
      <link>https://dev.to/iamdeepakdev/how-to-implement-kafka-in-nestjs--2p9a</link>
      <guid>https://dev.to/iamdeepakdev/how-to-implement-kafka-in-nestjs--2p9a</guid>
      <description>&lt;p&gt;Dear Devs, This is not a beginners guide. I want to show you how i have implemented Kafka in my Nest.Js project.&lt;br&gt;
In this project we have 3 microservices developed in Nest.js&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;ev-api-gateway&lt;/li&gt;
&lt;li&gt;ev-users&lt;/li&gt;
&lt;li&gt;ev-vehicles
I am running Kafka, MongoDb , zookeeper , Redis in the Docker.
The project structure is shown as below.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwgmhzha82yvh6goucybt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwgmhzha82yvh6goucybt.png" alt="folder structure"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;docker-compose.yml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;version: '3.8'
networks:
  ev:
    name: "ev"
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 10.5.0.0/16
          ip_range: 10.5.0.0/24
          gateway: 10.5.0.1
          aux_addresses:
            kafka: 10.5.0.2
            zookeeper: 10.5.0.3
services:
  mongodb:
        image : mongo:latest
        container_name: mongodb
        environment:
        - MONGO_INITDB_ROOT_PASSWORD= root
        - MONGO_INITDB_ROOT_USERNAME= root
        volumes:
        - ./mongodb:/data/db
        ports:
        - 27017:27017
        restart: unless-stopped
  zookeeper:
        image: 'bitnami/zookeeper:latest'
        container_name: "zookeeper"
        ports:
        - 2181:2181
        # volumes:
        # - ./zookeeper:/var/lib/zookeeper
        networks:
        - "ev"
        environment:
        - ALLOW_ANONYMOUS_LOGIN=yes
  kafka:
        image: bitnami/kafka:latest
        container_name: "kafka"
        ports:
            - 9092:9092
        networks:
        - "ev"
        # volumes:
        # - ./kafka:/opt/bitnami/kafka
        restart: unless-stopped
        depends_on:
        - zookeeper
        environment:
        - KAFKA_BROKER_ID=1
        - KAFKA_LISTENERS=PLAINTEXT://:9092
        - ALLOW_PLAINTEXT_LISTENER=yes
        - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
        - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092
        - KAFKA_RESTART_ATTEMPTS=10
        - KAFKA_RESTART_DELAY=5
        - ZOOKEEPER_AUTOPURGE_PURGE_INTERVAL=0
        # - KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1
  redis:
        image: redis:3
        restart: always
        container_name: "redis"
        ports:
        - 6379:6379
        environment:
        - ALLOW_EMPTY_PASSWORD=yes
        volumes: 
        - ./redis:/data
        networks:
        - "ev"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;run the &lt;code&gt;docker-compose up -d --build&lt;/code&gt;&lt;br&gt;
Once the containers are up confirm by &lt;code&gt;docker ps&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F863r49t9zg45wrqh91gv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F863r49t9zg45wrqh91gv.png" alt="Docker ps"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ev-api-gateway\src\main.ts&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as compression from 'compression';
import { ValidationPipe } from '@nestjs/common';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.use(compression());
  app.enableCors({
    origin: ['http://localhost:4200'],
    methods: ['POST'],
    credentials: true,
  });
  app.setGlobalPrefix('api/v1');
  app.useGlobalPipes(
    new ValidationPipe({
      transform: false,
      whitelist: true,
      //enableDebugMessages: true,
    }),
  );
  app.startAllMicroservices();
  await app.listen(8081);
}
bootstrap();

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The api-gateway will start listening on 8081&lt;/p&gt;

&lt;p&gt;Generate modules in api-gateway by&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nest g mo auth
nest g mo kafka
nest g mo redis
nest g mo users
nest g mo vehicles
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In kafka module add the following codes&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Module } from '@nestjs/common';
import { ClientsModule, Transport } from '@nestjs/microservices';
import { Partitioners } from 'kafkajs';

@Module({
  imports: [
    ClientsModule.register([
      {
        name: 'USERS_SERVICE',
        transport: Transport.KAFKA,
        options: {
          client: {
            brokers: ['localhost:9092'],
          },
          consumer: {
            groupId: 'users-consumer',
          },
          producer: {
            createPartitioner: Partitioners.LegacyPartitioner,
          },
        },
      },
      {
        name: 'VEHICLES_SERVICE',
        transport: Transport.KAFKA,
        options: {
          client: {
            brokers: ['localhost:9092'],
          },
          consumer: {
            groupId: 'vehicles-consumer',
          },
          producer: {
            createPartitioner: Partitioners.LegacyPartitioner,
          },
        },
      },
    ]),
  ],
  exports: [ClientsModule],
})
export class KafkaModule {}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;in users module add the following code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Module } from '@nestjs/common';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
import { KafkaModule } from 'src/kafka/kafka.module';
import { RedisModule } from 'src/redis/redis.module';
@Module({
  imports: [KafkaModule, RedisModule],
  controllers: [UsersController],
  providers: [UsersService],
})
export class UsersModule {}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;users controller will be like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Controller, Post, Body, Header, Res } from '@nestjs/common';
import { UsersService } from './users.service';

@Controller('users')
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @Post('/signup')
  @Header('Content-Type', 'application/json')
  async create(@Body() signupData, @Res() res) {
    const result = await this.usersService.userCreation(signupData);
    res.send(result);
  }
  @Post('/login')
  @Header('Content-Type', 'application/json')
  async login(@Body() data, @Res() res) {
    const result = await this.usersService.login(data);
    res.send(result);
  }
  @Post('/list')
  @Header('Content-Type', 'application/json')
  async list(@Body() data, @Res() res) {
    const result = await this.usersService.redisSet();
    console.log('result');
    console.log(result);
    res.send({ result: result });
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the users service likes this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import {
  Inject,
  Injectable,
  OnApplicationShutdown,
  OnModuleInit,
} from '@nestjs/common';
import { ClientKafka } from '@nestjs/microservices/client';
import { RedisService } from 'src/redis/redis.service';

@Injectable()
export class UsersService implements OnModuleInit, OnApplicationShutdown {
  constructor(
    @Inject('USERS_SERVICE') private readonly usersService: ClientKafka,
    private cacheManager: RedisService,
  ) {}
  async onApplicationShutdown() {
    await this.usersService.close();
  }
  async onModuleInit() {
    const requestPatterns = ['users.userCreation', 'users.login'];
    requestPatterns.forEach((pattern) =&amp;gt; {
      this.usersService.subscribeToResponseOf(pattern);
    });
    await this.usersService.connect();
  }
  async userCreation(signupData: any) {
    return await new Promise&amp;lt;any&amp;gt;((resolve) =&amp;gt;
      this.usersService
        .send('users.userCreation', signupData)
        .subscribe((data) =&amp;gt; {
          console.log(data);
          resolve(data);
        }),
    );
  }
  async login(data: any) {
    return await new Promise&amp;lt;any&amp;gt;((resolve) =&amp;gt;
      this.usersService.send('users.login', data).subscribe(async (data) =&amp;gt; {
        console.log(data);
        if (data?.id) {
          const pattern = 'loginData' + data.id;
          await this.cacheManager
            .get(pattern)
            .then((loginData) =&amp;gt; {
              console.log(loginData);
              if (loginData) {
                loginData.count += 1;
                this.cacheManager.set(pattern, loginData);
              } else {
                const setLoginData = {
                  count: 1,
                };
                this.cacheManager.set(pattern, setLoginData);
              }
            })
            .catch((err) =&amp;gt; {
              console.log(err);
            });
        }
        resolve(data);
      }),
    );
  }
  async redisSet() {
    this.cacheManager.set('address', 'deepakdev');
    return this.cacheManager.get('name');
  }
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now lets focus on ev-users project&lt;br&gt;
main.ts file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { Transport, MicroserviceOptions } from '@nestjs/microservices';
import { Partitioners } from 'kafkajs';

async function bootstrap() {
  const app = await NestFactory.createMicroservice&amp;lt;MicroserviceOptions&amp;gt;(
    AppModule,
    {
      transport: Transport.KAFKA,
      options: {
        client: {
          brokers: ['localhost:9092'],
        },
        consumer: {
          groupId: 'users-consumer',
        },
        producer: {
          createPartitioner: Partitioners.LegacyPartitioner,
        },
      },
    },
  );
  app.listen();
}
bootstrap();

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;app.module file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UsersModule } from './users/users.module';
import { MongodbModule } from './mongodb/mongodb.module';
@Module({
  imports: [MongodbModule, UsersModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generate users module in ev-users by &lt;code&gt;nest g mo users&lt;/code&gt;&lt;br&gt;
inside users module&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Module } from '@nestjs/common';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
import { User, UsersSchema } from '../mongodb/schemas/user.schema';
import { MongooseModule } from '@nestjs/mongoose';

@Module({
  imports: [
    MongooseModule.forFeature([{ name: User.name, schema: UsersSchema }]),
  ],
  controllers: [UsersController],
  providers: [UsersService],
})
export class UsersModule {}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;users controller&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Controller, Post, Body, Header, HttpStatus } from '@nestjs/common';
import { UsersService } from './users.service';
import * as bcrypt from 'bcrypt';
import { config } from '../config/configuration';
import * as jwt from 'jsonwebtoken';
import { Res } from '@nestjs/common/decorators';
import { MessagePattern, Payload } from '@nestjs/microservices';

@Controller()
export class UsersController {
  constructor(private readonly usersService: UsersService) {}

  @MessagePattern('users.userCreation')
  async create(@Payload() signupData: any) {
    const isUserExits = await this.usersService.isUserExits(signupData.emailId);
    if (isUserExits !== null) {
      return {
        status: HttpStatus.CONFLICT,
        message: 'You have already registered.',
      };
    } else {
      signupData.password = await bcrypt.hash(
        signupData.password,
        config.saltOrRounds,
      );

      try {
        return await this.usersService
          .createUser(signupData)
          .then(() =&amp;gt; {
            return {
              status: HttpStatus.OK,
              message: 'You have successfully registered.',
            };
          })
          .catch(() =&amp;gt; {
            return {
              status: HttpStatus.BAD_REQUEST,
              message: 'Inavlid details provided!',
            };
          });
      } catch {
        return {
          status: HttpStatus.BAD_REQUEST,
          message: 'Inavlid details provided!',
        };
      }
    }
  }

  @MessagePattern('users.login')
  async login(@Payload() loginData) {
    console.log('MessagePattern:users.login');
    const dbData = await this.usersService.isUserExits(loginData.emailId);
    if (dbData !== null) {
      const isMatch = await bcrypt.compare(loginData.password, dbData.password);
      if (isMatch) {
        const token = await this.tokenGenerator(dbData);
        return {
          status: HttpStatus.OK,
          token: token,
          id: dbData._id,
        };
      } else {
        return {
          status: HttpStatus.UNAUTHORIZED,
          message: 'Inavlid credentials!',
        };
      }
    } else {
      return {
        status: HttpStatus.NOT_ACCEPTABLE,
        message: 'Inavlid credentials!',
      };
    }
  }
  async tokenGenerator(data: any) {
    const payload = {
      userId: data._id.toString(),
      userIdObject: data._id,
      emailId: data.emailId,
      firstName: data.firstName,
    };
    const secret = config.JWTsecret;
    const options = config.JWToptios;

    const token = jwt.sign(payload, secret, options);
    return token;
  }
  async verifyToken(token: string): Promise&amp;lt;any&amp;gt; {
    return jwt.verify(token, config.JWTsecret, function (err, data) {
      if (err) {
        return err;
      }
      return data;
    });
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;users service&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { Model } from 'mongoose';
import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { CreateUserDto } from './dto/create-user.dto';
import { User, UserDocument } from '../mongodb/schemas/user.schema';

@Injectable()
export class UsersService {
  constructor(
    @InjectModel(User.name) private usersModel: Model&amp;lt;UserDocument&amp;gt;,
  ) {}

  async createUser(createUserDto: CreateUserDto) {
    console.log('Users::createUser');
    try {
      const createdUser = new this.usersModel(createUserDto);
      return createdUser.save();
    } catch (err) {
      console.log('createUser Mongodb error!');
      console.log(err);
      return false;
    }
  }
  async isUserExits(email: string) {
    return this.usersModel.findOne({ emailId: email });
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once u start the users service and hit the login api as &lt;code&gt;8081/api/v1/login&lt;/code&gt;&lt;br&gt;
What will happen :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;ev-api-gateway will hit.The login controller will produce the message to ev-users and it will subscribe to the same topic as well&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once Message sent, the Ev-uses will consume the data and return the result to the ev-apigateway. Since its already subscribed to the same topic, the result will be received at the api-gateway and returned the result to the api.&lt;br&gt;
This is just a fragment of the project that i shared here but the producer and consumer codes are mentioned above which will be helpful for some of the Devs. In case if you have any doubts, please comment and let me help you out.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>nestjs</category>
      <category>kafka</category>
    </item>
  </channel>
</rss>
