বাংলা আর্টিকেল:{Prisma CRUD & Posts ,Profile } Learn MERN Stack By Create Real-Estate Project -Part_6

বাংলা আর্টিকেল:{Prisma CRUD & Posts ,Profile } Learn MERN Stack By Create Real-Estate Project -Part_6

(CRUD Prisma Post & Profile section ) ->Create a Real-estate Management Full-Stack Project To Learn React, NodeJs, MongoDB, Prisma And More Web Tools.

ফাঙ্কশনাল প্যারাডাইম এ এক একটা সিঙ্গেল ফাঙ্কশন কে বা এক ফাঙ্কশন থেকে অন্য ফাঙ্কশন কে সিঙ্গেল রেস্পন্সিবিলিটি দেয়া হয়ে থাকে। যাতে করে প্রতিটা ফাঙ্কশন তার একটা স্পেসিফিক কাজের জন্যই ডিফাইনেড হয়।

ঠিক তেমনিভাবে ,আমাদের ক্ষেত্রেও এক একটা সিঙ্গেল ফাইল কে সিঙ্গেল রেস্পন্সিবিলিটি দিব যাতে করে আমাদের বাগ বা এরর খুঁজে বের করা সহজ হয়।

হাজার লাইন কোড থেকে প্রব্লেম খুঁজে বের করার থেকে বেটার আলাদা ফাইল এ ছোট্ট ছোট্ট ফাঙ্কশন এ কোড রাখব যেন সহজে খুঁজে পাই।

ধরো , user এর জন্য user কন্ট্রোলার ও route ,Profile এর জন্য প্রোফাইল কন্ট্রোলার ও route । আবার Posts এর জন্য post কন্ট্রোলার ও route ।

#Hey_Programmers,

তোমাদের সবাইকে স্বাগতম জানাচ্ছি Learn MERN Stack By Create Real-Estate Project -Part_6 । সবাই আশাকরি ভালো আছ এবং আগের চ্যাপ্টার এর প্রাকটিস গুলো খুব ভালোভাবে করেছো।
এই পর্যায় আমাদের প্রজেক্ট এর লার্নিং প্রসেস চলছে ,আমরা জানছি কিভাবে crud নিয়ে কাজ করতে হয় prisma ও rest api ব্যবহার করে।

আজকে আমাদের এজেন্ডা ,one to many রিলেসনশিপ মেইনটেইন করে একজন সিঙ্গেল user এর পোস্ট create করা ,read করা ,update করা ও delete করা ।

💬
If you enjoy my blog, please consider giving it a follow, leaving a friendly comment, and showing your support. Your engagement means the world to me!

Note: তোমাদের ফিডব্যাক খুব দরকার, আমার লেখা কেমন আগাচ্ছে ,ইমপ্রুভমেন্ট কোথায় লাগবে এসব কমেন্ট এ জানালে লেখার ইন্সপারেশন যোগায়।

let's Get start code:

#Make_Post_Route_Scaffolding:

এইটা মোটামুটি কমন ,তুমি প্রত্যেকটা রুট এর জন্য আলাদা আলাদা রাউটার ও কন্ট্রোলার বানাবা। যেমন ধর ,আমাদের পোস্ট রাউটার জন্য router ফোল্ডার এর মধ্যে postRouter.js ,controller ফোল্ডার এর মধ্যে postController.js এবং সার্ভার মানে index.js এর মধ্যে app.use এর মধ্যে postRoute মিডলওয়ার use করবা।

ডিফারেন্ট route আর controller এ এপ্লিকেশন ভাগকরা একটা কমন প্রাকটিস ,তুমি সব সময় চেষ্টা করবে একটা সিঙ্গেল ফাইল কে সিঙ্গেল রেস্পন্সিবিলিটি দেয়ার জন্য।

