<?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>Forem: codingKrills</title>
    <description>The latest articles on Forem by codingKrills (@pulkit5ingh).</description>
    <link>https://forem.com/pulkit5ingh</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%2F494002%2Fbd2d294f-eba9-4236-856c-722b78ded6cb.jpeg</url>
      <title>Forem: codingKrills</title>
      <link>https://forem.com/pulkit5ingh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/pulkit5ingh"/>
    <language>en</language>
    <item>
      <title>I Self-Hosted a Scalable Live Video Infrastructure in 10 Minutes (And You Can Too) 🚀🎥</title>
      <dc:creator>codingKrills</dc:creator>
      <pubDate>Sun, 12 Apr 2026 22:50:43 +0000</pubDate>
      <link>https://forem.com/pulkit5ingh/i-self-hosted-a-scalable-live-video-infrastructure-in-10-minutes-and-you-can-too-2app</link>
      <guid>https://forem.com/pulkit5ingh/i-self-hosted-a-scalable-live-video-infrastructure-in-10-minutes-and-you-can-too-2app</guid>
      <description>&lt;p&gt;I Self-Hosted a Scalable Live Video Infrastructure in 10 Minutes (And You Can Too) 🚀🎥&lt;/p&gt;

&lt;h2&gt;
  
  
  Hook: Forget expensive Zoom APIs or complex Twilio setups. I just deployed a production-ready LiveKit server with Ingress (OBS support) and Egress (Recording) on a basic VPS. Here is exactly how I did it without losing my mind.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  The "Why" 🧐
&lt;/h2&gt;

&lt;p&gt;Building video apps is usually a nightmare. You have to deal with STUN/TURN servers, SSL certificates, and UDP port ranges. Enter LiveKit: an open-source, high-performance WebRTC stack that handles the heavy lifting.&lt;/p&gt;

&lt;h2&gt;
  
  
  I’m going to show you how to turn a fresh Ubuntu VPS into a powerhouse for video calls, livestreams, and recordings.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Phase 1: The "Clean Slate" Script 🧹
&lt;/h2&gt;

&lt;p&gt;Before we start, we need a clean Docker environment. No ghost containers, no dangling images. I used this "Nuclear Cleanup" script:&lt;/p&gt;

&lt;h1&gt;
  
  
  !/bin/bash# Stop everything, delete everything, restart the engine
&lt;/h1&gt;

&lt;p&gt;docker stop $(docker ps -aq) 2&amp;gt;/dev/null&lt;br&gt;
docker system prune -a --volumes -f&lt;br&gt;
sudo systemctl restart docker&lt;/p&gt;

&lt;h2&gt;
  
  
  Run chmod +x clean.sh &amp;amp;&amp;amp; ./clean.sh and boom—you’re starting from zero.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Phase 2: The DNS Magic Trick 🪄
&lt;/h2&gt;

&lt;p&gt;If you use Cloudflare, this is where 90% of people fail.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create two A records: ://yourdomain.com and ://yourdomain.com.&lt;/li&gt;
&lt;li&gt;CRITICAL: Switch the Proxy status to Grey Cloud (DNS Only).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pro-Tip: WebRTC needs raw UDP traffic. Cloudflare's orange cloud (HTTP proxy) will kill your video stream instantly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 3: Launching the Generator 🚀
&lt;/h2&gt;

&lt;p&gt;We don't write config files manually; we let LiveKit’s interactive wizard do it.&lt;/p&gt;

&lt;p&gt;sudo docker run --rm -it -v$PWD:/output livekit/generate&lt;/p&gt;

&lt;p&gt;The Choices I Made:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Components: Server + Ingress (for OBS/RTMP) + Egress (for Recording).&lt;/li&gt;
&lt;li&gt;SSL: Let's Encrypt (Free and automatic).&lt;/li&gt;
&lt;li&gt;Redis: Bundled (Keep it simple).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  This generated a folder with a livekit.yaml and a magical init_script.sh.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Phase 4: Opening the Gates (Firewall) 🛡️
&lt;/h2&gt;

&lt;p&gt;You can't have a party if the doors are locked. We need to open specific ports for WebRTC to breathe:&lt;/p&gt;

&lt;h1&gt;
  
  
  TCP for signals, UDP for the actual video data
&lt;/h1&gt;

&lt;p&gt;sudo ufw allow 80,443,7881,1935/tcp&lt;br&gt;
sudo ufw allow 3478,7885,50000:60000/udp&lt;/p&gt;




&lt;h2&gt;
  
  
  Phase 5: The "One Command" Deployment ⚡
&lt;/h2&gt;

&lt;p&gt;Navigate into your generated folder and let it rip:&lt;/p&gt;

&lt;p&gt;cd ://yourdomain.com&lt;br&gt;
sudo chmod +x init_script.sh&lt;br&gt;
sudo ./init_script.sh&lt;/p&gt;

&lt;h2&gt;
  
  
  Once you see livekit-server: Up, you officially own your own video infrastructure.
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Phase 6: How to Connect (The Code) 💻
&lt;/h2&gt;

&lt;p&gt;Connecting your frontend is surprisingly easy. Use the livekit-client SDK:&lt;/p&gt;

&lt;p&gt;import { Room } from 'livekit-client';&lt;br&gt;
const room = new Room();await room.connect('wss://://yourdomain.com', 'YOUR_TOKEN');await room.localParticipant.enableCameraAndMicrophone();&lt;/p&gt;




&lt;h2&gt;
  
  
  The Verdict 🏆
&lt;/h2&gt;

&lt;p&gt;In under 15 minutes, we have:&lt;br&gt;
✅ End-to-end encrypted video calls.&lt;br&gt;
✅ RTMP Ingress (You can stream from OBS directly to your server).&lt;br&gt;
✅ Egress (Save meetings directly to S3 or local storage).&lt;br&gt;
✅ Auto-scaling capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stop paying for minutes. Start owning your stack.
&lt;/h2&gt;

&lt;p&gt;What are you building next? Video games? Remote surgery apps? Virtual classrooms? Let me know in the comments! 👇&lt;/p&gt;

&lt;h1&gt;
  
  
  webdev #javascript #docker #openSource #webrtc
&lt;/h1&gt;




</description>
    </item>
    <item>
      <title>⚔️ Kafka vs RabbitMQ vs SQS vs BullMQ — Stop Guessing, Choose the Right One (2026 Guide)</title>
      <dc:creator>codingKrills</dc:creator>
      <pubDate>Tue, 07 Apr 2026 13:17:40 +0000</pubDate>
      <link>https://forem.com/pulkit5ingh/kafka-vs-rabbitmq-vs-sqs-vs-bullmq-stop-guessing-choose-the-right-one-2026-guide-1cp5</link>
      <guid>https://forem.com/pulkit5ingh/kafka-vs-rabbitmq-vs-sqs-vs-bullmq-stop-guessing-choose-the-right-one-2026-guide-1cp5</guid>
      <description>&lt;h2&gt;
  
  
  ⚔️ Kafka vs RabbitMQ vs SQS vs BullMQ — Stop Guessing, Choose the Right One (2026 Guide)
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ Using the wrong messaging system will silently kill your scalability.&lt;br&gt;
✅ Choosing the right one will make your system &lt;strong&gt;fast, resilient, and future-proof&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you're building microservices, background jobs, or real-time systems… this is one decision you &lt;strong&gt;cannot afford to get wrong&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  🧠 TL;DR (Save This)
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Pick&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Microservices communication&lt;/td&gt;
&lt;td&gt;🐰 RabbitMQ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real-time analytics / streaming&lt;/td&gt;
&lt;td&gt;🧠 Kafka&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS serverless apps&lt;/td&gt;
&lt;td&gt;☁️ SQS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js background jobs&lt;/td&gt;
&lt;td&gt;⚡ BullMQ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  📡 The 4 Systems Explained
&lt;/h1&gt;




&lt;h2&gt;
  
  
  🐰 RabbitMQ — The Reliable Workhorse
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔹 What it is:
&lt;/h3&gt;

&lt;p&gt;A traditional &lt;strong&gt;message broker&lt;/strong&gt; that routes messages via exchanges → queues.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 Best for:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Microservices communication&lt;/li&gt;
&lt;li&gt;Task queues&lt;/li&gt;
&lt;li&gt;Reliable processing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔹 Example:
&lt;/h3&gt;

&lt;p&gt;User signs up → event sent → email + notification services consume it&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Apache Kafka — The Scale Monster
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔹 What it is:
&lt;/h3&gt;

&lt;p&gt;A distributed &lt;strong&gt;event streaming platform&lt;/strong&gt; that stores events as logs.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 Best for:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Real-time analytics&lt;/li&gt;
&lt;li&gt;Event sourcing&lt;/li&gt;
&lt;li&gt;High-scale systems&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔹 Example:
&lt;/h3&gt;

&lt;p&gt;Tracking millions of user clicks → analytics dashboard in real-time&lt;/p&gt;




&lt;h2&gt;
  
  
  ☁️ Amazon SQS — The Managed Simplicity
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔹 What it is:
&lt;/h3&gt;

&lt;p&gt;A fully managed queue service by AWS.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 Best for:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Serverless architectures&lt;/li&gt;
&lt;li&gt;AWS-based systems&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔹 Example:
&lt;/h3&gt;

