# FrontOffice.BFF

## Overview
FrontOffice.BFF (Backend-For-Frontend) is a gRPC-based API gateway that serves the FrontOffice web application. It communicates with the CMS microservice via gRPC and exposes APIs to the frontend.

## Architecture
```
Frontend (FrontOffice) → FrontOffice.BFF → CMS Microservice
```

## Project Structure
```
FrontOffice.BFF/
├── src/
│   ├── FrontOffice.BFF.Application/     # CQRS handlers, DTOs, interfaces
│   ├── FrontOffice.BFF.Domain/          # Domain entities
│   ├── FrontOffice.BFF.Infrastructure/  # gRPC clients, DI config
│   ├── FrontOffice.BFF.WebApi/          # gRPC services, mappings
│   └── Protobufs/                       # Proto definitions for frontend
│       ├── FrontOffice.BFF.Category.Protobuf/
│       ├── FrontOffice.BFF.DiscountShop.Protobuf/  # NEW
│       ├── FrontOffice.BFF.Package.Protobuf/
│       ├── FrontOffice.BFF.Products.Protobuf/
│       ├── FrontOffice.BFF.ShopingCart.Protobuf/
│       ├── FrontOffice.BFF.Transaction.Protobuf/
│       ├── FrontOffice.BFF.User.Protobuf/
│       ├── FrontOffice.BFF.UserAddress.Protobuf/
│       ├── FrontOffice.BFF.UserOrder.Protobuf/
│       └── FrontOffice.BFF.UserWallet.Protobuf/
```

## Feature Modules

### DiscountShopCQ (New - Jan 2025)
فروشگاه تخفیفی برای اعضای باشگاه مشتریان

**Queries:**
- `GetDiscountProducts` - لیست محصولات تخفیفی
- `GetDiscountCategories` - دسته‌بندی‌های فروشگاه
- `GetMyDiscountCart` - سبد خرید تخفیفی کاربر
- `GetMyDiscountOrders` - سفارشات تخفیفی کاربر

**Commands:**
- `AddToDiscountCart` - افزودن به سبد خرید
- `RemoveFromDiscountCart` - حذف از سبد خرید
- `PlaceDiscountOrder` - ثبت سفارش

### CommissionCQ
سیستم کمیسیون شبکه‌ای

**Queries:**
- `GetMyCommissionPayouts` - لیست پرداخت‌های کمیسیون
- `GetMyWeeklyBalances` - بالانس‌های هفتگی

### NetworkMembershipCQ
عضویت شبکه‌ای و درخت باینری

**Queries:**
- `GetMyNetworkPosition` - موقعیت کاربر در شبکه
- `GetMyNetworkStatistics` - آمار شبکه
- `GetMyNetworkTree` - درخت شبکه
- `GetSubordinateTree` - درخت زیرمجموعه (NEW - ۲۸ آذر)

### ClubMembershipCQ
عضویت باشگاه مشتریان

**Queries:**
- `GetMyClubMembership` - وضعیت عضویت

**Commands:**
- `ActivateMyClubMembership` - فعال‌سازی عضویت

### UserWalletCQ
کیف پول کاربر

**Queries:**
- `GetUserWallet` - موجودی کیف پول
- `GetAllUserWalletChangeLog` - تاریخچه تراکنش‌ها

**Commands:**
- `WithdrawBalance` - درخواست برداشت
- `TransferUserWalletBallance` - انتقال موجودی (TODO: needs CMS proto)
- `DeleteUser` - حذف کاربر

## gRPC Clients (CMS Connection)
Defined in `IApplicationContractContext.cs`:

- `ProductContract` - محصولات
- `CategoryContract` - دسته‌بندی‌ها
- `ShopingCartContract` - سبد خرید
- `TransactionContract` - تراکنش‌ها
- `UserWalletContract` - کیف پول
- `UserContract` - کاربران
- `UserOrderContract` - سفارشات
- `NetworkMembershipContract` - عضویت شبکه
- `CommissionContract` - کمیسیون
- `ClubMembershipContract` - باشگاه مشتریان
- `DiscountProductContract` - محصولات تخفیفی (NEW)
- `DiscountCategoryContract` - دسته‌بندی تخفیفی (NEW)
- `DiscountShoppingCartContract` - سبد خرید تخفیفی (NEW)
- `DiscountOrderContract` - سفارش تخفیفی (NEW)

## Build & Run
```bash
cd FrontOffice.BFF/src
dotnet build
dotnet run --project FrontOffice.BFF.WebApi
```

## Last Updated
- **28 آذر ۱۴۰۴**: Added `GetSubordinateTree` handler for viewing subordinate network trees
- **January 2025**: Added DiscountShop integration (4 gRPC clients, 7 handlers, Proto service)