File Folder Structure And Code


npm setup

সর্বপ্রথমে কমান্ড লাইনে npm init --y কমান্ড দিয়ে প্যাকেজ.জেসন ফাইল টি ক্রিয়েট করতে হবে। npm init --y

তারপর এই প্যাকেজ গুলো ইনিস্ট্রল করতে হবে।

সব গুলো এক সাথে ইনিস্ট্রল করতে এই কমান্ড টি প্রেস করুনnpm i express nodemon mysql multer express-mongo-sanitize express-rate-limit mongoose body-parser cookie-parser cors dotenv helmet hpp jsonwebtoken xss-clean


নিম্নে একটি প্রোজেক্টের কোড দেওয়া হলো, যেগুলো দিয়ে কমপ্লিট একটি প্রজেক্ট করা যাবে।
প্রজেক্ট টিতে প্রোপাইল তৈরি করা যায়, সেই প্রোফাইলে লগিন করা যায়, প্রোফাইল আপডেট করা যায়, সেই প্রোফাইল দিয়ে একটি টুডু তৈরি করা যায়, সেই টুডু আপডেট করা যায়, সেই টুডু কে ভিবিন্ন ভাবে খোজা যায় এবং এই টুডু কে ডিলেট করা যায়, নিম্নে ডোকুমেন্টেশনের লিং দেওয়া হলো
Documention দেখতে ক্লিক করুন

কন্ট্রোলারের মধ্যে সকল ফাইলকে কনট্রল করবে, রাউটারের ইন্ড পয়েন্ট এইখানে এসে সেস হবে, এখান থেকে দেখিয়ে দেওয়া হবে ডাটা কোন ভাবে সেভ হবে।



লগিন করার সময় একটা টোকেন ক্রিয়েট করবে, নিম্নে টোকেন ক্রিয়েট করার কোড দেওয়া হলো।

কোড Profile Control


  const ProfileModel = require("../Models/ProfileModel")
  const Jwt = require("jsonwebtoken")
  
  
  // Create Profile
  exports.CreateProfile=(req, res)=>{
      
      let RequestBody = req.body;
  
      ProfileModel.create(RequestBody,(error, Data)=>{
          if(error){
              res.status(400).json({status:"Data Insert Fail From ProfileModel", data:error,})
          }else{
              res.status(200).json({status:"Data insert Success or Data save success", data:Data,})
          }
      })
  
  }
  
  
  // User Login 
  exports.UserLogin=(req, res)=>{
      
      let RequestBody = req.body;
      let UserNameFind = RequestBody["UserName"];
      let PasswordFind = RequestBody["Password"];
  
      ProfileModel.find({UserName: UserNameFind,},(err, data)=>{
  
              if(data.length > 0){
                  // Create Auth Token // authontication token // টোকেন তৈরি করা হয়েছে
                  let Paylod = {
                      exp: Math.floor(Date.now() / 100) + (24 * 60 * 60), //২৪ ঘন্টা এই টোকেনের মেয়াদ থাকবে
                      data: data
                  }
                  let token = Jwt.sign(Paylod, "123456789") // ১২৩৪৫৬৭৮৯ হচ্ছে সিক্রেট কি
                  res.status(200).json({login:"Login Success",toekn:token, Data:data, data: data})
              }
  
              else{
                  res.status(401).json({status:"401 unathorize, Login Fail, Please Type Sure Name and Password"})
              }
          })
  
  
  
  
  }
  
  
  //Select Profile 
  exports.SelectProfile=(req, res)=>{
      
      let UserName = req.headers['UserName']
  
      ProfileModel.find({UserName:UserName},function(error, Data){
          if(error){
              res.status(400).json({status:"Select Profile Fail, an sure UserName", data:error})
          }
          else{
              res.status(200).json({status:"Select Profile success, see profile data", data:Data})
          }
      })
  
  }
  
  
  
  
  
  //Update Profile 
  exports.UpdateProfile=(req, res)=>{
      
      let UserName = req.headers['UserName']
      let RequestBody = req.body;
  
      ProfileModel.updateOne({UserName:UserName},{$set:RequestBody}, {upsert:true},(error,data)=>{
  
          if(error){
              res.status(400).json({status:"Update Profile Fail", data:error})
          }
          else{
              res.status(200).json({status:"Update Profile success, see profile data", data:data})
          }
  
  
      })
  
  }  

                        

