update
This commit is contained in:
@@ -0,0 +1,181 @@
|
||||
# 📚 FourSat Project Documentation
|
||||
|
||||
> **آخرین بروزرسانی**: January 3, 2026
|
||||
> **وضعیت**: ✅ Production Ready
|
||||
> **Domain**: `*.se.kbs1.ir`
|
||||
|
||||
---
|
||||
|
||||
## ⚡ Quick Reference (نکات مهم)
|
||||
|
||||
### 🌐 آدرسهای Stage
|
||||
| سرویس | آدرس |
|
||||
|-------|------|
|
||||
| BackOffice | `https://backoffice.se.kbs1.ir` |
|
||||
| BackOffice BFF | `https://backoffice-bff.se.kbs1.ir` |
|
||||
| FrontOffice | `https://frontoffice.se.kbs1.ir` |
|
||||
| FrontOffice BFF | `https://frontoffice-bff.se.kbs1.ir` |
|
||||
| CMS | `https://cms.se.kbs1.ir` |
|
||||
| Git | `git.se.kbs1.ir` |
|
||||
|
||||
### 📦 Git Repositories
|
||||
```bash
|
||||
# BackOffice
|
||||
git remote -v # kub-stage → https://git.se.kbs1.ir/admin/BackOffice.git
|
||||
|
||||
# BackOffice.BFF
|
||||
git remote -v # kub-stage → https://git.se.kbs1.ir/admin/BackOffice.BFF.git
|
||||
|
||||
# CMS
|
||||
git remote -v # gitea → https://git.se.kbs1.ir/admin/CMS.git
|
||||
```
|
||||
|
||||
### 🔧 Build Commands
|
||||
```bash
|
||||
# BackOffice (Proto DLLs required)
|
||||
cd BackOffice && ./build-deps.sh
|
||||
cd src && dotnet build BackOffice.sln
|
||||
|
||||
# BFF/CMS
|
||||
cd [Project]/src && dotnet build
|
||||
|
||||
# Deploy
|
||||
git push kub-stage main
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ معماری پروژه
|
||||
|
||||
```
|
||||
┌───────────────────────────────────────────────────────────────┐
|
||||
│ FRONTEND (Blazor WASM) │
|
||||
│ BackOffice (Admin) │ FrontOffice (User) │
|
||||
└───────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
gRPC-Web + JWT
|
||||
▼
|
||||
┌───────────────────────────────────────────────────────────────┐
|
||||
│ BFF (Backend For Frontend) │
|
||||
│ BackOffice.BFF │ FrontOffice.BFF │
|
||||
│ CQRS + MediatR + Proto Contracts │
|
||||
└───────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
gRPC
|
||||
▼
|
||||
┌───────────────────────────────────────────────────────────────┐
|
||||
│ CMS Microservice │
|
||||
│ Clean Architecture + PostgreSQL │
|
||||
│ Commission │ Network │ Club │ Inventory │
|
||||
└───────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📂 ساختار پروژه
|
||||
|
||||
```
|
||||
FourSat/
|
||||
├── BackOffice/ # Admin Panel (Blazor WASM)
|
||||
│ ├── src/BackOffice/ # UI - 96 pages, 21 modules
|
||||
│ ├── libs/ # Pre-built Proto DLLs (24)
|
||||
│ └── build-deps.sh # Build proto dependencies
|
||||
│
|
||||
├── BackOffice.BFF/ # Backend For Frontend
|
||||
│ └── src/Protobufs/ # 24 Proto projects
|
||||
│
|
||||
├── FrontOffice/ # User Frontend (Blazor WASM)
|
||||
├── FrontOffice.BFF/ # Backend For Frontend
|
||||
│
|
||||
├── CMS/ # Core Microservice
|
||||
│ └── src/
|
||||
│ ├── CMSMicroservice.Domain/
|
||||
│ ├── CMSMicroservice.Application/
|
||||
│ ├── CMSMicroservice.Infrastructure/
|
||||
│ └── CMSMicroservice.WebApi/
|
||||
│
|
||||
├── DataMigration/ # One-time Migration Tool
|
||||
│
|
||||
└── totalDoc/ # Documentation
|
||||
└── final-docs/ # ← این پوشه
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 مدل کاری (Workflow)
|
||||
|
||||
### توسعه Local:
|
||||
```bash
|
||||
# 1. تغییرات در کد
|
||||
# 2. Build و تست
|
||||
dotnet build && dotnet run
|
||||
|
||||
# 3. Commit
|
||||
git add . && git commit -m "feat: description"
|
||||
```
|
||||
|
||||
### Deploy به Stage:
|
||||
```bash
|
||||
# Push به remote → Gitea Actions → Docker → K8s
|
||||
git push kub-stage main
|
||||
```
|
||||
|
||||
### تغییر Proto:
|
||||
```bash
|
||||
# 1. تغییر در CMS/BackOffice.BFF
|
||||
# 2. Rebuild DLLs
|
||||
cd BackOffice && ./build-deps.sh
|
||||
# 3. Build UI
|
||||
cd src && dotnet build
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 وضعیت سیستمها
|
||||
|
||||
| سیستم | ماژولها | وضعیت |
|
||||
|-------|---------|--------|
|
||||
| BackOffice | 21 ماژول, 96 صفحه | ✅ Ready |
|
||||
| BackOffice.BFF | 24 Proto | ✅ Ready |
|
||||
| CMS | Commission, Network, Club, Inventory | ✅ Ready |
|
||||
| FrontOffice | User UI | ⏳ Active |
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Tech Stack
|
||||
|
||||
| Layer | Technology |
|
||||
|-------|------------|
|
||||
| Frontend | Blazor WebAssembly, MudBlazor, .NET 9.0 |
|
||||
| BFF | ASP.NET Core, gRPC, MediatR, Mapster |
|
||||
| Backend | Clean Architecture, EF Core, PostgreSQL |
|
||||
| Communication | gRPC, gRPC-Web, Protobuf |
|
||||
| CI/CD | Gitea Actions, Docker, Kubernetes |
|
||||
| Auth | JWT |
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ نکات مهم
|
||||
|
||||
1. **Proto DLLs**: قبل از build کردن BackOffice، حتماً `./build-deps.sh` اجرا شود
|
||||
2. **Domain**: همه آدرسها به `*.se.kbs1.ir` تغییر کرده
|
||||
3. **PublicMessage.Protobuf**: تنها proto با `net8.0` (بقیه `net9.0`)
|
||||
4. **Package Versions**: `Google.Protobuf: 3.28.3`, `Grpc.Core.Api: 2.71.0`
|
||||
|
||||
---
|
||||
|
||||
## 📋 فهرست مستندات
|
||||
|
||||
| # | فایل | موضوع |
|
||||
|---|------|-------|
|
||||
| 1 | [01-BACKOFFICE.md](./01-BACKOFFICE.md) | Admin Panel - ماژولها و صفحات |
|
||||
| 2 | [02-PROTO-GUIDE.md](./02-PROTO-GUIDE.md) | Proto & gRPC - راهنمای packaging |
|
||||
| 3 | [03-DATA-MIGRATION.md](./03-DATA-MIGRATION.md) | Data Migration - 33 جدول |
|
||||
| 4 | [04-CMS.md](./04-CMS.md) | CMS Microservice |
|
||||
| 5 | [05-DEPLOYMENT.md](./05-DEPLOYMENT.md) | Deployment & CI/CD |
|
||||
|
||||
---
|
||||
|
||||
## 📁 آرشیو
|
||||
|
||||
مستندات قدیمی در `totalDoc/archive/` نگهداری میشوند
|
||||
@@ -0,0 +1,360 @@
|
||||
# 📚 BackOffice (Admin Panel) - Complete Documentation
|
||||
|
||||
> **آخرین بروزرسانی**: January 3, 2026
|
||||
> **Build Status**: ✅ SUCCESS (0 Errors)
|
||||
> **Framework**: Blazor WebAssembly (.NET 9.0) + MudBlazor UI
|
||||
|
||||
---
|
||||
|
||||
## 📊 وضعیت کلی سیستم
|
||||
|
||||
| Component | Status | Errors |
|
||||
|-----------|--------|--------|
|
||||
| BackOffice UI | ✅ SUCCESS | 0 |
|
||||
| BackOffice.BFF | ✅ SUCCESS | 0 |
|
||||
| CMS Microservice | ✅ SUCCESS | 0 |
|
||||
|
||||
**System Status**: 🟢 **PRODUCTION READY**
|
||||
|
||||
---
|
||||
|
||||
## 🗂️ ماژولهای فعال (21 ماژول - 96 صفحه)
|
||||
|
||||
### آمار صفحات هر ماژول:
|
||||
|
||||
| ماژول | تعداد صفحات | وضعیت |
|
||||
|-------|-------------|--------|
|
||||
| DiscountShop | 9 | ✅ |
|
||||
| Inventory | 9 | ✅ |
|
||||
| AutoComplete | 7 | ✅ |
|
||||
| Products | 7 | ✅ |
|
||||
| UserOrder | 6 | ✅ |
|
||||
| Commission | 6 | ✅ |
|
||||
| Club | 5 | ✅ |
|
||||
| Network | 4 | ✅ |
|
||||
| Payment | 4 | ✅ |
|
||||
| PublicMessages | 4 | ✅ |
|
||||
| Role | 4 | ✅ |
|
||||
| UserRole | 4 | ✅ |
|
||||
| SystemManagement | 4 | ✅ |
|
||||
| Category | 3 | ✅ |
|
||||
| Package | 3 | ✅ |
|
||||
| Settings | 3 | ✅ |
|
||||
| Tag | 3 | ✅ |
|
||||
| UserAddress | 3 | ✅ |
|
||||
| Dashboard | 2 | ✅ |
|
||||
| Login | 2 | ✅ |
|
||||
| User | 2 | ✅ |
|
||||
|
||||
---
|
||||
|
||||
## 📦 Proto Projects (24 پروژه)
|
||||
|
||||
### Core:
|
||||
- ✅ `BackOffice.BFF.Common.Protobuf`
|
||||
- ✅ `BackOffice.BFF.Health.Protobuf`
|
||||
- ✅ `BackOffice.BFF.Configuration.Protobuf`
|
||||
|
||||
### User Management:
|
||||
- ✅ `BackOffice.BFF.User.Protobuf`
|
||||
- ✅ `BackOffice.BFF.UserRole.Protobuf`
|
||||
- ✅ `BackOffice.BFF.Role.Protobuf`
|
||||
- ✅ `BackOffice.BFF.UserAddress.Protobuf`
|
||||
- ✅ `BackOffice.BFF.Otp.Protobuf`
|
||||
|
||||
### Products & Shop:
|
||||
- ✅ `BackOffice.BFF.Products.Protobuf`
|
||||
- ✅ `BackOffice.BFF.Category.Protobuf`
|
||||
- ✅ `BackOffice.BFF.Tag.Protobuf`
|
||||
- ✅ `BackOffice.BFF.ProductTag.Protobuf`
|
||||
- ✅ `BackOffice.BFF.Package.Protobuf`
|
||||
- ✅ `BackOffice.BFF.Inventory.Protobuf`
|
||||
|
||||
### Discount Shop:
|
||||
- ✅ `BackOffice.BFF.DiscountProduct.Protobuf`
|
||||
- ✅ `BackOffice.BFF.DiscountCategory.Protobuf`
|
||||
- ✅ `BackOffice.BFF.DiscountOrder.Protobuf`
|
||||
- ✅ `BackOffice.BFF.DiscountShoppingCart.Protobuf`
|
||||
|
||||
### Network & Commission:
|
||||
- ✅ `BackOffice.BFF.NetworkMembership.Protobuf`
|
||||
- ✅ `BackOffice.BFF.ClubMembership.Protobuf`
|
||||
- ✅ `BackOffice.BFF.Commission.Protobuf`
|
||||
|
||||
### Orders & Payments:
|
||||
- ✅ `BackOffice.BFF.UserOrder.Protobuf`
|
||||
- ✅ `BackOffice.BFF.ManualPayment.Protobuf`
|
||||
|
||||
### Messaging:
|
||||
- ✅ `BackOffice.BFF.PublicMessage.Protobuf`
|
||||
|
||||
---
|
||||
|
||||
## 🔧 معماری سیستم
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ BackOffice (Blazor WASM) │
|
||||
│ 96 Pages / 21 Modules │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
gRPC-Web + JWT
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ BackOffice.BFF │
|
||||
│ CQRS Handlers + Proto Contracts │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
gRPC
|
||||
│
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ CMS Microservice │
|
||||
│ Business Logic + PostgreSQL │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 راهنمای Build و Deploy
|
||||
|
||||
### Local Development:
|
||||
|
||||
```bash
|
||||
cd /home/masoud/Apps/project/FourSat/BackOffice/src
|
||||
dotnet build BackOffice.sln
|
||||
dotnet run --project BackOffice/BackOffice.csproj
|
||||
```
|
||||
|
||||
### Production با DLL های Proto:
|
||||
|
||||
```bash
|
||||
# 1. Build proto dependencies
|
||||
cd /home/masoud/Apps/project/FourSat/BackOffice
|
||||
./build-deps.sh
|
||||
|
||||
# 2. Build & Publish
|
||||
cd src
|
||||
dotnet publish BackOffice/BackOffice.csproj -c Release -o ./publish
|
||||
```
|
||||
|
||||
### Docker:
|
||||
|
||||
```bash
|
||||
cd /home/masoud/Apps/project/FourSat/BackOffice
|
||||
docker build -t backoffice:latest .
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📋 جزئیات ماژولها
|
||||
|
||||
### 1. Products Module
|
||||
**مسیر**: `Pages/Products/`
|
||||
|
||||
| صفحه | Route | توضیحات |
|
||||
|------|-------|---------|
|
||||
| ProductsMainPage | `/products` | لیست + فیلتر + صفحهبندی |
|
||||
| CreateDialog | - | ایجاد محصول + آپلود تصویر |
|
||||
| UpdateDialog | - | ویرایش محصول |
|
||||
| GalleryDialog | - | گالری تصاویر محصول |
|
||||
| BulkEdit | `/products/bulk-edit` | ویرایش گروهی قیمت/موجودی |
|
||||
| ProductCategoriesDragDropPage | `/products/categories` | تخصیص دستهبندی |
|
||||
| CategoryProductsDragDropPage | `/category/products` | مدیریت محصولات دسته |
|
||||
|
||||
**ویژگیها**:
|
||||
- ✅ ستون موجودی با رنگبندی هوشمند (🔴🟡🟢)
|
||||
- ✅ DragDrop دستهبندی محصولات
|
||||
- ✅ آپلود تصویر با پیشنمایش
|
||||
- ✅ مدیریت تگهای محصول
|
||||
|
||||
---
|
||||
|
||||
### 2. Inventory Module
|
||||
**مسیر**: `Pages/Inventory/`
|
||||
|
||||
| صفحه | Route | توضیحات |
|
||||
|------|-------|---------|
|
||||
| InventoryMainPage | `/inventory` | لیست موجودیها |
|
||||
| LowStockPage | `/inventory/low-stock` | هشدار موجودی کم |
|
||||
| MovementsPage | `/inventory/movements` | تاریخچه حرکات |
|
||||
| WarehousesPage | `/inventory/warehouses` | مدیریت انبارها |
|
||||
| AddStockDialog | - | اضافه کردن موجودی |
|
||||
| AdjustStockDialog | - | تنظیم موجودی |
|
||||
| RecordLossDialog | - | ثبت ضایعات |
|
||||
| TransferStockDialog | - | انتقال بین انبار |
|
||||
| InventorySettingsDialog | - | تنظیمات انبار |
|
||||
|
||||
**ویژگیها**:
|
||||
- ✅ انواع حرکت موجودی (ورود، خروج، تنظیم، انتقال، ضایعات)
|
||||
- ✅ هشدار موجودی کم با threshold قابل تنظیم
|
||||
- ✅ پشتیبانی از multi-warehouse
|
||||
|
||||
---
|
||||
|
||||
### 3. Discount Shop Module
|
||||
**مسیر**: `Pages/DiscountShop/`
|
||||
|
||||
| صفحه | Route | توضیحات |
|
||||
|------|-------|---------|
|
||||
| DiscountProductsMainPage | `/discount-products` | محصولات تخفیفی |
|
||||
| DiscountCategoriesMainPage | `/discount-categories` | دستهبندیها |
|
||||
| DiscountOrdersMainPage | `/discount-orders` | سفارشات |
|
||||
|
||||
**ویژگیها**:
|
||||
- ✅ CRUD محصولات تخفیفی
|
||||
- ✅ گالری تصاویر
|
||||
- ✅ مدیریت دستهبندی سلسلهمراتبی
|
||||
- ✅ مشاهده و تغییر وضعیت سفارشات
|
||||
|
||||
---
|
||||
|
||||
### 4. Commission Module
|
||||
**مسیر**: `Pages/Commission/`
|
||||
|
||||
| صفحه | Route | توضیحات |
|
||||
|------|-------|---------|
|
||||
| Dashboard | `/commission` | داشبورد استخر هفتگی |
|
||||
| WeeklyReports | `/commission/reports` | گزارشهای هفتگی |
|
||||
| Payouts | `/commission/payouts` | لیست پرداختها |
|
||||
| Withdrawals | `/commission/withdrawals` | لیست برداشتها |
|
||||
| UserBalances | `/network/balances` | بالانس کاربران |
|
||||
|
||||
**ویژگیها**:
|
||||
- ✅ نمایش استخر هفتگی با جزئیات
|
||||
- ✅ محاسبه ارزش هر بالانس
|
||||
- ✅ تاریخچه پرداختها و برداشتها
|
||||
|
||||
---
|
||||
|
||||
### 5. Network Module
|
||||
**مسیر**: `Pages/Network/`
|
||||
|
||||
| صفحه | Route | توضیحات |
|
||||
|------|-------|---------|
|
||||
| NetworkMembersList | `/network/members` | لیست اعضای شبکه |
|
||||
| NetworkTreeViewer | `/network/tree` | نمای درختی شبکه |
|
||||
| NetworkStats | `/network/stats` | آمار شبکه |
|
||||
|
||||
**ویژگیها**:
|
||||
- ✅ نمایش درختی شبکه بازاریابی
|
||||
- ✅ جستجو و فیلتر اعضا
|
||||
- ✅ آمار و گزارشگیری
|
||||
|
||||
---
|
||||
|
||||
### 6. Club Module
|
||||
**مسیر**: `Pages/Club/`
|
||||
|
||||
| صفحه | Route | توضیحات |
|
||||
|------|-------|---------|
|
||||
| ClubMembersList | `/club/members` | لیست اعضای باشگاه |
|
||||
| ClubFeatures | `/club/features` | مدیریت ویژگیها |
|
||||
| ManualActivation | `/club/activate` | فعالسازی دستی |
|
||||
|
||||
**ویژگیها**:
|
||||
- ✅ مدیریت اعضای باشگاه مشتریان
|
||||
- ✅ فعال/غیرفعال کردن ویژگیها برای هر کاربر
|
||||
- ✅ فعالسازی دستی با آپلود فیش پرداخت
|
||||
|
||||
---
|
||||
|
||||
### 7. User Order Module
|
||||
**مسیر**: `Pages/UserOrder/`
|
||||
|
||||
| صفحه | Route | توضیحات |
|
||||
|------|-------|---------|
|
||||
| UserOrderMainPage | `/orders` | لیست سفارشات |
|
||||
| UserOrderDetailsDialog | - | جزئیات سفارش |
|
||||
| ChangeOrderStatusDialog | - | تغییر وضعیت |
|
||||
| CancelOrderDialog | - | لغو سفارش |
|
||||
| ApplyDiscountDialog | - | اعمال تخفیف |
|
||||
|
||||
**ویژگیها**:
|
||||
- ✅ مدیریت کامل سفارشات
|
||||
- ✅ نمایش جزئیات با VAT
|
||||
- ✅ تغییر وضعیت و لغو سفارش
|
||||
|
||||
---
|
||||
|
||||
### 8. System Management Module
|
||||
**مسیر**: `Pages/SystemManagement/`
|
||||
|
||||
| صفحه | Route | توضیحات |
|
||||
|------|-------|---------|
|
||||
| Configuration | `/system/config` | تنظیمات سیستم |
|
||||
| EmailConfig | `/system/email` | پیکربندی ایمیل |
|
||||
| SmsConfig | `/system/sms` | پیکربندی SMS |
|
||||
| Logs | `/system/logs` | لاگهای سیستم |
|
||||
|
||||
---
|
||||
|
||||
## 🔗 دامنهها و آدرسها (محیط Stage)
|
||||
|
||||
| سرویس | آدرس |
|
||||
|-------|------|
|
||||
| BackOffice UI | `https://backoffice.se.kbs1.ir` |
|
||||
| BackOffice BFF | `https://backoffice-bff.se.kbs1.ir` |
|
||||
| FrontOffice UI | `https://frontoffice.se.kbs1.ir` |
|
||||
| FrontOffice BFF | `https://frontoffice-bff.se.kbs1.ir` |
|
||||
| CMS | `https://cms.se.kbs1.ir` |
|
||||
| Git Registry | `git.se.kbs1.ir` |
|
||||
|
||||
---
|
||||
|
||||
## 📝 تاریخچه تغییرات اخیر
|
||||
|
||||
### January 3, 2026
|
||||
- ✅ مایگریشن Proto References به DLL-based Approach
|
||||
- ✅ تغییر دامنهها از `*.foursat.afrino.co` به `*.se.kbs1.ir`
|
||||
- ✅ بروزرسانی Git Remote URLs
|
||||
- ✅ ایجاد `build-deps.sh` برای CI/CD
|
||||
|
||||
### January 1, 2026
|
||||
- ✅ فعالسازی ماژول DiscountShop Frontend
|
||||
- ✅ فعالسازی ماژول Tag
|
||||
- ✅ فعالسازی ماژول PublicMessages
|
||||
|
||||
### December 20, 2025
|
||||
- ✅ رفع مشکل صفحه `/network/balances`
|
||||
- ✅ رفع مشکل صفحه `/club/members`
|
||||
- ✅ تکمیل Mapster Mappings
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Troubleshooting
|
||||
|
||||
### Build Errors
|
||||
|
||||
**مشکل**: Missing Proto DLLs
|
||||
```bash
|
||||
# راهحل: Rebuild proto dependencies
|
||||
cd BackOffice
|
||||
rm -rf libs/
|
||||
./build-deps.sh
|
||||
```
|
||||
|
||||
**مشکل**: Package Version Conflict
|
||||
```bash
|
||||
# بررسی ورژنها
|
||||
# Google.Protobuf: 3.28.3
|
||||
# Grpc.Core.Api: 2.71.0
|
||||
```
|
||||
|
||||
### Runtime Errors
|
||||
|
||||
**مشکل**: gRPC Connection Failed
|
||||
```
|
||||
# بررسی آدرس BFF در appsettings.json
|
||||
"GwUrl": "https://backoffice-bff.se.kbs1.ir"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📚 مستندات مرتبط
|
||||
|
||||
- [Proto Packaging Guide](./02-PROTO-GUIDE.md)
|
||||
- [Data Migration Guide](./03-DATA-MIGRATION.md)
|
||||
- [CMS Documentation](./04-CMS.md)
|
||||
- [Deployment Guide](./05-DEPLOYMENT.md)
|
||||
@@ -0,0 +1,313 @@
|
||||
# 📦 Proto & gRPC Complete Guide
|
||||
|
||||
> **آخرین بروزرسانی**: January 3, 2026
|
||||
> **NuGet Server**: GitLab Package Registry
|
||||
> **URL جدید**: `https://git.se.kbs1.ir/api/packages/FourSat/nuget/index.json`
|
||||
|
||||
---
|
||||
|
||||
## 📊 معماری Packaging
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ LAYER 1: CMS Proto (Base) │
|
||||
│ CMSMicroservice.Protobuf │
|
||||
│ Version: 0.0.142+ → Auto-push به GitLab │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
PackageReference
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ LAYER 2: BFF Protos │
|
||||
│ BackOffice.BFF.*.Protobuf (24 packages) │
|
||||
│ FrontOffice.BFF.*.Protobuf (packages) │
|
||||
│ → Depend on: CMS Proto v0.0.x │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
│
|
||||
PackageReference / DLL Reference
|
||||
▼
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ LAYER 3: UI Applications │
|
||||
│ BackOffice UI → libs/*.dll (24 DLLs) │
|
||||
│ FrontOffice UI → FrontOffice.BFF Protos │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ قانون طلایی
|
||||
|
||||
**هر تغییر در Proto = این 3 مرحله اجباری:**
|
||||
|
||||
```bash
|
||||
# 1️⃣ افزایش Version
|
||||
<Version>X.Y.Z</Version> → <Version>X.Y.Z+1</Version>
|
||||
|
||||
# 2️⃣ Pack کردن
|
||||
dotnet pack -c Release
|
||||
# ✅ خودکار push میشه به GitLab
|
||||
|
||||
# 3️⃣ Update در لایه بالاتر
|
||||
<PackageReference Include="PackageName" Version="NEW_VERSION" />
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 روشهای Reference در BackOffice
|
||||
|
||||
### روش 1: DLL Reference (Production/CI-CD) ✅ پیشنهادی
|
||||
|
||||
**مزایا**: مستقل از ریپوی BFF، مناسب CI/CD
|
||||
|
||||
```bash
|
||||
# Build proto DLLs
|
||||
cd BackOffice
|
||||
./build-deps.sh
|
||||
|
||||
# DLLs در libs/ قرار میگیرند
|
||||
ls libs/*.dll | wc -l # 24 DLL
|
||||
```
|
||||
|
||||
**BackOffice.csproj**:
|
||||
```xml
|
||||
<!-- CI/CD Mode: Use pre-built DLLs -->
|
||||
<ItemGroup Condition="Exists('../../libs/BackOffice.BFF.Common.Protobuf.dll')">
|
||||
<Reference Include="BackOffice.BFF.Common.Protobuf">
|
||||
<HintPath>../../libs/BackOffice.BFF.Common.Protobuf.dll</HintPath>
|
||||
</Reference>
|
||||
<!-- ... all 24 proto DLLs ... -->
|
||||
</ItemGroup>
|
||||
|
||||
<!-- Transitive Dependencies -->
|
||||
<PackageReference Include="Google.Protobuf" Version="3.28.3"/>
|
||||
<PackageReference Include="Grpc.Core.Api" Version="2.71.0"/>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### روش 2: ProjectReference (Development)
|
||||
|
||||
**مزایا**: تغییرات بلافاصله اعمال میشود
|
||||
|
||||
```xml
|
||||
<!-- Development Mode: Fallback if libs/ doesn't exist -->
|
||||
<ItemGroup Condition="!Exists('../../libs/BackOffice.BFF.Common.Protobuf.dll')">
|
||||
<ProjectReference Include="..\..\..\BackOffice.BFF\src\Protobufs\BackOffice.BFF.Common.Protobuf\BackOffice.BFF.Common.Protobuf.csproj"/>
|
||||
</ItemGroup>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### روش 3: PackageReference (قدیمی)
|
||||
|
||||
**مزایا**: کنترل دقیق ورژن
|
||||
|
||||
```xml
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Foursat.BackOffice.BFF.Common.Protobuf" Version="1.0.0"/>
|
||||
</ItemGroup>
|
||||
```
|
||||
|
||||
**معایب**: نیاز به push به NuGet server
|
||||
|
||||
---
|
||||
|
||||
## 📝 اسکریپت build-deps.sh
|
||||
|
||||
**مسیر**: `/home/masoud/Apps/project/FourSat/BackOffice/build-deps.sh`
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# Build all BFF proto dependencies and copy DLLs to libs folder
|
||||
|
||||
set -e
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
LIBS_DIR="$SCRIPT_DIR/libs"
|
||||
BFF_PROTOS_DIR="$SCRIPT_DIR/../BackOffice.BFF/src/Protobufs"
|
||||
|
||||
echo "🔧 Building all proto dependencies..."
|
||||
mkdir -p "$LIBS_DIR"
|
||||
|
||||
# All 24 proto projects
|
||||
PROTO_PROJECTS=(
|
||||
"BackOffice.BFF.Common.Protobuf"
|
||||
"BackOffice.BFF.Category.Protobuf"
|
||||
# ... (complete list)
|
||||
)
|
||||
|
||||
for PROJECT in "${PROTO_PROJECTS[@]}"; do
|
||||
PROJECT_DIR="$BFF_PROTOS_DIR/$PROJECT"
|
||||
dotnet build "$PROJECT_DIR" -c Release --verbosity quiet
|
||||
|
||||
# Check both net9.0 and net8.0
|
||||
if [ -f "$PROJECT_DIR/bin/Release/net9.0/$PROJECT.dll" ]; then
|
||||
cp "$PROJECT_DIR/bin/Release/net9.0/$PROJECT.dll" "$LIBS_DIR/"
|
||||
elif [ -f "$PROJECT_DIR/bin/Release/net8.0/$PROJECT.dll" ]; then
|
||||
cp "$PROJECT_DIR/bin/Release/net8.0/$PROJECT.dll" "$LIBS_DIR/"
|
||||
fi
|
||||
done
|
||||
|
||||
echo "✅ Build complete! Total DLLs: $(ls $LIBS_DIR/*.dll | wc -l)"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Workflow توسعه
|
||||
|
||||
### Development (Local):
|
||||
|
||||
```bash
|
||||
# Build با Debug config
|
||||
cd BackOffice/src
|
||||
dotnet build -c Debug
|
||||
|
||||
# اگر libs/ نباشد → از ProjectReference استفاده میشود
|
||||
# تغییرات Proto بلافاصله اعمال میشود
|
||||
```
|
||||
|
||||
### Production (Deploy):
|
||||
|
||||
```bash
|
||||
# 1. Build proto DLLs
|
||||
cd BackOffice
|
||||
./build-deps.sh
|
||||
|
||||
# 2. Build & Publish
|
||||
cd src
|
||||
dotnet publish BackOffice/BackOffice.csproj -c Release -o ./publish
|
||||
|
||||
# 3. بررسی output
|
||||
ls ./publish/wwwroot/_framework/*.wasm | grep "BackOffice.BFF" | wc -l
|
||||
# Result: 24 ✅
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📦 لیست Proto Projects
|
||||
|
||||
### BackOffice.BFF (24 پروژه)
|
||||
|
||||
| پروژه | Target Framework | وضعیت |
|
||||
|-------|------------------|--------|
|
||||
| BackOffice.BFF.Common.Protobuf | net9.0 | ✅ |
|
||||
| BackOffice.BFF.Category.Protobuf | net9.0 | ✅ |
|
||||
| BackOffice.BFF.ClubMembership.Protobuf | net9.0 | ✅ |
|
||||
| BackOffice.BFF.Commission.Protobuf | net9.0 | ✅ |
|
||||
| BackOffice.BFF.Configuration.Protobuf | net9.0 | ✅ |
|
||||
| BackOffice.BFF.DiscountCategory.Protobuf | net9.0 | ✅ |
|
||||
| BackOffice.BFF.DiscountOrder.Protobuf | net9.0 | ✅ |
|
||||
| BackOffice.BFF.DiscountProduct.Protobuf | net9.0 | ✅ |
|
||||
| BackOffice.BFF.DiscountShoppingCart.Protobuf | net9.0 | ✅ |
|
||||
| BackOffice.BFF.Health.Protobuf | net9.0 | ✅ |
|
||||
| BackOffice.BFF.Inventory.Protobuf | net9.0 | ✅ |
|
||||
| BackOffice.BFF.ManualPayment.Protobuf | net9.0 | ✅ |
|
||||
| BackOffice.BFF.NetworkMembership.Protobuf | net9.0 | ✅ |
|
||||
| BackOffice.BFF.Otp.Protobuf | net9.0 | ✅ |
|
||||
| BackOffice.BFF.Package.Protobuf | net9.0 | ✅ |
|
||||
| BackOffice.BFF.Products.Protobuf | net9.0 | ✅ |
|
||||
| BackOffice.BFF.ProductTag.Protobuf | net9.0 | ✅ |
|
||||
| BackOffice.BFF.PublicMessage.Protobuf | **net8.0** | ✅ |
|
||||
| BackOffice.BFF.Role.Protobuf | net9.0 | ✅ |
|
||||
| BackOffice.BFF.Tag.Protobuf | net9.0 | ✅ |
|
||||
| BackOffice.BFF.User.Protobuf | net9.0 | ✅ |
|
||||
| BackOffice.BFF.UserAddress.Protobuf | net9.0 | ✅ |
|
||||
| BackOffice.BFF.UserOrder.Protobuf | net9.0 | ✅ |
|
||||
| BackOffice.BFF.UserRole.Protobuf | net9.0 | ✅ |
|
||||
|
||||
⚠️ **نکته**: `PublicMessage.Protobuf` تنها پروژه با `net8.0` است
|
||||
|
||||
---
|
||||
|
||||
## 🔧 تنظیمات csproj با Auto-Push
|
||||
|
||||
```xml
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net9.0</TargetFramework>
|
||||
<PackageId>Foursat.BackOffice.BFF.Products.Protobuf</PackageId>
|
||||
<Version>1.0.0</Version>
|
||||
<Authors>FourSat</Authors>
|
||||
<Company>FourSat</Company>
|
||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||
<PackageOutputPath>./nupkg</PackageOutputPath>
|
||||
</PropertyGroup>
|
||||
|
||||
<!-- Auto-Push به GitLab -->
|
||||
<Target Name="PushToFoursatNuget" AfterTargets="Pack"
|
||||
Condition="'$(Configuration)' == 'Release'">
|
||||
<PropertyGroup>
|
||||
<NugetPackagePath>$(PackageOutputPath)$(PackageId).$(Version).nupkg</NugetPackagePath>
|
||||
<PushCommand>dotnet nuget push **/*.nupkg --source https://git.se.kbs1.ir/api/packages/FourSat/nuget/index.json --api-key YOUR_API_KEY --skip-duplicate</PushCommand>
|
||||
</PropertyGroup>
|
||||
<Exec Command="$(PushCommand)" />
|
||||
</Target>
|
||||
|
||||
</Project>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Troubleshooting
|
||||
|
||||
### مشکل: Version Conflict
|
||||
|
||||
**علامت**:
|
||||
```
|
||||
error NU1605: Detected package downgrade: Grpc.Core.Api from 2.71.0 to 2.54.0
|
||||
```
|
||||
|
||||
**راهحل**:
|
||||
```xml
|
||||
<PackageReference Include="Grpc.Core.Api" Version="2.71.0"/>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### مشکل: Missing Transitive Dependencies
|
||||
|
||||
**علامت**:
|
||||
```
|
||||
CS0234: The type or namespace name 'Google' does not exist
|
||||
```
|
||||
|
||||
**راهحل**: اضافه کردن dependencies در csproj:
|
||||
```xml
|
||||
<PackageReference Include="Google.Protobuf" Version="3.28.3"/>
|
||||
<PackageReference Include="Google.Api.CommonProtos" Version="2.10.0"/>
|
||||
<PackageReference Include="FluentValidation" Version="11.2.2"/>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### مشکل: DLL Not Found
|
||||
|
||||
**علامت**:
|
||||
```
|
||||
warning MSB3245: Could not resolve this reference
|
||||
```
|
||||
|
||||
**راهحل**:
|
||||
```bash
|
||||
# Rebuild all proto DLLs
|
||||
cd BackOffice
|
||||
rm -rf libs/
|
||||
./build-deps.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### مشکل: net8.0 vs net9.0
|
||||
|
||||
**علامت**: DLL یک پروژه کپی نشده
|
||||
|
||||
**راهحل**: اسکریپت `build-deps.sh` هر دو framework را چک میکند
|
||||
|
||||
---
|
||||
|
||||
## 📚 مراجع
|
||||
|
||||
- [gRPC for .NET](https://docs.microsoft.com/en-us/aspnet/core/grpc/)
|
||||
- [Protocol Buffers](https://developers.google.com/protocol-buffers)
|
||||
- [NuGet CLI Reference](https://docs.microsoft.com/en-us/nuget/reference/nuget-exe-cli-reference)
|
||||
@@ -0,0 +1,260 @@
|
||||
# 🔄 Data Migration Guide
|
||||
|
||||
> **آخرین بروزرسانی**: January 3, 2026
|
||||
> **ابزار**: FourSat.DataMigration
|
||||
> **تعداد جداول**: 33
|
||||
> **وضعیت**: ✅ آماده برای Production
|
||||
|
||||
---
|
||||
|
||||
## 📋 نگاه اجمالی
|
||||
|
||||
این ابزار یک **ابزار یکبار مصرف** برای مهاجرت دادههای دیتابیس از ساختار قدیمی (Production) به ساختار جدید (Stage) است.
|
||||
|
||||
**زمان تخمینی اجرا**: 5-10 دقیقه
|
||||
**تکنولوژی**: .NET 9.0 + Dapper + PostgreSQL
|
||||
|
||||
---
|
||||
|
||||
## 📁 ساختار پروژه
|
||||
|
||||
```
|
||||
DataMigration/
|
||||
├── FourSat.DataMigration/
|
||||
│ ├── Program.cs # Entry point
|
||||
│ ├── appsettings.json # 33 table mappings
|
||||
│ ├── Models/
|
||||
│ │ └── MigrationModels.cs # Settings, Mapping, QueueItem
|
||||
│ ├── Services/
|
||||
│ │ └── MigrationService.cs # Migration + Post-Migration logic
|
||||
│ └── Scripts/
|
||||
│ └── PostMigration_DataTransformation.sql
|
||||
└── FourSat.GeographySeeder/ # ابزار جداگانه برای Geography data
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 راهنمای سریع (3 قدم)
|
||||
|
||||
### قدم 1: ویرایش تنظیمات
|
||||
|
||||
```bash
|
||||
cd DataMigration/FourSat.DataMigration
|
||||
# ویرایش appsettings.json
|
||||
```
|
||||
|
||||
```json
|
||||
{
|
||||
"SourceConnectionString": "Host=OLD_SERVER;Database=OLD_DB;Username=xxx;Password=xxx",
|
||||
"DestinationConnectionString": "Host=NEW_SERVER;Database=NEW_DB;Username=xxx;Password=xxx"
|
||||
}
|
||||
```
|
||||
|
||||
### قدم 2: اجرای Migration
|
||||
|
||||
```bash
|
||||
dotnet run
|
||||
```
|
||||
|
||||
### قدم 3: بررسی Logs
|
||||
|
||||
```bash
|
||||
# خروجی:
|
||||
✅ [Users] Migrated 50000 rows in 12.5s
|
||||
✅ [Products] Migrated 8500 rows in 3.2s
|
||||
...
|
||||
✅ Migration completed! Total: 33 tables, Time: 4m 32s
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📋 لیست جداول (33 جدول)
|
||||
|
||||
### جداول با تغییر نام (10 جدول)
|
||||
|
||||
| نام قدیمی (Source) | نام جدید (Target) | دلیل تغییر |
|
||||
|-------------------|-------------------|-----------|
|
||||
| `Categorys` | `Categories` | جمع صحیح Category |
|
||||
| `FactorDetailss` | `FactorDetails` | s اضافی |
|
||||
| `ProductGalleryss` | `ProductGalleries` | Gallery → Galleries |
|
||||
| `ProductImagess` | `ProductImages` | s اضافی |
|
||||
| `Productss` | `Products` | s اضافی |
|
||||
| `PruductCategorys` | `ProductCategories` | Pruduct → Product |
|
||||
| `PruductTags` | `ProductTags` | Pruduct → Product |
|
||||
| `Transactionss` | `Transactions` | s اضافی |
|
||||
| `UserAddresss` | `UserAddresses` | s اضافی |
|
||||
| `UserCartss` | `UserCarts` | s اضافی |
|
||||
|
||||
### جداول بدون تغییر نام (23 جدول)
|
||||
|
||||
| گروه | جداول |
|
||||
|------|--------|
|
||||
| Core | `Roles`, `Tags`, `SystemConfigurations`, `ClubFeatures`, `Packages` |
|
||||
| Users | `Users`, `OtpTokens`, `UserRoles`, `UserWallets`, `UserAddresses`, `UserCarts` |
|
||||
| Products | `Categories`, `Products`, `ProductImages`, `ProductGalleries`, `ProductCategories`, `ProductTags` |
|
||||
| Club | `ClubMemberships`, `ClubMembershipHistories`, `UserClubFeatures` |
|
||||
| Network | `NetworkWeeklyBalances`, `NetworkMembershipHistories` |
|
||||
| Commission | `CommissionPayoutHistories`, `UserCommissionPayouts`, `WeeklyCommissionPools` |
|
||||
| Orders | `UserOrders`, `Transactions`, `Contracts`, `UserContracts` |
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Post-Migration Transformation
|
||||
|
||||
### Binary Tree User Conversion
|
||||
|
||||
پس از migrate کردن جدول `Users`، باید تبدیل دادههای شبکه انجام شود:
|
||||
|
||||
**مشکل**: در دیتابیس قدیمی، ستونهای `Left` و `Right` شامل username است. در جدید باید UserId باشد.
|
||||
|
||||
**Script**: `PostMigration_DataTransformation.sql`
|
||||
|
||||
```sql
|
||||
-- Convert username to user_id for binary tree
|
||||
UPDATE "Users" u
|
||||
SET
|
||||
"LeftId" = (SELECT "Id" FROM "Users" WHERE "Username" = u."LeftUsername"),
|
||||
"RightId" = (SELECT "Id" FROM "Users" WHERE "Username" = u."RightUsername")
|
||||
WHERE "LeftUsername" IS NOT NULL OR "RightUsername" IS NOT NULL;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ تنظیمات پیشرفته
|
||||
|
||||
### appsettings.json
|
||||
|
||||
```json
|
||||
{
|
||||
"SourceConnectionString": "Host=...;Database=...;Username=...;Password=...",
|
||||
"DestinationConnectionString": "Host=...;Database=...;Username=...;Password=...",
|
||||
|
||||
"BatchSize": 5000,
|
||||
"MaxRetries": 3,
|
||||
"RetryDelaySeconds": 5,
|
||||
|
||||
"TableMappings": [
|
||||
{
|
||||
"SourceTable": "Categorys",
|
||||
"DestinationTable": "Categories",
|
||||
"Priority": 1,
|
||||
"ColumnMappings": {
|
||||
"Id": "Id",
|
||||
"Name": "Name",
|
||||
"ParentId": "ParentId"
|
||||
}
|
||||
}
|
||||
// ... 32 more tables
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### تنظیمات کلیدی:
|
||||
|
||||
| تنظیم | پیشفرض | توضیحات |
|
||||
|-------|---------|---------|
|
||||
| `BatchSize` | 5000 | تعداد rows در هر batch |
|
||||
| `MaxRetries` | 3 | تلاش مجدد در صورت خطا |
|
||||
| `RetryDelaySeconds` | 5 | تأخیر بین retries |
|
||||
| `Priority` | 1-5 | ترتیب migration (1=اول) |
|
||||
|
||||
---
|
||||
|
||||
## 🔧 ترتیب Migration
|
||||
|
||||
### مرحله 1: جداول پایه (بدون FK)
|
||||
```
|
||||
Roles → Tags → SystemConfigurations → ClubFeatures → Packages
|
||||
```
|
||||
|
||||
### مرحله 2: جداول کاربری
|
||||
```
|
||||
Users → OtpTokens → UserRoles → UserWallets → UserAddresses → UserCarts
|
||||
```
|
||||
|
||||
### مرحله 3: جداول محصولات
|
||||
```
|
||||
Categories → Products → ProductImages → ProductGalleries → ProductCategories → ProductTags
|
||||
```
|
||||
|
||||
### مرحله 4: جداول عضویت
|
||||
```
|
||||
ClubMemberships → ClubMembershipHistories → NetworkWeeklyBalances
|
||||
```
|
||||
|
||||
### مرحله 5: جداول تراکنش
|
||||
```
|
||||
UserOrders → Transactions → Contracts
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ عیبیابی
|
||||
|
||||
### مشکل: FK Constraint Violation
|
||||
|
||||
**علامت**:
|
||||
```
|
||||
ERROR: insert or update on table "UserRoles" violates foreign key constraint
|
||||
```
|
||||
|
||||
**راهحل**: بررسی Priority در appsettings.json - جدول parent باید Priority کمتر داشته باشد
|
||||
|
||||
---
|
||||
|
||||
### مشکل: Duplicate Key
|
||||
|
||||
**علامت**:
|
||||
```
|
||||
ERROR: duplicate key value violates unique constraint
|
||||
```
|
||||
|
||||
**راهحل**:
|
||||
```sql
|
||||
-- پاک کردن destination قبل از migration
|
||||
TRUNCATE TABLE "TargetTable" CASCADE;
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### مشکل: Connection Timeout
|
||||
|
||||
**علامت**:
|
||||
```
|
||||
Npgsql.NpgsqlException: Timeout during reading attempt
|
||||
```
|
||||
|
||||
**راهحل**: کاهش `BatchSize` به 1000
|
||||
|
||||
---
|
||||
|
||||
## ✅ چکلیست قبل از اجرا
|
||||
|
||||
- [ ] دسترسی به هر دو دیتابیس تست شده
|
||||
- [ ] Backup از destination database گرفته شده
|
||||
- [ ] Connection strings صحیح است
|
||||
- [ ] BatchSize مناسب تنظیم شده
|
||||
- [ ] Priority ها بررسی شده
|
||||
- [ ] Post-Migration script آماده است
|
||||
|
||||
---
|
||||
|
||||
## 📊 آمار نهایی
|
||||
|
||||
| معیار | مقدار |
|
||||
|-------|-------|
|
||||
| تعداد جداول | 33 |
|
||||
| جداول با تغییر نام | 10 |
|
||||
| زمان تخمینی | 5-10 دقیقه |
|
||||
| BatchSize پیشفرض | 5000 |
|
||||
| MaxRetries | 3 |
|
||||
|
||||
---
|
||||
|
||||
## 📚 فایلهای مرتبط
|
||||
|
||||
| فایل | توضیحات |
|
||||
|------|---------|
|
||||
| `appsettings.json` | تنظیمات و mapping ها |
|
||||
| `MigrationService.cs` | لاجیک اصلی migration |
|
||||
| `PostMigration_DataTransformation.sql` | Binary tree conversion |
|
||||
@@ -0,0 +1,270 @@
|
||||
# 🏢 CMS Microservice Documentation
|
||||
|
||||
> **آخرین بروزرسانی**: January 3, 2026
|
||||
> **Framework**: .NET 9.0 + Clean Architecture + CQRS
|
||||
> **Database**: PostgreSQL
|
||||
> **Build Status**: ✅ SUCCESS
|
||||
|
||||
---
|
||||
|
||||
## 📊 وضعیت کلی
|
||||
|
||||
| سیستم | پیشرفت | وضعیت |
|
||||
|-------|--------|--------|
|
||||
| Commission System | 85% | ✅ Production Ready |
|
||||
| Network System | 90% | ✅ Production Ready |
|
||||
| Club Membership | 95% | ✅ Production Ready |
|
||||
| Inventory System | 80% | ✅ Phase 2 Complete |
|
||||
| Email/SMS | 100% | ✅ Complete |
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ معماری
|
||||
|
||||
### Clean Architecture (4 لایه)
|
||||
|
||||
```
|
||||
CMSMicroservice/
|
||||
├── CMSMicroservice.Domain/ # Entities, Enums, Interfaces
|
||||
├── CMSMicroservice.Application/ # CQRS Commands/Queries, MediatR
|
||||
├── CMSMicroservice.Infrastructure/ # DbContext, Services, Repositories
|
||||
└── CMSMicroservice.WebApi/ # Controllers, gRPC Services
|
||||
```
|
||||
|
||||
### الگوی استاندارد
|
||||
|
||||
- ✅ **CQRS** با MediatR
|
||||
- ✅ **IApplicationDbContext** برای دسترسی به DB (بدون Repository Pattern)
|
||||
- ✅ **Mapster** برای mapping
|
||||
- ✅ **FluentValidation** برای validation
|
||||
|
||||
---
|
||||
|
||||
## 💼 Commission System
|
||||
|
||||
### ویژگیهای اصلی:
|
||||
- ✅ Binary network tree با placement خودکار
|
||||
- ✅ عضویت باشگاه (Member/Trial) با نرخهای کمیسیون
|
||||
- ✅ محاسبه کمیسیون هفتگی (الگوریتم Lesser Leg)
|
||||
- ✅ Background worker با Hangfire
|
||||
- ✅ Health check endpoints
|
||||
|
||||
### الگوریتم محاسبه:
|
||||
|
||||
```
|
||||
Weekly Commission = (Lesser Leg Balance × Rate) / Total Balances
|
||||
```
|
||||
|
||||
**نرخها**:
|
||||
| عضویت | نرخ |
|
||||
|-------|-----|
|
||||
| Member | 10% |
|
||||
| Trial | 5% |
|
||||
|
||||
---
|
||||
|
||||
## 🏪 Inventory System
|
||||
|
||||
### Domain Layer:
|
||||
|
||||
| Entity | توضیحات |
|
||||
|--------|---------|
|
||||
| `InventoryItem` | ردیابی موجودی محصول در هر انبار |
|
||||
| `StockMovement` | تاریخچه حرکات موجودی |
|
||||
| `Warehouse` | مدیریت انبارها |
|
||||
|
||||
### StockMovementType:
|
||||
|
||||
| Type | Code | توضیحات |
|
||||
|------|------|---------|
|
||||
| `MovementTypeUnspecified` | 0 | نامشخص |
|
||||
| `InitialStock` | 10 | موجودی اولیه |
|
||||
| `Purchase` | 20 | خرید از تامینکننده |
|
||||
| `Sale` | 30 | فروش به مشتری |
|
||||
| `Return` | 40 | برگشت از فروش |
|
||||
| `Adjustment` | 50 | تنظیم موجودی |
|
||||
| `Loss` | 60 | ضایعات/خسارت |
|
||||
| `Transfer` | 70 | انتقال بین انبار |
|
||||
| `Reservation` | 80 | رزرو برای سفارش |
|
||||
|
||||
### CQRS Commands (17):
|
||||
|
||||
**Inventory:**
|
||||
- `CreateInventoryItem`
|
||||
- `UpdateInventoryItem`
|
||||
- `DeleteInventoryItem`
|
||||
- `UpdateInventoryQuantity`
|
||||
- `ReserveInventory`
|
||||
- `ReleaseReservedInventory`
|
||||
- `ReduceInventory`
|
||||
- `IncreaseInventory`
|
||||
|
||||
**Movement:**
|
||||
- `CreateStockMovement`
|
||||
- `BulkCreateStockMovement`
|
||||
- `DeleteStockMovement`
|
||||
|
||||
**Warehouse:**
|
||||
- `CreateWarehouse`
|
||||
- `UpdateWarehouse`
|
||||
- `DeleteWarehouse`
|
||||
- `SetDefaultWarehouse`
|
||||
- `ActivateWarehouse`
|
||||
- `BulkCreateWarehouse`
|
||||
|
||||
### CQRS Queries (35):
|
||||
|
||||
**Inventory:**
|
||||
- `GetInventoryItem`
|
||||
- `GetInventoryByProduct`
|
||||
- `GetAllInventoryItems`
|
||||
- `GetLowStockItems`
|
||||
- `GetOutOfStockItems`
|
||||
- `CheckAvailability`
|
||||
- `SearchInventory`
|
||||
|
||||
**Movement:**
|
||||
- `GetStockMovements`
|
||||
- `GetStockMovementsByInventoryItem`
|
||||
- `GetMovementHistory`
|
||||
- `GetDailyVolume`
|
||||
- `GetTopMovingProducts`
|
||||
- `SearchStockMovements`
|
||||
|
||||
**Warehouse:**
|
||||
- `GetWarehouse`
|
||||
- `GetAllWarehouses`
|
||||
- `GetWarehouseStats`
|
||||
- `GetWarehouseLowStock`
|
||||
- `SearchWarehouses`
|
||||
|
||||
---
|
||||
|
||||
## 📧 Email & SMS Notifications
|
||||
|
||||
### پیکربندی:
|
||||
|
||||
**Email (MailKit 4.14.1)**:
|
||||
```json
|
||||
{
|
||||
"Email": {
|
||||
"Host": "smtp.example.com",
|
||||
"Port": 587,
|
||||
"Username": "noreply@foursat.com",
|
||||
"Password": "xxx",
|
||||
"SenderName": "FourSat System"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**SMS (Kavenegar 1.2.5)**:
|
||||
```json
|
||||
{
|
||||
"Kavenegar": {
|
||||
"ApiKey": "xxx",
|
||||
"Sender": "10008663"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### انواع نوتیفیکیشن:
|
||||
- ✅ Commission notification (هفتگی)
|
||||
- ✅ Club activation notification
|
||||
- ✅ Error alerts
|
||||
|
||||
---
|
||||
|
||||
## ⏰ Hangfire Job Scheduling
|
||||
|
||||
### داشبورد:
|
||||
```
|
||||
URL: https://cms.se.kbs1.ir/hangfire
|
||||
```
|
||||
|
||||
### Job های زمانبندی شده:
|
||||
|
||||
| Job | Schedule | توضیحات |
|
||||
|-----|----------|---------|
|
||||
| WeeklyCommissionCalculation | یکشنبه 00:05 UTC | محاسبه کمیسیون هفتگی |
|
||||
|
||||
### API های Manual Trigger:
|
||||
```
|
||||
POST /api/commission/calculate
|
||||
POST /api/commission/process-week?weekNumber=2026-W01
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🏥 Health Checks
|
||||
|
||||
### Endpoints:
|
||||
|
||||
| Endpoint | استفاده |
|
||||
|----------|---------|
|
||||
| `/health` | وضعیت کلی |
|
||||
| `/health/ready` | Readiness probe (K8s) |
|
||||
| `/health/live` | Liveness probe (K8s) |
|
||||
|
||||
### Example Response:
|
||||
```json
|
||||
{
|
||||
"status": "Healthy",
|
||||
"checks": [
|
||||
{ "name": "database", "status": "Healthy" },
|
||||
{ "name": "redis", "status": "Healthy" }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Proto Sync (January 3, 2026)
|
||||
|
||||
### تغییرات enum در Inventory:
|
||||
|
||||
| آیتم | قبل | بعد |
|
||||
|------|-----|-----|
|
||||
| ProductType | `REGULAR`, `DISCOUNT` | `REGULAR_PRODUCT`, `DISCOUNT_PRODUCT` |
|
||||
| StockMovementType | Sequential (0-9) | Grouped (10, 20, 30...) |
|
||||
|
||||
### تغییرات فیلد:
|
||||
|
||||
| قبل | بعد |
|
||||
|-----|-----|
|
||||
| `page_index` | `page` |
|
||||
| `search_term` | `search` |
|
||||
| `product_name` | `product_title` |
|
||||
| `active_only` | `is_active` |
|
||||
| `created_at` | `created` |
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Build & Run
|
||||
|
||||
### Local Development:
|
||||
```bash
|
||||
cd CMS/src
|
||||
dotnet build CMS.sln
|
||||
dotnet run --project CMSMicroservice.WebApi
|
||||
```
|
||||
|
||||
### Docker:
|
||||
```bash
|
||||
cd CMS
|
||||
docker build -t cms:latest .
|
||||
docker run -p 5000:80 cms:latest
|
||||
```
|
||||
|
||||
### Environment Variables:
|
||||
```bash
|
||||
ASPNETCORE_ENVIRONMENT=Staging
|
||||
ConnectionStrings__DefaultConnection=Host=...;Database=...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📚 مستندات مرتبط
|
||||
|
||||
- [BackOffice Documentation](./01-BACKOFFICE.md)
|
||||
- [Proto Guide](./02-PROTO-GUIDE.md)
|
||||
- [Deployment Guide](./05-DEPLOYMENT.md)
|
||||
@@ -0,0 +1,393 @@
|
||||
# 🚀 Deployment Guide
|
||||
|
||||
> **آخرین بروزرسانی**: January 3, 2026
|
||||
> **Environment**: Kubernetes on Stage
|
||||
> **Domain**: `*.se.kbs1.ir`
|
||||
|
||||
---
|
||||
|
||||
## 🌐 آدرسهای سرویسها
|
||||
|
||||
| سرویس | آدرس Stage |
|
||||
|-------|------------|
|
||||
| BackOffice UI | `https://backoffice.se.kbs1.ir` |
|
||||
| BackOffice BFF | `https://backoffice-bff.se.kbs1.ir` |
|
||||
| FrontOffice UI | `https://frontoffice.se.kbs1.ir` |
|
||||
| FrontOffice BFF | `https://frontoffice-bff.se.kbs1.ir` |
|
||||
| CMS | `https://cms.se.kbs1.ir` |
|
||||
| Git Registry | `git.se.kbs1.ir` |
|
||||
|
||||
---
|
||||
|
||||
## 📦 Git Repositories
|
||||
|
||||
| Repo | Remote | URL |
|
||||
|------|--------|-----|
|
||||
| BackOffice | kub-stage | `https://git.se.kbs1.ir/admin/BackOffice.git` |
|
||||
| BackOffice.BFF | kub-stage | `https://git.se.kbs1.ir/admin/BackOffice.BFF.git` |
|
||||
| FrontOffice | kub-stage | `https://git.se.kbs1.ir/admin/FrontOffice.git` |
|
||||
| FrontOffice.BFF | kub-stage | `https://git.se.kbs1.ir/admin/FrontOffice.BFF.git` |
|
||||
| CMS | gitea | `https://git.se.kbs1.ir/admin/CMS.git` |
|
||||
| Docs | foursatDocs | `https://git.se.kbs1.ir/FourSat/docs.git` |
|
||||
|
||||
---
|
||||
|
||||
## 🔄 CI/CD Workflow
|
||||
|
||||
### Gitea Actions
|
||||
|
||||
هر ریپو دارای workflow در `.gitea/workflows/` است:
|
||||
|
||||
```yaml
|
||||
# kub-deploy.yml - Deploy to Stage
|
||||
# prod-deploy.yml - Deploy to Production
|
||||
```
|
||||
|
||||
### مراحل Deploy:
|
||||
|
||||
```
|
||||
1. Push to branch → Trigger workflow
|
||||
2. Build Docker image
|
||||
3. Push to Registry (git.se.kbs1.ir)
|
||||
4. Deploy to Kubernetes
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🐳 Docker Registry
|
||||
|
||||
### تنظیمات:
|
||||
|
||||
```yaml
|
||||
env:
|
||||
EXTERNAL_REGISTRY: git.se.kbs1.ir
|
||||
IMAGE: backoffice # or backoffice-bff, cms, etc.
|
||||
|
||||
# Docker daemon config
|
||||
daemon.json: |
|
||||
{
|
||||
"insecure-registries": ["git.se.kbs1.ir", "gitea-svc:3000"]
|
||||
}
|
||||
```
|
||||
|
||||
### Image Names:
|
||||
|
||||
| سرویس | Image |
|
||||
|-------|-------|
|
||||
| BackOffice | `git.se.kbs1.ir/admin/backoffice:latest` |
|
||||
| BackOffice.BFF | `git.se.kbs1.ir/admin/backoffice-bff:latest` |
|
||||
| FrontOffice | `git.se.kbs1.ir/admin/frontoffice:latest` |
|
||||
| FrontOffice.BFF | `git.se.kbs1.ir/admin/frontoffice-bff:latest` |
|
||||
| CMS | `git.se.kbs1.ir/admin/cms:latest` |
|
||||
|
||||
---
|
||||
|
||||
## 📋 BackOffice Deployment
|
||||
|
||||
### Prerequisites:
|
||||
|
||||
```bash
|
||||
# 1. Build proto DLLs
|
||||
cd BackOffice
|
||||
./build-deps.sh
|
||||
|
||||
# 2. Verify DLLs
|
||||
ls libs/*.dll | wc -l # Should be 24
|
||||
```
|
||||
|
||||
### Build & Publish:
|
||||
|
||||
```bash
|
||||
cd BackOffice/src
|
||||
dotnet publish BackOffice/BackOffice.csproj -c Release -o ./publish
|
||||
```
|
||||
|
||||
### Docker Build:
|
||||
|
||||
```bash
|
||||
cd BackOffice
|
||||
docker build -t backoffice:latest .
|
||||
```
|
||||
|
||||
### Dockerfile:
|
||||
|
||||
```dockerfile
|
||||
FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
|
||||
WORKDIR /src
|
||||
|
||||
# Copy pre-built proto DLLs
|
||||
COPY ["libs/", "libs/"]
|
||||
|
||||
COPY ["src/BackOffice/", "BackOffice/"]
|
||||
RUN dotnet publish "BackOffice/BackOffice.csproj" -c Release -o /app/publish
|
||||
|
||||
FROM nginx:alpine
|
||||
COPY --from=build /app/publish/wwwroot /usr/share/nginx/html
|
||||
EXPOSE 80
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📋 BFF & CMS Deployment
|
||||
|
||||
### Standard .NET Web API:
|
||||
|
||||
```bash
|
||||
# Build
|
||||
cd BackOffice.BFF/src
|
||||
dotnet publish BackOffice.BFF.WebApi/BackOffice.BFF.WebApi.csproj -c Release -o ./publish
|
||||
|
||||
# Docker
|
||||
docker build -t backoffice-bff:latest .
|
||||
```
|
||||
|
||||
### Dockerfile Template:
|
||||
|
||||
```dockerfile
|
||||
FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime
|
||||
FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
|
||||
|
||||
WORKDIR /src
|
||||
COPY . .
|
||||
RUN dotnet publish -c Release -o /app
|
||||
|
||||
FROM runtime
|
||||
WORKDIR /app
|
||||
COPY --from=build /app .
|
||||
EXPOSE 80
|
||||
ENTRYPOINT ["dotnet", "BackOffice.BFF.WebApi.dll"]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Configuration
|
||||
|
||||
### appsettings.Staging.json (BackOffice):
|
||||
|
||||
```json
|
||||
{
|
||||
"Environment": "Staging",
|
||||
"GwUrl": "https://backoffice-bff.se.kbs1.ir",
|
||||
"AllowedHosts": "*"
|
||||
}
|
||||
```
|
||||
|
||||
### appsettings.Staging.json (FrontOffice):
|
||||
|
||||
```json
|
||||
{
|
||||
"GwUrl": "https://frontoffice-bff.se.kbs1.ir",
|
||||
"AllowedHosts": "*"
|
||||
}
|
||||
```
|
||||
|
||||
### appsettings.json (BFF):
|
||||
|
||||
```json
|
||||
{
|
||||
"ConnectionStrings": {
|
||||
"DefaultConnection": "Host=postgres;Database=cms;Username=xxx;Password=xxx"
|
||||
},
|
||||
"CMSMSAddress": "https://cms.se.kbs1.ir",
|
||||
"Jwt": {
|
||||
"Secret": "xxx",
|
||||
"Issuer": "FourSat",
|
||||
"Audience": "FourSat"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Kubernetes Resources
|
||||
|
||||
### Deployment Template:
|
||||
|
||||
```yaml
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: backoffice
|
||||
spec:
|
||||
replicas: 2
|
||||
selector:
|
||||
matchLabels:
|
||||
app: backoffice
|
||||
template:
|
||||
spec:
|
||||
containers:
|
||||
- name: backoffice
|
||||
image: git.se.kbs1.ir/admin/backoffice:latest
|
||||
ports:
|
||||
- containerPort: 80
|
||||
env:
|
||||
- name: ASPNETCORE_ENVIRONMENT
|
||||
value: "Staging"
|
||||
```
|
||||
|
||||
### Service Template:
|
||||
|
||||
```yaml
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: backoffice-svc
|
||||
spec:
|
||||
selector:
|
||||
app: backoffice
|
||||
ports:
|
||||
- port: 80
|
||||
targetPort: 80
|
||||
```
|
||||
|
||||
### Ingress Template:
|
||||
|
||||
```yaml
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: backoffice-ingress
|
||||
spec:
|
||||
rules:
|
||||
- host: backoffice.se.kbs1.ir
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: backoffice-svc
|
||||
port:
|
||||
number: 80
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🏥 Health Checks
|
||||
|
||||
### CMS Health Endpoints:
|
||||
|
||||
| Endpoint | استفاده |
|
||||
|----------|---------|
|
||||
| `/health` | وضعیت کلی |
|
||||
| `/health/ready` | Readiness probe |
|
||||
| `/health/live` | Liveness probe |
|
||||
|
||||
### Kubernetes Probes:
|
||||
|
||||
```yaml
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: /health/live
|
||||
port: 80
|
||||
initialDelaySeconds: 30
|
||||
periodSeconds: 10
|
||||
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: /health/ready
|
||||
port: 80
|
||||
initialDelaySeconds: 5
|
||||
periodSeconds: 5
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Monitoring
|
||||
|
||||
### Hangfire Dashboard:
|
||||
```
|
||||
https://cms.se.kbs1.ir/hangfire
|
||||
```
|
||||
|
||||
### Logs:
|
||||
```bash
|
||||
# Kubernetes logs
|
||||
kubectl logs -f deployment/cms -n foursat
|
||||
|
||||
# Docker logs
|
||||
docker logs -f cms
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔄 Deploy Process
|
||||
|
||||
### 1. Manual Deploy:
|
||||
|
||||
```bash
|
||||
# BackOffice
|
||||
cd BackOffice
|
||||
./build-deps.sh
|
||||
git add .
|
||||
git commit -m "Deploy: v1.x.x"
|
||||
git push kub-stage main
|
||||
|
||||
# BFF/CMS
|
||||
cd BackOffice.BFF
|
||||
git add .
|
||||
git commit -m "Deploy: v1.x.x"
|
||||
git push kub-stage main
|
||||
```
|
||||
|
||||
### 2. Verify Deployment:
|
||||
|
||||
```bash
|
||||
# Check pods
|
||||
kubectl get pods -n foursat
|
||||
|
||||
# Check services
|
||||
kubectl get svc -n foursat
|
||||
|
||||
# Check ingress
|
||||
kubectl get ingress -n foursat
|
||||
```
|
||||
|
||||
### 3. Rollback:
|
||||
|
||||
```bash
|
||||
# Rollback to previous version
|
||||
kubectl rollout undo deployment/backoffice -n foursat
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🛠️ Troubleshooting
|
||||
|
||||
### Build Failed:
|
||||
|
||||
```bash
|
||||
# Check proto DLLs
|
||||
ls BackOffice/libs/*.dll | wc -l # Should be 24
|
||||
|
||||
# Rebuild
|
||||
./build-deps.sh
|
||||
```
|
||||
|
||||
### Image Push Failed:
|
||||
|
||||
```bash
|
||||
# Login to registry
|
||||
docker login git.se.kbs1.ir
|
||||
|
||||
# Check daemon.json
|
||||
cat /etc/docker/daemon.json
|
||||
```
|
||||
|
||||
### Pod CrashLoopBackOff:
|
||||
|
||||
```bash
|
||||
# Check logs
|
||||
kubectl logs pod-name -n foursat
|
||||
|
||||
# Check events
|
||||
kubectl describe pod pod-name -n foursat
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📚 مستندات مرتبط
|
||||
|
||||
- [BackOffice Documentation](./01-BACKOFFICE.md)
|
||||
- [Proto Guide](./02-PROTO-GUIDE.md)
|
||||
- [CMS Documentation](./04-CMS.md)
|
||||
Reference in New Issue
Block a user