Data Validation এবং Constraints

টাইপওআরএম (TypeORM) - Web Development

349

TypeORM এবং Data Validation

Data Validation হল ডেটার সঠিকতা এবং নিরাপত্তা নিশ্চিত করার জন্য একটি গুরুত্বপূর্ণ পদক্ষেপ। ডেটাবেসে ইনপুট ডেটা সঠিকভাবে যাচাই না করলে, ডেটা ত্রুটি বা নিরাপত্তা ঝুঁকি তৈরি হতে পারে। TypeORM এর মাধ্যমে, আপনি Data Validation এবং Constraints ব্যবহার করে ডেটার সঠিকতা এবং অখণ্ডতা নিশ্চিত করতে পারেন।

TypeORM সরাসরি ডেটা ভ্যালিডেশন করার জন্য decorators প্রদান করে না, তবে এটি constraints এবং database-level validation ব্যবহার করার জন্য অনেক সুবিধা সরবরাহ করে, যেমন Column Constraints, Custom Validation Logic এবং class-validator প্যাকেজের মাধ্যমে ডেটা ভ্যালিডেশন।


১. Column Constraints

TypeORM-এর Column Constraints ব্যবহার করে ডেটাবেস স্তরে ডেটার অখণ্ডতা নিশ্চিত করা যায়। এর মাধ্যমে আপনি প্রতিটি কলামে কিছু নিয়ম (যেমন NOT NULL, UNIQUE, CHECK) প্রয়োগ করতে পারেন।

Common Column Constraints:

  • NOT NULL: একটি কলামে null মান থাকতে পারবে না।
  • UNIQUE: কলামের মানগুলো একে অপর থেকে আলাদা থাকতে হবে।
  • CHECK: কিছু শর্ত বা সীমা নির্ধারণ করা।

উদাহরণ: Column Constraints ব্যবহার করা

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";

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

  @Column({ type: "varchar", length: 100, unique: true })
  email: string;

  @Column({ type: "varchar", length: 100, nullable: false })
  name: string;

  @Column({ type: "int", check: "age >= 18" })
  age: number;
}

এখানে:

  • email কলামে UNIQUE কন্সট্রেন্ট ব্যবহার করা হয়েছে, যা নিশ্চিত করে যে প্রত্যেকটি ইমেইল আলাদা থাকবে।
  • name কলামে NOT NULL কন্সট্রেন্ট নিশ্চিত করছে যে এই ফিল্ডে কখনও null থাকতে পারবে না।
  • age কলামে CHECK কন্সট্রেন্ট প্রয়োগ করা হয়েছে, যা নিশ্চিত করে যে age এর মান কমপক্ষে ১৮ হতে হবে।

২. Custom Validation Logic

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

class-validator সেটআপ:

  1. class-validator এবং class-transformer ইনস্টল করা:
npm install class-validator class-transformer
  1. Entity ক্লাসে Custom Validation যুক্ত করা:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
import { IsEmail, MinLength, MaxLength, IsInt, Min } from "class-validator";

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

  @Column()
  @IsEmail()
  email: string;

  @Column()
  @MinLength(3)
  @MaxLength(100)
  name: string;

  @Column()
  @IsInt()
  @Min(18)
  age: number;
}

এখানে:

  • @IsEmail() ডেকোরেটর ব্যবহার করে email ফিল্ডের জন্য ইমেইল ঠিকানা যাচাই করা হচ্ছে।
  • @MinLength() এবং @MaxLength() ডেকোরেটর ব্যবহার করে name ফিল্ডের দৈর্ঘ্য সীমাবদ্ধ করা হচ্ছে।
  • @IsInt() এবং @Min() ডেকোরেটর ব্যবহার করে age ফিল্ডের জন্য একাধিক শর্ত যাচাই করা হচ্ছে (এখানে বয়স অবশ্যই ১৮ বা তার বেশি হতে হবে)।

৩. Using ValidationPipe in Express (for API Validation)

TypeORM Entity Validation করতে আপনি যদি Express.js বা NestJS ব্যবহার করেন, তাহলে আপনি ValidationPipe ব্যবহার করতে পারেন যাতে সার্ভারের লেভেলে ডেটা ভ্যালিডেশন করা হয়।

Express এবং ValidationPipe উদাহরণ:

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