কোড ToDo Control


  const ToDoListModel = require("../Models/ToDoListModel")
  const Jwt = require("jsonwebtoken")
  
  
  // Create Profile
  exports.ToDoListModel=(req, res)=>{
      
      let RequestBody = req.body;
  
      let UserName = req.headers["UserName"];
      let ToDoSubject = RequestBody["ToDoSubject"];
      let ToDoDescription = RequestBody["ToDoDescription"];
      let ToDoStatus = "New";
      let ToDoCreateDate = Date.now();
      let ToDoUpdateDate = Date.now();
  
      let PostBody = {
          UserName: UserName,
          ToDoSubject: ToDoSubject,
          ToDoDescription: ToDoDescription,
          ToDoStatus: ToDoStatus,
          ToDoCreateDate: ToDoCreateDate,
          ToDoUpdateDate: ToDoUpdateDate
      }
  
      ToDoListModel.create(PostBody,(error, Data)=>{
          if(error){
              res.status(400).json({status:"ToDo List Create Fail From ToDo List Model", data:error,})
          }else{
              res.status(200).json({status:"ToDo List insert Success or ToDo List save success", data:Data,})
          }
      })
  
  }
  
  
  
  
  
  //Select ToDo 
  exports.SelectToDo=(req, res)=>{
      
      let UserName = req.headers['UserName']
  
      ToDoListModel.find({UserName:UserName},function(error, Data){
          if(error){
              res.status(400).json({status:"Select ToDo Fail, an sure UserName", data:error})
          }
          else{
              res.status(200).json({status:"Select ToDo success, see profile data", data:Data})
          }
      })
  
  }
  
  
  
  
  
  //Update ToDo 
  exports.UpdateToDo=(req, res)=>{
      
      let ToDoSubject = req.body["ToDoSubject"]
      let ToDoDescription = req.body["ToDoDescription"]
      let _id = req.body["_id"]
  
      let ToDoUpdateDate = Date.now();
  
      let PostBody = {
          ToDoSubject:ToDoSubject,
          ToDoDescription: ToDoDescription,
          ToDoUpdateDate: ToDoUpdateDate
      }
      
      ToDoListModel.updateOne({_id:_id}, {$set:PostBody}, {upsert:true}, (error, data)=>{
          if(error){
              res.status(400).json({status:"Update ToDo Fail", data:error})
          }
          else{
              res.status(200).json({status:"Update ToDo success, see profile data", data:data})
          }
      })
  
  
  }
  
  
  
  
  //Status Update ToDo 
  exports.StatusUpdateToDo=(req, res)=>{
      
      let ToDoStatus = req.body["ToDoStatus"]
      let _id = req.body["_id"]
  
      let ToDoUpdateDate = Date.now();
  
      let PostBody = {
          ToDoStatus:ToDoStatus,
          ToDoUpdateDate: ToDoUpdateDate
      }
      
      ToDoListModel.updateOne({_id:_id}, {$set:PostBody}, {upsert:true}, (error, data)=>{
          if(error){
              res.status(400).json({status:"Status Update ToDo Fail", data:error})
          }
          else{
              res.status(200).json({status:"Status Update ToDo success, see profile data", data:data})
          }
      })
  
  
  }
  
  
  
  
  //Remove ToDo 
  exports.RemoveToDo=(req, res)=>{
      
      let _id = req.body["_id"]
      
      ToDoListModel.remove({_id:_id}, (error, data)=>{
          if(error){
              res.status(400).json({status:"Remove or Delete ToDo Fail", data:error})
          }
          else{
              res.status(200).json({status:"Remove or Delete ToDo success, see profile data", data:data})
          }
      })
  
  
  }
  
  
  
  
  
  //Select ToDo By Status
  exports.SelectToDoByStatus=(req, res)=>{
      
      
      let UserName = req.headers['UserName']
  
      let ToDoStatus = req.body['ToDoStatus']
  
      ToDoListModel.find({UserName:UserName, ToDoStatus:ToDoStatus},function(error, Data){
          if(error){
              res.status(400).json({status:"Select ToDo Status Fail, an sure UserName", data:error})
          }
          else{
              res.status(200).json({status:"Select ToDo Status success, see profile data", data:Data})
          }
      })
  
  }
  
  
  
  
  
  //Filter By Date ToDo
  exports.FilterByCreateDateToDo=(req, res)=>{
  
  
      let UserName = req.headers['UserName']
  
  
      let FromDateToDo = req.body['FromDateToDo']
      let ToDaTeToDo = req.body['ToDaTeToDo']
  
      //কন্ডিশনার দিয়ে কোন তারিখ থেকে কোন তারিখে টুডু তৈরি করা হয়েছে সেগুলো ছলে আসবে
      ToDoListModel.find({UserName:UserName, ToDoCreateDate:{$gte:new Date(FromDateToDo), $lte:new Date(ToDaTeToDo)}},function(error, Data){
          if(error){
              res.status(400).json({status:"Select ToDo Status Fail, an sure UserName", data:error})
          }
          else{
              res.status(200).json({status:"Select ToDo Status success, see profile data", data:Data})
          }
      })
  
  }

                        

