سرفس الزبائن (CustomerService)
شنو تسوي هاي السرفس؟
CustomerService عبارة عن كلاس مسؤول عن إدارة عمليات الزبائن داخل النظام، مثل إضافة زبون جديد.
الحقول (Fields) المستخدمة
private readonly AppDbContext _context;
private readonly AccountsService _accountService;
| المتغيّر | شنو يسوي؟ |
|---|---|
_context | يمثل قاعدة البيانات (Entity Framework). |
_accountService | يتعامل ويا حسابات المالية الزبائن، مثل إنشاء حساب جديد. |
الكونستركتر
public CustomerService(AppDbContext context, AccountsService accountService)
- يحقن قاعدة البيانات وخدمة الحسابات حتى نستخدمهم داخل الكلاس.
الدالة Add(...)
public async Task<CustomerResponse> Add(string name, string? phoneNumber, string? address, CancellationToken ct)
هاي الدالة تضيف زبون جديد، وتتكون من الخطوات التالية:
1. التحقق إذا الزبون موجود مسبقًا
var customerExist = await _context.Customer
.IgnoreQueryFilters()
.Where(c => c.Name == name)
.FirstOrDefaultAsync(ct);
- يبحث إذا أكو زبون بنفس الاسم، حتى لو كان محذوف.
- يستخدم
IgnoreQueryFiltersحتى يشوف الزبائن المحذوفين مؤقتًا (soft delete).
2. التحقق من حالة الزبون
- إذا الزبون موجود وممـحـذوف:
if (customerExist != null && customerExist.DeletedAt == null)
throw new ApiException("CustomerWithTheSameNameExist", "زبون بنفس الاسم موجود", 409);
- إذا الزبون موجود لكن محذوف:
if (customerExist != null && customerExist.DeletedAt != null)
throw new ApiException("DeletedCustomerWithTheSameNameExist", "زبون بنفس الاسم موجود لكن محذوف. هل تريد استعادته؟", 409);
3. إنشاء حساب مالي للزبون
var account = await _accountService.NewAccount(name, CommonAccountOption.Customers, ct);
- ينشئ حساب مالي مرتبط بالزبون تحت نوع
Customers.
4. إنشاء الزبون وحفظه
var customer = new CustomerModel {
Id = Ulid.NewUlid(),
Name = name,
PhoneNumber = phoneNumber,
Location = address ?? "",
AccountId = account.Id
};
- ينشئ كائن الزبون.
- إذا العنوان ما موجود، يحط قيمة فارغة بدلًا عنه.
5. حفظ الحساب والزبون بقاعدة البيانات
await _accountService.SaveAccount(account, ct);
_context.Customer.Add(customer);
await _context.SaveChangesAsync(ct);
6. إرجاع الرد
return new CustomerResponse(customer);
- يرجع نسخة من الزبون باستخدام كلاس
CustomerResponse.
ملاحظات
- النظام يستخدم Soft Delete (يعني الزبون ينحذف بس ما ينمسح من قاعدة البيانات).
- يستخدم
Ulidكـ ID للزبون (مميز وزمني). - يعتمد على خدمات أخرى مثل
AccountsService.