Files
clinicpro/docs/tasks/task-01-project-setup/database.md
T
hamed de1a78a235 feat: Implement SMS sending functionality with KavehNegar and Rangineh providers
- Add SendSmsMessage class for encapsulating SMS message data.
- Create KavehNegarProvider and RanginehProvider classes implementing SmsProviderInterface for sending SMS.
- Implement SmsLogRepository and SmsTemplateRepository for managing SMS logs and templates.
- Develop SendSmsHandler for handling SMS sending messages.
- Create SmsService to manage SMS dispatching and logging.
- Add UserProfileController for managing user profiles with CRUD operations.
- Implement UserProfile entity and repository for user profile data management.
- Update symfony.lock and bootstrap.php for project dependencies and environment setup.
2026-06-09 22:00:34 +03:30

95 lines
2.7 KiB
Markdown

# پایگاه داده — تسک ۰۱: راه‌اندازی پروژه
## موتور پایگاه داده
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
```