প্রোপাইল তৈরি করার সময় টোকেন ক্রিয়েট করা হয়, মিডেলওয়্যার ফাইলে টোকেন টিকে ভ্যারিফাই করা হয়, উপরের কোড গুলোতে মিডেলওয়্যার তৈরি করা হয়েছে।
এই ফাইলে টোকেন টিকে ভ্যারিফাই করে বডিতে UserName নামে স্টোর করা হয়েছে।


টোকেন তৈরি করার কোড


টোকেন ভ্যারিফাই করার কোড, এখানে টোকেন ভ্যারিফাই করা হেডারে UserNmae নামে স্টোর করা হয়েছে।

কোড


  const Jwt = require("jsonwebtoken");

  module.exports=(req, res, next)=>{
  
      let Token = req.headers["token-key"]
  
      Jwt.verify(Token, "123456789", (err, decode)=>{ //১২৩৪৫৬৭৮৯ হচ্ছে সিক্রেট কি, টোকেন যদি ঠিক থাকে তাহলে ডিকোড করে দিবে।
          
          if(err){
              res.status(401).json({status:"unauthorize, jwt auth token fail, middlewae fail", status_t:"decode fail"})
          }
          else{
              // তৈরি করা টোকেন ভেঙ্গে সেখান থেকে ইউজার নেম কে একটা ভ্যারিয়েবলে স্টোর করা হয়েছে
              let UserName = decode.data[0].UserName;
              req.headers.UserName = UserName; 
              // get UserName ইউজার নেম কে ইনকোড করে বডিতে এড করা হয়েছে
  
              next();
          }
      })
  
  }

                        

ডাটা কোন আকারে সেভ হবে, কি কি ডাটা সেভ হবে, কোথায় সেভ হবে সেই সব কিছু ডাটা মডেলে থাকে।



Profile Model কোড



  const Mongose = require("mongoose");

  const DataSchema =  Mongose.Schema(
      {
        FirstName:{type:String},
        LastName:{type:String},
        EmailAddress:{type:String},
        MobileNumber:{type:String},
        City:{type:String},
        UserName:{type:String, unique:true},
        Password:{type:String},
      },{
          versionKey:false
      }
  );
  
  const ProfileModel =  Mongose.model("Profile", DataSchema);
  
  
  module.exports = ProfileModel;

                        

ToDo Model কোড


  const Mongose = require("mongoose");

  const DataSchema =  Mongose.Schema(
      {
          UserName:{type:String},
          ToDoSubject:{type:String},
          ToDoDescription:{type:String},
          ToDoStatus:{type:String, default:"New"},
          ToDoCreateDate:{type:Date, default:Date.now()},
          ToDoUpdateDate:{type:Date, default:Date.now()}
  
      },{
          versionKey:false
      }
  );
  
  const ToDoListModel =  Mongose.model("ToDoList", DataSchema);
  
  
  module.exports = ToDoListModel;

                        

Router রাউটার পোল্ডারে router.js, api.js ফাইলগুলো থাকে, যেগুলো ভিবিন্ন রাউটারে লিং link তৈরি করে বা api তৈরি করে।


