প্রকল্প সম্পর্কে

সারসংক্ষেপ এই রিপোজিটরি, sqlite-multi-tenant, হলো .NET-এর জন্য একটি multi-tenant SQLite ডাটাবেস ম্যানেজার (রিপোজিটরি মেটাডেটাতে এটিকে প্রতি-টেন্যান্ট আইসোলেশন, মাইগ্রেশন এবং ব্যাকআপ প্রদানকারী হিসেবে বর্ণনা করা হয়েছে)। এর README ফাইলটি একটি ক্লাস-বাই-ক্লাস রেফারেন্স হিসেবে কাজ করে: প্রতিটি সেকশনে একটি সার্ভিস, হেল্পার বা ভ্যালিডেটর ডকুমেন্ট করা হয়েছে এবং C# ব্যবহারের উদাহরণের মাধ্যমে তা ব্যাখ্যা করা হয়েছে। এটি একটি গেটিং-স্টার্টেড গাইডের পরিবর্তে API ডকুমেন্টেশন হিসেবে লেখা হয়েছে, তাই নিচের বিষয়গুলো README-তে প্রদর্শিত তথ্যের প্রতিফলন। মাল্টি-টেন্যান্সি কৌশল (Multi-tenancy strategies) README-র এন্ড-টু-এন্ড আইসোলেশন টেস্ট দুটি সমর্থিত পদ্ধতির বর্ণনা দেয়: - Connection-per-tenant: প্রতিটি টেন্যান্টের জন্য আলাদা ফিজিক্যাল SQLite ফাইল থাকে, যা ফাইল-লেভেল আইসোলেশন প্রদান করে। একটি টেন্যান্টের কানেকশন স্ট্রিং শুধুমাত্র সেই টেন্যান্টের ডাটাবেসকে নির্দেশ করে। - Shared-schema: সমস্ত টেন্যান্ট একটি একক SQLite ফাইল শেয়ার করে এবং একটি TenantId ডিসক্রিমিনেটর কলাম প্রতিটি কুয়েরিকে স্কোপ করে, যাতে প্রতিটি টেন্যান্ট শুধুমাত্র তার নিজস্ব রো (row) পড়তে বা লিখতে পারে। আইসোলেশন টেস্টগুলো ইচ্ছাকৃতভাবে প্রতিকূল পরীক্ষা হিসেবে উপস্থাপন করা হয়েছে যাতে নিশ্চিত করা যায় যে কোনো টেন্যান্ট অন্য টেন্যান্টের রো পড়তে, আপডেট করতে বা ডিলিট করতে পারে না। স্যাম্পল টেস্ট কোডটি প্রতি-টেন্যান্ট টেম্প ডাটাবেস ফাইল তৈরি করে, টেন্যান্ট-ট্যাগযুক্ত ডকুমেন্ট ইনসার্ট করে এবং নিশ্চিত করে যে TenantId ফিল্টার দিয়ে কুয়েরি করলে শুধুমাত্র সেই টেন্যান্টের টাইটেলগুলোই ফিরে আসে। একাধিক টেন্যান্টের রো containing একটি শেয়ারড ফাইলের জন্যও একই প্যাটার্ন দেখানো হয়েছে। স্যাম্পলগুলোর হেল্পার মেথডগুলো কানেকশন স্ট্রিং তৈরি করে, Id, TenantId এবং Title কলামসহ একটি Documents টেবিল তৈরি করে, প্যারামিটারাইজড কমান্ডের মাধ্যমে রো ইনসার্ট করে এবং টেন্যান্ট অনুযায়ী ফিল্টার করে টাইটেলগুলো পড়ে। ইনটিগ্রিটি চেকিং (Integrity checking) IntegrityCheckService টেন্যান্ট ডাটাবেসগুলোতে SQLite PRAGMA integrity_check অপারেশন পরিচালনা করে। ডকুমেন্ট করা এন্ট্রি পয়েন্টগুলো হলো: - আইডি দ্বারা একটি একক টেন্যান্ট চেক করা। - maxDegreeOfParallelism আর্গুমেন্টসহ টেন্যান্টদের একটি নির্দিষ্ট তালিকা চেক করা। - কনফিগারযোগ্য প্যারালেলিজমসহ সিস্টেমের সমস্ত টেন্যান্ট চেক করা। - শুধুমাত্র সক্রিয় টেন্যান্টদের চেক করা। ফলাফলগুলো TenantIntegrityCheckResult অবজেক্ট হিসেবে প্রদর্শিত হয় যা অন্তত TenantId এবং IsOk প্রকাশ করে। কনফিগারযোগ্য প্যারালেলিজমকে ভ্যালিডেশনের সময় সিস্টেম লোড ম্যানেজ করার একটি উপায় হিসেবে উপস্থাপন করা হয়েছে। টেন্যান্ট কনটেক্সট হেল্পার (Tenant context helpers) TenantContextHelperExtensions মাল্টি-টেন্যান্ট স্কোপের ভেতরে কাজ করার জন্য TenantContextHelper-এ এক্সটেনশন মেথড যোগ করে। README-তে দেখানো হয়েছে: বর্তমান টেন্যান্ট একটি টার্গেট আইডির সাথে মেলে কি না তা পরীক্ষা করা, একটি ভ্যালিডেটেড স্কোপ তৈরি করা যা টেন্যান্ট আইডি এবং ইউজার আইডি বহন করতে পারে এবং একটি using ব্লকে ব্যবহৃত হয়, প্রয়োজনীয় টেন্যান্ট কনটেক্সট পুনরুদ্ধার করা, সরাসরি প্রয়োজনীয় টেন্যান্ট আইডি পুনরুদ্ধার করা এবং একটি নির্দিষ্ট টেন্যান্ট কনটেক্সটের ভেতরে একটি অ্যাকশন বা ভ্যালু-রিটার্নিং ফাংশন এক্সিকিউট করা। এগুলোর লক্ষ্য হলো টেন্যান্ট-সচেতন কোড পাথের পুনরাবৃত্তিমূলক কাজগুলো কমানো। মিডলওয়্যার ভ্যালিডেশন (Middleware validation) দুটি ভ্যালিডেটর ডকুমেন্ট করা হয়েছে: - RateLimitingMiddlewareValidation একটি RateLimitingMiddleware ইনস্ট্যান্স, একটি RateLimitingConfig অবজেক্ট (MaxRequestsPerSecond, MaxBurst, WindowSize, Enabled এবং BanDuration-এর মতো ফিল্ডসহ), একটি RateLimitExceededResult (IsExceeded, RetryAfter, CurrentRequestCount, Limit, Window) এবং RateLimitStatistics (TotalRequests, AllowedRequests, DeniedRequests, PeakRequestsPerSecond, CurrentActiveLimits) ভ্যালিডেট করে। প্রতিটি ওভারলোডের জন্য README-তে দেখানো হয়েছে যে Validate একটি প্রবলেম স্ট্রিং লিস্ট রিটার্ন করে, IsValid একটি বুলিয়ান রিটার্ন করে এবং ইনপুট ইনভ্যালিড হলে EnsureValid একটি এক্সেপশন থ্রো করে। একটি ওয়ার্কফ্লো উদাহরণ ব্যবহারের আগে মিডলওয়্যার কনফিগারেশন ভ্যালিডেট করে এবং resulting আর্গুমেন্ট এক্সেপশনটি ক্যাচ করে। - ErrorHandlingMiddlewareValidation এক্সটেনশন মেথড প্রদান করে যা একটি ErrorHandlingMiddleware ইনস্ট্যান্স এবং Result অবজেক্টগুলো ভ্যালিডেট করে। এটি নাল রেফারেন্স, সাকসেস ফ্ল্যাগ এবং এরর মেসেজের মধ্যে সামঞ্জস্য এবং সফল ফলাফলগুলো ডিফল্ট ভ্যালুর বাইরে কি না তা পরীক্ষা করে। ডকুমেন্ট করা সারফেস হলো মিডলওয়্যারের ওপর Validate, IsValid এবং EnsureValid, এবং Result ভ্যালুগুলোর ওপর একই তিনটি মেথড, যাতে রিকোয়েস্ট পাইপলাইনের শুরুতেই ইনভ্যারিয়েন্টগুলো কার্যকর করা যায়। সেটিংস অ্যাক্সেস (Settings access) SettingsControllerExtensions, SettingsController-এ স্ট্রংলি টাইপড এবং ব্যাচ অপারেশন যোগ করে। ডকুমেন্ট করা মেথডগুলোর মধ্যে রয়েছে: একটি নির্দিষ্ট টাইপ হিসেবে সেটিংস পড়া, ঐচ্ছিকভাবে একটি কাস্টম পার্স ফাংশনের সাথে (যেমন DateTime-এর জন্য); একটি স্ট্রংলি টাইপড ভ্যালু লেখা; একটি ব্যাচ কলের মাধ্যমে সেটিংসের ডিকশনারি আপডেট করা; একটি সেটিংস বিদ্যমান কি না তা পরীক্ষা করা; এবং একটি প্রেডিকেট দ্বারা ফিল্টার করা সেটিংস পুনরুদ্ধার করা, যা সেটিংস ভ্যালুর একটি লিস্ট রিটার্ন করে। ফলাফলগুলো একটি API রেসপন্স অবজেক্টের Data পেলোডের মধ্যে র‍্যাপ করা থাকে, যা উদাহরণের OkObjectResult চেক দ্বারা দেখানো হয়েছে। সিরিয়ালাইজেশন ইউটিলিটিজ (Serialization utilities) - ReportGeneratorJsonExtensions মনিটরিং ডেটার জন্য System.Text.Json সিরিয়ালাইজেশন র‍্যাপ করে: হেলথ সামারি, অপারেশন স্ট্যাটিস্টিকস এবং পারফরম্যান্স মেট্রিক্স। এটি লেখার জন্য ToJson, স্ট্যাটিস্টিকস পড়ার জন্য FromJsonToOperationStatistics এবং বুলিয়ান সাকসেস রেজাল্টসহ পারফরম্যান্স মেট্রিক্সের জন্য TryFromJson ডকুমেন্ট করে। - StringUtilitiesJsonExtensions স্ট্রিং সিরিয়ালাইজ এবং ডিসিরিয়ালাইজ করে, যার ভেরিয়েন্টগুলো SHA256 হ্যাশ যুক্ত করে বা snake_case-এ রূপান্তর করে, সাথে একটি try-deserialize মেথড রয়েছে যা এক্সেপশন থ্রো না করে সাকসেস রিপোর্ট করে। টেস্টিং ইউটিলিটিজ (Testing utilities) TenantNameValidatorTestsExtensions টেন্যান্ট নাম ভ্যালিডেশনের জন্য অ্যাসারশন-স্টাইল হেল্পার সরবরাহ করে: একটি নাম প্রত্যাশিত নরমালাইজড টেন্যান্ট আইডিতে ম্যাপ হয় কি না তা যাচাই করা, একটি নাম বৈধ টেন্যান্ট আইডি হিসেবে বিবেচিত কি না, একটি ইনভ্যালিড নাম নির্দিষ্ট প্রত্যাশিত এরর মেসেজ দেয় কি না এবং ইনভ্যালিড টেন্যান্ট আইডি এবং বৈধ নাম-টু-আইড ম্যাপিংয়ের বিল্ট-ইন কালেকশনগুলো এনামারেট করা। এগুলো টেস্ট স্যুট থেকে পুনরায় ব্যবহারের জন্য তৈরি। মূল্যায়নের জন্য নোট (Notes for evaluation) README-টি ব্যবহারের স্নিপেটসহ ব্যক্তিগত API-এর ডকুমেন্টেশন; এতে ইনস্টলেশন নির্দেশাবলী, প্যাকেজ নাম, সমর্থিত .NET ভার্সন, মাইগ্রেশন বা ব্যাকআপ ওয়াকথ্রু, অথবা লাইসেন্স এবং কন্ট্রিবিউশন ডিটেইলস অন্তর্ভুক্ত নেই, যদিও রিপোজিটরি ডেসক্রিপশনে মাইগ্রেশন এবং ব্যাকআপের কথা উল্লেখ আছে। স্যাম্পলগুলো SqliteMultiTenant.Services, SqliteMultiTenant.Models, SqliteMultiTenant.Utilities, SqliteMultiTenant.Middleware, SqliteMultiTenant.Monitoring, SqliteMultiTenant.Validation এবং SqliteMultiTenant.Api.Controllers-এর মতো নেমস্পেস রেফার করে এবং এগুলো System.Data.SQLite এবং একটি টেস্ট ফ্রেমওয়ার্কের ওপর নির্ভরশীল। পাঠকদের উচিত স্যাম্পলগুলোকে দৃষ্টান্তমূলক হিসেবে বিবেচনা করা এবং সেগুলো গ্রহণ করার আগে সোর্স কোডের বিপরীতে বর্তমান API, প্যাকেজিং এবং আইসোলেশন গ্যারান্টি নিশ্চিত করা। README-র শেষের পুনরাবৃত্ত ব্লকগুলো নির্দেশ করে যে ডকুমেন্টের ভেতরে কিছু ডুপ্লিকেশন রয়েছে।