اصطلاح — كتالوج المساعدات
ما هو
المجموعة الصغيرة من أصناف المساعدة/الامتداد المشتركة المُستخرَجة أثناء عمل CRUD البيانات المرجعية (MIQ-131/132/133) التي ينبغي لمطوّر يبني الميزة التالية أن يعيد استخدامها بدلًا من إعادة تنفيذها. استُخرِج كلٌّ من ازدواجية ملحوظة، لا حاجة متوقَّعة — انظر انضباط §G — فالكتالوج قصير عمدًا.
متى يُستخدم
مدّ يدك إلى هذه عند بناء ميزة CRUD بيانات مرجعية (أو أي متحكّم يُرجِع ProblemDetails / أي خدمة تحذف ناعمًا). لا تمدّ أشكالها المقفلة؛ إن لم تلائم حالتك، أبقِ شيفرتك مضمّنة.
مساعدات الواجهة الخلفية
| Helper | File | What it does |
|---|---|---|
SoftDeleteExtensions |
Application/Common/SoftDeleteExtensions.cs |
MarkDeleted(this AuditableEntity, string actor, DateTimeOffset now) — يضبط IsDeleted=true، DeletedAt، DeletedBy، IsActive=false في استدعاء واحد. يستخدمه كل مسار حذف للبيانات المرجعية. |
ControllerProblemExtensions |
API/Common/ControllerProblemExtensions.cs |
مصنع RFC 7807 ProblemDetails: Problem400(detail)، ToValidationProblem(validationResult)، وProblemWithCode(status, title, detail, extensions) لاستجابات 409 ذات الـ code المُهيكل. |
ExceptionPredicates |
API/Common/ExceptionPredicates.cs |
مُسنِدا IsNotFound() / IsDuplicate() على InvalidOperationException، لربط catch (… ex) when (ex.IsDuplicate()) بالحالة الصحيحة. |
SystemRowProtectedException<T> |
Application/Common/SystemRowProtectedException.cs |
حارس صف-النظام العام (MIQ-133 المرحلة Phase 1، استخراج قاعدة-الثلاثة PB-085): (T entity, string code, string localizedMessage)، يحمل Entity وCode. انظر الاستثناءات. |
مساعدات الواجهة الأمامية
| Helper | File | What it does |
|---|---|---|
createLookupHooks |
web/src/lib/createLookupHooks.ts |
مصنع React Query: بإعطائه { resourceKey, api: { list, get, create, update, delete } }، يُرجِع { keys, useList, useDetail, useCreate, useUpdate, useDelete }. كل ملفات hooks البيانات المرجعية السبعة تستهلكه. |
DeleteConfirmDialog |
web/src/components/common/DeleteConfirmDialog.tsx |
نافذة تأكيد حذف مشتركة. تأخذ مرجع hook طفرة-الحذف + rowId + testIdPrefix؛ تعرض أجسام 409 من الخادم بـ whitespace-pre-line بحيث تحفظ رسائل "referenced by" متعدّدة الأسطر فواصل أسطرها. |
extractErrorMessage |
web/src/lib/apiError.ts |
يسحب بأمان الرسالة المُوجَّهة للمستخدم من خطأ Axios (response.data.detail ?? message ?? null). يستخدمه كل حوار. |
كيف تتلاءم معًا
حذف بيانات مرجعية نموذجي: تعرض الصفحة DeleteConfirmDialog، مُمرِّرةً طفرة useDelete<Entity>() (من مصنع createLookupHooks) وtestIdPrefix. عند التأكيد، تستدعي الطفرة الـ API؛ يعود 409 من ProblemWithCode على الخادم؛ يُظهِر extractErrorMessage الـ detail المُوطَّن؛ يعرضه الحوار مع حفظ فواصل الأسطر.
مزالق / قيود
- أشكال المصنع والحوار مقفلة (قرار MIQ-131 رقم 39). إذا احتاج كيان مستقبلي معاملًا سابعًا أو فعلًا مختلفًا، لا تمدّ المساعد — أبقِ hooks/حوار ذلك الكيان مضمّنين، أو قسّم التجريد. فرض معامل على الشكل المشترك هو فشل التجريد المتسرّب الذي يوجد انضباط §G لمنعه.
useSkillsAdminيستخدمresourceKey: 'skills-admin'لتقسيم cache React Query الخاص به بعيدًا عن سطح المهارات الإنتاجي — مثال على نمط التعايش.- بلغ
SystemRowProtectedException<T>الكتالوج عند ثلاثة مستهلكين حقيقيين، لا قبل — عتبة قاعدة-الثلاثة (MIQ-133، PB-085). بعض أنماط الأربعة-مستهلكين (StringBuilder الخاص بـComposeReferencedBody) لم تُستخرَج عمدًا لأن المضمّن لا يزال يُقرأ أنظف.
حالة البناء
Available — كل المساعدات حيّة وقيد الاستخدام عبر كيانات CRUD البيانات المرجعية (MIQ-131/132/133).
ذات صلة
- الاستثناءات، قالب CRUD للبيانات المرجعية، انضباط §G، نمط التعايش
- المصدر: تقارير MIQ-131 / MIQ-132 / MIQ-133 (
manpoweriq/docs/).