-
المساهمات
19761 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
472
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Mustafa Suleiman
-
شكرًا على إهتمامك وإقتراحك شادي، سيتم إرساله لقسم التطوير بالأكاديمية، في الوقت الحالي، أرجو تثبيت الإضافة التالية: Scroll To Top وسيظهر لك الزر التالي في الصفحة بعد إعادة التحديث: وعند الضغط عليه سيتم الصعود لأعلى الصفحة، وكذلك يوفر إمكانية النزول لأسفل الصفحة مباشرًة في حال كنت بالأعلى.
- 2 اجابة
-
- 1
-
-
أين يتم تشغيل الملف، فلا يوجد طريقة لتشغيله من خلال github مباشرًة، فهي منصة لعرض وتخزين الكود ونظام تحكم في الإصدارات، ولا تقوم بمهمة تشغيل الكود. ما تقصده هو فتح الملف لرؤية الكود أي عرضه، لكن بالنسبة لملفات jupyter فالمشكلة عند حفظك للملف على جهازك، يتم تخزين معلومات عن الـ Widgets أي الخلايا بطريقة قديمة أو غير مكتملة، ونظام العرض في GitHub يتوقع وجود معلومة محددة اسمها state أي الحالة لكل Widget، ولكنه لم يجدها. أسهل حل هو فتح الملف على حاسوبك من خلال VS Code، ثم من القائمة العلوية، اختار Kernel ثم اختار Restart and Clear Output لإعادة التشغيل ومسح المخرجات التي تظهر نتيجة تشغيل الخلايا. واحفظي الملف مرة أخرى، ورفع الملف الجديد إلى GitHub مرة أخرى.
- 1 جواب
-
- 1
-
-
تلك المشكلة تحدث أحيانًا بالفعل، حيث ستجد رسالة خطأ unable to save your notebook because it may have been modified in another location والحل لتجاوزها هو من خلال تحميل الملف بالضغط على file أعلى اليسار ثم اختر download notebook، ثم أنشيء ملف جديد من خلال استيراد الملف الذي قمت بتحميله للتو وذلك بالضغط على file ثم import notebook.
- 3 اجابة
-
- 1
-
-
سيحدد لك المدرب مشروعًا مرتبطًا بما تعلمته أثناء الدورة لتنفيذه خلال فترة محددة تتراوح بين أسبوع الى أسبوعين. في حال تتوقع تأخير أو تريد مدة أطول، أرجو مناقشة ذلك مع المُدرب المُختص بإختبارك، وسيتم إرشادك، وذلك من خلال مركز المساعدة.
- 1 جواب
-
- 1
-
-
في دالة distribution_values تستخدم المتغير self.mu لكن لم يتم إنشاؤه أو تعيين قيمة له بعد في الكائن v1، فعند تنفيذ v1.plot() يتم استدعاء دالة self.distribution_values() كأول خطوة. ثم دالة distribution_values تعمل على تنفيذ x = np.linspace(self.mu - 4*self.sigma وهي هنا تحتاج إلى قيمة للمتغيرين self.mu و self.sigma. والمكان الوحيد الذي يتم فيه إنشاء هذين المتغيرين هو داخل دالة average()، لكن لم تقم باستدعاء دالة average() قبل استدعاء دالة plot()، يجب استدعائها. كذلك يوجد خطأ إملائي في الدالة البانية __init__ حيث كتبت __int__ وبالتالي لن تعمل ولن يتم تعيين self.column_name1 و self.column_name2. وفي دالة average استخدمت self.col1 بينما في الدالة البانية استخدمت self.column_name1، فيجب توحيد الاسم. وحساب الاحتمال الشرطي غير مكتمل، فهنا p_conditional = 1 - scipy.stats.norm.cdf غير صحيح، فلم تقم باستدعاء الدالة cdf مع معاملاتها، يجب أن تكون p_conditional = 1 - scipy.stats.norm.cdf(0, self.mu, self.sigma ويوجد عدم تطابق أسماء المتغيرات في دالة plot حيث تستخدم self.col1 و self.col2 بينما يجب أن تكون self.column_name1 و self.column_name2. import numpy as np import scipy.stats import matplotlib.pyplot as plt import pandas as pd data_train = pd.DataFrame({ 'V1': np.random.randn(1000), 'forward_returns': np.random.randn(1000) * 0.02 }) class ConditionalProbability: def __init__(self, col1, col2): self.column_name1 = col1 self.column_name2 = col2 def average(self): condition = data_train[self.column_name1] > data_train[self.column_name1].mean() subset = data_train[condition][self.column_name2] self.mu, self.sigma = np.mean(subset), np.std(subset) return self.mu, self.sigma def distribution_values(self): x = np.linspace(self.mu - 4 * self.sigma, self.mu + 4 * self.sigma, 100) pdf = scipy.stats.norm.pdf(x, self.mu, self.sigma) p_conditional = 1 - scipy.stats.norm.cdf(0, self.mu, self.sigma) return x, pdf, p_conditional def plot(self): self.average() x, pdf, p_conditional = self.distribution_values() plt.figure(figsize=(8, 5)) plt.plot(x, pdf, label=f'Distribution of {self.column_name2} (given {self.column_name1} > mean)') plt.fill_between(x, pdf, where=(x > 0), color='orange', alpha=0.4, label=f'Area where returns > 0\nP = {p_conditional:.3f}') plt.axvline(0, color='red', linestyle='--', label='return = 0') plt.title('Conditional Probability Visualization') plt.xlabel('Forward Returns') plt.ylabel('Density') plt.legend() plt.show()
- 4 اجابة
-
- 1
-
-
الأهم لديك هو شراء ذاكرة عشوائية إضافية بحجم 16 جيجابايت أو 8 على الأقل، فالنظام يستهلك ما بين 3 إلى 4 جيجا، والبقية للبرامج وخلافه، لذا حاليًا النظام به عنق زجاجة قوي وهي الذاكرة العشوائية. كذلك ستحتاج إلى هارد NVMe SSD وتثبيت النظام عليه، فحاليًا HDD لم يعد مناسب لأنظمة التشغيل، فحتى لو مواصفات الحاسوب لديك مرتفعة ستجد بطيء بسبب وحدة التخزين القديمة وسرعة الكتابة والقراءة المنخفضة.
-
ستحتاج إلى حذف الـ padding لعنصر ul حيث يتم إضافته من قبل بوتستراب ولا حاجة إليه: #venues ul { padding: 0 !important; margin: 0 !important; list-style: none; } كذلك تعديله لعنصر dropdown .dropdown { padding: 20px; position: absolute; top: 100%; right: 100px; width: 200%; background: #fbf8f8; box-shadow: 0 5px 15px rgba(0, 0, 0, 0.1); min-width: 400px; opacity: 0; visibility: hidden; transform: translateY(10px); transition: all 0.3s; } ثم تعديل نسبة استحواذ كل عمود إلى col-md-5 <li class="has-dropdown" id="venues"> <a href="#">VENUES<i class="fas fa-chevron-down"></i></a> <div class="dropdown"> <div class="container-venues"> <div class="row"> <div class="col-md-4"> <div class="dropdown-column"> <h4>Business Courses</h4> <ul> <li><a href="#">Management & Leadership</a></li> <li><a href="#">Innovation & Strategy</a></li> <li><a href="#">Corporate Governance</a></li> </ul> </div> </div> <div class="col-md-4"> <div class="dropdown-column"> <h4>Business Courses</h4> <ul> <li><a href="#">Management & Leadership</a></li> <li><a href="#">Innovation & Strategy</a></li> <li><a href="#">Corporate</a></li> </ul> </div> </div> <div class="col-md-4"> <div class="dropdown-column"> <h4>Business Courses</h4> <ul> <li><a href="#">Management & Leadership</a></li> <li><a href="#">Innovation & Strategy</a></li> <li><a href="#">Corporate Governance</a></li> </ul> </div> </div> <div class="col-md-4"> <div class="dropdown-column"> <h4>Business Courses</h4> <ul> <li><a href="#">Management & Leadership</a></li> <li><a href="#">Innovation & Strategy</a></li> <li><a href="#">Corporate Governance</a></li> </ul> </div> </div> </div> </div> </div> </li>
-
الإختبار غرضه قياس مدى استيعابك فيما قمت بدراسته، لذا يجب معرفة ما هو توجهك وما هدفك وما الذي قمت بتنفيذه، من أجل إختبارك بشكل مناسب لك وتجنب إفتراض أنك قمت بدراسة الدورة كاملة. على ما أعتقد أنك ذكرت دراسة تخصص الواجهة الأمامية فقط، ودرست مسارات معينة، وما المشاريع التي عملت على تنفيذها وهكذا، لذا يجب ذكر ذلك في نقاط مختصرة كالتالي: - - - وبجانب لكل شرطة اذكر النقاط الهامة وبشكل مختصر.
-
مواصفات جهاز MSI أفضل بالتأكيد، فجهازك الحالي به كرت Quadro P2000 وهو مخصص لأجهزة الـ Workstation، أي لبرامج التصميم الهندسي CAD وما شابه، لكنه مبني على معمارية قديمة ولا يحتوي على أنوية Tensor. أما RTX 2050 كرت مخصص للألعاب، ولكن مبني على معمارية أحدث Turing، والأهم أحتواءه على أنوية Tensor، وهي وحدات معالجة متخصصة مصممة لتسريع عمليات حساب المصفوفات التي تشكل أساس نماذج التعلم العميق. ومعالج i5-12450H على الرغم من كونه i5، إلا أنه من الجيل الثاني عشر، وفارق الأجيال كبير جدًا لدرجة أنه يتفوق على الـ i7 القديم في كل من أداء النواة الواحدة والأداء متعدد الأنوية بفضل المعمارية الأحدث P-cores و E-cores.
-
بإمكانك التقدم للإختبار الآن لا داعي للقلق.
- 3 اجابة
-
- 2
-
-
-
ليس المطلوب شرح كل شيء في المشروع بل سيتم طرح بعض الأسئلة والمناقشة حول المشاريع التي قمت بتنفيذها لقياس مدى استيعابك لما قمت به وما تم شرحه بالدورة، وليس مجرد تطبيق حرفي مع الشرح بدون استيعاب. ثم اختبار عملي من خلال اسناد مشروع لتنفيذه خلال أسبوع ثم مراجعته لتفقد ما قمت به. آلية الإختبار هي كالتالي: بعد إنهاء 4 مسارات من الدورة على الأقل، أو الدورة بالكامل عليك رفع المشاريع التي قمت بها بالدورة على حسابك في github، ثم التحدث لمركز المساعدة وإخبارهم أنك تريد التقدم للإختبار وتوفير روابط المشاريع على github. ثم الإنتظار لبعض الوقت لحين مراجعة المشاريع وسيتم الرد عليك، وتحديد موعد لإجراء مقابلة، وبها يتم: إجراء محادثة صوتيّة لمدة 30 دقيقة يطرح المدرّب عليك أسئلة متعلّقة بالدورة والأمور التي نفّذتها خلالها. يحدد لك المدرّب مشروعًا مرتبطًا بما قمت به أثناء الدورة لتنفيذه خلال فترة محددة تتراوح بين أسبوع إلى أسبوعين. إجراء محادثة صوتيّة أخرى لمدّة 30 دقيقة يناقش بها مشروعك وما نفذته وتطرح أسئلة خلالها. إن سارت على جميع الخطوات السابقة بشكل صحيح، تحصل على الشهادة أو يرشدك المدرّب لأماكن القصور ويطلب منك تداركها ثم التواصل معنا من جديد.
- 3 اجابة
-
- 1
-
-
لن تتمكن من الإتصال بقاعدة البيانات المحلية فهي تعمل تعمل على حاسوبك فقط، يجب إنشاء قاعدة بيانات على استضافة مثل atlas والإتصال من خلال الرابط الذي ستحصل عليه
-
الأمر ليس له علاقة بـ mongodb compass بل يجب إنشاء قاعدة بيانات على mongodb atlas وستحصل على رابط للإتصال بقاعدة البيانات
-
صحيح، المشروع يعمل بشكل سليم، هل المشكلة تحدث عند تسجيل مستخدم جديد؟ يجب توفير قيمة لمتغير البيئة MONGODB_URL حيث ستحتاج إلى إنشاء قاعدة بيانات على Atlas ثم توفير الرابط الخاص بها وكذلك قيمة JWT_SECRET ستجد أعلى اليمين في صفحة إدارة المشروع في vercel تبويب Settings اضغط عليه ثم اختر Environment Variables وأضف متغير البيئة
-
ربما لديك إعدادات قاعدة البيانات غير صحيحة في ملف env. فلو تم إعداداها على قاعدة sqlite فلن تجد البيانات في mysql DB_CONNECTION=sqlite يجب أن تكون كالتالي: DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=اسم_قاعدة_البيانات DB_USERNAME=root DB_PASSWORD= ثم تنفيذ الأمر php artisan config:clear والتهجير والبذر: php artisan migrate:fresh --seed ثم تشغيل الخادم: php artisan serve
-
-
لديك خطأ 401 أي عملية غير مُصرح بها، لأن التوكن لم يتم تخزينه بعد تسجيل الدخول، لذا الطلب إلى /api/todos يُرسل بدون Authorization، كذلك يوجد تحذير الـ key وسببه أن دالة createTask تُعيد الجسم الكامل { newTodo, user } بينما الواجهة تتوقع كائن المهمة فقط، فينتج عنصر بدون _id في المصفوفة. في ملف page.tsx يجب حفظ التوكن بعد تسجيل الدخول: if(res?.message){ setError(res?.message); setLoading(false); }else{ alert("تم تسجيل الدخول بنجاح"); localStorage.setItem("token", res.token); // هنا router.push("/home") } كذلك، تعديل createTask لإعادة data.newTodo وللتحقق من الأخطاء: export async function createTask(title:string) { const token = localStorage.getItem("token"); const res = await fetch('http://localhost:3000/api/todos', { method: "POST", headers: { "Content-Type": "application/json", "Authorization": `Bearer ${token ?? ""}` }, body: JSON.stringify({title}), }); if (!res.ok) { const err = await res.json().catch(() => ({})); throw new Error(err?.message || "Request failed"); } const data = await res.json(); return data.newTodo; } كذلك يجب تحويل الـ _id إلى نص عند توليد التوكن فحاليًا أنت تمرر كائن، في ملف app\api\auth\login\route.ts: const token = generateToken(user._id.toString()); ثم شغل الخادم وتوجه إلى الرابط التالي وسجل الدخول: http://localhost:3000/
-
هل مكتبة PyTorch عند استخدامها لبناء الشبكات العصبية الالتفافية (CNN) تجبرني أن أحمّل البيانات وأعالجها فقط من خلالها، وكأنها نظام مغلق مثل منتجات أبل (حيث كل شيء يعمل مع بعضه)، أم يمكنني الاستعانة بمكتبات أخرى مثل cv2 أو os أو غيرها في تجهيز البيانات؟
Mustafa Suleiman رد على سؤال Ali Ahmed55 في علوم الحاسوب
ستحتاج إلى استخدام دوال PyTorch فقط في حال المعالجة جزء من الرسم البياني ويجب أن يدخل في حساب الـ back-prop كـ RandomCrop يُطبق داخل النموذج نفسه. أو لو تريد أن تتم العملية على الـ GPU مباشرةً، فحينها يجب أن تكون الدوال من مكتبة تورش أو تدعم CUDA. لكن PyTorch قائمة على مبدأ المرونة، بمعنى لا تهتم بكيفية وصول البيانات بل فقط بالشكل النهائي، فالبيانات الخام من أي مصدر وأي شكل، تستطيع معالجتها بأي مكتبة تريد سواء PIL أو panadas ثم تحويلها إلى تحويل إلى torch.Tensor و التدريب في PyTorch. القيد الوحيد هو أن ما يدخل إلى الشبكة في النهاية يجب أن يكون torch.Tensor، أما كل ما يسبق ذلك من قراءة الملفات، المعالجة، الـ augmentation، دمج بيانات إضافية وخلافه فتستطيع إنجازه بأي مكتبة في بايثون. وذلك لأنّ PyTorch مجرد إطار للحوسبة التفاضلية، والـ Autograd يحتاج إلى Tensor لكي يتتبع التدرجات، ولا يهتم بكيفية وصول البيانات إلى الـ Tensor. وجميع التحويلات خارج الرسم البياني كقراءة الصورة أو قصها لا تحتاج إلى أن تكون عمليات torch أصلاً.- 4 اجابة
-
- 1
-
-
الدورة ليس تخصصها مجال تحليل البيانات، ما ستتعلمه بها هو جزء كبير من الأساسيات اللازمة لذلك المجال، بعد ذلك ستحتاج تعلم أساسيات برنامج الـ Excel، وبالأخص دوال ومعادلات SUM, AVERAGE, VLOOKUP, INDEX, و MATCH. ثم دورة لتعلم الإحصاء والإحتمالات، سواء من Khan Academy أو من مصادر أخرى، ثم دورة أخرى متخصصة في تحليل البيانات باستخدام برنامج الـ Excel. ثم تعلم قواعد البيانات ولغة الـ SQL وقد تعلمت ذلك بالدورة بالفعل، لكن ستحتاج إلى تعلم SQL for Data Analytics للتعمق قليلاً والتعرف على مفاهيم متقدمة منها JOINs بأنواعها، GROUP BY, Window Functions, Subqueries, CTEs، وللعلم معظم مقابلات العمل لمحللي البيانات تتضمن أسئلة SQL متقدمة. الخطوة التالية هي تعلم أحد برامج التحليل والتصوير المرئي للبيانات مثل Power BI أو Tableau أو Google Looker Studio، وأنصحك ببرنامج Power BI فهو المطلوب في سوق العمل. كما أنه يجب عليكِ الاستمرار في التطبيق بكثافة على بيانات حقيقية لتحليلها كلما تقدمت في المسار التعليمي، ومن أشهر المواقع التي يمكنك الحصول منها على بيانات لتقم بتحليلها هو موقع Kaggle الشهير، ولديك أيضًا Data.gov. للتبسيط الصورة التالية جيدة: وفي المرحلة المتقدمة ستحتاج إلى دراسة تعلم الآلة، وذلك ما ستتعلمه بالدورة بالفعل، بالتالي تحتاج إلى دراسة القليل خارج الدورة فيما يخص الأساسيات. ستجد هنا تفصيل لما تحتاجه: https://roadmap.sh/data-analyst
-
الأمر ليس له علاقة بسرعة الكتابة من قريب أو بعيد في مجال البرمجة، فأنت لست كاتب محتوى بل مهندس برمجيات أو مبرمج أيًا كان المُسمى. وظيفتك هي حل مشكلة من خلال البرمجة، أي التفكير والتحليل المنطقي هي المهارة الأهم، وكذلك استيعابك العميق للأساسيات، جودة الكود، قدرتك على التعلم، والخبرة في التقنيات التي تستخدمها أو التخصص الخاص بك سواء مطور واجهة خلفية أو أمامية وخلافه. السرعة والدقة في التنفيذ هي نتاج ما سبق، فالمبتدئين يواجهة صعوبة في التنفيذ بسرعة وبدون أخطاء جسيمة وكذلك جودة الكود أقل، لكن بعد فترة من الممارسة العملية يتم اكتساب تلك الخبرة بطبيعة الحال. لذا يجب العمل على المُسبب الصحيح للبطيء في التنفيذ، والسرعة في الكتابة مجرد مهارة مساعدة، وليست أساسية وتستطيع تطويرها تدريجيًا ولن يسألك أحد عنها في المقابلات. لكن في حال كنت بطيء في استخدام لوحة المفاتيح بشكل عام، فتلك مشكلة، تستطيع حلها بالممارسة الأمر بسيط.
-
لا علاقة لمجال المحاسبة بالبرمجة، الأمر سيفيدك فقط عند العمل على مشاريع محاسبية مثل أنظمة ERP، أو Fintech، أو مشاريع متعلقة بإدخال قيود، مطابقة حسابات، إعداد تقارير. ولديك أفضلية في العمل في شركة ناشئة تبني تطبيق لإدارة المصاريف الشخصية، أو تطوير أنظمة دفع إلكتروني، أو منصات إقراض، أو برامج لإدارة الاستثمار، لأنك مستوعب للوائح المالية والمبادئ المحاسبية التي يجب أن يلتزم بها أي منتج مالي. لكن الفكرة أنه بعد تخرجك تنسى ما درسته إلا في حال كنت ترغب التخصص في مجال المحاسبة والبحث عن وظيفة بها، لذا الشركات التي بحاجة إلى محاسب، سترى أنك مشتت بين المجالين، والشركات التي بحاجة غلى مبرمج، سترى أن خبرتك البرمجية ليست كافية. لذا الحل الأنسب في حال تريد البرمجة هو التعمق بها، وأيضًا التعمق في مشاريع Fintech. أو التركيز على تعلم بايثون وOdoo لتصبح متخصص ERP.
-
أرفق المشروع لديك مع أحدث تعديل لتفقده
-
توقيع الدوال في [id]/route.ts غير صحيح قمت بتعريفها كـ PATCH(request, params) وDELETE(request, params) بدلًا من PATCH(request, { params }) وDELETE(request, { params }). بالتالي params.id يصبح undefined، عند إنشاء مشروع Next.js (App Router)، فدوال المسارات الديناميكية تستقبل params داخل كائن ثانٍ بشكل هيكلي، والتوقيع الصحيح هو (request, { params }) وليس (request, params) import { connectDB } from "@/app/libs/connectDB"; import { NextRequest, NextResponse } from "next/server"; import jwt from 'jsonwebtoken'; import User from "@/app/models/User"; import Todos from "@/app/models/Todos"; import mongoose from "mongoose"; type Params = { id: string; } export async function GET(request:NextRequest, {params} : {params: Params }){ try{ await connectDB(); const authHeader = request.headers.get("authorization"); if(!authHeader || !authHeader.startsWith("Bearer ")){ return NextResponse.json({error: "Unauthorized"}, {status:401}) } const token = authHeader.split(" ")[1]; const decoded = jwt.verify(token , process.env.JWT_SECRET); const userId = (decoded as {userId?: string}).userId; if(!userId){ return NextResponse.json({error: "Unauthorized"}, {status:401}) } const user = await User.findById(userId); if(!user){ return NextResponse.json({error: "User not found!"}, {status: 404}); } if (!mongoose.Types.ObjectId.isValid(params.id)) { return NextResponse.json({ error: "Invalid id" }, { status: 400 }); } const task = await Todos.findOne({_id: params.id , userId}); if(!task){ return NextResponse.json({error: "Task not found"}, {status: 404}); } return NextResponse.json({task}) }catch(e:any){ return NextResponse.json({error: e.message}, {status:500}) } } export async function PATCH(request:NextRequest, { params }: { params: Params }){ try{ await connectDB(); const {title , content} = await request.json(); const authHeader = request.headers.get("authorization"); if(!authHeader || !authHeader.startsWith("Bearer ")){ return NextResponse.json({error: "Unauthorized"}, {status:401}) } const token = authHeader.split(" ")[1]; const decoded = jwt.verify(token , process.env.JWT_SECRET) const userId = (decoded as {userId?: string}).userId; if(!userId){ return NextResponse.json({error: "Unauthorized"}, {status:401}) } const user = await User.findById(userId).select("-password"); if(!user){ return NextResponse.json({error: "User not found!"}, {status: 404}); } if (!mongoose.Types.ObjectId.isValid(params.id)) { return NextResponse.json({ error: "Invalid id" }, { status: 400 }); } const taskUpdate = await Todos.findOneAndUpdate( {_id: params.id , userId}, { title , content }, {new: true} ); if(!taskUpdate){ return NextResponse.json({error: "Task not found"}, {status: 404}); } return NextResponse.json(taskUpdate); }catch(e:any){ return NextResponse.json({error: e.message}, {status:500}) } } export async function DELETE(request:NextRequest, { params }: { params: Params }){ try{ await connectDB(); const authHeader = request.headers.get("authorization"); if(!authHeader || !authHeader.startsWith("Bearer ")){ return NextResponse.json({error: "Unauthorized"}, {status:401}) } const token = authHeader.split(" ")[1]; const decoded = jwt.verify(token , process.env.JWT_SECRET); const userId = (decoded as {userId?: string}).userId; if(!userId){ return NextResponse.json({error: "Unauthorized"}, {status:401}) } const user = await User.findById(userId); if(!user){ return NextResponse.json({error: "User not found!"}, {status: 404}); } if (!mongoose.Types.ObjectId.isValid(params.id)) { return NextResponse.json({ error: "Invalid id" }, { status: 400 }); } const taskDelete = await Todos.findOneAndDelete({_id: params.id, userId}); if(!taskDelete){ return NextResponse.json({error: "Task not found"}, {status: 404}); } return NextResponse.json(taskDelete); }catch(e:any){ return NextResponse.json({error: e.message}, {status:500}) } }
