# Entity Naming Convention Refactoring Plan

**تاریخ شروع**: 2024-12-03  
**تاریخ اتمام**: 2024-12-03  
**مدت زمان واقعی**: 3 ساعت  
**اولویت**: 🔴 فوری  
**وضعیت**: ✅ تکمیل شده

---

## 🎯 هدف

تبدیل 5 Entity از **Plural** به **Singular** مطابق با EF Core Convention:

```csharp
// Before: ❌
public class Products { }
DbSet<Products> Products { get; }

// After: ✅
public class Product { }
DbSet<Product> Products { get; }
```

---

## 📋 Entity های هدف

| # | Entity | تغییر به | استفاده | فایل‌ها | زمان | وضعیت |
|---|--------|----------|----------|---------|------|--------|
| 1 | UserCarts | UserCart | 192 | 40+ | 30m | ✅ Done |
| 2 | ProductImages | ProductImage | 181 | 35+ | 30m | ✅ Done |
| 3 | ProductGalleries | ProductGallery | 162 | 30+ | 30m | ✅ Done |
| 4 | Products | Product | 283 | 50+ | 45m | ✅ Done |
| 5 | Transactions | Transaction | 257 | 45+ | 45m | ✅ Done |

**نتیجه نهایی**: 
- ✅ تمام 5 Entity به Singular تبدیل شدند
- ✅ Build: 0 errors
- ✅ 1075+ استفاده به‌روز شدند

---

## 🔧 مراحل اجرا (برای هر Entity)

### Phase 1: تغییر نام Entity File و Class

**1.1. تغییر نام فایل Entity:**
```bash
mv Products.cs Product.cs
```

**1.2. تغییر نام کلاس در فایل:**
```csharp
// Before:
public class Products : BaseAuditableEntity

// After:
public class Product : BaseAuditableEntity
```

**1.3. چک کردن وضعیت:**
- ✅ فایل تغییر نام یافت
- ✅ Class name صحیح است

---

### Phase 2: Configuration Files

**2.1. تغییر نام فایل Configuration:**
```bash
mv ProductsConfiguration.cs ProductConfiguration.cs
```

**2.2. تغییر Class و EntityTypeConfiguration:**
```csharp
// Before:
public class ProductsConfiguration : IEntityTypeConfiguration<Products>

// After:
public class ProductConfiguration : IEntityTypeConfiguration<Product>
```

**2.3. آپدیت builder type:**
```csharp
public void Configure(EntityTypeBuilder<Product> builder)
```

---

### Phase 3: DbContext Files

**3.1. آپدیت IApplicationDbContext:**
```csharp
// Before:
DbSet<Products> Products { get; }

// After:
DbSet<Product> Products { get; }
```

**3.2. آپدیت ApplicationDbContext:**
```csharp
// Before:
public DbSet<Products> Products => Set<Products>();

// After:
public DbSet<Product> Products => Set<Product>();
```

---

### Phase 4: Navigation Properties

**4.1. پیدا کردن تمام Navigation Properties:**
```bash
grep -r "ICollection<Products>" CMSMicroservice.Domain/Entities/
```

**4.2. تغییر به Singular:**
```csharp
// Before:
public virtual ICollection<Products> Products { get; set; }

// After:
public virtual ICollection<Product> Products { get; set; }
```

**4.3. آپدیت Foreign Key references:**
```csharp
// WithMany relations
builder.HasOne(x => x.Category)
       .WithMany(x => x.Products)  // همین Plural باقی بماند
       .HasForeignKey(x => x.CategoryId);
```

---

### Phase 5: CQRS - تغییر نام Folders

**5.1. تغییر نام CQ Folder:**
```bash
# معمولاً نیازی نیست - ProductsCQ همان باقی می‌ماند
# چون به feature اشاره می‌کند نه Entity
```

**5.2. تغییر نام Commands/Queries folders (اختیاری):**
```bash
# معمولاً نام‌ها جمع هستند و تغییر نمی‌کنند
```

---

### Phase 6: CQRS - آپدیت Class References

**6.1. Batch update در Commands:**
```bash
find . -type f -name "*.cs" -exec sed -i 's/\bProducts\b/Product/g' {} \;
```

**توجه**: این command همه جا تغییر می‌دهد! باید دقیق باشیم.

**6.2. Manual review برای موارد خاص:**
- DbSet property names باید Plural بمانند
- Folder names معمولاً Plural هستند
- Navigation Properties باید Plural باشند

---

### Phase 7: Events

**7.1. آپدیت Event namespaces:**
```bash
find . -path "*/ProductsEvents/*" -name "*.cs" -exec sed -i 's/\bProducts\b/Product/g' {} \;
```

**7.2. Review Event class names:**
```csharp
// Before:
public class ProductsCreatedEvent

// After:  
public class ProductCreatedEvent
```

---

### Phase 8: Proto Files