app.post("/create", async (req, res) => {
  const user = new User();
  user.email = req.body.email;
  user.name = req.body.name;
  user.age = req.body.age;

  const errors = await validate(user);

  if (errors.length > 0) {
    return res.status(400).send(errors);
  } else {
    // Proceed with saving the user
    // userRepository.save(user);
    res.status(201).send("User created successfully");
  }
});

এখানে, validate() ফাংশনটি ব্যবহার করে আমরা User Entity এর ইনস্ট্যান্সের উপর class-validator যাচাই করছি এবং যদি কোনো ত্রুটি থাকে তবে তা ফেরত পাঠানো হচ্ছে।


৪. Database Constraints এবং Indexing

TypeORM আপনাকে Index তৈরি করার সুযোগও দেয়, যা ডেটার অনুসন্ধান কার্যক্ষমতা বাড়ায়। একটি Entity-তে Index তৈরি করার জন্য @Index ডেকোরেটর ব্যবহার করা হয়।

উদাহরণ: Indexing ব্যবহার করা

import { Entity, PrimaryGeneratedColumn, Column, Index } from "typeorm";

@Entity()
@Index("IDX_USER_EMAIL", ["email"])
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  email: string;

  @Column()
  name: string;
}

এখানে, @Index ডেকোরেটর ব্যবহার করে email কলামের উপর একটি ইনডেক্স তৈরি করা হয়েছে, যা এই কলামের উপর দ্রুত অনুসন্ধান করতে সাহায্য করবে।


৫. Unique Constraints and Custom Error Messages

TypeORM আপনাকে Unique Constraints ব্যবহার করার মাধ্যমে ডেটার একত্রিত হওয়ার ঝুঁকি কমাতে সাহায্য করে। আপনি একটি কাস্টম error message ব্যবহার করতে পারেন যদি ইউজার একই মানের ডেটা ইনপুট দেয়।

উদাহরণ: Unique Constraints এবং Custom Error Messages

import { Entity, PrimaryGeneratedColumn, Column, Unique } from "typeorm";

@Entity()
@Unique(["email"])
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  email: string;

  @Column()
  name: string;
}

এখানে, @Unique(["email"]) ব্যবহার করে email কলামে এক্সট্রা কনস্ট্রেইন্ট যোগ করা হয়েছে যাতে ইমেইল একেবারে ইউনিক হতে হয়। যদি একই ইমেইল ইনপুট করা হয়, তাহলে ডেটাবেস থেকে স্বয়ংক্রিয়ভাবে ত্রুটি আসবে।


সারাংশ

Data Validation এবং Constraints TypeORM-এর গুরুত্বপূর্ণ বৈশিষ্ট্য যা ডেটার সঠিকতা, অখণ্ডতা, এবং নিরাপত্তা নিশ্চিত করতে সাহায্য করে। TypeORM-এ Column Constraints (যেমন NOT NULL, UNIQUE, CHECK), class-validator প্যাকেজ ব্যবহার করে Custom Validation, এবং Indexing এর মাধ্যমে আপনি ডেটাবেসে সঠিক ডেটা সংরক্ষণ করতে পারেন। এছাড়াও, Cascade Operations এবং Unique Constraints ব্যবহারের মাধ্যমে ডেটার একত্রিত হওয়ার ঝুঁকি কমানো যায় এবং ডেটা সঠিকভাবে সংরক্ষিত হয়।

Content added By

Entity Level Validation Overview

Entity Level Validation হলো এমন একটি প্রক্রিয়া যেখানে ডেটা মডেল বা Entity এর ফিল্ডগুলোর মান যাচাই করা হয়। TypeORM এ Decorators ব্যবহার করে আমরা Entity এর প্রপার্টি বা কলামের উপরে বিভিন্ন ধরনের ভ্যালিডেশন প্রয়োগ করতে পারি। এই ধরনের ভ্যালিডেশন আমাদের ডেটাবেসের সাথে কাজ করার আগে ইনপুট ডেটার সঠিকতা নিশ্চিত করতে সাহায্য করে।

TypeORM এর সাথে Entity Level Validation সাধারণত class-validator লাইব্রেরির মাধ্যমে করা হয়। class-validator একটি সাধারণ এবং শক্তিশালী লাইব্রেরি যা TypeScript ক্লাস এবং প্রপার্টিগুলির জন্য ভ্যালিডেশন প্রদান করে। এটি TypeORM এর সাথে একত্রে ব্যবহার করা যায় যাতে Entity প্রপার্টির উপরে বিভিন্ন ধরনের ভ্যালিডেশন চেক করা যায়, যেমন required, maxLength, minLength, email, ইত্যাদি।


