خطأ في تحميل الدردشة

مرحباً، أود الإبلاغ عن مشكلة وجدتها عند تحميل الملفات أو الصور في رسائل الدردشة المباشرة.

  • عندما يقوم المستخدم أ بتحميل الملف أ في منشور أو دردشة، فإنه يعمل بشكل جيد ويتم تسجيل الملف بشكل صحيح.

  • ولكن عندما يقوم المستخدم ب بتنزيل الملف أ ثم يحاول تحميله مرة أخرى في دردشة أخرى:

    • إذا أرسل المستخدم ب الملف بدون نص، فإنه يحصل على خطأ:

      الرسالة قصيرة جدًا، يجب أن يكون لها حد أدنى من حرف واحد.
      
      
    • إذا أرسل المستخدم ب الملف مع نص، يتم إرسال النص فقط - المرفق مفقود.

ومع ذلك، إذا قام المستخدم أ بإعادة تحميل نفس الملف مرة أخرى، فإنه يعمل بشكل جيد ويتم تضمين الملف في الرسالة.

سؤالي:
هل هذا هو السلوك المقصود، حيث يمكن فقط للمُحمِّل الأصلي إعادة استخدام ملف تم تحميله؟ أم يجب أن يتمكن المستخدمون الآخرون أيضًا من تحميل وإرسال نفس الملف في الدردشة؟

إعجاب واحد (1)

نعم، يبدو هذا وكأنه خلل بسيط، وسيقوم شخص ما بالاطلاع عليه خلال الأسابيع القليلة القادمة، ويسعدني وضع علامة “PR welcome” على هذا الأمر في هذه الأثناء.

إعجاب واحد (1)

لقد استغرقت بعض الوقت للبحث في هذا، ولكن أعتقد أنني وجدت السبب. أعتقد أن الأمر يتعلق بـ هذا الكود:

def fetch_uploads(params:, guardian:)
  return [] if !SiteSetting.chat_allow_uploads
  guardian.user.uploads.where(id: params.upload_ids) # بالتحديد، هنا
end

عند إنشاء رسالة دردشة جديدة، يتم استدعاء هذا لجلب الملفات المرفوعة لإرفاقها بالرسالة. ربما لضمان الملكية، تمر الطريقة عبر مستخدم Guardian لجلب الملفات المرفوعة للسماح فقط بالملفات المرفوعة التي تخص هذا المستخدم.
المشكلة هي أن الملفات المرفوعة يتم إزالة التكرار منها، كما هو موضح هنا:

# هل لدينا بالفعل هذا الملف المرفوع؟
@upload = Upload.find_by(sha1: sha1)

# ...

# إرجاع الملف المرفوع السابق إن وجد
if @upload
  add_metadata!
  UserUpload.find_or_create_by!(user_id: user_id, upload_id: @upload.id) if user_id
  return @upload
end

أعتقد أن الحل الممكن سيكون المرور عبر UserUploads بدلاً من مجرد النظر إلى الملفات المرفوعة التي تخص المستخدم. يربط UserUpload الملفات المرفوعة بعدة مستخدمين، وهو ما يبدو أننا نحتاجه. لست متأكدًا بنسبة 100٪ بعد من كيفية القيام بذلك بشكل صحيح؛ لقد تأخر الوقت، لذا سأذهب للنوم، ولكن إذا لم يقم شخص آخر بإصلاحه، فسأحاول العودة لاحقًا والعمل على طلب سحب. :slightly_smiling_face:

3 إعجابات

هذه ملاحظة رائعة ودقيقة. :hugs:

لدى التحميلات user_id، ولكن هذا هو المستخدم الأصلي الذي أنشأ التحميل.

تحويل هذا الرمز إلى:

Upload.where(id: params.upload_ids).joins(:user_uploads).where(user_uploads: { user_id: guardian.user.id })

سيؤدي الغرض.

هل يمكنك إرسال طلب سحب (PR)؟

شكراً، لم أكن متأكداً من أفضل طريقة لبناء هذا الاستعلام (أنا جديد هنا نوعاً ما :slightly_smiling_face: ). سأعمل على طلب سحب.

3 إعجابات

حسنًا، لقد انتهيت أخيرًا من طلب السحب. آسف على التأخير، تداخلت مشاكل الحياة.

إصلاح: في رسائل الدردشة، قم بتصفية التحميلات بواسطة UserUpload، وليس بواسطة Upload.user بواسطة clechasseur · طلب سحب #34596 · discourse/discourse

أرى أن بعض الاختبارات قد فشلت، ولكنها ليست اختبارات قمت بتعديلها. كنت أواجه مشاكل في تشغيل الاختبارات في هذه الملفات محليًا أيضًا - لقد حصلت على نفس أخطاء المفتاح المكرر التي أراها هنا… لست متأكدًا مما إذا كنت أنا من كسرت شيئًا ما أو ما إذا كانت الاختبارات متقلبة في بعض الأحيان…

القاعدة الأساسية الجيدة هي إعادة تشغيل الاختبارات الفاشلة ثلاث مرات على الأقل والبدء في الذعر فقط إذا فشلت في المرة الثالثة :winking_face_with_tongue:

ومع ذلك، ربما يمكن لـ @j.jaffeux المساعدة؟

إعجاب واحد (1)

نعم، هذه مجرد أخطاء عشوائية أخرى، تغييراتك جيدة. سأعيد تشغيل اختبارات PR، إذا نجحت أو فشلت بنفس خطأ التسلسل العشوائي، سأوافق + دمج.

إعجاب واحد (1)

أنا من محبي الرعب أكثر من اللازم لدرجة أنني لا أعرف ما يحدث عندما تفعل شيئًا ثلاث مرات :sweat_smile:

إعجابَين (2)

تم دمج طلب السحب هذا، شكراً مرة أخرى للمساهمة @clechasseur :rocket:

6 إعجابات