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.
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
# پایگاه داده — تسک ۰۱: راهاندازی پروژه
|
||||
|
||||
## موتور پایگاه داده
|
||||
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
|
||||
```
|
||||
Reference in New Issue
Block a user