&lt;p&gt;Lambda → SQS → Worker → Process job&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ BullMQ — The Developer Favorite
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔹 What it is:
&lt;/h3&gt;

&lt;p&gt;A Redis-based queue system built for Node.js.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔹 Best for:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Background jobs&lt;/li&gt;
&lt;li&gt;Simple async processing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔹 Example:
&lt;/h3&gt;

&lt;p&gt;Upload file → queue job → process in background&lt;/p&gt;




&lt;h1&gt;
  
  
  ⚔️ The Real Differences (No BS Table)
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;RabbitMQ 🐰&lt;/th&gt;
&lt;th&gt;Kafka 🧠&lt;/th&gt;
&lt;th&gt;SQS ☁️&lt;/th&gt;
&lt;th&gt;BullMQ ⚡&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Type&lt;/td&gt;
&lt;td&gt;Broker&lt;/td&gt;
&lt;td&gt;Streaming&lt;/td&gt;
&lt;td&gt;Managed Queue&lt;/td&gt;
&lt;td&gt;Job Queue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Throughput&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;🔥 Extremely High&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complexity&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;td&gt;😵 High&lt;/td&gt;
&lt;td&gt;😌 Low&lt;/td&gt;
&lt;td&gt;😌 Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scaling&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;td&gt;🚀 Massive&lt;/td&gt;
&lt;td&gt;Auto&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replay Events&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Setup&lt;/td&gt;
&lt;td&gt;Self-hosted&lt;/td&gt;
&lt;td&gt;Complex cluster&lt;/td&gt;
&lt;td&gt;Managed&lt;/td&gt;
&lt;td&gt;Redis needed&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  ✅ Pros &amp;amp; Cons (Straight Talk)
&lt;/h1&gt;




&lt;h2&gt;
  
  
  🐰 RabbitMQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Pros:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Flexible routing (fanout, topic, direct)&lt;/li&gt;
&lt;li&gt;Strong reliability (ACK, DLQ, retries)&lt;/li&gt;
&lt;li&gt;Perfect for microservices&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ Cons:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Lower throughput than Kafka&lt;/li&gt;
&lt;li&gt;Needs infrastructure setup&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Kafka
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Pros:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Massive throughput (millions/sec)&lt;/li&gt;
&lt;li&gt;Event replay (game-changer)&lt;/li&gt;
&lt;li&gt;Horizontal scalability&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ Cons:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Hard to learn &amp;amp; manage&lt;/li&gt;
&lt;li&gt;Overkill for most apps&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ☁️ SQS
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Pros:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Fully managed (no ops)&lt;/li&gt;
&lt;li&gt;Highly durable&lt;/li&gt;
&lt;li&gt;Easy AWS integration&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ Cons:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Limited flexibility&lt;/li&gt;
&lt;li&gt;Vendor lock-in&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡ BullMQ
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ Pros:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Super easy setup&lt;/li&gt;
&lt;li&gt;Fast (Redis-based)&lt;/li&gt;
&lt;li&gt;Perfect for Node.js devs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ Cons:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Not for large distributed systems&lt;/li&gt;
&lt;li&gt;Limited advanced features&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🔥 Real-World Use Cases (This is What Matters)
&lt;/h1&gt;

&lt;h2&gt;
  
  
  💡 E-commerce App
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Order processing → 🐰 RabbitMQ&lt;/li&gt;
&lt;li&gt;Analytics pipeline → 🧠 Kafka&lt;/li&gt;
&lt;li&gt;Email queue → ⚡ BullMQ&lt;/li&gt;
&lt;li&gt;AWS infra → ☁️ SQS&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💡 Your System (Quotation + AI + OTP)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;OTP → ⚡ BullMQ / 🐰 RabbitMQ&lt;/li&gt;
&lt;li&gt;Notifications → ⚡ BullMQ&lt;/li&gt;
&lt;li&gt;Quotation processing → 🐰 RabbitMQ&lt;/li&gt;
&lt;li&gt;AI + analytics → 🧠 Kafka&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🚨 Common Mistakes (Avoid These)
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;❌ Using Kafka for simple queues&lt;/li&gt;
&lt;li&gt;❌ Using BullMQ for distributed systems&lt;/li&gt;
&lt;li&gt;❌ Ignoring retries &amp;amp; DLQ&lt;/li&gt;
&lt;li&gt;❌ Tight coupling between services&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🧠 Decision Framework (Think Like a Senior Engineer)
&lt;/h1&gt;

&lt;p&gt;Ask yourself:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Do I need &lt;strong&gt;event replay&lt;/strong&gt;? → Kafka&lt;/li&gt;
&lt;li&gt;Do I need &lt;strong&gt;reliable task processing&lt;/strong&gt;? → RabbitMQ&lt;/li&gt;
&lt;li&gt;Am I on &lt;strong&gt;AWS only&lt;/strong&gt;? → SQS&lt;/li&gt;
&lt;li&gt;Is this just &lt;strong&gt;background jobs in Node.js&lt;/strong&gt;? → BullMQ&lt;/li&gt;
&lt;/ol&gt;




&lt;h1&gt;
  
  
  💣 Hard Truth
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Most systems don’t fail because of code…&lt;br&gt;
They fail because of &lt;strong&gt;wrong architecture decisions&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  🚀 Final Takeaway
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;RabbitMQ = Reliable messaging&lt;/li&gt;
&lt;li&gt;Kafka = High-scale streaming&lt;/li&gt;
&lt;li&gt;SQS = Managed simplicity&lt;/li&gt;
&lt;li&gt;BullMQ = Developer-friendly queues&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Pick based on &lt;strong&gt;use case, not hype&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  🧠 TL;DR (Again)
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Don’t choose tools because they’re popular.&lt;br&gt;
Choose them because they &lt;strong&gt;fit your problem&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  🔥 Want More Like This?
&lt;/h1&gt;

&lt;p&gt;If this helped you, I can write next:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚔️ Kafka vs RabbitMQ deep dive (real production scenarios)&lt;/li&gt;
&lt;li&gt;🧱 Full microservices architecture (NestJS + Kafka + Redis)&lt;/li&gt;
&lt;li&gt;☸️ Deploy everything on Kubernetes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Comment &lt;strong&gt;“PART 2”&lt;/strong&gt; and I’ll drop it 😄&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🚀 NestJS Microservices with RabbitMQ, Retries &amp; DLQ — Production Setup That Actually Scales.</title>
      <dc:creator>codingKrills</dc:creator>
      <pubDate>Tue, 07 Apr 2026 13:09:55 +0000</pubDate>
      <link>https://forem.com/pulkit5ingh/nestjs-microservices-with-rabbitmq-retries-dlq-production-setup-that-actually-scales-55eh</link>
      <guid>https://forem.com/pulkit5ingh/nestjs-microservices-with-rabbitmq-retries-dlq-production-setup-that-actually-scales-55eh</guid>
      <description>&lt;h2&gt;
  
  
  🚀 NestJS Microservices with RabbitMQ, Retries &amp;amp; DLQ — Production Setup That Actually Scales
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;❌ Stop building fragile microservices that silently fail.&lt;br&gt;
✅ Start building systems that &lt;strong&gt;retry, recover, and scale automatically&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you're using NestJS and not handling &lt;strong&gt;failures, retries, and dead-letter queues (DLQ)&lt;/strong&gt; properly… your system will break in production. Period.&lt;/p&gt;

&lt;p&gt;In this guide, I’ll show you a &lt;strong&gt;battle-tested architecture&lt;/strong&gt; using &lt;strong&gt;NestJS + RabbitMQ&lt;/strong&gt; with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔁 Retries&lt;/li&gt;
&lt;li&gt;💀 Dead Letter Queues (DLQ)&lt;/li&gt;
&lt;li&gt;⚡ Event-driven communication&lt;/li&gt;
&lt;li&gt;🧱 Scalable microservices&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🧠 What You’ll Build
&lt;/h1&gt;

&lt;p&gt;A real-world system with services like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;authentication&lt;/li&gt;
&lt;li&gt;rbac&lt;/li&gt;
&lt;li&gt;quotation&lt;/li&gt;
&lt;li&gt;packages&lt;/li&gt;
&lt;li&gt;generate-quotation-pdf&lt;/li&gt;
&lt;li&gt;generate-quotation-ai&lt;/li&gt;
&lt;li&gt;subscription-plans&lt;/li&gt;
&lt;li&gt;user-subscriptions&lt;/li&gt;
&lt;li&gt;notifications&lt;/li&gt;
&lt;li&gt;send-otp&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🏗️ Architecture Overview
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API Gateway → RabbitMQ → Microservices (Consumers)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 No direct service-to-service calls&lt;br&gt;
👉 Fully async &amp;amp; decoupled&lt;/p&gt;


&lt;h1&gt;
  
  
  📁 Monorepo Structure
&lt;/h1&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nestjs-microservices/
│
├── apps/
│   ├── api-gateway/
│   ├── authentication/
│   ├── rbac/
│   ├── quotation/
│   ├── packages/
│   ├── generate-quotation-pdf/
│   ├── generate-quotation-ai/
│   ├── subscription-plans/
│   ├── user-subscriptions/
│   ├── notifications/
│   └── send-otp/
│
├── libs/
│   ├── rabbitmq/
│   ├── common/
│   ├── dto/
│   ├── config/
│   └── utils/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;👉 Clean separation = easy scaling&lt;/p&gt;


