Custom Validators তৈরি করা

Data Validation এবং Constraints - টাইপওআরএম (TypeORM) - Web Development

271

Custom Validators in TypeORM

TypeORM একটি শক্তিশালী ORM (Object-Relational Mapping) লাইব্রেরি যা JavaScript এবং TypeScript এর জন্য তৈরি। Custom Validators তৈরি করার মাধ্যমে আপনি আপনার ডেটাবেস মডেলগুলিতে কাস্টম ভ্যালিডেশন যুক্ত করতে পারেন। এটি ডেটার সঠিকতা নিশ্চিত করার জন্য একটি গুরুত্বপূর্ণ টুল, বিশেষ করে যখন আপনি ব্যবহারকারীর ইনপুট বা অন্য কোনো ডেটা প্রক্রিয়া করছেন।

TypeORM নিজে কিছু ভ্যালিডেটর সরবরাহ করে, যেমন @IsString(), @IsInt(), এবং @MinLength(), কিন্তু আপনি কাস্টম ভ্যালিডেটর তৈরি করে আরও কাস্টম এবং জটিল ভ্যালিডেশন যুক্ত করতে পারেন।


Custom Validator তৈরি করার ধাপ

TypeORM-এ কাস্টম ভ্যালিডেটর তৈরি করার জন্য আপনাকে class-validator লাইব্রেরি ব্যবহার করতে হবে। TypeORM নিজে class-validator লাইব্রেরির সাথে ইন্টিগ্রেটেড, যা TypeORM এর সাথে ভ্যালিডেশন সংক্রান্ত কাজ সহজ করে তোলে।

১. class-validator ইনস্টল করা

প্রথমে, আপনার প্রোজেক্টে class-validator এবং class-transformer ইনস্টল করতে হবে:

npm install class-validator class-transformer

২. Custom Validator তৈরি করা

আপনি যখন একটি কাস্টম ভ্যালিডেটর তৈরি করতে চান, তখন class-validator এর ValidatorConstraint এবং ValidatorConstraintInterface ব্যবহার করতে হয়। এই কাস্টম ভ্যালিডেটরটি একটি নির্দিষ্ট শর্ত পূরণ না করলে একটি এরর মেসেজ রিটার্ন করবে।

Custom Validator উদাহরণ:

ধরা যাক, আমরা একটি ভ্যালিডেটর তৈরি করতে চাই যেটি নিশ্চিত করবে যে phone number একটি নির্দিষ্ট ফরম্যাটে রয়েছে, যেমন +1234567890

import { registerDecorator, ValidationOptions, ValidationArguments } from 'class-validator';

// Custom Validator
export function IsPhoneNumber(format: string, validationOptions?: ValidationOptions) {
  return function (object: Object, propertyName: string) {
    registerDecorator({
      name: 'isPhoneNumber',
      target: object.constructor,
      propertyName: propertyName,
      constraints: [format],
      options: validationOptions,
      validator: {
        validate(value: any, args: ValidationArguments) {
          const [format] = args.constraints;
          const phoneNumberRegex = new RegExp(`^${format}$`);
          return typeof value === 'string' && phoneNumberRegex.test(value);
        },
        defaultMessage(args: ValidationArguments) {
          return `Phone number must match the format ${args.constraints[0]}`;
        }
      }
    });
  };
}

এখানে, IsPhoneNumber নামক কাস্টম ভ্যালিডেটর তৈরি করা হয়েছে যা একটি regex প্যাটার্ন নিয়ে কাজ করবে। আপনি যখন এই ভ্যালিডেটরটি ব্যবহার করবেন, তখন এটি ইনপুট ফোন নম্বরটির ফরম্যাট চেক করবে।

৩. Custom Validator Entity-এ ব্যবহার করা

এখন, এই কাস্টম ভ্যালিডেটরটি একটি Entity ক্লাসে ব্যবহার করা যেতে পারে।

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
import { IsPhoneNumber } from "./validators/IsPhoneNumber";  // Custom Validator Import

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  @IsPhoneNumber("+\\d{10}", { message: "Invalid phone number format!" })
  phoneNumber: string;
}

এখানে, User Entity তে phoneNumber ফিল্ডের উপর আমাদের কাস্টম ভ্যালিডেটর IsPhoneNumber ব্যবহার করা হয়েছে। ফোন নম্বরটি +1234567890 ফরম্যাটে থাকতে হবে। যদি তা না হয়, তবে একটি এরর মেসেজ দেখানো হবে।

৪. Validation এবং Error Handling

আপনি যখন ডেটা সেভ করতে বা আপডেট করতে চান, তখন আপনাকে ভ্যালিডেশন প্রয়োগ করতে হবে। TypeORM Entity তে validate() মেথড ব্যবহার করে এই ভ্যালিডেশন সম্পাদিত হয়।

import { validate } from "class-validator";
import { User } from "./entity/User";

async function saveUser() {
  const user = new User();
  user.name = "John Doe";
  user.phoneNumber = "1234567890"; // Invalid phone number
  
  const errors = await validate(user);
  
  if (errors.length > 0) {
    console.log("Validation failed. Errors: ", errors);
  } else {
    console.log("Validation succeeded!");
    // Save user to DB
  }
}

saveUser();

এখানে, validate() মেথডটি ব্যবহার করে আমরা User অবজেক্টের ভ্যালিডেশন চেক করেছি। যদি ভ্যালিডেশন ব্যর্থ হয়, তবে এরর মেসেজ কনসোলে প্রদর্শিত হবে, এবং সফল হলে ডেটাবেসে সেভ করা হবে।

৫. Custom Validator এ Optional Field Handling

ধরা যাক, আপনি চান যে ফোন নম্বর একটি ঐচ্ছিক ক্ষেত্র (optional field) হয়ে থাকুক এবং কেবল তখনই চেক করা হবে যখন এটি প্রদান করা হবে।

export function IsPhoneNumberOptional(format: string, validationOptions?: ValidationOptions) {
  return function (object: Object, propertyName: string) {
    registerDecorator({
      name: 'isPhoneNumberOptional',
      target: object.constructor,
      propertyName: propertyName,
      constraints: [format],
      options: validationOptions,
      validator: {
        validate(value: any, args: ValidationArguments) {
          if (!value) return true; // Skip validation if value is empty
          const [format] = args.constraints;
          const phoneNumberRegex = new RegExp(`^${format}$`);
          return typeof value === 'string' && phoneNumberRegex.test(value);
        },
        defaultMessage(args: ValidationArguments) {
          return `Phone number must match the format ${args.constraints[0]}`;
        }
      }
    });
  };
}

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


সারাংশ

Custom Validators TypeORM-এ একটি শক্তিশালী টুল যা আপনাকে ডেটাবেস মডেলগুলিতে কাস্টম ভ্যালিডেশন যুক্ত করতে সাহায্য করে। class-validator লাইব্রেরির মাধ্যমে TypeORM-এ কাস্টম ভ্যালিডেটর তৈরি এবং ব্যবহার করা যায়। আপনি কাস্টম ভ্যালিডেটর ব্যবহার করে ইমেল ঠিকানা, ফোন নম্বর, পাসওয়ার্ড, ডেটা ফরম্যাট ইত্যাদি ভ্যালিডেশন চেক করতে পারেন। এই ভ্যালিডেটরগুলি Entity-তে ব্যবহার করে সহজে ডেটা ভ্যালিডেশন পরিচালনা করা যায়।

Content added By
Promotion

Are you sure to start over?

Loading...