Files
Shahoo/docs/01-dynamic-markets-remediation.md
2026-08-13 20:26:04 +03:30

9.1 KiB
Raw Permalink Blame History

اصلاح بازار داینامیک، نمودار یکپارچه، و حذف CAD→IRT

تاریخ: 2026-07-19
محیط: staging — https://shahoo.fibitex.com/
وابستگی: Shahoo-BFF (ریپوی جدا)


۱. خلاصه مشکل

# علامت علت ریشه‌ای
۱ لیست بازار ثابت (IRT/USDT) آرایه‌های hardcode در UI
۲ ارزهای اضافی/کم (مثلاً BNB نیست، LINK هست) CURRENCY.TYPE + IRTitems/USDTitems ثابت
۳ نمودار USDT = Binance TradingViewWidget به‌جای datafeed داخلی
۴ CAD به‌عنوان quote پشتیبانی نمی‌شود UI فقط IRT/USDT؛ chart برای CAD null
۵ CAD→IRT در BFF (legacy) normalizeCurrencyForShahoo — دیگر لازم نیست؛ IRT روی سرور فعال است

۲. وضعیت فعلی staging (baseline)

API stats روی staging (2026-07-19):

BNB_CAD, BNB_IRT, BNB_USDT, BTC_CAD, BTC_IRT, BTC_USDT,
ETH_CAD, ETH_IRT, ETH_USDT, IRT_IRT, USDT_CAD, USDT_IRT
  • IRT و CAD هر دو quote مستقل روی Peatio/Dena فعال‌اند.
  • BFF endpoint GET /api/1/ohlcvs/tradingView?market=BTC_USDT داده صرافی برمی‌گرداند
  • UI هنوز از hardcode استفاده می‌کند

۳. اهداف (Definition of Done)

  • لیست بازارها و quote currencies (IRT, USDT, CAD) از API لود شوند
  • تب‌های sidebar/header/popover داینامیک باشند
  • فقط markets فعال Peatio نمایش داده شوند
  • نمودار همه quoteها از TVChartContainer + BFF /ohlcvs/tradingView
  • mapping CAD→IRT از BFF حذف شود
  • QA روی shahoo.fibitex.com سبز + redeploy images

۴. معماری هدف

Peatio (Dena)
  GET /public/markets
  GET /public/currencies
        ↓
Shahoo-BFF
  GET /api/1/markets/catalog   ← جدید (public)
  GET /api/1/ohlcvs/stats      ← موجود
  GET /api/1/ohlcvs/tradingView ← موجود
        ↓
Shahoo SPA
  MarketsContext (bootstrap، بدون login)
  MarketListPanel (تب quote + لیست base)
  TVChartContainer (IRT | USDT | CAD)

۵. قرارداد API پیشنهادی — GET /api/1/markets/catalog

Auth: public (بدون token)
منبع BFF: denaClient.getMarkets() + denaClient.getCurrencies()

{
  "statusCode": 200,
  "content": {
    "quoteCurrencies": ["IRT", "USDT", "CAD"],
    "marketsByQuote": {
      "IRT":  ["BTC", "ETH", "BNB", "USDT"],
      "USDT": ["BTC", "ETH", "BNB"],
      "CAD":  ["BTC", "ETH", "BNB", "USDT"]
    },
    "markets": [
      {
        "marketId": "btcirt",
        "marketKey": "BTC_IRT",
        "base": "BTC",
        "quote": "IRT",
        "symbol": "BTCIRT",
        "route": "BTC-IRT",
        "enabled": true,
        "amountPrecision": 6,
        "pricePrecision": 2
      }
    ]
  }
}

قوانین mapping BFF:

  • فقط markets با state: enabled
  • marketKey = {BASE}_{QUOTE} (uppercase)
  • route = {BASE}-{QUOTE} (مطابق react-router Shahoo)
  • symbol = {BASE}{QUOTE} (مطابق TradingView datafeed)
  • بدون تبدیل CAD→IRT

۶. فازبندی و اولویت

فاز ۱🔴 فوری

ID تسک repo فایل(ها) وضعیت
T1.1 یکپارچه‌سازی نمودار: حذف TradingViewWidget؛ TVChartContainer برای IRT/USDT/CAD Shahoo MarketChart/index.js
T1.2 حذف CAD→IRT در BFF Shahoo-BFF mapMarket.js, userPrefs.js, mapTransaction.js, …

T1.1 جزئیات:

// قبل: USDT → TradingViewWidget (Binance embed)
// بعد: همه quoteها → TVChartContainer + Datafeed → /api/1/ohlcvs/tradingView

symbol اولیه: {BASE}{QUOTE} — مثلاً BTCUSDT, BTCIRT, BTCCAD


فاز ۲ — 🔴 BFF catalog

ID تسک repo فایل(ها) وضعیت
T2.1 Endpoint GET /api/1/markets/catalog Shahoo-BFF routes/markets.js, lib/mapMarketsCatalog.js
T2.2 حذف/جایگزینی SHAAHO_CURRENCIES whitelist Shahoo-BFF mapMarket.js, mapConstants.js

فاز ۳ — 🔴 Shahoo UI داینامیک