&lt;h1&gt;
  
  
  📡 Messaging Setup (Core Idea)
&lt;/h1&gt;

&lt;p&gt;Instead of this ❌&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;authService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;validateUser&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We do this ✅&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;auth.validate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Async, scalable, resilient&lt;/p&gt;




&lt;h1&gt;
  
  
  ⚙️ RabbitMQ Configuration (DLQ + Retry)
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;ClientsModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;RABBITMQ_SERVICE&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Transport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RMQ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;urls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;RABBITMQ_URL&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;main_queue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;queueOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;durable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;deadLetterExchange&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dlx&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;deadLetterRoutingKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dlq&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  🔁 Retry Mechanism (The Secret Sauce)
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Main Queue → Retry Queue (TTL) → Main Queue → DLQ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Retry Queue Example:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;queue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;quotation_retry&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;queueOptions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;messageTtl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;deadLetterRoutingKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;quotation_queue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 If a job fails → wait 5s → retry automatically&lt;/p&gt;




&lt;h1&gt;
  
  
  💀 Dead Letter Queue (DLQ)
&lt;/h1&gt;

&lt;p&gt;When retries fail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;EventPattern&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;quotation.dlq&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;handleFailed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DLQ Message:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 No silent failures anymore 🔥&lt;/p&gt;




&lt;h1&gt;
  
  
  📤 Producer Example
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;QuotationProducer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(@&lt;/span&gt;&lt;span class="nd"&gt;Inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;RABBITMQ_SERVICE&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ClientProxy&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

  &lt;span class="nf"&gt;createQuotation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;emit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;quotation.create&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  📥 Consumer Example
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;EventPattern&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;quotation.create&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;RmqContext&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;channel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getChannelRef&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getMessage&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;process&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;channel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;nack&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// goes to DLQ&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  ⚡ Event-Driven Wins
&lt;/h1&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Traditional API&lt;/th&gt;
&lt;th&gt;Event-Driven&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tight coupling ❌&lt;/td&gt;
&lt;td&gt;Loose coupling ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Blocking ❌&lt;/td&gt;
&lt;td&gt;Async ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hard to scale ❌&lt;/td&gt;
&lt;td&gt;Horizontally scalable ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h1&gt;
  
  
  🔥 Real Use Cases
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;📩 send-otp → async SMS&lt;/li&gt;
&lt;li&gt;📄 generate-quotation-pdf → heavy processing&lt;/li&gt;
&lt;li&gt;🤖 generate-quotation-ai → AI calls&lt;/li&gt;
&lt;li&gt;🔔 notifications → emails, push&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Your API stays FAST ⚡&lt;/p&gt;




&lt;h1&gt;
  
  
  🧠 Production Best Practices
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;✅ Use &lt;strong&gt;idempotency keys&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ Add &lt;strong&gt;correlation IDs&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ Monitor DLQ actively&lt;/li&gt;
&lt;li&gt;✅ Scale consumers independently&lt;/li&gt;
&lt;li&gt;✅ Separate queues per service&lt;/li&gt;
&lt;li&gt;✅ Validate DTOs strictly&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🐳 Bonus: Run Everything with Docker
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;rabbitmq&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;rabbitmq:3-management&lt;/span&gt;
  &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5672:5672"&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;15672:15672"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Access dashboard → &lt;code&gt;http://localhost:15672&lt;/code&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  💣 Hard Truth
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;If your system doesn’t handle failure… it’s already broken.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  🚀 Final Takeaway
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Build microservices that don’t just “work”… but &lt;strong&gt;recover, retry, and scale automatically&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  🧠 TL;DR
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Use NestJS + RabbitMQ&lt;/li&gt;
&lt;li&gt;Prefer event-driven architecture&lt;/li&gt;
&lt;li&gt;Implement retries + DLQ&lt;/li&gt;
&lt;li&gt;Scale consumers independently&lt;/li&gt;
&lt;li&gt;Never ignore failures&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  🔥 Want More?
&lt;/h1&gt;

&lt;p&gt;If this helped you, I can next show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;☸️ Kubernetes deployment (auto-scaling microservices)&lt;/li&gt;
&lt;li&gt;📊 Monitoring with Prometheus + Grafana&lt;/li&gt;
&lt;li&gt;🔐 Full auth + API Gateway setup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just comment: &lt;strong&gt;“PART 2”&lt;/strong&gt; 👇&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>backend</category>
      <category>microservices</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>🚨 Stop Writing Messy API Calls in Next.js — Do This Instead (Production-Grade Setup)</title>
      <dc:creator>codingKrills</dc:creator>
      <pubDate>Tue, 31 Mar 2026 21:57:28 +0000</pubDate>
      <link>https://forem.com/pulkit5ingh/stop-writing-messy-api-calls-in-nextjs-do-this-instead-production-grade-setup-23fj</link>
      <guid>https://forem.com/pulkit5ingh/stop-writing-messy-api-calls-in-nextjs-do-this-instead-production-grade-setup-23fj</guid>
      <description>&lt;p&gt;Let me be brutally honest.&lt;/p&gt;

&lt;p&gt;Most Next.js codebases I’ve reviewed lately are a &lt;strong&gt;complete mess when it comes to API handling&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;useEffect&lt;/code&gt; everywhere&lt;/li&gt;
&lt;li&gt;API calls inside components&lt;/li&gt;
&lt;li&gt;No caching&lt;/li&gt;
&lt;li&gt;Broken auth (random logouts 🤡)&lt;/li&gt;
&lt;li&gt;Copy-pasted logic across files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the worst part?&lt;/p&gt;

&lt;p&gt;👉 These apps &lt;em&gt;work&lt;/em&gt;… until they scale.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ The Problem Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;Frontend devs focus a lot on UI…&lt;/p&gt;

&lt;p&gt;But ignore &lt;strong&gt;architecture&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Meanwhile, backend engineers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;design layers&lt;/li&gt;
&lt;li&gt;enforce contracts&lt;/li&gt;
&lt;li&gt;optimize performance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Frontend?&lt;br&gt;
"Just fetch it bro" 😅&lt;/p&gt;


&lt;h2&gt;
  
  
  💡 So I Built This Instead
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;production-grade API layer&lt;/strong&gt; using modern tools:&lt;/p&gt;
&lt;h3&gt;
  
  
  🧱 Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Next.js (App Router)&lt;/li&gt;
&lt;li&gt;Axios (client-side)&lt;/li&gt;
&lt;li&gt;TanStack Query (API state)&lt;/li&gt;
&lt;li&gt;Zustand (global state)&lt;/li&gt;
&lt;li&gt;Zod (validation)&lt;/li&gt;
&lt;li&gt;React Hook Form (forms)&lt;/li&gt;
&lt;li&gt;JWT Auth (with refresh token rotation)&lt;/li&gt;
&lt;/ul&gt;


&lt;h1&gt;
  
  
  🧠 Architecture Overview
&lt;/h1&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ UI Components ]
        ↓
[ Custom Hooks (React Query) ]
        ↓
[ Services Layer ]
        ↓
[ Axios / Fetch Layer ]
        ↓
[ NestJS Backend ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;👉 Clean separation = scalable system&lt;/p&gt;


&lt;h1&gt;
  
  
  🔥 Step 1: STOP Calling APIs in Components
&lt;/h1&gt;
&lt;h3&gt;
  
  
  ❌ Bad
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/api/users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(...)&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  ✅ Good (Service Layer)
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// services/user.service.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;👉 Your components should NEVER know how APIs work.&lt;/p&gt;


&lt;h1&gt;
  
  
  ⚡ Step 2: React Query = Game Changer
&lt;/h1&gt;

&lt;p&gt;Using TanStack Query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;isLoading&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useQuery&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;queryKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;queryFn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;getUsers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  What you get for free:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🚀 caching&lt;/li&gt;
&lt;li&gt;🔁 retries&lt;/li&gt;
&lt;li&gt;⚡ background refetch&lt;/li&gt;
&lt;li&gt;📊 pagination support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 This replaces Redux (for API state)&lt;/p&gt;




&lt;h1&gt;
  
  
  🧩 Step 3: Axios with Interceptors (REAL AUTH)
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// lib/api.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;axios&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_PUBLIC_API_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;withCredentials&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔐 Token Handling (IMPORTANT)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Flow:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request → 401 → Refresh Token → Retry Request
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Interceptor:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;interceptors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;401&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;refreshToken&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Authorization&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;newToken&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;api&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;config&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 This is what separates &lt;strong&gt;amateur apps vs production apps&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  🧠 Step 4: Zustand (Keep It Simple)
&lt;/h1&gt;

&lt;p&gt;Using Zustand:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;create&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;zustand&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;useAuthStore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="kd"&gt;set&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;setAuth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;logout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✔ no boilerplate&lt;br&gt;
✔ super fast&lt;br&gt;
✔ perfect with React Query&lt;/p&gt;


&lt;h1&gt;
  
  
  🛡️ Step 5: Zod = No More API Surprises
&lt;/h1&gt;

&lt;p&gt;Using Zod:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;userSchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why this matters:
&lt;/h3&gt;

&lt;p&gt;Without validation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Backend changes → frontend silently breaks 😬&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With Zod:&lt;br&gt;
✔ strict validation&lt;br&gt;
✔ type safety&lt;br&gt;
✔ safer production&lt;/p&gt;


&lt;h1&gt;
  
  
  🧾 Step 6: Forms That Don’t Lag
&lt;/h1&gt;

&lt;p&gt;Using React Hook Form:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;register&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;handleSubmit&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useForm&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="nx"&gt;onSubmit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;handleSubmit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;onSubmit&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nf"&gt;register&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/form&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✔ minimal re-renders&lt;br&gt;
✔ clean integration with Zod&lt;br&gt;
✔ better UX&lt;/p&gt;


&lt;h1&gt;
  
  
  📁 Step 7: Folder Structure (This is KEY)
&lt;/h1&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/src
  /lib
    api.ts
    fetcher.ts
  /services
    auth.service.ts
    user.service.ts
  /hooks
    useApiQuery.ts
    useApiMutation.ts
  /store
    auth.store.ts
  /schemas
    user.schema.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;👉 This is what makes your app scalable after 6+ months.&lt;/p&gt;


&lt;h1&gt;
  
  
  🧠 Step 8: Custom Hooks = Clean UI
&lt;/h1&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;useApiQuery&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;useQuery&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;queryKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;queryFn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now in UI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useApiQuery&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;getUsers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Clean AF.&lt;/p&gt;




&lt;h1&gt;
  
  
  📊 Diagram: Full Flow
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Component]
   ↓