TypeORM এবং class-validator সেটআপ

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

ইনস্টলেশন:

npm install class-validator class-transformer

এই দুটি প্যাকেজ ইনস্টল করার পর আপনি Entity Level Validation এর জন্য class-validator এর ডেকোরেটর ব্যবহার করতে পারবেন।


Entity Level Validation: Decorators ব্যবহার করা

class-validator লাইব্রেরি দিয়ে TypeORM Entity-এ বিভিন্ন ধরনের ভ্যালিডেশন ডেকোরেটর ব্যবহার করা হয়। এখানে আমরা কিছু সাধারণ ভ্যালিডেশন ডেকোরেটরের উদাহরণ দেখব।

১. @IsString() – স্ট্রিং ভ্যালিডেশন

এই ডেকোরেটরটি নিশ্চিত করে যে প্রপার্টির মান একটি স্ট্রিং টাইপ।

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
import { IsString } from "class-validator";

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

  @Column()
  @IsString()
  name: string;
}

এখানে @IsString() ডেকোরেটরটি name প্রপার্টির মানের জন্য স্ট্রিং ভ্যালিডেশন প্রয়োগ করছে।

২. @IsEmail() – ইমেইল ভ্যালিডেশন

এই ডেকোরেটরটি নিশ্চিত করে যে প্রপার্টির মান একটি বৈধ ইমেইল ঠিকানা।

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
import { IsEmail } from "class-validator";

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

  @Column()
  @IsEmail()
  email: string;
}

এখানে @IsEmail() ডেকোরেটরটি email প্রপার্টির জন্য ইমেইল ভ্যালিডেশন প্রয়োগ করছে।

৩. @IsInt() – ইন্টিজার ভ্যালিডেশন

এই ডেকোরেটরটি নিশ্চিত করে যে প্রপার্টির মান একটি পূর্ণসংখ্যা (integer)।

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
import { IsInt } from "class-validator";

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

  @Column()
  @IsInt()
  price: number;
}

এখানে @IsInt() ডেকোরেটরটি price প্রপার্টির জন্য পূর্ণসংখ্যা ভ্যালিডেশন প্রয়োগ করছে।

৪. @Length() – স্ট্রিং দৈর্ঘ্য ভ্যালিডেশন

এই ডেকোরেটরটি স্ট্রিং প্রপার্টির দৈর্ঘ্য সীমাবদ্ধ করতে ব্যবহৃত হয়।

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
import { Length } from "class-validator";

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

  @Column()
  @Length(3, 20) // নামের দৈর্ঘ্য ৩ থেকে ২০ অক্ষরের মধ্যে থাকতে হবে
  name: string;
}

এখানে @Length(3, 20) ডেকোরেটরটি name প্রপার্টির জন্য দৈর্ঘ্য সীমাবদ্ধতা সেট করছে। নামের দৈর্ঘ্য অবশ্যই ৩ থেকে ২০ অক্ষরের মধ্যে হতে হবে।

৫. @IsOptional() – ঐচ্ছিক ফিল্ড

এই ডেকোরেটরটি ফিল্ডকে ঐচ্ছিক করে তোলে, অর্থাৎ এটি অবশ্যই পূর্ণ করতে হবে না, কিন্তু থাকলে এটি ভ্যালিড হতে হবে।

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
import { IsOptional, IsString } from "class-validator";

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

  @Column()
  @IsString()
  name: string;

  @Column()
  @IsOptional()
  @IsString()
  address?: string;
}

এখানে, @IsOptional() ডেকোরেটরটি address প্রপার্টিকে ঐচ্ছিক করে দিচ্ছে, অর্থাৎ এটি যদি থাকে, তবে তার মান অবশ্যই স্ট্রিং হতে হবে।

৬. @Min() এবং @Max() – নম্বর সীমা ভ্যালিডেশন

এই ডেকোরেটরটি ব্যবহার করে আপনি সংখ্যা প্রপার্টির জন্য ন্যূনতম এবং সর্বোচ্চ মান সীমা নির্ধারণ করতে পারেন।

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
import { Min, Max } from "class-validator";

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

  @Column()
  @Min(0)
  @Max(1000)
  price: number;
}

