# Proto Package Management - Quick Start

این فایل یک راهنمای سریع برای مدیریت Proto Packages در پروژه FourSat است.

---

## 📦 فایل‌های مهم

| فایل | توضیحات |
|------|---------|
| `PROTO-PACKAGING-GUIDE.md` | راهنمای کامل و جامع (همه جزئیات) |
| `pack-protos.sh` | Script خودکار برای Package کردن همه Proto ها |
| `docker-compose.baget.yml` | راه‌اندازی Private NuGet Server |
| `EXAMPLE-PROTO-CSPROJ.xml` | مثال csproj با تنظیمات Debug/Release |

---

## 🚀 شروع سریع

### 1. راه‌اندازی NuGet Server (اختیاری برای Local Development)

```bash
# شروع BaGet با Docker
docker-compose -f docker-compose.baget.yml up -d

# بررسی وضعیت
docker ps | grep baget

# دسترسی به UI
# مرورگر: http://localhost:5555
```

### 2. Package کردن همه Proto ها

```bash
# فقط ساخت packages (بدون push)
./pack-protos.sh

# ساخت و push به NuGet server
./pack-protos.sh --push

# استفاده از custom server
NUGET_SERVER=https://nuget.foursat.com ./pack-protos.sh --push
```

### 3. اضافه کردن NuGet Source

```bash
# اضافه کردن local BaGet
dotnet nuget add source http://localhost:5555/v3/index.json \
  --name foursat-local \
  --username foursat \
  --password FOURSAT-SECRET-API-KEY-2025 \
  --store-password-in-clear-text

# بررسی sources
dotnet nuget list source
```

---

## 🔄 Workflow توسعه

### Development (Local):

```bash
# Build با Debug config → استفاده از ProjectReference
cd BackOffice/src
dotnet build -c Debug

# همه تغییرات Proto بلافاصله اعمال می‌شود
```

### Production (Deploy):

```bash
# 1. Package کردن CMS Proto
cd CMS/src/CMSMicroservice.Protobuf
dotnet pack -c Release -o ./nupkg

# 2. Push به NuGet Server
dotnet nuget push ./nupkg/*.nupkg \
  --source http://localhost:5555/v3/index.json \
  --api-key FOURSAT-SECRET-API-KEY-2025

# 3. Package کردن BFF Protos (وابسته به CMS)
cd BackOffice.BFF/src/Protobufs
# ... (مشابه)

# 4. Build UI با Release config → استفاده از PackageReference
cd BackOffice/src
dotnet build -c Release
```

---

## 📊 ساختار Packages

```
Foursat.CMSMicroservice.Protobuf (v1.0.0)
  └─ Base Proto Layer
     └─ استفاده شده در:
        ├─ Foursat.BackOffice.BFF.Products.Protobuf
        ├─ Foursat.BackOffice.BFF.User.Protobuf
        ├─ Foursat.BackOffice.BFF.*.Protobuf (12 package دیگر)
        ├─ Foursat.FrontOffice.BFF.Products.Protobuf
        └─ Foursat.FrontOffice.BFF.*.Protobuf (7 package دیگر)
```

**تعداد کل Packages**: ~23 package

---

## 🔍 دستورات مفید

```bash
# جستجو در local NuGet server
dotnet nuget search Foursat --source foursat-local

# نصب یک package
dotnet add package Foursat.CMSMicroservice.Protobuf \
  --version 1.0.0 \
  --source foursat-local

# بررسی dependencies
dotnet list package --include-transitive

# حذف package cache
dotnet nuget locals all --clear

# بررسی محتویات package
unzip -l package.nupkg
```

---

## ⚙️ تنظیمات csproj

### Development (Debug):
```xml
<ItemGroup Condition="'$(Configuration)' == 'Debug'">
  <ProjectReference Include="..\..\CMS\src\CMSMicroservice.Protobuf\CMSMicroservice.Protobuf.csproj" />
</ItemGroup>
```

### Production (Release):
```xml
<ItemGroup Condition="'$(Configuration)' == 'Release'">
  <PackageReference Include="Foursat.CMSMicroservice.Protobuf" Version="1.0.0" />
</ItemGroup>
```

**مثال کامل**: `EXAMPLE-PROTO-CSPROJ.xml`

---

## 📝 Versioning

### Semantic Versioning (SemVer):

```
MAJOR.MINOR.PATCH

1.0.0 → Initial release
1.0.1 → Bug fix
1.1.0 → New feature (backward compatible)
2.0.0 → Breaking change
```

### مثال تغییر نسخه:

```xml
<!-- قبل: -->
<Version>1.0.0</Version>

<!-- بعد از اضافه کردن فیلد جدید (compatible): -->
<Version>1.1.0</Version>

<!-- بعد از تغییر RPC signature (breaking): -->
<Version>2.0.0</Version>
```

---

## 🎯 نکات مهم

1. ✅ **Local Development**: همیشه با `Debug` build کار کنید
2. ✅ **Production Build**: همیشه با `Release` build
3. ✅ **Version Bump**: هر تغییر در Proto → نسخه جدید
4. ✅ **Push Order**: اول CMS، بعد BFF ها، آخر UI ها
5. ✅ **Testing**: قبل از push حتماً test کنید

---

## 🆘 عیب‌یابی

### مشکل: Package پیدا نمی‌شود

```bash
# بررسی source ها
dotnet nuget list source

# اضافه کردن source
dotnet nuget add source http://localhost:5555/v3/index.json --name foursat-local

# پاک کردن cache
dotnet nuget locals all --clear
```

### مشکل: Version conflict

```bash
# حذف obj و bin
find . -name "obj" -o -name "bin" | xargs rm -rf

# Restore دوباره
dotnet restore

# Build
dotnet build -c Release
```

### مشکل: BaGet server در دسترس نیست

```bash
# بررسی container
docker ps | grep baget

# restart container
docker-compose -f docker-compose.baget.yml restart

# لاگ‌ها
docker logs foursat-nuget-server
```

---

## 📚 منابع بیشتر

- **راهنمای کامل**: `PROTO-PACKAGING-GUIDE.md`
- **BaGet Documentation**: https://loic-sharma.github.io/BaGet/
- **NuGet CLI Reference**: https://docs.microsoft.com/en-us/nuget/reference/nuget-exe-cli-reference
- **Semantic Versioning**: https://semver.org/

---

**تاریخ**: December 6, 2025  
**نسخه**: 1.0.0  
**پروژه**: FourSat