[useApiQuery]
   ↓
[Service Layer]
   ↓
[Axios Instance]
   ↓
[Interceptor]
   ↓
[NestJS API]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  💥 The Real Difference
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Before:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;messy code&lt;/li&gt;
&lt;li&gt;duplicated logic&lt;/li&gt;
&lt;li&gt;no caching&lt;/li&gt;
&lt;li&gt;auth bugs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  After:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;scalable architecture&lt;/li&gt;
&lt;li&gt;centralized API logic&lt;/li&gt;
&lt;li&gt;automatic caching&lt;/li&gt;
&lt;li&gt;seamless auth flow&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  ⚠️ Controversial Take
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;If you're still using &lt;code&gt;useEffect&lt;/code&gt; for API calls in 2025…&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You're writing &lt;strong&gt;legacy code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Yeah, I said it.&lt;/p&gt;




&lt;h1&gt;
  
  
  🧠 Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Frontend is no longer “just UI”.&lt;/p&gt;

&lt;p&gt;It’s:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;data orchestration&lt;/li&gt;
&lt;li&gt;caching strategy&lt;/li&gt;
&lt;li&gt;auth handling&lt;/li&gt;
&lt;li&gt;performance optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Treat it like backend architecture.&lt;/p&gt;




&lt;h1&gt;
  
  
  🚀 Want This Setup Instantly?
&lt;/h1&gt;

&lt;p&gt;I created a &lt;strong&gt;Cursor AI command&lt;/strong&gt; that generates this entire architecture automatically.&lt;/p&gt;

&lt;p&gt;Drop a comment: &lt;strong&gt;"setup"&lt;/strong&gt;&lt;br&gt;
I’ll share it with you 👇&lt;/p&gt;




&lt;h1&gt;
  
  
  🔥 Tags
&lt;/h1&gt;

&lt;h1&gt;
  
  
  nextjs #nestjs #reactquery #zustand #webdev #typescript #frontend #fullstack #javascript
&lt;/h1&gt;




&lt;p&gt;🚀 Want the full setup?&lt;/p&gt;

&lt;p&gt;I’ve created a Cursor AI command that generates this entire architecture automatically.&lt;/p&gt;

&lt;p&gt;Comment “setup” and I’ll share it 👇&lt;/p&gt;

</description>
    </item>
    <item>
      <title>RESTful API Design: Complete Guide to Best Practices, Architecture, and Real-World Examples (2026).</title>
      <dc:creator>codingKrills</dc:creator>
      <pubDate>Tue, 17 Mar 2026 22:19:02 +0000</pubDate>
      <link>https://forem.com/pulkit5ingh/restful-api-design-complete-guide-to-best-practices-architecture-and-real-world-examples-2026-126g</link>
      <guid>https://forem.com/pulkit5ingh/restful-api-design-complete-guide-to-best-practices-architecture-and-real-world-examples-2026-126g</guid>
      <description>&lt;p&gt;Modern software systems rely heavily on APIs to connect web apps, mobile apps, and backend services. Among various API architectures, &lt;strong&gt;RESTful APIs remain the most widely used standard for building scalable backend systems&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you are building backend services using Node.js, Python, Java, or any modern framework, understanding &lt;strong&gt;REST API design principles and best practices&lt;/strong&gt; is essential for creating maintainable and scalable applications.&lt;/p&gt;

&lt;p&gt;In this complete guide, we will explore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What RESTful APIs are&lt;/li&gt;
&lt;li&gt;REST architecture principles&lt;/li&gt;
&lt;li&gt;Best practices for REST API design&lt;/li&gt;
&lt;li&gt;Real-world API examples&lt;/li&gt;
&lt;li&gt;HTTP methods and status codes&lt;/li&gt;
&lt;li&gt;API versioning and pagination&lt;/li&gt;
&lt;li&gt;Security and authentication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the end of this article, you will understand &lt;strong&gt;how to design production-ready REST APIs used by companies like Stripe, GitHub, and Shopify.&lt;/strong&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  What is a RESTful API?
&lt;/h1&gt;

&lt;p&gt;A &lt;strong&gt;RESTful API (Representational State Transfer API)&lt;/strong&gt; is a web service architecture that allows communication between clients and servers using standard HTTP protocols.&lt;/p&gt;

&lt;p&gt;REST was introduced by &lt;strong&gt;Roy Fielding in 2000&lt;/strong&gt; in his doctoral dissertation and has since become the foundation of modern web APIs.&lt;/p&gt;

&lt;p&gt;A REST API exposes &lt;strong&gt;resources through URLs&lt;/strong&gt; and allows clients to interact with them using HTTP methods such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GET&lt;/li&gt;
&lt;li&gt;POST&lt;/li&gt;
&lt;li&gt;PUT&lt;/li&gt;
&lt;li&gt;PATCH&lt;/li&gt;
&lt;li&gt;DELETE&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example REST API endpoints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET    /users
POST   /users
GET    /users/123
PATCH  /users/123
DELETE /users/123
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each endpoint represents a &lt;strong&gt;resource&lt;/strong&gt;, and the HTTP method determines the action performed.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why REST APIs Are So Popular
&lt;/h1&gt;

&lt;p&gt;REST APIs have become the industry standard because they provide several advantages:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Simplicity
&lt;/h3&gt;

&lt;p&gt;REST uses standard HTTP protocols, making it easy to implement and understand.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Scalability
&lt;/h3&gt;

&lt;p&gt;Stateless architecture allows REST APIs to scale horizontally across multiple servers.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Flexibility
&lt;/h3&gt;

&lt;p&gt;REST APIs can be consumed by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web applications&lt;/li&gt;
&lt;li&gt;Mobile apps&lt;/li&gt;
&lt;li&gt;Microservices&lt;/li&gt;
&lt;li&gt;IoT devices&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Language Independence
&lt;/h3&gt;

&lt;p&gt;REST APIs can be built using any programming language:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;Java&lt;/li&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;Go&lt;/li&gt;
&lt;li&gt;Ruby&lt;/li&gt;
&lt;li&gt;PHP&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Core Principles of REST Architecture
&lt;/h1&gt;

&lt;p&gt;A well-designed REST API follows several architectural constraints.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Client-Server Separation
&lt;/h2&gt;

&lt;p&gt;The client and server operate independently.&lt;/p&gt;

&lt;p&gt;The client handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User interface&lt;/li&gt;
&lt;li&gt;User interactions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The server handles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Business logic&lt;/li&gt;
&lt;li&gt;Database operations&lt;/li&gt;
&lt;li&gt;Authentication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Frontend: React / Next.js
Backend: Node.js API
Database: MongoDB / PostgreSQL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This separation allows teams to develop frontend and backend independently.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. Stateless Communication
&lt;/h1&gt;

&lt;p&gt;REST APIs are &lt;strong&gt;stateless&lt;/strong&gt;, meaning the server does not store client session information.&lt;/p&gt;

&lt;p&gt;Each request must contain all necessary information.&lt;/p&gt;

&lt;p&gt;Example request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /orders
Authorization: Bearer TOKEN
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Better scalability&lt;/li&gt;
&lt;li&gt;Simpler infrastructure&lt;/li&gt;
&lt;li&gt;Improved reliability&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  3. Resource-Based URLs
&lt;/h1&gt;

&lt;p&gt;REST APIs organize data as &lt;strong&gt;resources&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Examples of resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users&lt;/li&gt;
&lt;li&gt;Products&lt;/li&gt;
&lt;li&gt;Orders&lt;/li&gt;
&lt;li&gt;Posts&lt;/li&gt;
&lt;li&gt;Comments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each resource is represented by a URL.&lt;/p&gt;

