feat(api): .NET 10 multi-tenant REST API
Full backend implementation: - Multi-tenant cafe/restaurant management (menus, orders, tables, staff) - POS order flow with ZarinPal and Snappfood payment integration - OTP authentication via Kavenegar SMS - QR digital menu with public discover/finder endpoints - Customer loyalty, coupons, CRM - PostgreSQL via EF Core, Redis for caching/sessions - Background jobs, webhook handlers - Full migration history Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,108 @@
|
||||
{
|
||||
"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": "",
|
||||
"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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user