عن المشروع

نظرة عامة هذا المستودع، sqlite-multi-tenant، هو مدير قواعد بيانات SQLite متعدد المستأجرين لـ .NET (موصوف في بيانات المستودع الوصفية بأنه يوفر عزلاً لكل مستأجر، وعمليات ترحيل، ونسخ احتياطية). ملف README عبارة عن مرجع لكل فئة: يوثق كل قسم خدمة أو مساعداً أو أداة تحقق واحدة ويوضحها بأمثلة استخدام بلغة C#. لقد كُتب كوثائق لواجهة برمجة التطبيقات (API) بدلاً من دليل لبدء الاستخدام، لذا فإن المواد أدناه تعكس ما يستعرضه ملف README فعلياً. استراتيجيات تعدد المستأجرين تصف اختبارات العزل الشاملة في ملف README نهجين مدعومين: - اتصال لكل مستأجر (Connection-per-tenant): يتم دعم كل مستأجر بملف SQLite فيزيائي خاص به، مما يوفر عزلاً على مستوى الملف. يشير سلسلة اتصال المستأجر إلى قاعدة بيانات ذلك المستأجر فقط. - المخطط المشترك (Shared-schema): يتشارك جميع المستأجرين في ملف SQLite واحد، ويقوم عمود تمييز TenantId بتحديد نطاق كل استعلام بحيث يقرأ كل مستأجر أو يكتب صفوفه الخاصة فقط. تُعرض اختبارات العزل كفحوصات عدائية متعمدة للتأكد من أن المستأجر لا يمكنه قراءة أو تحديث أو حذف صفوف مستأجر آخر تحت أي من النموذجين. يقوم كود الاختبار التجريبي بإنشاء ملفات قواعد بيانات مؤقتة لكل مستأجر، وإدراج مستندات موسومة بالمستأجر، ويؤكد أن الاستعلام باستخدام عامل تصفية TenantId يعيد فقط عناوين ذلك المستأجر. ويظهر النمط نفسه لملف مشترك يحتوي على صفوف لعدة مستأجرين. تقوم الطرق المساعدة في العينات ببناء سلاسل الاتصال، وإنشاء جدول Documents بأعمدة Id و TenantId و Title، وإدراج الصفوف باستخدام أوامر ذات معاملات، وقراءة العناوين المصفاة حسب المستأجر. فحص السلامة يقوم IntegrityCheckService بتنفيذ عمليات SQLite PRAGMA integrity_check عبر قواعد بيانات المستأجرين. نقاط الدخول الموثقة هي: - فحص مستأجر واحد بواسطة المعرف (id). - فحص قائمة صريحة من المستأجرين، مع وسيط maxDegreeOfParallelism. - فحص جميع المستأجرين في النظام، أيضاً مع إمكانية تكوين التوازي. - فحص المستأجرين النشطين فقط. تظهر النتائج ككائنات TenantIntegrityCheckResult تكشف على الأقل عن TenantId و IsOk. يتم تقديم التوازي القابل للتكوين كوسيلة لإدارة حمل النظام أثناء التحقق. مساعدات سياق المستأجر تضيف TenantContextHelperExtensions طرق توسعة إلى TenantContextHelper للعمل داخل نطاقات متعددة المستأجرين. يوضح ملف README ما يلي: التحقق مما إذا كان المستأجر الحالي يطابق معرفاً مستهدفاً، وإنشاء نطاق تم التحقق منه يمكنه حمل معرف المستأجر ومعرف المستخدم ويُستخدم في كتلة using، واسترداد سياق المستأجر المطلوب، واسترداد معرف المستأجر المطلوب مباشرة، وتنفيذ إجراء أو دالة تعيد قيمة داخل سياق مستأجر محدد. تهدف هذه الأدوات إلى تقليل الأعمال الروتينية المتكررة حول مسارات الكود المدركة للمستأجر. التحقق من البرمجيات الوسيطة (Middleware) تم توثيق أداتي تحقق: - RateLimitingMiddlewareValidation: تتحقق من مثيل RateLimitingMiddleware، وكائن RateLimitingConfig (مع حقول مثل MaxRequestsPerSecond و MaxBurst و WindowSize و Enabled و BanDuration)، و RateLimitExceededResult (IsExceeded و RetryAfter و CurrentRequestCount و Limit و Window)، و RateLimitStatistics (TotalRequests و AllowedRequests و DeniedRequests و PeakRequestsPerSecond و CurrentActiveLimits). لكل تحميل زائد، يوضح ملف README أن Validate تعيد قائمة من سلاسل المشكلات، و IsValid تعيد قيمة منطقية، و EnsureValid تطلق استثناءً عندما يكون الإدخال غير صالح. يقوم مثال على سير العمل بالتحقق من تكوين البرمجيات الوسيطة قبل الاستخدام والتقاط استثناء الوسيطة الناتج. - ErrorHandlingMiddlewareValidation: توفر طرق توسعة تتحقق من مثيل ErrorHandlingMiddleware وكائنات Result. تتحقق من المراجع الفارغة (null)، والاتساق بين أعلام النجاح ورسائل الخطأ، وأن النتائج الناجحة تحمل قيمة غير افتراضية. السطح الموثق هو Validate و IsValid و EnsureValid على البرمجيات الوسيطة، بالإضافة إلى نفس الطرق الثلاث على قيم Result، بحيث يمكن فرض الثوابت في وقت مبكر من خط أنابيب الطلب. الوصول إلى الإعدادات تضيف SettingsControllerExtensions عمليات ذات أنواع قوية وعمليات دفعية إلى SettingsController. تشمل الطرق الموثقة: قراءة إعداد كنوع ملموس، اختيارياً مع دالة تحليل مخصصة (على سبيل المثال لـ DateTime)؛ كتابة قيمة ذات نوع قوي؛ تحديث قاموس من الإعدادات في استدعاء دفعي واحد؛ اختبار ما إذا كان الإعداد موجوداً؛ واسترداد الإعدادات المصفاة بواسطة مسند (predicate)، مما يعيد قائمة من قيم الإعدادات. يتم تغليف النتائج في كائن استجابة API مع حمولة Data، كما هو موضح في فحوصات OkObjectResult في الأمثلة. أدوات التسلسل (Serialization) - ReportGeneratorJsonExtensions: تغلف تسلسل System.Text.Json لبيانات المراقبة: ملخصات الحالة، وإحصائيات العمليات، ومقاييس الأداء. توثق ToJson للكتابة، و FromJsonToOperationStatistics لقراءة الإحصائيات، و TryFromJson لمقاييس الأداء مع نتيجة نجاح منطقية. - StringUtilitiesJsonExtensions: تقوم بتسلسل وإلغاء تسلسل السلاسل النصية، مع متغيرات ترفق هاش SHA256 أو تحول إلى snake_case، بالإضافة إلى طريقة try-deserialize التي تبلغ عن النجاح دون إطلاق استثناء. أدوات الاختبار توفر TenantNameValidatorTestsExtensions مساعدات بأسلوب التأكيد (assertion) للتحقق من صحة اسم المستأجر: التحقق من أن الاسم يرتبط بمعرف مستأجر طبيعي متوقع، وأن الاسم يعتبر معرف مستأجر صالحاً، وأن الاسم غير الصالح يؤدي إلى رسالة خطأ محددة متوقعة، وتعداد المجموعات المدمجة لمعرفات المستأجرين غير الصالحة مع أخطائها وتعيينات الاسم-إلى-المعرف الصالحة. هذه الأدوات مخصصة لإعادة الاستخدام من مجموعات الاختبار. ملاحظات للتقييم ملف README هو توثيق لواجهات برمجة تطبيقات فردية مع مقتطفات استخدام؛ وهو لا يتضمن تعليمات التثبيت، أو أسماء الحزم، أو إصدارات .NET المدعومة، أو أدلة تفصيلية لعمليات الترحيل أو النسخ الاحتياطي، أو تفاصيل الترخيص والمساهمة، على الرغم من ذكر الترحيلات والنسخ الاحتياطية في وصف المستودع. تشير العينات إلى مساحات أسماء مثل SqliteMultiTenant.Services و SqliteMultiTenant.Models و SqliteMultiTenant.Utilities و SqliteMultiTenant.Middleware و SqliteMultiTenant.Monitoring و SqliteMultiTenant.Validation و SqliteMultiTenant.Api.Controllers، وتعتمد على System.Data.SQLite وإطار عمل اختبار. يجب على القراء التعامل مع العينات كأمثلة توضيحية وتأكيد واجهات برمجة التطبيقات الحالية والتغليف وضمانات العزل مقابل المصدر قبل اعتمادها. تشير الكتل المتكررة في نهاية ملف README إلى وجود بعض التكرار في المستند نفسه.