&lt;p&gt;Examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/users
/products
/orders
/comments
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Important rule:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Always use nouns instead of verbs in URLs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Bad example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/createUser
/updateOrder
/deleteProduct
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Correct REST design:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST   /users
PATCH  /orders/:id
DELETE /products/:id
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  HTTP Methods in REST APIs
&lt;/h1&gt;

&lt;p&gt;REST APIs use HTTP verbs to define actions.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;HTTP Method&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;Retrieve resources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;Create a resource&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PUT&lt;/td&gt;
&lt;td&gt;Replace a resource&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PATCH&lt;/td&gt;
&lt;td&gt;Update partially&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DELETE&lt;/td&gt;
&lt;td&gt;Remove a resource&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Example:&lt;/p&gt;

&lt;p&gt;Create a user:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /users
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Request body:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Pulkit Singh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pulkit@email.com"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;201 Created
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  REST API Status Codes
&lt;/h1&gt;

&lt;p&gt;Proper status codes help clients understand API responses.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;200&lt;/td&gt;
&lt;td&gt;Success&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;201&lt;/td&gt;
&lt;td&gt;Resource created&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;204&lt;/td&gt;
&lt;td&gt;No content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;400&lt;/td&gt;
&lt;td&gt;Bad request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;401&lt;/td&gt;
&lt;td&gt;Unauthorized&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;403&lt;/td&gt;
&lt;td&gt;Forbidden&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;404&lt;/td&gt;
&lt;td&gt;Resource not found&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;Server error&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Example response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt; &lt;span class="m"&gt;200&lt;/span&gt; &lt;span class="ne"&gt;OK&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Pulkit Singh"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Designing RESTful Endpoints
&lt;/h1&gt;

&lt;p&gt;Below is a typical REST API design for a blog platform.&lt;/p&gt;

&lt;p&gt;Posts API&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET     /api/v1/posts
GET     /api/v1/posts/:id
POST    /api/v1/posts
PATCH   /api/v1/posts/:id
DELETE  /api/v1/posts/:id
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Comments API&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET     /api/v1/posts/:postId/comments
POST    /api/v1/posts/:postId/comments
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Users API&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET     /api/v1/users
POST    /api/v1/users
GET     /api/v1/users/:id
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Filtering, Sorting, and Pagination
&lt;/h1&gt;

&lt;p&gt;REST APIs should support &lt;strong&gt;query parameters&lt;/strong&gt; to filter and paginate data.&lt;/p&gt;

&lt;p&gt;Example pagination:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /products?page=2&amp;amp;limit=20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sorting example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /products?sort=price
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Filtering example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /products?category=electronics
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Typical paginated response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"pagination"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"page"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"limit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pagination is critical for performance when dealing with large datasets.&lt;/p&gt;




&lt;h1&gt;
  
  
  API Versioning
&lt;/h1&gt;

&lt;p&gt;APIs evolve over time. Versioning prevents breaking existing clients.&lt;/p&gt;

&lt;p&gt;Recommended format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/api/v1/users
/api/v2/users
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Benefits of versioning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backward compatibility&lt;/li&gt;
&lt;li&gt;Safe feature upgrades&lt;/li&gt;
&lt;li&gt;Easier API maintenance&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Consistent Response Structure
&lt;/h1&gt;

&lt;p&gt;Consistency improves developer experience.&lt;/p&gt;

&lt;p&gt;Success response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Users fetched successfully"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Error response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"User not found"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Authentication and Security
&lt;/h1&gt;

&lt;p&gt;REST APIs must secure endpoints using authentication mechanisms.&lt;/p&gt;

&lt;p&gt;Common methods include:&lt;/p&gt;

&lt;h3&gt;
  
  
  JWT Authentication
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer TOKEN
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  OAuth 2.0
&lt;/h3&gt;

&lt;p&gt;Used by platforms such as Google and GitHub.&lt;/p&gt;

&lt;h3&gt;
  
  
  API Keys
&lt;/h3&gt;

&lt;p&gt;Used by many SaaS APIs.&lt;/p&gt;

&lt;p&gt;Security best practices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validate all inputs&lt;/li&gt;
&lt;li&gt;Implement rate limiting&lt;/li&gt;
&lt;li&gt;Use HTTPS&lt;/li&gt;
&lt;li&gt;Sanitize request data&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Example REST API Implementation (Node.js)
&lt;/h1&gt;

&lt;p&gt;Example Express routes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;getUsers&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/users/:id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;getUser&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;patch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/users/:id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;updateUser&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/users/:id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;deleteUser&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example controller:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getUsers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  REST API Best Practices
&lt;/h1&gt;

&lt;p&gt;To design scalable REST APIs, follow these guidelines:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use nouns in URLs&lt;/li&gt;
&lt;li&gt;Use HTTP methods correctly&lt;/li&gt;
&lt;li&gt;Always return proper status codes&lt;/li&gt;
&lt;li&gt;Implement pagination&lt;/li&gt;
&lt;li&gt;Version your APIs&lt;/li&gt;
&lt;li&gt;Maintain consistent response structures&lt;/li&gt;
&lt;li&gt;Secure APIs with authentication&lt;/li&gt;
&lt;li&gt;Validate request payloads&lt;/li&gt;
&lt;li&gt;Document APIs using Swagger/OpenAPI&lt;/li&gt;
&lt;li&gt;Implement rate limiting&lt;/li&gt;
&lt;/ol&gt;




&lt;h1&gt;
  
  
  Common REST API Design Mistakes
&lt;/h1&gt;

&lt;p&gt;Avoid these common mistakes when designing APIs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Using verbs in endpoint URLs&lt;/li&gt;
&lt;li&gt;Not using proper HTTP status codes&lt;/li&gt;
&lt;li&gt;Returning inconsistent response formats&lt;/li&gt;
&lt;li&gt;Ignoring pagination&lt;/li&gt;
&lt;li&gt;Lack of versioning&lt;/li&gt;
&lt;li&gt;Over-nesting resources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Fixing these issues ensures your API remains maintainable and scalable.&lt;/p&gt;




&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;RESTful APIs remain the backbone of modern web applications. By following REST architecture principles, using proper HTTP methods, implementing pagination, and maintaining consistent responses, developers can build APIs that scale efficiently and provide an excellent developer experience.&lt;/p&gt;

&lt;p&gt;Whether you're building a startup product, SaaS platform, or microservices architecture, mastering REST API design will significantly improve your backend development skills.&lt;/p&gt;

&lt;p&gt;If you follow the practices described in this guide, your APIs will be &lt;strong&gt;clean, scalable, secure, and easy to integrate&lt;/strong&gt; for developers worldwide.&lt;/p&gt;

