1. Home
  2. Nodejs Boilerplate
  3. প্রজেক্ট তৈরী ও কনফিগ করা
  4. ১ ১। userController.js ফাইলে Joi স্কিমা ইমপোর্ট করে

১ ১। userController.js ফাইলে Joi স্কিমা ইমপোর্ট করে

const Joi = require("joi");
const catchAsync = require('../utils/catchAsync');
const ApiError = require("../utils/ApiError");
const  HTTP_STATUS_CODES = require("../constants/httpStatus");
const userService = require("../services/userService");
const {
  createUserSchema,
  updateUserSchema,
  getUserSchema,
  deleteUserSchema,
} = require("../validation/userValidation");

// Create User
const createUser = catchAsync(async (req, res, next) => {
  // Joi Validation for Create User
  const { error } = createUserSchema.validate(req.body);
  if (error) {
    return next(new ApiError(HTTP_STATUS_CODES.BAD_REQUEST, error.details[0].message));
  }

  // Call service to create the user
  const user = await userService.createUser(req.body);

  // Send response if successful
  res.status(HTTP_STATUS_CODES.CREATED).json({
    status: "success",
    data: user,
  });
});

// Get User by ID
const getUserById = catchAsync(async (req, res, next) => {
  // Validate ID using Joi
  const { error } = getUserSchema.validate(req.params);
  if (error) {
    return next(new ApiError(HTTP_STATUS_CODES.BAD_REQUEST, error.details[0].message));
  }

  const userId = req.params.id;

  // Call service to get the user
  const user = await userService.getUserById(userId);
  if (!user) {
    return next(new ApiError(HTTP_STATUS_CODES.NOT_FOUND, "User not found"));
  }

  // Send response if successful
  res.status(HTTP_STATUS_CODES.OK).json({
    status: "success",
    data: user,
  });
});

// Update User
const updateUser = catchAsync(async (req, res, next) => {
  // Joi Validation for Update User
  const { error } = updateUserSchema.validate(req.body);
  if (error) {
    return next(new ApiError(HTTP_STATUS_CODES.BAD_REQUEST, error.details[0].message));
  }

  // Call service to update the user
  const updatedUser = await userService.updateUser(req.params.id, req.body);
  if (!updatedUser) {
    return next(new ApiError(HTTP_STATUS_CODES.NOT_FOUND, "User not found"));
  }

  // Send response if successful
  res.status(HTTP_STATUS_CODES.OK).json({
    status: "success",
    data: updatedUser,
  });
});

// Delete User
const deleteUser = catchAsync(async (req, res, next) => {
  // Validate ID using Joi
  const { error } = deleteUserSchema.validate(req.params);
  if (error) {
    return next(new ApiError(HTTP_STATUS_CODES.BAD_REQUEST, error.details[0].message));
  }

  const userId = req.params.id;

  // Call service to delete the user
  const result = await userService.deleteUser(userId);
  if (!result) {
    return next(new ApiError(HTTP_STATUS_CODES.NOT_FOUND, "User not found"));
  }

  // Send response if successful
  res.status(HTTP_STATUS_CODES.NO_CONTENT).send();
});

// Get All Users
const getAllUsers = catchAsync(async (req, res, next) => {
  const users = await userService.getAllUsers();

  res.status(HTTP_STATUS_CODES.OK).json({
    status: "success",
    data: users,
  });
});

module.exports = {
  createUser,
  getUserById,
  updateUser,
  deleteUser,
  getAllUsers,
};

Joi এর মাধ্যমে ভ্যালিডেশন ব্যবহারের সুবিধা

  1. ভ্যালিড ইনপুট নিশ্চিত: Joi-এর মাধ্যমে আমরা ইনপুট ডেটা চেক করে নিতে পারি। এই প্রক্রিয়াটি সহজে সঠিক ডেটা যাচাই করতে সাহায্য করে।
  2. সহজ ভ্যালিডেশন মেসেজিং: যদি কোনো ভ্যালিডেশন এরর থাকে, তাহলে Joi এর ডিফল্ট এরর মেসেজই সরাসরি ব্যবহারকারীদের দেখানো যায়, যা পরিষ্কার বোঝায় সমস্যা কোথায়।
  3. কোড মডুলারিটি: আমরা ভ্যালিডেশনগুলো validation/userValidation.js ফাইলে রেখেছি, যা আমাদের কোডকে মডুলার এবং পুনরায় ব্যবহারযোগ্য করেছে।

এখন Joi সহ কন্ট্রোলার আরও কার্যকরী হয়েছে, এবং আমরা সব ধরনের ইনপুট ডেটা যাচাই করে নিতে পারছি, যাতে ডেটাবেসে শুধুমাত্র সঠিক ডেটা পাঠানো হয়।

How can we help?