এখানে, @Min(0) এবং @Max(1000) ডেকোরেটরগুলি price প্রপার্টির জন্য ন্যূনতম ০ এবং সর্বোচ্চ ১০০০ সীমা নির্ধারণ করছে।


Validation চালানো

TypeORM এ Entity Validation চালানোর জন্য, আপনি class-validator লাইব্রেরির validate ফাংশন ব্যবহার করতে পারেন। উদাহরণস্বরূপ:

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

const user = new User();
user.name = "John";
user.email = "invalid-email";

validate(user).then(errors => {
  if (errors.length > 0) {
    console.log("Validation failed: ", errors);
  } else {
    console.log("Validation succeeded");
  }
});

এখানে, validate(user) ফাংশনটি User Entity এর উপর করা সব ভ্যালিডেশন চেক করবে এবং যদি কোনো ত্রুটি থাকে তবে সেগুলো রিটার্ন করবে।


সারাংশ

Entity Level Validation TypeORM এবং class-validator লাইব্রেরি ব্যবহার করে সহজেই করা যায়। TypeORM এর Entity ফিল্ডগুলোতে বিভিন্ন ভ্যালিডেশন ডেকোরেটর যেমন @IsString(), @IsEmail(), @Length(), ইত্যাদি ব্যবহার করা যায়, যা ডেটার সঠিকতা নিশ্চিত করতে সাহায্য করে। class-validator লাইব্রেরি এবং TypeORM এর সমন্বয়ে আপনি আপনার Entity ডেটার মান পরীক্ষা এবং যাচাই করতে পারবেন, যা অ্যাপ্লিকেশনকে আরও নিরাপদ এবং নির্ভরযোগ্য করে তোলে।

Content added By

TypeORM এবং Database Constraints

Database Constraints হল এমন শর্তাবলী যা ডেটাবেস টেবিলের ডেটা সঠিকতা এবং সামঞ্জস্য নিশ্চিত করতে ব্যবহৃত হয়। এটি ডেটাবেসে অকার্যকর বা অপ্রত্যাশিত ডেটা প্রবেশ করা থেকে রোধ করতে সহায়তা করে। TypeORM ব্যবহার করে আপনি ডেটাবেসে বিভিন্ন ধরনের কনস্ট্রেইন্ট যেমন Unique এবং Foreign Key কনস্ট্রেইন্ট ইজি ভাবে সেট করতে পারেন।

এই গাইডে, আমরা Unique এবং Foreign Key কনস্ট্রেইন্টগুলো TypeORM এ কীভাবে সেট করা যায় তা দেখব।


১. Unique Constraint

Unique Constraint হল একটি কনস্ট্রেইন্ট যা নিশ্চিত করে যে টেবিলের কোনো দুটি রেকর্ডে নির্দিষ্ট কলামের মান কখনও একই হবে না। এটি প্রাথমিকভাবে এমন ক্ষেত্রগুলির জন্য ব্যবহৃত হয় যেখানে প্রতিটি রেকর্ডের জন্য অনন্য (unique) মান থাকতে হবে, যেমন ইমেইল, ইউজার আইডি ইত্যাদি।

TypeORM-এ Unique Constraint তৈরি করতে @Column({ unique: true }) ব্যবহার করা হয়। এটি একটি কলামের উপরে নির্দিষ্ট করা হয় এবং টেবিলের সেগুলোর মান অনন্য হতে বাধ্য করে।

উদাহরণ: Unique Constraint ব্যবহার

ধরা যাক, আমরা একটি User টেবিল তৈরি করতে যাচ্ছি, যেখানে email ফিল্ডটি ইউনিক থাকবে:

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";

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

  @Column({ unique: true })
  email: string;

  @Column()
  name: string;
}

এখানে, @Column({ unique: true }) দিয়ে email ফিল্ডে Unique Constraint যোগ করা হয়েছে, যার ফলে এই ফিল্ডে একাধিক রেকর্ডে একই ইমেইল থাকতে পারবে না।

মাইগ্রেশন তৈরি করা:

যেহেতু আপনি টেবিলের কাঠামো পরিবর্তন করেছেন, তাই একটি নতুন মাইগ্রেশন তৈরি করতে হবে:

