ساخت بک‌اند یک ابزار مدیریت پروژه

من در حال ساخت یک ابزار مدیریت پروژه مشارکتی برای دوره کارآموزی‌ام در CodeAlpha هستم.

این ابزار مشابه نسخه‌ای ساده‌شده از Trello یا Asana عمل می‌کند. کاربران پروژه‌ها را ایجاد می‌کنند، اعضا را دعوت می‌کنند و وظایف را در بردهای مختلف جابه‌جا می‌کنند. من از Express.js، Prisma و Socket.io برای راه‌اندازی آن استفاده می‌کنم.

در ادامه، درس‌های فنی که هنگام ساخت بک‌اند آموختم را آورده‌ام.

مدیریت روابط داده‌ها

کاربران و پروژه‌ها رابطه چند-به-چند (many-to-many) دارند. من از یک جدول ProjectMember برای اتصال آن‌ها استفاده می‌کنم. این جدول داده‌های اضافی مانند نقش کاربر (user role) را ذخیره می‌کند.

من یک محدودیت یکتا (unique constraint) به این جدول اضافه کردم. این کار تضمین می‌کند که هر کاربر فقط یک بار در هر پروژه ظاهر شود. همچنین یک کلید ترکیبی (composite key) برای جستجوهای سریع ایجاد می‌کند.

برای برد کانبان (Kanban board)، همه چیز را ساده نگه داشتم. وضعیت یک وظیفه با بردی که به آن تعلق دارد تعریف می‌شود. جابه‌جا کردن یک وظیفه از "To Do" به "Done" صرفاً با به‌روزرسانی board ID آن انجام می‌شود.

اشتباهات معماری

من درس سختی درباره اتصالات پایگاه داده آموختم. در هر فایل مسیر (route file)، یک PrismaClient جدید ایجاد نکنید. این کار باعث ایجاد اتصالات بیش از حد و از کار افتادن اپلیکیشن شما می‌شود.

در عوض، یک نمونه (instance) مشترک در یک فایل واحد ایجاد کنید. همان نمونه را در هر مسیر وارد (import) کنید. این کار باعث پایدار ماندن pool اتصالات شما می‌شود.

احراز هویت و امنیت

من از یک middleware به نام protect برای محافظت از مسیرها استفاده می‌کنم. این middleware، JWT موجود در هدر Authorization را بررسی می‌کند.

هنگام خواندن هدرها از optional chaining استفاده می‌کنم. این کار از کرش کردن اپلیکیشن در صورت نبود یک هدر جلوگیری می‌کند.

برای این پروژه، از یک access token ۷ روزه استفاده می‌کنم. در حالی که اپلیکیشن‌های عملیاتی (production) از توکن‌های کوتاه‌مدت و refresh token استفاده می‌کنند، یک توکن طولانی‌مدت برای این محدوده خاص به خوبی کار می‌کند.

یکپارچگی داده‌ها با تراکنش‌ها

ایجاد یک پروژه مستلزم سه مرحله است:

  • ایجاد رکورد پروژه
  • تعیین مالک
  • ایجاد بردهای پیش‌فرض

اگر یک مرحله با شکست مواجه شود، داده‌های شما فاسد (corrupt) می‌شوند. من از prisma.$transaction برای پوشش دادن این مراحل استفاده می‌کنم. اگر هر بخشی با شکست مواجه شود، کل فرآیند به حالت قبل بازمی‌گردد (roll back). این کار باعث تمیز ماندن پایگاه داده شما می‌شود.

خطاهای منطقی رایج

من با دو باگ رایج مواجه شدم:

  1. آرایه‌های رابطه (Relation Arrays): وقتی روابط را در یک کوئری (query) گنجانده می‌کنید، Prisma یک آرایه برمی‌گرداند. شما نمی‌توانید مستقیماً به یک ویژگی (property) در آن رابطه دسترسی داشته باشید. ابتدا باید اولین آیتم آرایه را انتخاب کنید.

۲. ترتیب مسیرها: Express مسیرها را از بالا به پایین تطبیق می‌دهد. اگر یک مسیر دارای پارامتر را قبل از یک مسیر مشخص قرار دهید، Express مسیر اشتباه را تطبیق خواهد داد. همیشه مسیرهای مشخص را بالاتر از مسیرهای پارامتریک قرار دهید.

این الگوهای بک‌اند اکنون بخشی از گردش کار من هستند.

منبع: https://dev.to/chinwuba_jeffrey/building-the-backend-for-a-project-management-tool-express-prisma-and-the-mistakes-i-made-along-5gia