হ্যা,এটা সত্যি আমরা এখনো ,অতটা ছোট আকারে ভাঙি নি আমাদের application,তবে আমাদের ছোট এপ্লিকেশন এর জন্য এতটুকু ঠিক আছে। আমরা যারা বিগিনার থাকি তারা এর usecase বুজতে পারি না। কিন্তু দিন দিন যত কোড অ্যাড হতে থাকে,কোড বেস বড় হয়, এপ্লিকেশন মেনেজ করা তত জটিল হয়।সুতরাং ,গুরুত্বের সাথে আমাদের এই পর্যায় গুলোকে পর্যবেক্ষণ করা উচিত।

যাইহোক ,তো তুমি তোমার ফোল্ডার আর ফাইল রেডি করে ফেলছো আশাকরি ,যদি না করে থাকো তবে চল শুরু করি :

ফার্স্ট আমরা আমাদের প্রয়োজনীয় ফোল্ডার এর মধ্যে ফাইল গুলোকে তৈরী করে নিচ্ছি:

#controllers/postController.js:

//controllers/postController.js
import prisma from "../config/prismaClient.js";

const posts = async (req, res, next) => {};
const post = async (req, res, next) => {};

const userPost = async (req, res, next) => {};

const updatePost = async (req, res, next) => {};

const deletePost = async (req, res, next) => {};

export { posts, post, userPost, updatePost, deletePost };

আমাদের post গুলোকে add ,read ,update এবং আপাতত ডিলিট করার কাজ করলেই চলবে।

অবশ্যই prisma ইম্পোর্ট করতে ভুল না। এটা আমাদের দরকার হবে।

#routes/postRoute.js:

//routes/postRoute.js
import express from "express";
import {
  deletePost,
  post,
  posts,
  updatePost,
  userPost,
} from "../controllers/postController.js";

const router = express.Router();


router.get("/posts/:authorEmail", posts);
router.get("/post/:postEmail/:postId", post);
router.post("/user/post", userPost);
router.put("/user/posts/:email/:postId", updatePost);
router.delete("/user/posts/:email/:postId", deletePost);

export { router as postRouter };

url এর ক্ষেত্রে সবসময় ক্লিয়ার এবং সিঙ্গুলার ও প্লুরার কনভেনশন ফলো করা ভাল।

যেমন ধর ,

একজন ইউসার এর সব পোস্ট দরকার url দিয়েছি : "/posts/:authorEmail" ।

একজন সিঙ্গেল user এর সিঙ্গেল পোস্ট দরকার url : "/post/:email/:id"

এমন করে url ডিফাইন করলে যেমন ক্লায়েন্ট কে বোঝানো সহজ হবে। তেমনি আমাদের api কনভেনশন রুল ফলো করা হবে।

#index.js:

//index.js
import express, { json } from "express";
import dotenv from "dotenv";
import cors from "cors";
import cookieParser from "cookie-parser";
import { userRouter } from "./routes/userRoute.js";
import { postRouter } from "./routes/postRoute.js";

dotenv.config();
const app = express();
const PORT = process.env.PORT || 3000;

app.use(express.json());
app.use(cookieParser());
app.use(cors());

app.listen(PORT, () => {
  try {
    console.log(`Server is running on ${PORT}`);
  } catch (err) {
    console.log(err);
  }
});

app.use("/api", userRouter);
app.use("/api", postRouter);

আমরা index এর দিকে খেয়াল করলে দেখতে পাব কতটা ক্লিন। এখানে আমরা আমাদের postRouter কে use করেছি। তবে খেয়াল করলে দেখব আমরা একটা url use করছি "/api" জেনারেল ভাবেই আমাদের ব্যাকএন্ড কে সলিড একটা understand provide করে আমাদের এই url ।

এখনসিঙ্গেল user এর সবগুল পোস্ট দেখার জন্য url হবে : localhost:3000/api/posts/authorEmail

আশাকরি বুজতে পারছ।

একই ভাবে আমরা প্রোফাইল এর জন্য কন্ট্রোলার ,এবং route তৈরী করতে পারি। তবে সেটা, থাকবে তোমার টাস্ক।

#Working_With_postController.js:

স্পেসিফিক পোস্ট নিয়ে কাজ করবো ,গত পর্বে আমরা দেখেছিলাম কিভাবে user create করার সময় আমরা তার রিলেটেড পোস্ট তৈরি করতে পারি।