ID تسک repo فایل(ها) وضعیت
T3.1 MarketsContext + useMarkets + fetch bootstrap Shahoo context/marketsContext.js, api/markets.js, Layout/App
T3.2 کامپوننت مشترک MarketListPanel Shahoo MarketListPanel/
T3.3 refactor سه فایل تکراری → MarketListPanel Shahoo MarketSelectCurrency, MarketSelectTab, MarketDropDown
T3.4 CURRENCY.TYPE → fallback Shahoo core/utils/getCurrencyMeta.js

فایل‌های hardcode برای حذف/جایگزینی:

src/features/Market/MainComponents/MarketSelectCurrency/index.js   → IRTitems, USDTitems
src/features/Market/MainComponents/MarketHeader/.../MarketSelectTab/index.js
src/features/PopOverComponents/Market/MarketDropDown/index.js

فاز ۴ — 🟡 سطوح ثانویه

ID تسک repo فایل(ها) وضعیت
T4.1 SwitchCurrency — تب quote داینامیک Shahoo SwitchCurrency/index.js
T4.2 Landing — لیست از catalog Shahoo Landing/pages/index.js
T4.3 TradingView datafeed — symbols داینامیک Shahoo datafeeds/datafeed.js
T4.4 MarketChart — symbol از catalog Shahoo MarketChart/index.js
T4.5 WatchList — quote از destMarket Shahoo WatchList/index.js
T4.6 Route guard — redirect به market معتبر Shahoo Market/pages/index.js

فاز ۵🟢 QA + Deploy

ID تسک وضعیت
T5.1 تب IRT/USDT/CAD فقط markets واقعی Peatio
T5.2 BNB در لیست؛ LINK/LTC بدون market نباشند
T5.3 نمودار BTC-USDT / BTC-IRT / BTC-CAD — داده صرافی
T5.4 Wallet: balance IRT و CAD جدا
T5.5 Order book + place order روی BNB-USDT
T5.6 Rebuild custom/shahoo:1 + custom/shahoo-bff:1 + redeploy staging

۷. مسیر بحرانی (Critical Path)

T1.2 → T2.1 → T3.1 → T3.2 → T3.3
         ↑
T1.1 (موازی — می‌توان همزمان با T1.2 شروع کرد)
         ↓
T4.* → T5.*

ترتیب پیشنهادی اجرا:

  1. T1.1 + T1.2 (نمودار + پاکسازی BFF)
  2. T2.1 + T2.2 (catalog API)
  3. T3.1 → T3.3 (UI داینامیک)
  4. T4.* (polish)
  5. T5.* (QA staging)

تخمین: ۴–۵ روز کاری


۸. تست دستی (staging)

# statMap — کلیدهای IRT/USDT/CAD
curl -s https://shahoo.fibitex.com/api/1/ohlcvs/stats | jq '.content.statMap | keys'

# catalog (بعد از T2.1)
curl -s https://shahoo.fibitex.com/api/1/markets/catalog | jq .

# نمودار USDT از صرافی (بعد از T1.1)
curl -s "https://shahoo.fibitex.com/api/1/ohlcvs/tradingView?market=BTC_USDT&resolution=240&from=1700000000&to=1800000000" | jq '.content | length'

چک UI:

  • /market/BNB-IRT — لیست + قیمت + نمودار
  • /market/BTC-USDT — نمودار Fibitex (نه Binance watermark)
  • /market/BTC-CAD — صفحه باز شود (بعد از T1.1/T3)

۹. خارج از scope (این سند)

  • حذف کامل CURRENCY.TYPE (فقط به fallback تبدیل می‌شود)
  • فیچرهای ایران (Jibit/Vandar/IRT Pay)

Real-time (Rango WebSocket): برنامه جدا — 02-rango-websocket-plan.md
شروع توصیه‌شده: بعد از T3.1 MarketsContext (marketId برای subscribe).


۱۰. Todo checklist (کپی برای commit/PR)

فاز ۱
[x] T1.1 MarketChart → TVChartContainer برای همه quote
[x] T1.2 BFF: حذف CAD→IRT

فاز ۲
[x] T2.1 BFF: GET /api/1/markets/catalog
[x] T2.2 BFF: SHAAHO_CURRENCIES → dynamic

فاز ۳
[x] T3.1 MarketsContext + useMarkets + api/markets.js
[x] T3.2 MarketListPanel (کامپوننت مشترک)
[x] T3.3 refactor MarketSelectCurrency / MarketSelectTab / MarketDropDown
[x] T3.4 CURRENCY.TYPE fallback + getCurrencyMeta

فاز ۴
[x] T4.1 SwitchCurrency داینامیک
[x] T4.2 Landing از catalog
[x] T4.3 datafeed symbols داینامیک
[x] T4.4 MarketChart symbol از context
[x] T4.5 WatchList quote selector
[x] T4.6 Route guard market معتبر

فاز ۵
[ ] T5 QA staging + redeploy

مرحله بعد (real-time): 02-rango-websocket-plan.md


۱۱. commit message convention

T1.1: unify market chart on TVChartContainer for all quotes
T2.1: add GET /api/1/markets/catalog from Dena public API
T3.2: replace hardcoded IRTitems/USDTitems with MarketListPanel