কোড



  // Profile Controller 
  const ProfileController = require("../Controller/ProfileController.js");
  
  
  // ToDo List Controller 
  const ToDoListController = require("../Controller/ToDoListController.js");
  
  // Auth Verify Middleware 
  const AuthVerifyMiddleware = require("../Middleware/AuthVerifyMiddleware.js");
  
  
  
  const Express = require("express");
  const Router =  Express.Router()
  
  // Profile Create Api 
  Router.post("/ProfileCreate", ProfileController.CreateProfile)
  
  // User Login Api 
  Router.post("/UserLogin", ProfileController.UserLogin)
  
  // Select Profile 
  Router.get("/SelectProfile",AuthVerifyMiddleware, ProfileController.SelectProfile)
  
  // Update Profile
  Router.post("/UpdateProfile",AuthVerifyMiddleware, ProfileController.UpdateProfile)
  
  
  
  
  
  // ToDo List Create 
  Router.post("/CreateToDo",AuthVerifyMiddleware, ToDoListController.ToDoListModel)
  
  // Select ToDo 
  Router.get("/SelectToDo",AuthVerifyMiddleware, ToDoListController.SelectToDo)
  
  // Update ToDo 
  Router.post("/UpdateToDo",AuthVerifyMiddleware, ToDoListController.UpdateToDo)
  
  // Status Update ToDo
  Router.post("/StatusUpdateToDo",AuthVerifyMiddleware, ToDoListController.StatusUpdateToDo)
  
  // Remove ToDo 
  Router.post("/RemoveToDo",AuthVerifyMiddleware, ToDoListController.RemoveToDo)
  
  // Select ToDo By Status
  Router.post("/SelectToDoByStatus",AuthVerifyMiddleware, ToDoListController.SelectToDoByStatus)
  
  // Filter By Create DateT oDo
  Router.post("/FilterByCreateDateToDo",AuthVerifyMiddleware, ToDoListController.FilterByCreateDateToDo)
  
  // Documention Post Man this project 
  // https://documenter.getpostman.com/view/22317575/2s935oKibC
  
  module.exports = Router;

                        

App ফাইলে সকল গুরুত্বপূর্ণ কাজ করা হয়, যা নিম্নে ইমেজ লক্ষ করলে বুজা যাবে।



কোড



  //Basic Lib Import
  const express = require("express");
  const Router = require("./Src/Routers/Api.js");
  const App = new express();
  const BodyParser = require("body-parser");
  
  
  // Security Middleware Lib Import
  const RateLimiter = require("express-rate-limit");
  const Helmet = require("helmet")
  const MongoSanitize = require("express-mongo-sanitize");
  const Xss = require("xss-clean");
  const Hpp = require("hpp");
  const Cors = require("cors");
  
  
  // Database Configuration
  const Mongose = require("mongoose");
  
  
  // Security Middleware Implement 
  App.use(Cors())
  App.use(Helmet())
  App.use(MongoSanitize())
  App.use(Xss())
  App.use(Hpp())
  
  
  // Body Parser Implement 
  App.use(BodyParser.json())
  
  
  // Request Rate Limite 
  const Limiter =  RateLimiter(
          {
              windowMs: 15 * 60 * 1000, // 15 Minute
              max: 3000 // 3000 request
          }
      )
  App.use(Limiter)
  
  
  
  // Mongo DB Database Connection 
  let Url = "mongodb://127.0.0.1:27017/ToDo"  // ToDo হচ্ছে মঙ্গোডিভি ডাটাবেসের নাম, যে আগেই তৈরি করে নিতে হবে। 
  // let OPTION = {username:"", password:""}
  // Mongose.connect(Url, OPTION(error)=>{
  //     console.log("Mongo DB Datbase Connection Success");
  //     console.log(error)
  // })
  Mongose.connect(Url,(error)=>{
      console.log("Mongo DB Datbase Connection Success");
      console.log(error)
  })
  
  
  // API Create, Or Routing Implement
  App.use("/api/v1", Router)
  
  
  // Undefine Route Or Undefine API 
  App.use("*",(req, res)=>{
      res.status(404)
      res.json(
          {
              Status: "Not Found",
              Data:"Undefine Route Or Rong API"
          }
      )
  })
  
  
  
  module.exports = App;

                        
Index.js ফাইলে যাস্ট সার্ভার রান হবে। আর সকল কাজ App.js এ করা হয়েছে, সে জন্য App.js ফাইলকে রিকোয়ার করা হয়েছে।

কোড


  const App = require("./App.js");

  App.listen(5000, ()=>{
          console.log("Server Run Success Port Address : http://localhost:5000/")
  })

                        

Dotenv || .env

process.env হচ্ছে রিজার্ভ কিওয়ার্ড, process.env লেখার পরে .env ফাইলের মধ্যে থাকা ভ্যারিয়েবল গুলোর নাম দেওয়া হয়।




  RUNNING_PORT=5000

                        

সব গুলো প্যাকেজ ইনিস্ট্রল করতে হবে। সব গুলো কপি করে কমান্ড টি প্রেস করুনnpm i express nodemon mysql multer express-mongo-sanitize express-rate-limit mongoose body-parser cookie-parser cors dotenv helmet hpp jsonwebtoken xss-clean