</description>
      <category>restfull</category>
      <category>fullstack</category>
      <category>api</category>
      <category>webdev</category>
    </item>
    <item>
      <title>VIBE CODE !</title>
      <dc:creator>codingKrills</dc:creator>
      <pubDate>Sun, 16 Nov 2025 20:37:45 +0000</pubDate>
      <link>https://forem.com/pulkit5ingh/vibe-code--fii</link>
      <guid>https://forem.com/pulkit5ingh/vibe-code--fii</guid>
      <description></description>
    </item>
    <item>
      <title>TypeORM + PostgresQL</title>
      <dc:creator>codingKrills</dc:creator>
      <pubDate>Fri, 26 Sep 2025 10:22:57 +0000</pubDate>
      <link>https://forem.com/pulkit5ingh/typeorm-postgresql-1jbk</link>
      <guid>https://forem.com/pulkit5ingh/typeorm-postgresql-1jbk</guid>
      <description>&lt;h1&gt;
  
  
  TypeORM with NestJS &amp;amp; PostgreSQL – Guide
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. Installation &amp;amp; Setup
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--save&lt;/span&gt; @nestjs/typeorm typeorm pg
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Module&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@nestjs/common&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;TypeOrmModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@nestjs/typeorm&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./users/user.entity&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;UsersModule&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./users/users.module&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Module&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nx"&gt;TypeOrmModule&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forRoot&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;postgres&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;localhost&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5432&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;postgres&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;yourpassword&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;database&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;testdb&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;entities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
      &lt;span class="na"&gt;synchronize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="nx"&gt;UsersModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AppModule&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Defining Entities
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Entity&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;PrimaryGeneratedColumn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;nullable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;CreateDateColumn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;UpdateDateColumn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;updatedAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;OneToMany&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Entity&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Post&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;PrimaryGeneratedColumn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;ManyToOne&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Repositories &amp;amp; Services
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Injectable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UsersService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(@&lt;/span&gt;&lt;span class="nd"&gt;InjectRepository&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;usersRepo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Repository&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

  &lt;span class="nf"&gt;findAll&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;usersRepo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;relations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;posts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nf"&gt;findOne&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;usersRepo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findOne&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;where&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="na"&gt;relations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;posts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Partial&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;usersRepo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;usersRepo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Partial&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;usersRepo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;usersRepo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Controller Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Controller&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UsersController&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;usersService&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;UsersService&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nf"&gt;getAll&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;usersService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findAll&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;:id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;getOne&lt;/span&gt;&lt;span class="p"&gt;(@&lt;/span&gt;&lt;span class="nd"&gt;Param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;usersService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findOne&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(@&lt;/span&gt;&lt;span class="nd"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;userData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Partial&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;usersService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;:id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(@&lt;/span&gt;&lt;span class="nd"&gt;Param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;userData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Partial&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;usersService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;userData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;:id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(@&lt;/span&gt;&lt;span class="nd"&gt;Param&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;usersService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Query Examples
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// QueryBuilder&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;usersRepo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createQueryBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;leftJoinAndSelect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user.posts&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;post&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user.age &amp;gt; :age&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;25&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;orderBy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user.name&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ASC&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getMany&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Raw SQL&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;usersRepo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SELECT * FROM "user" WHERE age &amp;gt; $1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Relationships in TypeORM
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;OneToOne: User → Profile
&lt;/li&gt;
&lt;li&gt;OneToMany / ManyToOne: User → Posts
&lt;/li&gt;
&lt;li&gt;ManyToMany: Posts ↔ Tags
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;ManyToMany&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;Tag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tag&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;posts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;JoinTable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nx"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Tag&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. Transactions
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dataSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;manager&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;manager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;User&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;manager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Updated&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  8. Migrations
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx typeorm migration:generate &lt;span class="nt"&gt;-n&lt;/span&gt; CreateUsers
npx typeorm migration:run
npx typeorm migration:revert
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  9. Indexes &amp;amp; Constraints
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;nullable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="nx"&gt;username&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;idx_user_email&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  10. Advanced Tips
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Use QueryBuilder for complex queries with joins, pagination, filtering.
&lt;/li&gt;
&lt;li&gt;Avoid N+1 problems with &lt;code&gt;leftJoinAndSelect&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Use transactions for multi-table operations.
&lt;/li&gt;
&lt;li&gt;Use migrations in production, not &lt;code&gt;synchronize: true&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Combine with Redis caching for heavy reads.
&lt;/li&gt;
&lt;li&gt;Use DTOs + ValidationPipe for input validation.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>postgres</category>
      <category>typescript</category>
      <category>tutorial</category>
      <category>node</category>
    </item>
    <item>
      <title>Nestjs Questions &amp; Answeres.</title>
      <dc:creator>codingKrills</dc:creator>
      <pubDate>Fri, 26 Sep 2025 10:03:00 +0000</pubDate>
      <link>https://forem.com/pulkit5ingh/nestjs-questions-answeres-12pk</link>
      <guid>https://forem.com/pulkit5ingh/nestjs-questions-answeres-12pk</guid>
      <description>&lt;h1&gt;
  
  
  NestJS Interview Questions &amp;amp; Answers
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. What is NestJS and why use it?
&lt;/h2&gt;

&lt;p&gt;NestJS is a progressive Node.js framework built on TypeScript for&lt;br&gt;
building &lt;strong&gt;scalable and maintainable server-side applications&lt;/strong&gt;. It&lt;br&gt;
provides &lt;strong&gt;modularity, dependency injection, and decorators&lt;/strong&gt;, making it&lt;br&gt;
structured like Angular.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. What are modules in NestJS?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  A module is a &lt;strong&gt;container for a feature&lt;/strong&gt; (controllers, providers,
services).&lt;/li&gt;
&lt;li&gt;  Every NestJS app has at least one root module (&lt;code&gt;AppModule&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;  Helps in organizing code into &lt;strong&gt;modular, reusable units&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. What are controllers in NestJS?
&lt;/h2&gt;

&lt;p&gt;Controllers handle &lt;strong&gt;incoming HTTP requests&lt;/strong&gt; and return responses.\&lt;br&gt;
Defined with &lt;code&gt;@Controller()&lt;/code&gt; decorator and route handlers with &lt;code&gt;@Get()&lt;/code&gt;,&lt;br&gt;
&lt;code&gt;@Post()&lt;/code&gt;, etc.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. What are providers/services in NestJS?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Services (providers) hold &lt;strong&gt;business logic&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  They can be injected into controllers or other providers using
&lt;strong&gt;dependency injection&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  Decorated with &lt;code&gt;@Injectable()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. What is Dependency Injection in NestJS?
&lt;/h2&gt;

&lt;p&gt;A design pattern where classes request dependencies from the framework&lt;br&gt;
rather than creating them manually.\&lt;br&gt;
Example: Injecting &lt;code&gt;UsersService&lt;/code&gt; into &lt;code&gt;UsersController&lt;/code&gt; instead of&lt;br&gt;
instantiating it.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. What are decorators in NestJS?
&lt;/h2&gt;

&lt;p&gt;Special functions that add &lt;strong&gt;metadata&lt;/strong&gt;.\&lt;br&gt;
Examples:\&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;@Controller()&lt;/code&gt; -- marks a class as controller\&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@Get()&lt;/code&gt; -- maps a GET request\&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@Injectable()&lt;/code&gt; -- makes a service available for DI&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  7. What are pipes in NestJS?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Pipes are used for &lt;strong&gt;validation and transformation&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  Example: &lt;code&gt;ValidationPipe&lt;/code&gt; automatically validates DTOs against class
validators.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  8. What are interceptors in NestJS?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Interceptors can &lt;strong&gt;transform requests/responses&lt;/strong&gt;, log execution
time, handle caching, etc.&lt;/li&gt;
&lt;li&gt;  Example: LoggingInterceptor to measure API execution time.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  9. What are guards in NestJS?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Guards control &lt;strong&gt;authorization&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  Example: &lt;code&gt;AuthGuard&lt;/code&gt; checks if the user is authenticated before
accessing a route.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  10. What are filters in NestJS?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Exception filters catch &lt;strong&gt;unhandled exceptions&lt;/strong&gt; and format error
responses.&lt;/li&gt;
&lt;li&gt;  Example: &lt;code&gt;HttpExceptionFilter&lt;/code&gt; to customize error messages.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  11. What is Middleware in NestJS?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Middleware runs &lt;strong&gt;before route handlers&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  Used for logging, authentication, parsing, etc.&lt;/li&gt;
&lt;li&gt;  Example: &lt;code&gt;app.use(LoggerMiddleware)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  12. How does NestJS handle database integration?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Via &lt;strong&gt;TypeORM, Sequelize, Prisma, or Mongoose&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  Use &lt;strong&gt;repositories or models&lt;/strong&gt; injected into services to interact
with DB.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  13. What are DTOs in NestJS?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  DTO = Data Transfer Object.&lt;/li&gt;
&lt;li&gt;  Defines the shape of data received or sent.&lt;/li&gt;
&lt;li&gt;  Used with validation decorators like &lt;code&gt;@IsString()&lt;/code&gt;, &lt;code&gt;@IsEmail()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  14. What is the difference between &lt;code&gt;forRoot()&lt;/code&gt; and &lt;code&gt;forFeature()&lt;/code&gt; in modules?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;code&gt;forRoot()&lt;/code&gt; → used in the &lt;strong&gt;root module&lt;/strong&gt; to configure a module
globally (e.g., database connection).&lt;/li&gt;
&lt;li&gt;  &lt;code&gt;forFeature()&lt;/code&gt; → used in &lt;strong&gt;feature modules&lt;/strong&gt; to register entities or
repositories.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  15. How does NestJS support Microservices?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Provides &lt;code&gt;@nestjs/microservices&lt;/code&gt; package.&lt;/li&gt;
&lt;li&gt;  Supports TCP, Redis, Kafka, RabbitMQ, NATS, and gRPC.&lt;/li&gt;
&lt;li&gt;  Uses &lt;strong&gt;message-based communication&lt;/strong&gt; instead of HTTP.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  16. What is the difference between &lt;code&gt;@Module()&lt;/code&gt; imports, providers, controllers, and exports?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;imports&lt;/strong&gt; → modules to import\&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;controllers&lt;/strong&gt; → handle requests\&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;providers&lt;/strong&gt; → services/business logic\&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;exports&lt;/strong&gt; → services to share with other modules&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  17. How does NestJS handle authentication?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Using &lt;strong&gt;Passport.js strategy integration&lt;/strong&gt; (&lt;code&gt;@nestjs/passport&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;  JWT-based authentication is most common.&lt;/li&gt;
&lt;li&gt;  Guard + Strategy pattern (&lt;code&gt;JwtAuthGuard&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  18. What is the lifecycle of a request in NestJS?
&lt;/h2&gt;

&lt;p&gt;Middleware → Guards → Interceptors (before) → Pipes → Controller →&lt;br&gt;
Service → Interceptors (after) → Response → Filters (if error).&lt;/p&gt;




&lt;h2&gt;
  
  
  19. What is the difference between Monorepo and Microservice architecture in NestJS?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Monorepo:&lt;/strong&gt; All apps/services in a single repo with shared code.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Microservice:&lt;/strong&gt; Independent services communicating via
events/messages.&lt;/li&gt;
&lt;li&gt;  NestJS supports both.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  20. How do you implement caching in NestJS?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  Use &lt;code&gt;@nestjs/cache-manager&lt;/code&gt; or Redis.&lt;/li&gt;
&lt;li&gt;  Example: &lt;code&gt;CacheInterceptor&lt;/code&gt; to cache responses.&lt;/li&gt;
&lt;li&gt;  Can also use manual caching with &lt;code&gt;cacheManager.set()&lt;/code&gt; and
&lt;code&gt;cacheManager.get()&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>interview</category>
      <category>backend</category>
      <category>typescript</category>
      <category>node</category>
    </item>
    <item>
      <title>MySQL Queries</title>
      <dc:creator>codingKrills</dc:creator>
      <pubDate>Tue, 23 Sep 2025 16:40:19 +0000</pubDate>
      <link>https://forem.com/pulkit5ingh/mysql-queries-oi4</link>
      <guid>https://forem.com/pulkit5ingh/mysql-queries-oi4</guid>
      <description>&lt;h1&gt;
  
  
  PostgreSQL Important Queries for 5+ Years Experience
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. Database Basics
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;\l  -- Show all databases
\c dbname;  -- Connect to a database
\dt;  -- Show all tables in current schema
\d tablename;  -- Show table structure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. CRUD Operations
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INSERT INTO users (name, email, age) VALUES ('Pulkit', 'pulkit@example.com', 28);
SELECT * FROM users;
UPDATE users SET age = 29 WHERE id = 1;
DELETE FROM users WHERE id = 1;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Filtering &amp;amp; Sorting
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT * FROM orders WHERE status = 'completed' ORDER BY created_at DESC;
SELECT * FROM products WHERE price BETWEEN 100 AND 500;
SELECT * FROM users WHERE id IN (1,2,3);
SELECT * FROM customers WHERE name LIKE 'Pul%';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Joins
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;-- Inner Join
SELECT u.name, o.id, o.amount FROM users u INNER JOIN orders o ON u.id = o.user_id;

-- Left Join
SELECT u.name, o.id FROM users u LEFT JOIN orders o ON u.id = o.user_id;

-- Right Join
SELECT u.name, o.id FROM users u RIGHT JOIN orders o ON u.id = o.user_id;

-- Full Join
SELECT u.name, o.id FROM users u FULL JOIN orders o ON u.id = o.user_id;

-- Cross Join
SELECT * FROM users CROSS JOIN roles;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Grouping &amp;amp; Aggregations
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT status, COUNT(*) FROM orders GROUP BY status;
SELECT user_id, COUNT(*) as total_orders FROM orders GROUP BY user_id HAVING COUNT(*) &amp;gt; 5;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  6. Subqueries
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT name FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount &amp;gt; 500);
SELECT name, (SELECT COUNT(*) FROM orders o WHERE o.user_id = u.id) as total_orders FROM users u;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  7. Common Table Expressions (CTEs)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WITH recent_orders AS (
  SELECT * FROM orders WHERE created_at &amp;gt; NOW() - INTERVAL '30 days'
)
SELECT * FROM recent_orders WHERE status = 'completed';

WITH RECURSIVE employee_hierarchy AS (
  SELECT id, manager_id, name FROM employees WHERE manager_id IS NULL
  UNION ALL
  SELECT e.id, e.manager_id, e.name
  FROM employees e
  INNER JOIN employee_hierarchy eh ON e.manager_id = eh.id
)
SELECT * FROM employee_hierarchy;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  8. Window Functions
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT id, user_id, amount, RANK() OVER (PARTITION BY user_id ORDER BY amount DESC) as rank FROM orders;
SELECT user_id, amount, SUM(amount) OVER (PARTITION BY user_id ORDER BY created_at) as running_total FROM orders;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  9. Indexes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE INDEX idx_users_email ON users(email);
CREATE UNIQUE INDEX idx_unique_username ON users(username);
CREATE INDEX idx_active_users ON users(last_login) WHERE active = true;
DROP INDEX idx_users_email;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  10. Constraints
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ALTER TABLE users ADD CONSTRAINT users_pkey PRIMARY KEY (id);
ALTER TABLE orders ADD CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id);
ALTER TABLE users ADD CONSTRAINT unique_email UNIQUE (email);
ALTER TABLE products ADD CONSTRAINT check_price CHECK (price &amp;gt; 0);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  11. Transactions
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BEGIN;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT;

BEGIN;
DELETE FROM orders WHERE id = 100;
ROLLBACK;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  12. Advanced Queries
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;INSERT INTO users (id, name, email) VALUES (1, 'Pulkit', 'pulkit@example.com')
ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, email = EXCLUDED.email;

SELECT data-&amp;gt;&amp;gt;'name' as username FROM users_json WHERE data-&amp;gt;&amp;gt;'role' = 'admin';
SELECT * FROM posts WHERE tags @&amp;gt; ARRAY['nestjs'];
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  13. Performance Tools
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EXPLAIN SELECT * FROM orders WHERE user_id = 5;
EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 5;
SELECT * FROM pg_stat_activity;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  14. User &amp;amp; Role Management
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE USER devuser WITH PASSWORD 'password';
GRANT ALL PRIVILEGES ON DATABASE mydb TO devuser;
REVOKE ALL PRIVILEGES ON DATABASE mydb FROM devuser;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  15. Backup &amp;amp; Restore
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pg_dump -U username dbname &amp;gt; backup.sql
psql -U username dbname &amp;lt; backup.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Pro Tip:&lt;/strong&gt; Focus on &lt;strong&gt;CRUD, joins, aggregation, CTEs, window functions, indexing, transactions, and JSON operations&lt;/strong&gt; for interviews and high-scale applications.&lt;/p&gt;

</description>
      <category>database</category>
      <category>sql</category>
      <category>postgres</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>MongoDB Queries</title>
      <dc:creator>codingKrills</dc:creator>
      <pubDate>Tue, 23 Sep 2025 16:40:03 +0000</pubDate>
      <link>https://forem.com/pulkit5ingh/mongodb-queries-2pgm</link>
      <guid>https://forem.com/pulkit5ingh/mongodb-queries-2pgm</guid>
      <description></description>
    </item>
    <item>
      <title>S3 uploads</title>
      <dc:creator>codingKrills</dc:creator>
      <pubDate>Tue, 23 Sep 2025 16:39:47 +0000</pubDate>
      <link>https://forem.com/pulkit5ingh/s3-uploads-4230</link>
      <guid>https://forem.com/pulkit5ingh/s3-uploads-4230</guid>
      <description></description>
    </item>
    <item>
      <title>How to set up SSH on a new MacBook (M1) and connect to GitHub</title>
      <dc:creator>codingKrills</dc:creator>
      <pubDate>Sat, 06 Sep 2025 09:29:26 +0000</pubDate>
      <link>https://forem.com/pulkit5ingh/how-to-set-up-ssh-on-a-new-macbook-m1-and-connect-to-github-4mbp</link>
      <guid>https://forem.com/pulkit5ingh/how-to-set-up-ssh-on-a-new-macbook-m1-and-connect-to-github-4mbp</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR (what you'll do)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Check for existing SSH keys.&lt;/li&gt;
&lt;li&gt;Create a new &lt;code&gt;ed25519&lt;/code&gt; SSH key (recommended).&lt;/li&gt;
&lt;li&gt;Add the key to the ssh-agent and macOS Keychain.&lt;/li&gt;
&lt;li&gt;Add the public key to your GitHub account.&lt;/li&gt;
&lt;li&gt;Configure &lt;code&gt;~/.ssh/config&lt;/code&gt; so your key loads automatically.&lt;/li&gt;
&lt;li&gt;Test the connection and switch existing repos to SSH.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Why SSH?
&lt;/h3&gt;

&lt;p&gt;SSH lets your Mac authenticate with GitHub without typing your username/password (or a PAT) for every &lt;code&gt;git push&lt;/code&gt;. It's secure, fast, and the standard for developers.&lt;/p&gt;

&lt;h3&gt;
  
  
  1) Check for existing keys
&lt;/h3&gt;

&lt;p&gt;Open Terminal and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-al&lt;/span&gt; ~/.ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the folder doesn't exist or you don't see &lt;code&gt;id_ed25519&lt;/code&gt;/&lt;code&gt;id_rsa&lt;/code&gt;, you're clear to create a new key. If you see keys you still want to keep, note their names.&lt;/p&gt;

&lt;h3&gt;
  
  
  2) Generate a new key (use &lt;code&gt;ed25519&lt;/code&gt; if possible)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;ed25519&lt;/code&gt; is modern and compact. Replace the email with your GitHub email:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"your_email@example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When prompted for a file to save the key, press Enter to accept the default (&lt;code&gt;~/.ssh/id_ed25519&lt;/code&gt;) unless you want multiple keys. Add a passphrase for an extra layer of security (recommended), or press Enter to leave it empty.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If &lt;code&gt;ed25519&lt;/code&gt; isn’t supported on your system, use RSA:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; rsa &lt;span class="nt"&gt;-b&lt;/span&gt; 4096 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"your_email@example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3) Start the ssh-agent and add your key
&lt;/h3&gt;

&lt;p&gt;Start the agent in your shell session:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;ssh-agent &lt;span class="nt"&gt;-s&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add your new private key to the agent &lt;strong&gt;and&lt;/strong&gt; (on macOS) save the passphrase in the Keychain so you won't need to enter it repeatedly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# On macOS Monterey (12.0) and later (Apple's ssh-add):&lt;/span&gt;
ssh-add &lt;span class="nt"&gt;--apple-use-keychain&lt;/span&gt; ~/.ssh/id_ed25519

&lt;span class="c"&gt;# On older macOS versions (pre-Monterey) you can use:&lt;/span&gt;
ssh-add &lt;span class="nt"&gt;-K&lt;/span&gt; ~/.ssh/id_ed25519

&lt;span class="c"&gt;# Fallback (simple add, no keychain behaviour):&lt;/span&gt;
ssh-add ~/.ssh/id_ed25519
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;If &lt;code&gt;ssh-add --apple-use-keychain&lt;/code&gt; fails&lt;/strong&gt; (e.g. &lt;code&gt;ssh-add: illegal option -- apple-use-keychain&lt;/code&gt;), you're probably using a non-Apple &lt;code&gt;ssh-add&lt;/code&gt; (Homebrew’s OpenSSH). Check which binary is being used with &lt;code&gt;which ssh-add&lt;/code&gt; and use &lt;code&gt;/usr/bin/ssh-add --apple-use-keychain ~/.ssh/id_ed25519&lt;/code&gt; or remove/adjust the Homebrew version.&lt;/p&gt;

&lt;h3&gt;
  
  
  4) Configure &lt;code&gt;~/.ssh/config&lt;/code&gt; so macOS automatically uses your key
&lt;/h3&gt;

&lt;p&gt;Create or edit &lt;code&gt;~/.ssh/config&lt;/code&gt; and add these lines (this makes the ssh-agent use your key and use Keychain on macOS):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Host github.com
  HostName github.com
  User git
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/id_ed25519
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is especially helpful if you have multiple keys or want passphrases remembered.&lt;/p&gt;

&lt;h3&gt;
  
  
  5) Copy the public key and add it to GitHub