**8.1. آپدیت proto references (احتمالاً نیاز نیست):**
```protobuf
// Proto files معمولاً lowercase و plural هستند
// تغییر نمی‌دهیم مگر اینکه inconsistency باشد
```

**8.2. آپدیت Service references:**
```csharp
// فقط در صورت لزوم
```

---

### Phase 9: Validators & Profiles

**9.1. آپدیت Validator references:**
```bash
find . -path "*/Validator/*" -name "*Products*.cs" -exec sed -i 's/\bProducts\b/Product/g' {} \;
```

**9.2. آپدیت AutoMapper Profiles:**
```csharp
CreateMap<Product, ProductDto>();
CreateMap<CreateProductCommand, Product>();
```

---

### Phase 10: Build & Test

**10.1. Clean:**
```bash
find . -type d \( -name "obj" -o -name "bin" \) -exec rm -rf {} +
```

**10.2. Restore:**
```bash
dotnet restore
```

**10.3. Build:**
```bash
dotnet build
```

**10.4. Check for errors:**
- ✅ 0 Errors
- ⚠️ Warnings قابل قبول

**10.5. Manual review:**
- چک کردن چند فایل به صورت sample
- اطمینان از صحت Navigation Properties
- تست CRUD operations

---

## ⚠️ نکات مهم

### 🔴 جاهایی که باید Plural بمانند:

1. **DbSet Property Names:**
   ```csharp
   DbSet<Product> Products { get; }  // ✅ Products
   ```

2. **Navigation Properties:**
   ```csharp
   public virtual ICollection<Product> Products { get; set; }  // ✅ Products
   ```

3. **Table Names (در Configuration):**
   ```csharp
   builder.ToTable("Products");  // ✅ معمولاً Plural
   ```

4. **CQ Folder Names:**
   ```
   ProductsCQ/  // ✅ معمولاً Plural (به feature اشاره می‌کند)
   ```

5. **Proto Files:**
   ```
   products.proto  // ✅ معمولاً Plural
   ```

### 🟢 جاهایی که باید Singular شوند:

1. **Entity Class Name:**
   ```csharp
   public class Product { }  // ✅ Singular
   ```

2. **Configuration Class:**
   ```csharp
   public class ProductConfiguration  // ✅ Singular
   ```

3. **Generic Type Parameters:**
   ```csharp
   IEntityTypeConfiguration<Product>  // ✅ Singular
   EntityTypeBuilder<Product>  // ✅ Singular
   ```

4. **DbSet Generic Type:**
   ```csharp
   DbSet<Product>  // ✅ Singular
   ```

---

## 🎯 ترتیب پیشنهادی اجرا

### دور 1: UserCarts → UserCart
**دلیل**: کمترین complexity، بهترین برای test کردن process

**مراحل**:
1. Entity + Configuration
2. DbContext
3. Navigation Properties (کم)
4. CQRS Handlers
5. Build & Test

**زمان**: 45 دقیقه

---

### دور 2: ProductImages → ProductImage
**دلیل**: مشابه UserCart، پیچیدگی کم

**زمان**: 45 دقیقه

---

### دور 3: ProductGalleries → ProductGallery
**دلیل**: تازه ProductGalleries درست کردیم، فعلاً fresh است

**زمان**: 45 دقیقه

---

### دور 4: Products → Product
**دلیل**: پر استفاده‌ترین، باید در آخر باشد

**زمان**: 1 ساعت

---

### دور 5: Transactions → Transaction
**دلیل**: پر استفاده، باید در آخر باشد

**زمان**: 1 ساعت

---

## 📊 Progress Tracking

| Entity | Start | End | Duration | Status | Notes |
|--------|-------|-----|----------|--------|-------|
| UserCarts | - | - | - | ⏸️ | - |
| ProductImages | - | - | - | ⏸️ | - |
| ProductGalleries | - | - | - | ⏸️ | - |
| Products | - | - | - | ⏸️ | - |
| Transactions | - | - | - | ⏸️ | - |

---

## ✅ Checklist برای هر Entity

### Pre-Refactoring:
- [ ] Backup گرفته شد
- [ ] Build موفق است (baseline)
- [ ] Git commit انجام شد

### During Refactoring:
- [ ] Entity file renamed
- [ ] Entity class renamed
- [ ] Configuration file renamed
- [ ] Configuration class updated
- [ ] IApplicationDbContext updated
- [ ] ApplicationDbContext updated
- [ ] Navigation Properties updated
- [ ] CQRS Handlers updated (batch)
- [ ] Events updated
- [ ] Validators updated
- [ ] Profiles updated

### Post-Refactoring:
- [ ] Build successful (0 errors)
- [ ] Manual review انجام شد
- [ ] Git commit با message مناسب
- [ ] Documentation updated

---

**آخرین به‌روزرسانی**: 2024-12-03  
**وضعیت کلی**: 🔄 آماده برای شروع
