4c98c2cce1
CI/CD / CI · API (dotnet build + test) (push) Successful in 1m24s
CI/CD / CI · Admin API (dotnet build) (push) Successful in 1m1s
CI/CD / CI · Dashboard (tsc) (push) Successful in 1m5s
CI/CD / CI · Admin Web (tsc) (push) Successful in 37s
CI/CD / CI · Website (tsc) (push) Successful in 46s
CI/CD / CI · Koja (tsc) (push) Successful in 50s
CI/CD / Deploy · all services (push) Successful in 2m16s
A user can be offline for months (offline-first dashboard) and must stay logged in / be able to sync on reconnect. Access 7d→30d, refresh 30d→365d, so a ~3-month offline gap still has a valid refresh token on reconnect (queued writes sync, no forced logout). Client only logs out on a server 401, never while offline.
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": 30,
|
|
"RefreshTokenExpiryDays": 365
|
|
},
|
|
"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": "meeziotp"
|
|
},
|
|
"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
|
|
}
|
|
}
|