typeorm migration:generate -n AddUniqueConstraintToEmail

এরপর মাইগ্রেশন রান করুন:

typeorm migration:run

এভাবে Unique Constraint আপনার ডেটাবেসে যোগ হবে।


২. Foreign Key Constraint

Foreign Key Constraint একটি টেবিলের কলামকে অন্য টেবিলের প্রাইমারি কিকে রেফারেন্স করে। এটি ডেটাবেসে সম্পর্কিত টেবিলগুলির মধ্যে ডেটার ইন্টিগ্রিটি নিশ্চিত করে। Foreign Key কনস্ট্রেইন্ট ব্যবহার করলে আপনি নিশ্চিত করতে পারেন যে এক টেবিলের কোনো রেকর্ড অপর টেবিলের সম্পর্কিত রেকর্ডে থাকা একটি বৈধ মানের সাথে সংযুক্ত রয়েছে।

TypeORM-এ Foreign Key কনস্ট্রেইন্ট তৈরি করতে @ManyToOne এবং @JoinColumn ডেকোরেটর ব্যবহার করা হয়।

উদাহরণ: Foreign Key Constraint ব্যবহার

ধরা যাক, আমরা একটি Post টেবিল তৈরি করছি, যেখানে প্রতিটি Post এর একটি User এর সাথে সম্পর্ক থাকবে (One-to-Many এবং Many-to-One সম্পর্ক)।

import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from "typeorm";
import { User } from "./User";

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

  @Column()
  title: string;

  @ManyToOne(() => User, user => user.posts)
  @JoinColumn({ name: "userId" })
  user: User;
}

এখানে, Post টেবিলের userId কলামটি User টেবিলের id কলামের সাথে সম্পর্কিত। @JoinColumn ডেকোরেটরটি সম্পর্কিত কলামটি যোগ করতে ব্যবহৃত হয় এবং Foreign Key কনস্ট্রেইন্ট তৈরি হয়।

User Entity:

import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from "typeorm";
import { Post } from "./Post";

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

  @Column()
  name: string;

  @OneToMany(() => Post, post => post.user)
  posts: Post[];
}

এখানে, OneToMany ডেকোরেটর ব্যবহার করে একটি User এর একাধিক Post থাকতে পারে, এবং প্রতিটি Post একটি User এর সাথে সম্পর্কিত।

মাইগ্রেশন তৈরি করা:

এখানে Foreign Key কনস্ট্রেইন্ট সেট করা হয়েছে, তাই মাইগ্রেশন তৈরি করতে হবে:

typeorm migration:generate -n AddForeignKeyConstraintToPost

এরপর মাইগ্রেশন রান করুন:

typeorm migration:run

এভাবে Foreign Key Constraint আপনার ডেটাবেসে যোগ হবে, যা Post টেবিলের userId কলামটিকে User টেবিলের id কলামের সাথে সম্পর্কিত করবে।


৩. Composite Unique Constraint

একাধিক কলামের সংমিশ্রণ (Combination) নিয়ে Unique Constraint তৈরি করতে হলে, @Unique ডেকোরেটর ব্যবহার করা হয়। এটি নিশ্চিত করে যে ঐ কলামগুলির সমন্বয়ে কোনো দুইটি রেকর্ড এক হতে পারবে না।

উদাহরণ: Composite Unique Constraint

ধরা যাক, আমাদের একটি User টেবিল আছে যেখানে firstName এবং lastName এর একসাথে ইউনিক হওয়া দরকার:

import { Entity, PrimaryGeneratedColumn, Column, Unique } from "typeorm";

@Unique(["firstName", "lastName"])
@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  firstName: string;

  @Column()
  lastName: string;
}

এখানে, @Unique(["firstName", "lastName"]) দ্বারা আমরা নিশ্চিত করছি যে firstName এবং lastName এর একসাথে কোন দুটি রেকর্ড একই হতে পারবে না।


সারাংশ

TypeORM-এ Unique এবং Foreign Key কনস্ট্রেইন্ট ব্যবহার করে আপনি ডেটাবেসের ইন্টিগ্রিটি এবং ডেটা সম্পর্ক সুনিশ্চিত করতে পারেন। Unique Constraint একটি ফিল্ডের মধ্যে অনন্য মান রাখতে সাহায্য করে, এবং Foreign Key Constraint দুই টেবিলের মধ্যে সম্পর্ক নিশ্চিত করে। এগুলি ব্যবহার করে আপনি ডেটাবেসের ডিজাইন আরও শক্তিশালী এবং সঠিক করতে পারবেন।

