TypeORM-এ Repository কি?
Repository TypeORM-এ একটি ডেটাবেস অ্যাক্সেস প্যাটার্ন যা ডেটাবেস অপারেশন যেমন Create, Read, Update, এবং Delete (CRUD) পরিচালনা করে। এটি ডেটাবেসের Entities-এর উপর কাজ করতে ব্যবহৃত হয় এবং TypeORM এর Repository API খুবই শক্তিশালী এবং কাস্টম কোয়েরি তৈরির জন্য সহায়তা করে।
Repository ক্লাসটি TypeORM এর মাধ্যমে ডেটাবেস টেবিলের সঙ্গে কাজ করার জন্য একটি এবস্ট্র্যাকশন প্রদান করে, যেখানে আপনি কাস্টম ফাংশনগুলো লিখতে পারেন যা Entity এর উপর ভিত্তি করে ডেটাবেসের মধ্যে ডেটা অপারেশন পরিচালনা করবে।
Repository তৈরি করা
TypeORM-এ Repository তৈরি করতে হলে আপনি Entity ক্লাসের সাথে যুক্ত একটি Repository তৈরি করবেন। @EntityRepository ডেকোরেটর ব্যবহার করে আপনি কাস্টম Repository তৈরি করতে পারেন, যা Entity এর জন্য কাস্টম CRUD অপারেশন করতে সহায়তা করবে।
Repository তৈরি করার উদাহরণ:
ধরা যাক আমাদের একটি User Entity আছে এবং আমরা একটি UserRepository তৈরি করতে চাই যা কাস্টম ডেটাবেস অপারেশনগুলো সম্পাদন করবে।
১. Entity তৈরি করা (User Entity)
প্রথমে, আমাদের একটি Entity ক্লাস তৈরি করতে হবে যা ডেটাবেসের টেবিলের প্রতিনিধিত্ব করবে।
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
email: string;
}
এখানে, User Entity একটি ডাটাবেস টেবিলের প্রতিনিধিত্ব করছে, যেখানে id, name, এবং email কলাম রয়েছে।
২. Repository তৈরি করা (UserRepository)
এখন, আমরা User Entity এর জন্য একটি কাস্টম Repository তৈরি করব। TypeORM 0.3.x সংস্করণ থেকে @EntityRepository ডেকোরেটরটি সরানো হয়েছে, তাই আমরা সরাসরি DataSource.getRepository() ব্যবহার করে Repository তৈরি করতে পারি।
UserRepository.ts উদাহরণ:
import { Repository } from "typeorm";
import { User } from "../entities/User";
import { AppDataSource } from "../data-source"; // আপনার ডেটাবেস ডেটাসোর্স ইম্পোর্ট করুন
export class UserRepository extends Repository<User> {
// কাস্টম মেথড যা একটি ব্যবহারকারীর ইমেইল অনুসারে অনুসন্ধান করবে
async findUserByEmail(email: string): Promise<User | null> {
return this.findOne({
where: { email },
});
}
// কাস্টম মেথড যা ব্যবহারকারীর নাম অনুযায়ী অনুসন্ধান করবে
async findUsersByName(name: string): Promise<User[]> {
return this.find({
where: { name },
});
}
}
এখানে, UserRepository ক্লাসে দুটি কাস্টম মেথড রয়েছে:
findUserByEmail: ইমেইল দ্বারা একটি ব্যবহারকারী খুঁজে বের করবে।findUsersByName: নাম অনুসারে একাধিক ব্যবহারকারী খুঁজে বের করবে।
৩. Repository ব্যবহার করা
এখন, Repository ব্যবহার করে ডেটাবেস অপারেশনগুলো পরিচালনা করা হবে। TypeORM এর AppDataSource.getRepository() মেথড ব্যবহার করে আমরা UserRepository তৈরি করতে পারি এবং সেই Repository এর মাধ্যমে ডেটাবেস অপারেশন চালাতে পারি।
UserService.ts উদাহরণ:
import { AppDataSource } from "../data-source";
import { User } from "../entities/User";
import { UserRepository } from "../repositories/UserRepository";
export class UserService {
private userRepository: UserRepository;
constructor() {
// DataSource থেকে UserRepository ইনস্ট্যান্স রিটার্ন করা হচ্ছে
this.userRepository = AppDataSource.getRepository(User) as UserRepository;
}
// সমস্ত ব্যবহারকারী রিটার্ন করবে
async getAllUsers(): Promise<User[]> {
return this.userRepository.find();
}
// ইমেইল অনুসারে ব্যবহারকারী খুঁজে বের করা
async getUserByEmail(email: string): Promise<User | null> {
return this.userRepository.findUserByEmail(email);
}
// নাম অনুসারে ব্যবহারকারী খুঁজে বের করা
async getUsersByName(name: string): Promise<User[]> {
return this.userRepository.findUsersByName(name);
}
// নতুন ব্যবহারকারী তৈরি করা
async createUser(name: string, email: string): Promise<User> {
const user = new User();
user.name = name;
user.email = email;
return this.userRepository.save(user);
}
}
এখানে, UserService ক্লাসটি UserRepository ব্যবহার করে ডেটাবেসে CRUD অপারেশনগুলো পরিচালনা করছে। getRepository() মেথডের মাধ্যমে UserRepository ব্যবহার করা হচ্ছে এবং বিভিন্ন কাস্টম মেথড কল করা হচ্ছে।
৪. Controller-এ Repository ব্যবহার করা
এখন, আপনি যখন API রাউট বা কন্ট্রোলারের মাধ্যমে এই Repository ব্যবহার করবেন, তখন UserService কে ব্যবহার করে ডেটাবেস অপারেশন করতে হবে।
UserController.ts উদাহরণ:
import { Request, Response } from "express";
import { UserService } from "../services/UserService";
export class UserController {
private userService: UserService;
constructor() {
this.userService = new UserService();
}
// সমস্ত ব্যবহারকারী প্রাপ্তির API
async getUsers(req: Request, res: Response): Promise<Response> {
const users = await this.userService.getAllUsers();
return res.json(users);
}
// ইমেইল অনুসারে ব্যবহারকারী প্রাপ্তির API
async getUserByEmail(req: Request, res: Response): Promise<Response> {
const email = req.params.email;
const user = await this.userService.getUserByEmail(email);
return user ? res.json(user) : res.status(404).json({ message: "User not found" });
}
// নতুন ব্যবহারকারী তৈরি করার API
async createUser(req: Request, res: Response): Promise<Response> {
const { name, email } = req.body;
const newUser = await this.userService.createUser(name, email);
return res.status(201).json(newUser);
}
}
এখানে, UserController কন্ট্রোলার ক্লাসটি UserService ব্যবহার করে API রাউটগুলিতে ডেটাবেস অপারেশনগুলোর জন্য কল করছে।
৫. Repository-র সুবিধা
- ডেটাবেস অ্যাক্সেসের সহজতা: Repository TypeORM-এ ডেটাবেসের সাথে যোগাযোগকে সহজতর করে, যেখানে SQL কোড না লিখেই ডেটাবেসে CRUD অপারেশন করা যায়।
- কাস্টম ফাংশনালিটি: Repository-তে কাস্টম ফাংশনালিটি যেমন
findUserByEmailএবংfindUsersByNameযোগ করা যায়, যা ডেটাবেসে দক্ষভাবে কুয়েরি পরিচালনা করতে সহায়তা করে। - বিজনেস লজিক আলাদা করা: Repository ডেটাবেসের অপারেশনগুলোকে আলাদা করে রাখে, এবং সার্ভিস ক্লাসে ব্যবসায়িক লজিক রাখতে সাহায্য করে।
সারাংশ
TypeORM Repository ডেটাবেসের উপর CRUD অপারেশন এবং কাস্টম কুয়েরি পরিচালনার জন্য একটি শক্তিশালী উপায় প্রদান করে। Repository তৈরি এবং ব্যবহার করার মাধ্যমে আপনি ডেটাবেসে নিরাপদ এবং কার্যকরীভাবে কাজ করতে পারবেন। TypeORM এর Repository এবং Service গঠন ব্যবহার করে আপনি ডেটাবেস সম্পর্কিত লজিক আলাদা করতে পারবেন এবং কোডের রক্ষণাবেক্ষণ সহজ করে তুলতে পারবেন।