#get_All_Posts_by_postEmail:

পোস্ট কালেকশন এর মধ্যে আমাদের user এর ইমেইল ডিফাইন করা আছে ,ক্লায়েন্ট যখন রিকয়েস্ট দিবে params থেকে user এর ইমেইল কালেক্ট করব in const { authorEmail } = req.params; থেকে ।

// Get all Single user Post
const posts = async (req, res, next) => {
  try {
    const { authorEmail } = req.params;
    const findPost = await prisma.post.findMany({
      where: {
        authorEmail: authorEmail,
      },
    });
    if (!findPost) {
      res.json({
        message: "Email is Incorrect",
        input: {
          authorEmail,
        },
      });
      return;
    }
    res.json({
      message: "Get The All Posts",
      findPost,
    });
  } catch (error) {
    res.status(500).json(error);
  }
};
  1. const posts = async (req, res, next) => {:

    • আমরা অলরেডি দেখেছি যখনি কোন রিকোয়েস্ট বা রেসপন্স হ্যান্ডেল করতে হয় আমরা অসিনক্রোনাস অপারেশন চালায়। এবং সবসময় এই কনভেনশন ফলো করা উচিত। তাই async ফাঙ্কশন ডিফাইন করেছি।
  2. const { authorEmail } = req.params;:

    • এই লাইন Value এক্সট্র্যাক্ট করে authorEmail request parameter থেকে । মূলত যখন HTTP রিকোয়েস্ট চালানো হয় by deafoult আমরা req.params পেয়ে থাকি। সেখান থেকে ডিস্টার্ক্ট করে authorEmail নিয়ে নিয়েছি।
  3. const findPost = await prisma.post.findMany({ ... }):

    • Prisma ডাটাবেস এ কোন সার্চ অপারেশন চালানোর জন্য এই কোয়ারি provide করে। authorEmail মানে ক্লায়েন্ট এর দেয়া ইমেইল এর সাথে ডাটাবেস এ থাকা authorEmail ম্যাচ করে where ক্লোজ এর মাধ্যমে।
  4. if (!findPost) { ... }:

    • আমরা কন্ডিশন চেক করেছি যদি ইমেইল খুঁজে না পায় তবে মেসেজ দিয়ে রিটার্ন করে দিব।
  5. res.json({ ... }):

    • অন্যথায় ইউসার কে ডাটাবেস থেকে পাওয়া তার ইমেইল এর সব পোস্ট গুলোকে রেসপন্স ব্যাক করে দিব।

#আউটপুট :

//request
GET http://localhost:3000/api/posts/1dev@gmail.com
//Result
{
  "message": "Get The All Posts",
  "findPost": {
    "id": "64f92bbd55ce2accf691cf2f",
    "title": "This Is FIrst Blog in Dev Mehedi",
    "authorEmail": "1dev@gmail.com"
  }
}

#get_user_single_post_baseOn_id:

এখানে আমাদের মূল এজেন্ডা হচ্ছে আমরা ইমেইল এর উপর ভিত্তি করে সব পোস্ট নিয়ে আসব, কিন্তু তার সাথে একটা সিঙ্গেল id থাকবে post এর যা আমাদের স্পেসিফিক post response ব্যাক দিবে :

// Get Single Post

const post = async (req, res) => {
  try {
    const { postEmail, postId } = req.params;
    const findPost = await prisma.post.findMany({
      where: {
        authorEmail: postEmail,
        id: postId,
      },
    });
    if (!findPost) {
      res.json({
        message: "Email Or Id is Incorrect",
        input: {
          postEmail,
          postId,
        },
      });
      return;
    }
    res.json({
      message: "Get The Single Post",
      findPost,
    });
  } catch (error) {
    res.status(500).json(error);
  }
};

সবকিছু আগের মতোই জাস্ট email এর সাথে এবারে আমরা ক্লাইন্ট থেকে params এর মধ্যে postId নিব const { postEmail, postId } = req.params

const findPost = await prisma.post.findMany({ ... }) সার্চ কোয়েরি থেকে এগেইন ডাটাবেস এর উপর অপারেশন চালাব তবে, এবারে আমরা where ক্লোজ এ ইমেইল এর সাথে post এর id ও চেক করব।

আমাদের url কিন্তু এবারে একটু চেঞ্জ আছে :GET localhost:3000/api/post/postEmail/postId

#আউটপুট:

//Request 
GET http://localhost:3000/api/post/tanvir2ee3@gmail.com/64f7dc990ad6f656a514b3ca
//response 
{
  "message": "Get The Single Post",
  "findPost": {
    "id": "64f7dc990ad6f656a514b3ca",
    "title": "This Is FIrst Blog",
    "authorEmail": "tanvir2ee3@gmail.com"
  }
}

#Create_Post_According_To_User_Email:

আমাদের এপ্লিকেশন এর ফাঙ্কশনালিটি হিসেবে ,আমরা যখন user তৈরী করছি অলরেডি আমরা user এর posts ডিফাইন করে দিচ্ছি। এবারে আমাদের বেসিক রিকোয়ারমেন্ট হচ্ছে user এর রিলেসন এর উপর ভিত্তি করে, মানে email এর সাথে ম্যাচ করে এমন user এর জন্য পোস্ট create করব।

আমরা দেখেছি মডেল ডিফাইন করার সময় আমাদের পোস্ট গুলো একটা array of object আকারে থাকবে। posts ফিল্ড হচ্ছে একটা array এবং প্রত্যেকটি আলাদাতা আলাদা post তার id ,title ও authorEmail এর সাথে অবজেক্ট আকারে থাকবে।

// create User related posts 
const userPost = async (req, res, next) => {
  try {
    const { email, title } = req.body;
    const findUser = await prisma.user.findFirst({
      where: {
        email: email,
      },
    });

    if (!findUser) {
      res.json({
        message: "User Not In Database!",
        user: email,
      });
      return;
    }

    const createPost = await prisma.post.create({
      data: {
        authorEmail: email,
        title,
      },
    });

    res.json({
      message: "Find The User in Database",
      user: createPost,
    });
  } catch (error) {
    res.status(500).json(error);
  }
};

Now, let's explain each part:

  1. const userPost = async (req, res, next) => {:

    • userPost ফাঙ্কশন incoming requests হ্যান্ডেল করবে ,তুমি এটাকে হ্যান্ডেলার ফাঙ্কশন বলতে পার । আমরা async ব্যবহার করেছি ,কারণ অসিনক্রোনাস বিহেবিওর রিকোয়েস্ট হ্যান্ডেল করছে।
  2. const { email, title } = req.body;:

    • email and title এর ভ্যালু বেরকরে নিয়ে আসছি request body থেকে । HTTP request body এর মাধ্যমে ক্লায়েন্ট আমাদের এই ইনফরমেশন গুলো provide করবে।
  3. const findUser = await prisma.user.findFirst({ ... }):

    • Prisma তার search কোয়ারি এর মাধ্যমে চেক করবে user database এ আছে কিনা। খেয়াল করলে দেখবে আমরা একইভাবে where ক্লোজ এর মাধ্যমে email চেক করে ডাটা findUser ভ্যারিয়েবল এ স্টোর করেছি যেন কন্ডিশন চালাতে পারি।
  4. if (!findUser) { ... }:

    • if কন্ডিশন বলছে !findUser যদি ডাটাবেস এ পাওয়া না যায় তবে ,রেসপন্স ব্যাক করবে user is not in the database এবং return করবে।
  5. const createPost = await prisma.post.create({ ... }):

    • এটাই মূল কোয়েরি যা prisma আমাদের দেয় creates a new post associated with the user । আমরা post কালেকশন এর মধ্যে এই কোয়েরি চালাচ্ছি এবং বলেদিচ্ছি ,নতুন post তৈরী কর data অবজেক্ট এর মধ্যে যার , authorEmail হবে (user's email) এবং title হবে request থেকে পাওয়া টাইটেল।
  6. res.json({ ... }):

    • sucess হলে রেসপন্স ব্যাক করবে ,এবং আমাদের createPost নামে ভ্যারিয়েবল এ যেহেতু কোয়েরি store করেছি তাই আমরা নতুন তৈরী হাওয়া পোস্ট user কে শো করব।

#আউটপুট :

//request 
### Create Post 

POST http://localhost:3000/api/user/post
Content-Type: application/json

{
    "email":"1dev@gmail.com",
    "title":"This Is 2nd Blog in Dev Mehedi"
}
//response 
{
  "message": "Find The User in Database",
  "user": {
    "id": "64f93521b53f636a5e7b05a7",
    "title": "This Is 2nd Blog in Dev Mehedi",
    "authorEmail": "1dev@gmail.com"
  }
}

//User all post request 
GET http://localhost:3000/api/posts/1dev@gmail.com

//response 
{
  "message": "Get The All Posts",
  "findPost": [
    {
      "id": "64f92bbd55ce2accf691cf2f",
      "title": "This Is FIrst Blog in Dev Mehedi",
      "authorEmail": "1dev@gmail.com"
    },
    {
      "id": "64f93521b53f636a5e7b05a7",
      "title": "This Is 2nd Blog in Dev Mehedi",
      "authorEmail": "1dev@gmail.com"
    }
  ]
}

দেখতে পেয়েছ ,কিভাবে আমাদের post গুলি array of অবজেক্ট এর মধ্যে আছে!!

এবারে আমাদের যদি কোন user এর সিঙ্গেল পোস্ট লাগে আমরা id ধরে নিয়ে আসতে পারব।

#Update_Post_According_To_authorEmail:

আচ্ছা এখানে আমাদের একটা ব্যাপার ক্লিয়ার হাওয়া দরকার ।

আমরা সাধারণত কোন কিছু আপডেট করার সময় put মেথড ব্যবহার করে থাকি।

তবে আমরা জানি patch নামে আরো একটা মেথড আমাদের এক্সপ্রেস provide করে।

এদের মধ্যে মূলত স্লাইড একটা পার্থক্য আছে ,যা সাধারণ আমরা সেভাবে ইনফর্মড হই না ,

যেমন ধর put , এই মেথডটা ব্যবহার হয় এন্টায়ার রিসোর্স কে রিপ্লেস করতে। মানে , তোমার কাছে যদি ফুল একটা ওয়েব পেজ থাকে তবে তুমি সম্পূর্ণ webpage এর রিসোর্স চেঞ্জ করতে put ব্যবহার করতে পার।

অন্যদিকে ,patch মেথড শুধুমাত্র স্পেসিফিক জায়গা বা রিসোর্স চেঞ্জ করে। যেমন ,আমাদের একটা full ওয়েবপেজ এ জাস্ট কিছু typo বা টেক্সট চেঞ্জ করা দরকার এমন।

Update Method:

  • "PUT" replaces the entire resource with a new version.

  • "PATCH" makes partial updates to the existing resource.

ছোট করে বলতে হল ,এটা নিয়ে বড়সড় একটা আলোচনা করা সম্ভব। যা আমরা কোনো একটা আর্টিকেল এ দেখব।

যাইহোক ,আমরা আমাদের এই প্রজেক্ট এ put ব্যবহার করছি সহজ রাখার জন্য ,

now ,আমাদের এজেন্ডা হচ্ছে ইমেইল ও id এর উপর ভিত্তি করে আমরা স্পেসিফিক post এর টাইটেল কে আপডেট করব। আর যদি user এর দেয়া টাইটেল ও আমাদের ডাটাবেস এর টাইটেলে একই থাকে তবে কিছুই চেঞ্জ করতে দিব না।

// Update Post By User Single Post
const updatePost = async (req, res, next) => {
  try {
    const { email, postId } = req.params;
    const { title } = req.body;
    const findPost = await prisma.post.findFirst({
      where: {
        authorEmail: email,
        id: postId,
      },
    });

    if (!findPost) {
      res.json({
        message: "Email Or PostID is Incorrect",
        postData: {
          email,
          postId,
        },
      });
      return;
    } else if (findPost.title === title) {
      res.json({
        message: "New Title & Existing Title is Same",
        postData: {
          title,
        },
      });
      return;
    }

    const updatePost = await prisma.post.update({
      where: {
        id: postId,
        authorEmail: email,
      },
      data: {
        title: {
          set: title,
        },
      },
    });

    res.json({
      message: "Update Your Post Details!",
      data: updatePost,
    });
  } catch (err) {
    res.status(500).json(err);
  }
};

তুমি অলরেডি বুঝে গেছো কিভাবে বডি ও params থেকে ভ্যালু নিয়ে আসতে হবে ও সেই সাথে কিভাবে findPost ও if কন্ডিশন চেক করতে হবে। এগুলি সাধারণত রেপিটেটিভ কাজ। তাই আশাকরি এক্সপ্লেইন এর দরকার নাই।

আমরা মূল আলোচায় খেয়াল দেই :

Now, let's explain Update part:

  1. else if (findPost.title === title) { ... }:

    • এই else if কন্ডিশন চেক করে titleডাটাবেস এ থাকা পোস্ট টাইটেল এর সাথে মিলে কিনা । যদি same হয় ,তবে error মেসেজ দিয়ে ,রিটার্ন করে দিব। অন্যথায় ,
  2. const updatePost = await prisma.post.update({ ... }):

    • postId and email ,title ঠিক থাকলে prisma.post.update কোয়েরি use করে data এর মধ্যে টাইটেল পাব সেখানে জাস্ট set কীওয়ার্ড এর মধ্যে নতুন title বসাইয়া দিব।

#আউটপুট

### Update Post 
//Request 
PUT  http://localhost:3000/api/user/posts/1dev@gmail.com/64f93521b53f636a5e7b05a7
Content-Type: application/json

{
    "title":"This is Updated Post Title"
}

//response 
{
  "message": "Get The All Posts",
  "findPost": [
    {
      "id": "64f93521b53f636a5e7b05a7",
      "title": "This is Updated Post Title",
      "authorEmail": "1dev@gmail.com"
    }
  ]
}

#Deletet_Post_By_Id_And_Email:

Post ডিলিট করার জন্য আমাদের দুইটা ব্যাপার মাথায় রাখতে হবে ফার্স্ট ,একজন user চাইলে তার সব গুলো post একবারে ডিলিট করতে পারে আবার একটা সিঙ্গেল পোস্ট ও ডিলিট করতে পারে।

আমরা প্রথমে দেখব ,একজন user এর সিঙ্গেল post ডিলিট করা post id ও ইমেইল এর উপর ডিপেন্ড করে।

//Delete Posts
const deletePost = async (req, res, next) => {
  try {
    const { email, postId } = req.params;

    const findPost = await prisma.post.findFirst({
      where: {
        authorEmail: email,
        id: postId,
      },
    });

    if (!findPost) {
      res.json({
        message: "Your Id And Email Are Not Match!",
      });
      return;
    }
    await prisma.post.delete({
      where: {
        authorEmail: email,
        id: postId,
      },
    });
    res.json({
      message: "Your Post Is Deleted Sucessfully!",
      post: findPost,
    });
  } catch (err) {
    res.status(500).json(err);
  }
};

deletePost হচ্ছে হ্যান্ডেলের ফাঙ্কশন যা ইনকামিং রিকোয়েস্ট প্রসেস করে । এটি URLএর perams থেকে ইমেইল ও post id নেয় । prisma সার্চ কুয়ারি এর মাধ্যমে email and post ID ম্যাচ করে ডাটাবেস থেকে post খুঁজে আনে । যদি পোস্ট খুঁজে না পায় তবে মেসেজ দিবে no post is found,আর যদি পোস্ট খুঁজে পায় তবে পরের প্রসেস এপলাই করবে ।

  1. await prisma.post.delete({ ... }):

    • prisma এর ডিলিট কোয়েরি চালাবে পোস্ট এর উপর । then where ক্লোস এর মধ্যে সার্চ করবে এবং পোস্ট delete করবে based on email and postId

#আউটপুট:

// Request 
### Delete Post 

DELETE http://localhost:3000/api/user/posts/1dev@gmail.com/64f93521b53f636a5e7b05a7

//Response 
{
  "message": "Your Post Is Deleted Sucessfully!",
  "post": {
    "id": "64f7dc990ad6f656a514b3ca",
    "title": "This Is FIrst Blog",
    "authorEmail": "tanvir2ee3@gmail.com"
  }
}

Note: এখানে আমরা যখন const findPost = await prisma.post.findFirst({ where: { authorEmail: email, id: postId, }, }); post ফাইন্ড করব খেয়াল রাখব সিঙ্গেল পোস্ট ফাইন্ড করতে findFirst কোয়েরি ব্যবহার করতে হবে।

#Delete_SingleUser_All_Posts:

একজন সিঙ্গেল user এর সব পোস্ট গুলো ডিলিট করার জন্য আমরা কোন হ্যান্ডলার ফাঙ্কশন বা route বানাই নি।

আমাদের প্রথম কাজ হচ্ছে ফাঙ্কশন বানানো ,route বানান, ফাঙ্কশন এক্সপোর্ট করা ও route এর মধ্যে ফাঙ্কশন ইম্পোর্ট করা।
তুমি অলরেডি জানো, কিভাবে করতে হয় তাই সেটা দেখানোর দরকার নাই আশাকরি।

//Delete single User All Posts

const deletePosts = async (req, res, next) => {
  try {
    const { email } = req.params;

    const findPost = await prisma.post.findMany({
      where: {
        authorEmail: email,
      },
    });

    if (!findPost) {
      res.json({
        message: "Your Email Are Not Match!",
      });
      return;
    }
    await prisma.post.deleteMany({
     where: {
        authorEmail: email,
           },
        });
    res.json({
      message: "Your Posts Is Deleted Sucessfully!",
      post: findPost,
    });
  } catch (err) {
    res.status(500).json(err);
  }
};

আমাদের কোড শুধু দুইটাই মেজর চেঞ্জ করবে।

ফার্স্ট, আমরা এবারে অনলি email এর উপর ডিপেন্ড করে পোস্ট গুলি খুঁজে আনব।

আর সেকেন্ড ,যেভাবে আগে বলেছি prisma.post.findMany কোয়েরি চালাতে হবে একজন ইউসার এর সব পোস্ট দেখার জন্য। এবং post ডিলিট করতে deleteMany কোয়েরি চালাতে হবে await prisma.post.deleteMany post কালেকশন এ।

#আউটপুট:

// Request 
### Delete Posts

DELETE http://localhost:3000/api/user/posts/tanvir@gmail.com

// Response
{
  "message": "Your Post Is Deleted Sucessfully!",
  "post": [
    {
      "id": "64f7f0d975b047caf2be3f5f",
      "title": "This Is FIrst Blog2",
      "authorEmail": "tanvir@gmail.com"
    },
    {
      "id": "64f9fc21d1fc7affd059ecc5",
      "title": "This Is 3nd Blog in Dev Mehedi",
      "authorEmail": "tanvir@gmail.com"
    }
  ]
}

এবারে তুমি সব user এর ডাটা গেট করলে দেখবে যে সিঙ্গেল ইউসার এর পোস্ট ডিলিট করেছো তা আবার empty array হয়ে গেছে।

আশাকরি বুজতে পারছ ।

#Conclusion:

আমাদের সব গুলি crud অপারেশন চালানো হয়ে গেছে। তোমার কাজ থাকবে এর প্রাকটিস হিসেবে প্রোফাইল কালেকশন এর উপর crud অপারেক্শন চালান।

একই কাজ একই ভাবে হবে ,শুধু চেঞ্জ থাকবে url ও কি ফিল্ড নিয়ে কাজ করতে চাই তা।

সবসময় তুমি তোমার মডেল এর উপর খেয়াল রাখবে তাহলে বুঝে যাবে কি করা দরকার।

💡
If you enjoy my blog, please consider giving it a follow, leaving a friendly comment, and showing your support. Your engagement means the world to me!

তাহলে আজকের মত বিদায়।

#devTj #tanvir_mehedi #Prisma #mernstack #javascript