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