&lt;/h3&gt;

&lt;p&gt;Copy the public key to clipboard (macOS):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pbcopy &amp;lt; ~/.ssh/id_ed25519.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or display it for manual copy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.ssh/id_ed25519.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then in GitHub: &lt;code&gt;Settings&lt;/code&gt; → &lt;code&gt;SSH and GPG keys&lt;/code&gt; → &lt;code&gt;New SSH key&lt;/code&gt;. Give it a descriptive title (e.g. &lt;code&gt;MacBook-M1&lt;/code&gt;) and paste the key.&lt;/p&gt;

&lt;h3&gt;
  
  
  6) Test the connection
&lt;/h3&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-T&lt;/span&gt; git@github.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On success you'll see something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hi &amp;lt;your-username&amp;gt;! You've successfully authenticated, but GitHub does not provide shell access.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see &lt;code&gt;Permission denied (publickey)&lt;/code&gt;, continue to the troubleshooting section below.&lt;/p&gt;

&lt;h3&gt;
  
  
  7) Switch an existing repo to SSH (if needed)
&lt;/h3&gt;

&lt;p&gt;Inside your repo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote &lt;span class="nt"&gt;-v&lt;/span&gt;
&lt;span class="c"&gt;# to check current remote, if it shows https, switch it to ssh:&lt;/span&gt;
git remote set-url origin git@github.com:USERNAME/REPO.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or clone using SSH:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone git@github.com:USERNAME/REPO.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Troubleshooting
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;ssh-add: illegal option -- apple-use-keychain&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cause: &lt;code&gt;ssh-add&lt;/code&gt; installed from Homebrew (or another source) doesn't include Apple's &lt;code&gt;--apple-use-keychain&lt;/code&gt; flag.&lt;/li&gt;
&lt;li&gt;Fix: Run &lt;code&gt;which ssh-add&lt;/code&gt; to see which binary is being used. Apple's ssh-add lives at &lt;code&gt;/usr/bin/ssh-add&lt;/code&gt;. Call it directly or remove/adjust the PATH for the Homebrew ssh. See the &lt;code&gt;ssh-add --apple-use-keychain&lt;/code&gt; behaviour in &lt;code&gt;man ssh-add&lt;/code&gt; if necessary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Permission denied (publickey)&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Common causes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The private key wasn't loaded to the agent. Run &lt;code&gt;ssh-add -l&lt;/code&gt; to list loaded keys.&lt;/li&gt;
&lt;li&gt;Wrong file permissions on &lt;code&gt;~/.ssh&lt;/code&gt; or key files. Fix with:
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod &lt;/span&gt;700 ~/.ssh
&lt;span class="nb"&gt;chmod &lt;/span&gt;600 ~/.ssh/id_ed25519
&lt;span class="nb"&gt;chmod &lt;/span&gt;644 ~/.ssh/id_ed25519.pub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;You added the wrong public key to GitHub (copy/paste error). Re-copy with &lt;code&gt;pbcopy &amp;lt; ~/.ssh/id_ed25519.pub&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The remote is still using HTTPS — check with &lt;code&gt;git remote -v&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verbose debug output&lt;/strong&gt;&lt;br&gt;
Run a verbose SSH attempt to see what key is being offered:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-vT&lt;/span&gt; git@github.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Multiple GitHub accounts (personal vs work)&lt;/strong&gt;&lt;br&gt;
If you need separate keys for different accounts, create two keys:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# personal&lt;/span&gt;
ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"personal@example.com"&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; ~/.ssh/id_ed25519_personal

