𝗣𝗿𝗶𝘀𝗺𝗮 کے ساتھ پروجیکٹ مینجمنٹ ٹول بنانا
میں Trello کی طرح ایک اشتراکی (collaborative) پروجیکٹ مینجمنٹ ٹول بنا رہا ہوں۔
میں React، Express.js، PostgreSQL، اور Socket.io استعمال کر رہا ہوں۔ کسی بھی بیک اینڈ روٹس (backend routes) کو لکھنے سے پہلے، مجھے ڈیٹا بیس اسکیمہ (database schema) ڈیزائن کرنا ہوگا۔
اسکیمہ بنیاد ہے۔ اگر اسکیمہ غلط ہو، تو پوری ایپ ناکام ہو جاتی ہے۔ یہاں Prisma اسکیمہ ڈیزائن کا میرا تجزیہ پیش ہے۔
𝗧𝗵𝗲 𝗠𝗼𝗱𝗲𝗹𝘀
• User: نام، ای میلز، اور پاس ورڈز کو محفوظ کرتا ہے۔ میں IDs کے لیے cuid() استعمال کرتا ہوں۔ یہ طویل اور منفرد اسٹرنگز (strings) تخلیق کرتا ہے۔ یہ نمبروں سے بہتر ہے کیونکہ یہ URL میں آپ کے صارفین کی تعداد ظاہر نہیں کرتا۔
• Project: پروجیکٹ کا نام اور تفصیل محفوظ کرتا ہے۔ میں نے سوالیہ نشان (?) کا استعمال کرتے ہوئے تفصیل (description) کو اختیاری (optional) بنا دیا ہے۔
• ProjectMember: یہ ایک جنکشن ٹیبل (junction table) ہے۔ یہ Users کو Projects سے جوڑتا ہے۔ چونکہ ایک صارف بہت سے پروجیکٹس میں شامل ہو سکتا ہے، اور ایک پروجیکٹ میں بہت سے صارفین ہو سکتے ہیں، اس لیے many-to-many تعلق کو مینیج کرنے کے لیے آپ کو اس درمیانی ٹیبل کی ضرورت ہوتی ہے۔ میں نے ایک 'unique constraint' شامل کی ہے تاکہ ایک ہی صارف کو دو بار ایک ہی پروجیکٹ میں شامل ہونے سے روکا جا سکے۔
• Board: ٹاسک (Tasks) بورڈز کے اندر ہوتے ہیں۔ بورڈز پروجیکٹس کے اندر ہوتے ہیں۔ یہ درجہ بندی (hierarchy) ڈریگ اینڈ ڈراپ (drag-and-drop) کو آسان بناتی ہے۔ کالموں کے درمیان ٹاسک کو منتقل کرنا محض ایک فیلڈ اپ ڈیٹ ہے۔
• Task: یہ بنیادی ماڈل ہے۔ اس کا User ماڈل کے ساتھ دو مختلف تعلقات (relations) ہیں:
- ایک تفویض کردہ صارف (assigned user) - یہ اختیاری ہے۔
- ایک تخلیق کار (creator) - یہ لازمی ہے۔ مجھے ان تعلقات کو واضح طور پر نام دینا پڑا تاکہ Prisma جان سکے کہ کون سا کون سا ہے۔
• Comment: صارفین ٹاسک پر کمنٹس چھوڑ سکتے ہیں۔ میں نے کوڈ کو پڑھنے میں آسان رکھنے کے لیے تعلق کا نام "user" کے بجائے "author" رکھا ہے۔
• Notification: صارفین کے لیے پیغامات کو ٹریک کرنے کے لیے ایک سادہ ماڈل۔
𝗧𝗲𝗰𝗵𝗻𝗶𝗰𝗮𝗹 𝗟𝗲𝘀𝘀𝗼𝗻𝘀 𝗟𝗲𝗮𝗿𝗻𝘁
میں اسے بناتے وقت کئی غلطیوں کا سامنا کر رہا تھا۔ ان باتوں کا خیال رکھیں:
- Relation Names: اگر دو فیلڈز ایک ہی ماڈل کی طرف اشارہ کرتی ہیں، تو آپ کو تعلقات (relations) کو نام دینا ہوگا۔ اگر آپ ایسا نہیں کرتے ہیں، تو Prisma ایرر (error) دے گا۔
- Nullable Fields: اگر کوئی تعلق اختیاری ہے، تو آپ کو ریلیشن فیلڈ اور فارن کی (foreign key) فیلڈ دونوں پر سوالیہ نشان لگانا ہوگا۔
- Syntax Errors: Prisma کو اسٹرنگ ڈیفالٹس (string defaults) کے لیے ڈبل کوٹس (double quotes) کی ضرورت ہوتی ہے۔ سنگل کوٹس (single quotes) کام نہیں کریں گے۔
- Relation Syntax: ہمیشہ درست سنٹیکس (syntax) استعمال کریں:
@relation(fields: [localField], references: [remoteField])۔
اسکیمہ اب مائیگریٹ (migrate) ہو چکا ہے۔ اگلا مرحلہ، میں ریئل ٹائم اپ ڈیٹس کے لیے Express بیک اینڈ اور Socket.io سیٹ اپ بناؤں گا۔