בניית Backend לניהול פרויקטים

אני בונה כלי שיתופי לניהול פרויקטים עבור ההתמחות שלי ב-CodeAlpha.

הוא עובד כמו גרסה מפושטת של Trello או Asana. משתמשים יוצרים פרויקטים, מזמינים חברים ומזיזים משימות בין לוחות. אני משתמש ב-Express.js, Prisma ו-Socket.io כדי להפעיל אותו.

הנה השיעורים הטכניים שלמדתי בזמן בניית ה-backend.

ניהול קשרי נתונים (Data Relationships)

למשתמשים ולפרויקטים יש קשר many-to-many. אני משתמש בטבלת ProjectMember כדי לחבר ביניהם. טבלה זו שומרת נתונים נוספים כמו תפקיד המשתמש (user role).

הוספתי אילוץ ייחודי (unique constraint) לטבלה זו. זה מבטיח שמשתמש יופיע רק פעם אחת בכל פרויקט. זה גם יוצר מפתח מורכב (composite key) לצורך שליפה מהירה.

עבור לוח ה-Kanban, שמרתי על דברים פשוטים. סטטוס של משימה מוגדר על ידי הלוח אליו היא שייכת. העברת משימה מ-"To Do" ל-"Done" היא פשוט עניין של עדכון ה-board ID שלה.

טעויות ארכיטקטורה

למדתי שיעור קשה לגבי חיבורי מסד נתונים. אל תיצרו PrismaClient חדש בכל קובץ route. זה יוצר יותר מדי חיבורים וגורם לאפליקציה לקרוס.

במקום זאת, צרו instance משותף אחד בקובץ בודד. ייבאו את אותו instance לכל route. זה שומר על ה-connection pool שלכם יציב.

הרשאה ואבטחה (Authorization and Security)

אני משתמש ב-middleware מסוג protect כדי להגן על ה-routes. הוא בודק את ה-JWT בכותרת ה-Authorization.

אני משתמש ב-optional chaining בעת קריאת כותרות (headers). זה מונע מהאפליקציה לקרוס אם כותרת חסרה.

עבור פרויקט זה, אני משתמש ב-access token ל-7 ימים. בעוד שאפליקציות production משתמשות ב-tokens בעלי חיי תוקף קצרים וב-refresh tokens, token בעל חיי תוקף ארוכים עובד היטב עבור ההיקף הספציפי הזה.

שלמות נתונים באמצעות טרנזקציות (Transactions)

יצירת פרויקט דורשת שלושה שלבים:

  • יצירת רשומת הפרויקט
  • הקצאת הבעלים (owner)
  • יצירת הלוחות ברירת המחדל

אם שלב אחד נכשל, הנתונים שלכם עלולים להפוך לפגומים. אני משתמש ב-prisma.$transaction כדי לעטוף את השלבים הללו. אם חלק כלשהו נכשל, כל התהליך מתבטל (rolls back). זה שומר על מסד הנתונים שלכם נקי.

שגיאות לוגיקה נפוצות

נתקלתי בשני באגים נפוצים:

  1. מערכי קשרים (Relation Arrays): כשאתם כוללים קשרים (relations) בשאילתה, Prisma מחזירה מערך. אי אפשר לגשת למאפיין (property) ישירות על הקשר. עליכם לבחור קודם את האיבר הראשון במערך.

  2. סדר נתיבים: Express מתאימה נתיבים מלמעלה למטה. אם תציבו נתיב עם פרמטר לפני נתיב ספציפי, Express תתאים את הנתיב הלא נכון. תמיד הציבו נתיבים ספציפיים מעל נתיבים עם פרמטרים.

תבניות backend אלו הן כעת חלק מתהליך העבודה שלי.

מקור: https://dev.to/chinwuba_jeffrey/building-the-backend-for-a-project-management-tool-express-prisma-and-the-mistakes-i-made-along-5gia