# ارتقای نسخه ۲ به ۳

نسخه ۳ قرارداد روت‌های قدیمی را حفظ می‌کند و ۱۲ روت جدید دارد: ۵ گزارش POST، ۵ options، catalog و logout-all. گزارش‌های جدید یک envelope مستقیم data/meta/summary/columns دارند. محدودیت page در GETهای قدیمی اکنون حداکثر ۱۰۰۰ است.

قبل از ارتقا از دیتابیس بکاپ بگیرید و نسخه ۳ را روی کپی آزمایشی بررسی کنید. فایل .env قبلی را حفظ کنید؛ init:env آن را بازنویسی نمی‌کند. داده واقعی را به test:integration ندهید.

## نصب قبلی با migration نسخه ۲

کد جدید و package-lock را جایگزین کنید و در مسیر پروژه اجرا کنید:

```bash
npm ci
npx prisma generate
npx prisma migrate deploy
npm start
```

migration اولیه دست‌نخورده است؛ migration جدید فقط ۳ index اضافه می‌کند. سند مالی، نرخ یا مانده بازنویسی نمی‌شود. ساخت index در دیتابیس بزرگ ممکن است زمان ببرد؛ برای نصب عملیاتی زمان مناسب انتخاب کنید.

اگر Docker دارید: .env قبلی و volume قبلی را حفظ و docker compose up --build -d را در همان project directory/name اجرا کنید. تغییر نام پروژه Compose می‌تواند volume جدید بسازد؛ نام project قبلی را با گزینه -p حفظ کنید. هیچ volume را پاک نکنید.

## نصب قبلی با import دستی SQL نسخه ۲

اگر migration اولیه قبلاً resolve نشده، فقط پس از اطمینان از تطبیق ساختار نسخه ۲:

```bash
npx prisma migrate resolve --applied 20260922000000_init
npx prisma migrate deploy
```

## نصب تازه

روش اصلی README همان npm run setup یا Docker است و هر دو migration به ترتیب اجرا می‌شوند.

اگر sql/schema.sql نسخه ۳ را به‌صورت دستی در دیتابیس خالی import می‌کنید، چون indexهای جدید در آن هستند، هر دو migration را applied علامت بزنید:

```bash
npx prisma generate
npx prisma migrate resolve --applied 20260922000000_init
npx prisma migrate resolve --applied 20260923000000_report_indexes
npm run prisma:seed
npm start
```

schema.sql کامل را روی دیتابیس دارای داده import نکنید. npm run sql اکنون فقط snapshot کامل SQL را بازتولید می‌کند و migration منتشرشده را تغییر نمی‌دهد.

## اصلاحات دیگر

ورود هم‌زمان با تغییر رمز دوباره وضعیت حساب را در تراکنش بررسی می‌کند. تغییر رمز نیز با شرط تطبیق هش قبلی انجام می‌شود تا تغییر هم‌زمان بازنویسی نشود. خروج فعلی Audit دارد و POST /api/auth/logout-all همه نشست‌های کاربر را باطل می‌کند. پاسخ‌های API کش مرورگر نمی‌شوند. خطای timeout برای محدودکردن گزارش پیام مشخص دارد.

## تست یکپارچه مستقل

```bash
docker compose -f compose.test.yaml up --build --abort-on-container-exit --exit-code-from test
```

این Compose جداگانه MySQL آزمایشی بدون پورت عمومی و با داده موقت می‌سازد؛ رمزهای ثابت آن فقط برای همین محیط دورریختنی‌اند. راه‌اندازی production از compose.yaml و .env واقعی استفاده می‌کند. اجرای Docker/MySQL در محیط تهیه این نسخه ممکن نبود؛ تست یکپارچه برای اجرای شما آماده شده است.