Content added By

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

TypeORM Error Handling: একটি পরিচিতি

Error Handling একটি গুরুত্বপূর্ণ বিষয় যখন আপনি TypeORM ব্যবহার করে ডেটাবেস অপারেশন পরিচালনা করেন। TypeORM আপনাকে সঠিকভাবে ব্যতিক্রম (exceptions) ম্যানেজ করার জন্য প্রয়োজনীয় ফিচার প্রদান করে, যাতে আপনি সহজে ডেটাবেসের সমস্যা শনাক্ত করতে পারেন এবং সেগুলোর উপর সঠিকভাবে প্রতিক্রিয়া জানাতে পারেন। সাধারণত, TypeORM এর QueryFailedError, EntityNotFoundError, ConnectionError, ইত্যাদি এরকম বিভিন্ন ত্রুটি ঘটে, যা ডেটাবেস অপারেশন চলাকালে দেখা যায়।


TypeORM Error Handling এর জন্য প্রাথমিক ধারণা

১. Error Class ব্যবহার করা

TypeORM-এ যখন কোনো ত্রুটি ঘটে, তখন তা Error Class হিসেবে রিটার্ন করা হয়। আপনি এই Error Class ব্যবহার করে ত্রুটির ধরন, বার্তা এবং অন্যান্য বিস্তারিত তথ্য পেতে পারেন।

QueryFailedError

TypeORM-এ QueryFailedError সাধারণত তখন ঘটে যখন SQL কোড ঠিকভাবে রান না করতে পারে, যেমন সঠিকভাবে SQL স্টেটমেন্ট পার্স করা না গেলে অথবা ডেটাবেসে নির্দিষ্ট ডেটা না পাওয়া গেলে।

উদাহরণ:

import { createConnection, getRepository } from "typeorm";
import { User } from "./entity/User";

createConnection().then(async connection => {
  try {
    const userRepository = getRepository(User);
    // Trying to find a non-existing user
    const user = await userRepository.findOneOrFail(999); // This will throw an error if user doesn't exist
  } catch (error) {
    if (error instanceof QueryFailedError) {
      console.log("Query Failed Error:", error.message);
    } else {
      console.log("Other Error:", error);
    }
  }
}).catch(error => console.log("Connection Error:", error));

এখানে, findOneOrFail() মেথডটি এমন একটি ব্যবহারকারীর জন্য কোয়েরি করছে যা ডাটাবেসে থাকতে পারে না। এই ক্ষেত্রে, একটি QueryFailedError ঘটবে।

EntityNotFoundError

এটি তখন ঘটে যখন TypeORM কোনো নির্দিষ্ট এন্টিটি খুঁজে পায় না, যেমন একটি সম্পর্কিত এন্টিটি খোঁজা হচ্ছে কিন্তু সেটি ডেটাবেসে উপস্থিত নেই।

উদাহরণ:

import { EntityNotFoundError } from "typeorm";

try {
  const userRepository = connection.getRepository(User);
  const user = await userRepository.findOneOrFail({ id: 999 });
} catch (error) {
  if (error instanceof EntityNotFoundError) {
    console.log("Entity not found:", error.message);
  }
}

ConnectionError

এটি তখন ঘটে যখন ডেটাবেসের সাথে সংযোগ স্থাপন করা সম্ভব হয় না, যেমন ভুল ডাটাবেস ক্রিডেনশিয়ালস বা ডেটাবেস সার্ভারের সাথে সংযোগ বিচ্ছিন্ন হয়ে গেলে।

উদাহরণ:

import { createConnection, ConnectionError } from "typeorm";

createConnection().then(async connection => {
  // Do something
}).catch((error) => {
  if (error instanceof ConnectionError) {
    console.log("Database connection error:", error.message);
  } else {
    console.log("Other error:", error);
  }
});

TypeORM-এ Validation Messages

Validation TypeORM-এ অত্যন্ত গুরুত্বপূর্ণ একটি বিষয়। আপনি যখন Entity তৈরি করেন, তখন তার validation এর জন্য বিভিন্ন decorators ব্যবহার করতে পারেন। TypeORM Entity ফিল্ডে validation প্রয়োগ করতে সাধারণত class-validator লাইব্রেরি ব্যবহার করা হয়।

