# پایگاه داده — تسک ۰۱: راه‌اندازی پروژه

## موتور پایگاه داده
MySQL 8.0 با موتور InnoDB و charset از نوع utf8mb4.
DDEV به صورت پیش‌فرض MySQL 8 را فراهم می‌کند.

## قراردادهای کلی

| قرارداد | توضیح |
|---------|-------|
| `id` | کلید اصلی auto-increment (فقط استفاده داخلی) |
| `uuid` | شناسه عمومی UUID v4 (استفاده در API) |
| `created_at` | زمان ایجاد (datetime_immutable) |
| `updated_at` | زمان آخرین ویرایش (datetime_immutable) |
| `deleted_at` | nullable — برای soft delete جداول مهم |
| Foreign key | `ON DELETE CASCADE` یا `ON DELETE SET NULL` بسته به نیاز |

## پیکربندی DDEV برای پایگاه داده
DDEV به طور خودکار MySQL 8 راه‌اندازی می‌کند:
```bash
# اطلاعات اتصال از DDEV
DB_HOST=db
DB_PORT=3306
DB_NAME=db
DB_USER=db
DB_PASSWORD=db
```

در فایل `.env`:
```dotenv
DATABASE_URL="mysql://db:db@db:3306/db?serverVersion=8.0&charset=utf8mb4"
```

## Redis با DDEV
```yaml
# .ddev/docker-compose.redis.yaml
version: "3.6"
services:
  redis:
    image: redis:7-alpine
    expose:
      - "6379"
    labels:
      com.ddev.site-name: ${DDEV_SITENAME}
      com.ddev.approot: ${DDEV_APPROOT}
```

## استفاده از Redis

| کاربرد | کلید | TTL |
|--------|------|-----|
| کد OTP | `otp:{mobile}` | ۱۲۰ ثانیه |
| Rate limiting | `rate:{ip}:{endpoint}` | بسته به قانون |
| JWT Blacklist (logout) | `jwt_blacklist:{jti}` | تا انقضای token |

## TimestampableTrait
در همه Entity ها استفاده می‌شود:
```php
// src/Shared/Trait/TimestampableTrait.php
trait TimestampableTrait
{
    #[ORM\Column(type: 'datetime_immutable')]
    private \DateTimeImmutable $createdAt;

    #[ORM\Column(type: 'datetime_immutable')]
    private \DateTimeImmutable $updatedAt;

    #[ORM\PrePersist]
    public function onPrePersist(): void
    {
        $this->createdAt = new \DateTimeImmutable();
        $this->updatedAt = new \DateTimeImmutable();
    }

    #[ORM\PreUpdate]
    public function onPreUpdate(): void
    {
        $this->updatedAt = new \DateTimeImmutable();
    }
}
```

## استراتژی Migration
- از `doctrine/doctrine-migrations-bundle` استفاده می‌شود
- هر تسک migration فایل مخصوص خود را دارد
- هرگز migration های قبلی ویرایش نشوند — همیشه فایل جدید بساز
- دستور اجرا:
```bash
ddev exec php bin/console doctrine:migrations:migrate
```
- دستور ساخت migration جدید:
```bash
ddev exec php bin/console doctrine:migrations:diff
```