&lt;span class="c"&gt;# work&lt;/span&gt;
ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"work@example.com"&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; ~/.ssh/id_ed25519_work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add them to your &lt;code&gt;~/.ssh/config&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Personal
Host github-personal
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_personal
  AddKeysToAgent yes
  UseKeychain yes

# Work
Host github-work
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_ed25519_work
  AddKeysToAgent yes
  UseKeychain yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the host alias when cloning or setting remotes, for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone git@github-personal:yourusername/yourrepo.git
&lt;span class="c"&gt;# or set remote&lt;/span&gt;
git remote set-url origin git@github-work:yourorg/repo.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Extra notes for Apple Silicon (M1) users
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Homebrew installs on M1 use &lt;code&gt;/opt/homebrew&lt;/code&gt; by default; this can install a different &lt;code&gt;ssh&lt;/code&gt;/&lt;code&gt;ssh-add&lt;/code&gt; under &lt;code&gt;/opt/homebrew/bin&lt;/code&gt; which may not support Apple-specific flags. If you face issues with &lt;code&gt;--apple-use-keychain&lt;/code&gt;, check &lt;code&gt;which ssh-add&lt;/code&gt; and use &lt;code&gt;/usr/bin/ssh-add&lt;/code&gt; when necessary.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;zsh&lt;/code&gt; is the default shell on modern macOS. Add &lt;code&gt;ssh-add --apple-load-keychain ~/.ssh/id_ed25519 2&amp;gt;/dev/null&lt;/code&gt; or the &lt;code&gt;ssh-add --apple-use-keychain&lt;/code&gt; command to your &lt;code&gt;~/.zshrc&lt;/code&gt; if you want keys to load automatically after login.&lt;/li&gt;
&lt;/ul&gt;






&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Setup SSH &amp;amp; GitHub on macOS (M1)&lt;/span&gt;

&lt;span class="gu"&gt;## Steps&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; Check for existing keys:

   &lt;span class="p"&gt;```&lt;/span&gt;&lt;span class="nl"&gt;
&lt;/span&gt;
bash
   ls -al ~/.ssh


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

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Generate an ED25519 key (replace email):&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
   ssh-keygen -t ed25519 -C "your_email@example.com"


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

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Start ssh-agent and add key (macOS):&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
   eval "$(ssh-agent -s)"
   ssh-add --apple-use-keychain ~/.ssh/id_ed25519


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

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Add the following to &lt;code&gt;~/.ssh/config&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
text
   Host github.com
     HostName github.com
     User git
     AddKeysToAgent yes
     UseKeychain yes
     IdentityFile ~/.ssh/id_ed25519


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

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Copy the public key and add it to GitHub &lt;code&gt;Settings → SSH and GPG keys&lt;/code&gt;:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
   pbcopy &amp;lt; ~/.ssh/id_ed25519.pub


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

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Test connection:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
   ssh -T git@github.com


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

&lt;/div&gt;

&lt;ol&gt;
&lt;li&gt;Switch an existing repo to SSH:&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
   git remote set-url origin git@github.com:USERNAME/REPO.git


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

&lt;/div&gt;
&lt;h2&gt;
  
  
  Troubleshooting tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ssh-add --apple-use-keychain&lt;/code&gt; not found: run &lt;code&gt;which ssh-add&lt;/code&gt; and ensure you're using &lt;code&gt;/usr/bin/ssh-add&lt;/code&gt; (Apple’s version).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Permission denied (publickey)&lt;/code&gt;: check &lt;code&gt;ssh-add -l&lt;/code&gt;, &lt;code&gt;ssh -vT git@github.com&lt;/code&gt;, and file permissions.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

# Final checklist (quick)
- [ ] Generated a key: `~/.ssh/id_ed25519`
- [ ] Added key to ssh-agent &amp;amp; Keychain
- [ ] Pasted public key into GitHub
- [ ] Confirmed `ssh -T git@github.com` succeeds
- [ ] Updated repo remotes to SSH

---




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

&lt;/div&gt;



</description>
    </item>
  </channel>
</rss>