class-validator লাইব্রেরি TypeORM-এ ইন্টিগ্রেটেড থাকে, যার মাধ্যমে আপনি সঠিক ইনপুট যাচাই করতে পারেন এবং কাস্টম validation error বার্তা প্রদান করতে পারেন।

১. class-validator ব্যবহার করে Validation

আপনি Entity-এর প্রপার্টিতে বিভিন্ন validation decorators ব্যবহার করতে পারেন, যেমন @IsNotEmpty(), @IsEmail(), @MinLength(), ইত্যাদি।

উদাহরণ:

import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
import { IsNotEmpty, IsEmail, MinLength } from "class-validator";

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

  @Column()
  @IsNotEmpty({ message: "Name should not be empty!" })
  name: string;

  @Column()
  @IsEmail({}, { message: "Invalid email format!" })
  email: string;

  @Column()
  @MinLength(6, { message: "Password must be at least 6 characters long!" })
  password: string;
}

এখানে, @IsNotEmpty(), @IsEmail(), এবং @MinLength() ডেকোরেটরগুলি ব্যবহার করা হয়েছে, এবং কাস্টম মেসেজও প্রদান করা হয়েছে। যখন আপনি Entity-টি সেভ করার আগে ভ্যালিডেশন প্রয়োগ করবেন, তখন এই মেসেজগুলো দেখা যাবে।

২. Validation চেক করা

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

উদাহরণ:

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

const user = new User();
user.name = "";
user.email = "invalid-email";
user.password = "123";

// Validate the user object
validate(user).then(errors => {
  if (errors.length > 0) {
    console.log("Validation failed. Errors: ", errors);
  } else {
    console.log("Validation succeeded!");
  }
});

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

৩. Custom Validation Error Messages

TypeORM এবং class-validator এর মাধ্যমে আপনি কাস্টম error messages তৈরি করতে পারেন। উদাহরণস্বরূপ, আপনি যদি কোনো একটি ফিল্ডে বিশেষ ধরনের ত্রুটি চান, তবে আপনি message প্রপার্টি ব্যবহার করে একটি কাস্টম মেসেজ দিতে পারেন।

উদাহরণ:

import { IsEmail, IsNotEmpty, Length, validate } from "class-validator";

class User {
  @IsNotEmpty({ message: "Name is required!" })
  name: string;

  @IsEmail({}, { message: "Please provide a valid email address!" })
  email: string;

  @Length(6, 20, { message: "Password must be between 6 and 20 characters!" })
  password: string;
}

const user = new User();
user.name = "";
user.email = "invalidemail";
user.password = "12345";

validate(user).then(errors => {
  if (errors.length > 0) {
    console.log("Validation failed. Errors: ", errors);
  } else {
    console.log("Validation succeeded!");
  }
});

এখানে, যদি name ফিল্ড খালি থাকে, email ভুল ফরম্যাটে থাকে, অথবা password ৬টি ক্যারেক্টারের কম হয়, তাহলে কাস্টম error messages প্রদর্শিত হবে।


সারাংশ

Error Handling এবং Validation TypeORM এর খুবই গুরুত্বপূর্ণ অংশ। Error Handling এর মাধ্যমে আপনি ডেটাবেস অপারেশনের সময় ঘটে যাওয়া ত্রুটিগুলো সহজে ধরতে পারেন এবং সেগুলোর উপর সঠিকভাবে প্রতিক্রিয়া জানাতে পারেন। Validation TypeORM-এ Entity ফিল্ডের জন্য ব্যবহার করা হয় এবং এতে class-validator লাইব্রেরি ব্যবহৃত হয়। Custom Validation Messages প্রদান করে, আপনি ডেটা ইনপুটের জন্য পরিষ্কার এবং কাস্টম বার্তা দিতে পারেন যা ইউজারদের জন্য আরও ব্যবহারকারী বান্ধব হতে সহায়ক হয়। TypeORM-এ এসব টেকনিক ব্যবহার করে আপনি আরও কার্যকরী এবং নির্ভরযোগ্য ওয়েব অ্যাপ্লিকেশন তৈরি করতে পারবেন।

Content added By
Promotion

Are you sure to start over?

Loading...