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:
soroush.asadi
2026-05-27 21:33:48 +03:30
parent 03376b3ea1
commit ef15fd6247
472 changed files with 120358 additions and 0 deletions
+298
View File
@@ -0,0 +1,298 @@
{
"version": 2,
"source": "Food-101 class mapping (Unsplash fallbacks until Kaggle JPEG import)",
"defaults": {
"drink": "https://images.unsplash.com/photo-1509042239860-f550ce710b93?w=600\u0026auto=format\u0026fit=crop",
"food": "https://images.unsplash.com/photo-1546793665-c74683f339c1?w=600"
},
"items": {
"item_demo_espresso": {
"food101Class": "espresso",
"imageUrl": "https://images.unsplash.com/photo-1509042239860-f550ce710b93?w=600\u0026auto=format\u0026fit=crop",
"nameEn": "Espresso",
"categoryId": "cat_demo_drinks"
},
"item_demo_americano": {
"food101Class": "cappuccino",
"imageUrl": "https://images.unsplash.com/photo-1572442388796-11668a67e3d0?w=600",
"nameEn": "Americano",
"categoryId": "cat_demo_drinks"
},
"item_demo_latte": {
"food101Class": "latte",
"imageUrl": "https://images.unsplash.com/photo-1461023058943-07fcbe16d735?w=600",
"nameEn": "Latte",
"categoryId": "cat_demo_drinks"
},
"item_demo_cappuccino": {
"food101Class": "cappuccino",
"imageUrl": "https://images.unsplash.com/photo-1572442388796-11668a67e3d0?w=600",
"nameEn": "Cappuccino",
"categoryId": "cat_demo_drinks"
},
"item_demo_mocha": {
"food101Class": "mocha",
"imageUrl": "https://images.unsplash.com/photo-1577887233537-a81b387b125e?w=600",
"nameEn": "Mocha",
"categoryId": "cat_demo_drinks"
},
"item_demo_tea": {
"food101Class": "miso_soup",
"imageUrl": "https://images.unsplash.com/photo-1556679343-c7306c1976bc?w=600",
"nameEn": "Masala tea",
"categoryId": "cat_demo_drinks"
},
"item_demo_iced_latte": {
"food101Class": "iced_coffee",
"imageUrl": "https://images.unsplash.com/photo-1517487881594-2787aeee8f58?w=600\u0026auto=format\u0026fit=crop",
"nameEn": "Iced latte",
"categoryId": "cat_demo_cold"
},
"item_demo_cold_brew": {
"food101Class": "iced_coffee",
"imageUrl": "https://images.unsplash.com/photo-1517487881594-2787aeee8f58?w=600\u0026auto=format\u0026fit=crop",
"nameEn": "Cold brew",
"categoryId": "cat_demo_cold"
},
"item_demo_lemonade": {
"food101Class": "lemonade",
"imageUrl": "https://images.unsplash.com/photo-1523672990561-64c16245f769?w=600",
"nameEn": "Lemonade",
"categoryId": "cat_demo_cold"
},
"item_demo_smoothie": {
"food101Class": "smoothie",
"imageUrl": "https://images.unsplash.com/photo-1505252585463-0433371f7f6b?w=600",
"nameEn": "Berry smoothie",
"categoryId": "cat_demo_cold"
},
"item_demo_croissant": {
"food101Class": "croque_madame",
"imageUrl": "https://images.unsplash.com/photo-1555507036342-9231d37c10f3?w=600",
"nameEn": "Croissant",
"categoryId": "cat_demo_breakfast"
},
"item_demo_omelette": {
"food101Class": "omelette",
"imageUrl": "https://images.unsplash.com/photo-1525351484343-752d43d363f1?w=600",
"nameEn": "Omelette",
"categoryId": "cat_demo_breakfast"
},
"item_demo_avocado": {
"food101Class": "avocado_toast",
"imageUrl": "https://images.unsplash.com/photo-1541519221064-49632fb3380e?w=600",
"nameEn": "Avocado toast",
"categoryId": "cat_demo_breakfast"
},
"item_demo_pancakes": {
"food101Class": "pancakes",
"imageUrl": "https://images.unsplash.com/photo-1567620905732-2d1ec7ab7440?w=600",
"nameEn": "Pancakes",
"categoryId": "cat_demo_breakfast"
},
"item_demo_waffles": {
"food101Class": "waffles",
"imageUrl": "https://images.unsplash.com/photo-1567818735240-7acbb4b7e34c?w=600",
"nameEn": "Waffles",
"categoryId": "cat_demo_breakfast"
},
"item_demo_french_toast": {
"food101Class": "french_toast",
"imageUrl": "https://images.unsplash.com/photo-1484723091739-30a329e1f0c4?w=600",
"nameEn": "French toast",
"categoryId": "cat_demo_breakfast"
},
"item_demo_eggs_benedict": {
"food101Class": "eggs_benedict",
"imageUrl": "https://images.unsplash.com/photo-1608039819502-3d5a2a2e0b0e?w=600",
"nameEn": "Eggs Benedict",
"categoryId": "cat_demo_breakfast"
},
"item_demo_sandwich": {
"food101Class": "club_sandwich",
"imageUrl": "https://images.unsplash.com/photo-1528735602780-2552fd46c7af?w=600",
"nameEn": "Chicken sandwich",
"categoryId": "cat_demo_food"
},
"item_demo_salad": {
"food101Class": "caesar_salad",
"imageUrl": "https://images.unsplash.com/photo-1546793665-c74683f339c1?w=600",
"nameEn": "Caesar salad",
"categoryId": "cat_demo_food"
},
"item_demo_greek_salad": {
"food101Class": "greek_salad",
"imageUrl": "https://images.unsplash.com/photo-1540189549336-e6e99c3679fe?w=600",
"nameEn": "Greek salad",
"categoryId": "cat_demo_food"
},
"item_demo_burger": {
"food101Class": "hamburger",
"imageUrl": "https://images.unsplash.com/photo-1568901346375-23c9450c58cd?w=600",
"nameEn": "Burger",
"categoryId": "cat_demo_food"
},
"item_demo_steak": {
"food101Class": "steak",
"imageUrl": "https://images.unsplash.com/photo-1600891963295-d66a269b9202?w=600",
"nameEn": "Steak",
"categoryId": "cat_demo_food"
},
"item_demo_salmon": {
"food101Class": "grilled_salmon",
"imageUrl": "https://images.unsplash.com/photo-1467003909585-2f8a72700288?w=600",
"nameEn": "Grilled salmon",
"categoryId": "cat_demo_food"
},
"item_demo_tacos": {
"food101Class": "tacos",
"imageUrl": "https://images.unsplash.com/photo-1565299585323-38174c4aab1e?w=600",
"nameEn": "Tacos",
"categoryId": "cat_demo_food"
},
"item_demo_shawarma": {
"food101Class": "shawarma",
"imageUrl": "https://images.unsplash.com/photo-1529006557810-274adbcb39d8?w=600",
"nameEn": "Shawarma",
"categoryId": "cat_demo_food"
},
"item_demo_falafel": {
"food101Class": "falafel",
"imageUrl": "https://images.unsplash.com/photo-1601050690597-df5748fb5cee?w=600",
"nameEn": "Falafel",
"categoryId": "cat_demo_food"
},
"item_demo_hummus": {
"food101Class": "hummus",
"imageUrl": "https://images.unsplash.com/photo-1626208082043-e6319abfeec2?w=600",
"nameEn": "Hummus",
"categoryId": "cat_demo_food"
},
"item_demo_fries": {
"food101Class": "french_fries",
"imageUrl": "https://images.unsplash.com/photo-1573080496219-76b9e6909700?w=600",
"nameEn": "French fries",
"categoryId": "cat_demo_food"
},
"item_demo_spring_rolls": {
"food101Class": "spring_rolls",
"imageUrl": "https://images.unsplash.com/photo-1526318896985-4d29c0903299?w=600",
"nameEn": "Spring rolls",
"categoryId": "cat_demo_food"
},
"item_demo_ramen": {
"food101Class": "ramen",
"imageUrl": "https://images.unsplash.com/photo-1569718212165-3a8278d5f624?w=600",
"nameEn": "Ramen",
"categoryId": "cat_demo_food"
},
"item_demo_pho": {
"food101Class": "pho",
"imageUrl": "https://images.unsplash.com/photo-1591814468924-caf36d123dd6?w=600",
"nameEn": "Pho",
"categoryId": "cat_demo_food"
},
"item_demo_sushi": {
"food101Class": "sushi",
"imageUrl": "https://images.unsplash.com/photo-1579584425555-c3ce17fd4351?w=600",
"nameEn": "Sushi",
"categoryId": "cat_demo_food"
},
"item_demo_pasta": {
"food101Class": "pasta_carbonara",
"imageUrl": "https://images.unsplash.com/photo-1621996346565-e3dbc646d9a9?w=600",
"nameEn": "Alfredo pasta",
"categoryId": "cat_demo_pasta"
},
"item_demo_carbonara": {
"food101Class": "spaghetti_carbonara",
"imageUrl": "https://images.unsplash.com/photo-1612874741227-866d1aeeecd1?w=600",
"nameEn": "Carbonara",
"categoryId": "cat_demo_pasta"
},
"item_demo_bolognese": {
"food101Class": "spaghetti_bolognese",
"imageUrl": "https://images.unsplash.com/photo-1622973536968-77544a8a4e0e?w=600",
"nameEn": "Bolognese",
"categoryId": "cat_demo_pasta"
},
"item_demo_lasagna": {
"food101Class": "lasagna",
"imageUrl": "https://images.unsplash.com/photo-1574894709920-11b28e7367e3?w=600",
"nameEn": "Lasagna",
"categoryId": "cat_demo_pasta"
},
"item_demo_gnocchi": {
"food101Class": "gnocchi",
"imageUrl": "https://images.unsplash.com/photo-1551183053-bf33a48c970a?w=600",
"nameEn": "Gnocchi",
"categoryId": "cat_demo_pasta"
},
"item_demo_pizza": {
"food101Class": "pizza",
"imageUrl": "https://images.unsplash.com/photo-1513104890138-7c749659a591?w=600",
"nameEn": "Margherita pizza",
"categoryId": "cat_demo_pasta"
},
"item_demo_risotto": {
"food101Class": "mushroom_risotto",
"imageUrl": "https://images.unsplash.com/photo-1476124362071-b9f2c96ef2db?w=600",
"nameEn": "Mushroom risotto",
"categoryId": "cat_demo_pasta"
},
"item_demo_cake": {
"food101Class": "chocolate_cake",
"imageUrl": "https://images.unsplash.com/photo-1578985545062-69928b1d9587?w=600",
"nameEn": "Chocolate cake",
"categoryId": "cat_demo_dessert"
},
"item_demo_cheesecake": {
"food101Class": "cheesecake",
"imageUrl": "https://images.unsplash.com/photo-1524351199678-941a58cfcc36?w=600",
"nameEn": "Cheesecake",
"categoryId": "cat_demo_dessert"
},
"item_demo_brownie": {
"food101Class": "brownie",
"imageUrl": "https://images.unsplash.com/photo-1606313564200-e75d5e30476e?w=600",
"nameEn": "Brownie",
"categoryId": "cat_demo_dessert"
},
"item_demo_icecream": {
"food101Class": "ice_cream",
"imageUrl": "https://images.unsplash.com/photo-1563805042-7684c019e1cb?w=600",
"nameEn": "Ice cream",
"categoryId": "cat_demo_dessert"
},
"item_demo_tiramisu": {
"food101Class": "tiramisu",
"imageUrl": "https://images.unsplash.com/photo-1571877227200-a0d98ea607e9?w=600",
"nameEn": "Tiramisu",
"categoryId": "cat_demo_dessert"
},
"item_demo_donuts": {
"food101Class": "donuts",
"imageUrl": "https://images.unsplash.com/photo-1551024506-0bccd28d3071?w=600",
"nameEn": "Donuts",
"categoryId": "cat_demo_dessert"
},
"item_demo_churros": {
"food101Class": "churros",
"imageUrl": "https://images.unsplash.com/photo-1627482299165-0883a056a48f?w=600",
"nameEn": "Churros",
"categoryId": "cat_demo_dessert"
},
"item_demo_baklava": {
"food101Class": "baklava",
"imageUrl": "https://images.unsplash.com/photo-1598110756419-84b30681f41f?w=600",
"nameEn": "Baklava",
"categoryId": "cat_demo_dessert"
},
"item_demo_creme_brulee": {
"food101Class": "creme_brulee",
"imageUrl": "https://images.unsplash.com/photo-1470309864661-683be0ef7eaf?w=600",
"nameEn": "Cr\u00E8me br\u00FBl\u00E9e",
"categoryId": "cat_demo_dessert"
}
}
}