একটি প্রজেক্ট ম্যানেজমেন্ট ব্যাকএন্ড তৈরি করা
আমি CodeAlpha-তে আমার ইন্টার্নশিপের জন্য একটি কোলাবোরেটিভ প্রজেক্ট ম্যানেজমেন্ট টুল তৈরি করছি।
এটি একটি সহজীকৃত Trello বা Asana-এর মতো কাজ করে। ব্যবহারকারীরা প্রজেক্ট তৈরি করতে পারে, মেম্বারদের আমন্ত্রণ জানাতে পারে এবং বোর্ডগুলোর মধ্যে টাস্ক মুভ করতে পারে। এটি চালানোর জন্য আমি Express.js, Prisma এবং Socket.io ব্যবহার করছি।
ব্যাকএন্ড তৈরির সময় আমি যে প্রযুক্তিগত শিক্ষাগুলো অর্জন করেছি তা নিচে দেওয়া হলো।
ডেটা রিলেশনশিপ ম্যানেজ করা
ইউজার এবং প্রজেক্টের মধ্যে একটি many-to-many রিলেশনশিপ রয়েছে। তাদের মধ্যে সংযোগ স্থাপনের জন্য আমি একটি ProjectMember টেবিল ব্যবহার করি। এই টেবিলে ইউজার রোল (user role)-এর মতো অতিরিক্ত ডেটা সংরক্ষিত থাকে।
আমি এই টেবিলে একটি unique constraint যোগ করেছি। এটি নিশ্চিত করে যে একজন ইউজার একটি প্রজেক্টে কেবল একবারই উপস্থিত থাকতে পারবেন। এটি দ্রুত অনুসন্ধানের (lookup) জন্য একটি composite key-ও তৈরি করে।
Kanban বোর্ডের জন্য আমি সবকিছু সহজ রেখেছি। একটি টাস্কের স্ট্যাটাস নির্ধারিত হয় সেটি কোন বোর্ডের অন্তর্ভুক্ত তার মাধ্যমে। একটি টাস্ককে "To Do" থেকে "Done"-এ মুভ করা মানে কেবল তার board ID আপডেট করা।
আর্কিটেকচার সংক্রান্ত ভুল
ডেটাবেস কানেকশন নিয়ে আমি একটি কঠিন শিক্ষা পেয়েছি। প্রতিটি route ফাইলে নতুন PrismaClient তৈরি করবেন না। এটি অতিরিক্ত কানেকশন তৈরি করে এবং আপনার অ্যাপ ক্র্যাশ করতে পারে।
এর পরিবর্তে, একটি সিঙ্গেল ফাইলে একটি shared instance তৈরি করুন। সেই একই instance প্রতিটি route-এ ইমপোর্ট করুন। এটি আপনার connection pool-কে স্থিতিশীল রাখে।
অথরাইজেশন এবং সিকিউরিটি
রুটগুলো সুরক্ষিত রাখতে আমি একটি protect middleware ব্যবহার করি। এটি Authorization হেডার থেকে JWT চেক করে।
হেডার পড়ার সময় আমি optional chaining ব্যবহার করি। এটি হেডার অনুপস্থিত থাকলেও অ্যাপ ক্র্যাশ হওয়া থেকে রক্ষা করে।
এই প্রজেক্টের জন্য আমি ৭ দিনের একটি access token ব্যবহার করছি। যদিও প্রোডাকশন অ্যাপগুলোতে short-lived token এবং refresh token ব্যবহার করা হয়, তবে এই নির্দিষ্ট কাজের পরিধির জন্য একটি long-lived token ভালো কাজ করে।
ট্রানজ্যাকশনের মাধ্যমে ডেটা ইন্টিগ্রিটি
একটি প্রজেক্ট তৈরি করতে তিনটি ধাপ প্রয়োজন:
- প্রজেক্ট রেকর্ড তৈরি করা
- ওনার (owner) অ্যাসাইন করা
- ডিফল্ট বোর্ডগুলো তৈরি করা
যদি একটি ধাপ ব্যর্থ হয়, তবে আপনার ডেটা নষ্ট হয়ে যেতে পারে। আমি এই ধাপগুলোকে prisma.$transaction দিয়ে র্যাপ (wrap) করি। যদি কোনো অংশ ব্যর্থ হয়, তবে পুরো প্রক্রিয়াটি রোলব্যাক (rollback) হয়ে যায়। এটি আপনার ডেটাবেসকে পরিচ্ছন্ন রাখে।
সাধারণ লজিক এরর
আমি দুটি সাধারণ বাগের সম্মুখীন হয়েছি:
১. Relation Arrays: যখন আপনি কোনো কুয়েরিতে রিলেশন অন্তর্ভুক্ত করেন, Prisma একটি array রিটার্ন করে। আপনি সরাসরি রিলেশনের ওপর কোনো প্রপার্টি অ্যাক্সেস করতে পারবেন না। আপনাকে প্রথমে array-এর প্রথম আইটেমটি নিতে হবে।
২. রুট অর্ডার: Express উপর থেকে নিচে রুটগুলো ম্যাচ করে। যদি আপনি একটি নির্দিষ্ট রুটের আগে প্যারামিটারযুক্ত একটি রুট রাখেন, তবে Express ভুল রুটটি ম্যাচ করবে। সবসময় প্যারামিটারযুক্ত রুটের উপরে নির্দিষ্ট রুটগুলো রাখুন।
এই ব্যাকএন্ড প্যাটার্নগুলো এখন আমার কাজের পদ্ধতির (workflow) অংশ।