42d7667735
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>
110 lines
2.5 KiB
JSON
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
|
|
}
|
|
}
|