Files
meezi/src/Meezi.API/appsettings.json
T
soroush.asadi 42d7667735 Fully implement Kavenegar SMS support
Core changes:
- ISmsService: add SendBulkAsync (batches of 200) + GetAccountInfoAsync
- KavenegarSmsService: POST requests, sender number config, bulk send
  via comma-separated receptors, account balance, full error code mapping
  (HTTP 400-432), enabled-flag check before any send
- SmsMarketingService: replaced per-recipient loop with SendBulkAsync
- SmsController: new GET /sms/balance endpoint returns Kavenegar credit
- SmsDtos: SmsBalanceDto
- IntegrationDtos + PlatformIntegrationService: SenderNumber field
- appsettings.json + docker-compose: Kavenegar__SenderNumber = 90005671

Dashboard:
- sms-screen: char counter, SMS parts indicator (Persian 70/67 chars,
  Latin 160/153), account balance card, sender line display, result banner

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 02:38:06 +03:30

110 lines
2.5 KiB
JSON

{
"ConnectionStrings": {
"DefaultConnection": "Host=localhost;Port=5434;Database=meezi;Username=meezi;Password=meezi_local_pass",
"Redis": "localhost:6381"
},
"Jwt": {
"Key": "meezi-dev-secret-key-min-32-chars!!",
"Issuer": "meezi",
"Audience": "meezi",
"AccessTokenExpiryDays": 7,
"RefreshTokenExpiryDays": 30
},
"App": {
"PublicBaseUrl": "https://localhost:7208",
"QrPublicBaseUrl": "https://meezi.ir"
},
"Auth": {
"MaxOtpAttemptsPerHour": 5
},
"Security": {
"Enabled": true,
"RequireCaptchaOnPublicWrites": false,
"Turnstile": {
"SiteKey": "",
"SecretKey": ""
},
"RateLimits": {
"AuthOtpPerIpPerHour": 15,
"PublicReadsPerIpPerMinute": 120,
"PublicWritesPerIpPerMinute": 30
},
"GuestOrders": {
"PerIpPerCafePerHour": 25,
"PerCafePerHour": 200,
"PerIpGlobalPerHour": 60
}
},
"Kavenegar": {
"ApiKey": "",
"SenderNumber": "90005671",
"OtpTemplate": "verify"
},
"ZarinPal": {
"MerchantId": "",
"Sandbox": true
},
"Billing": {
"DashboardBaseUrl": "http://localhost:3101"
},
"Snappfood": {
"WebhookSecret": "meezi-dev-snappfood-secret",
"ApiKey": "",
"ApiBaseUrl": ""
},
"DeliveryPlatforms": {
"DefaultSnappfoodCommissionPercent": 18,
"DefaultTap30CommissionPercent": 15,
"DefaultDigikalaCommissionPercent": 12,
"Snappfood": {
"WebhookSecret": "meezi-dev-snappfood-secret",
"ApiKey": "",
"ApiBaseUrl": ""
},
"Tap30": {
"WebhookSecret": "meezi-dev-tap30-secret",
"ApiKey": "",
"ApiBaseUrl": ""
},
"Digikala": {
"WebhookSecret": "",
"Enabled": false
}
},
"Taraz": {
"Username": ""
},
"OpenAI": {
"ApiKey": "",
"Model": "gpt-4o-mini"
},
"Cors": {
"Origins": [ "http://localhost:3000", "http://localhost:3100", "http://localhost:3101" ]
},
"Serilog": {
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"Microsoft.EntityFrameworkCore": "Warning",
"Hangfire": "Information"
}
}
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"Ai3d": {
"ApiKey": "",
"BaseUrl": "https://api.meshy.ai",
"ImageTo3dPath": "/openapi/v1/image-to-3d",
"PollIntervalSeconds": 4,
"PollTimeoutSeconds": 300,
"AllowDevStub": false
}
}