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
@@ -0,0 +1,78 @@
namespace Meezi.Infrastructure.Data;
/// <summary>Rotating menu templates for discover showcase cafés.</summary>
public static class DiscoverShowcaseMenus
{
public sealed record MenuTemplate(
IReadOnlyList<DemoMenuCatalog.CategorySeed> Categories,
IReadOnlyList<DemoMenuCatalog.ItemSeed> Items);
public static IReadOnlyList<MenuTemplate> Templates { get; } =
[
CoffeeShopTemplate(),
BrunchTemplate(),
RestaurantTemplate(),
DessertTemplate(),
TraditionalTemplate(),
];
private static MenuTemplate CoffeeShopTemplate() => new(
[
new("cat_sc_hot", "قهوه تخصصی", "Specialty coffee", null, 1, IconPresetId: "drinks-hot", IconStyle: "gradient"),
new("cat_sc_cold", "نوشیدنی سرد", "Cold drinks", null, 2, IconPresetId: "drinks-cold", IconStyle: "modern"),
new("cat_sc_snack", "میان‌وعده", "Snacks", null, 3, IconPresetId: "food-mains", IconStyle: "flat"),
],
[
new("item_sc_espresso", "cat_sc_hot", "اسپرسو", "Espresso", null, "دوبل سینگل", 70_000, 0, "espresso"),
new("item_sc_latte", "cat_sc_hot", "لاته", "Latte", null, "شیر بخار", 125_000, 0, "latte"),
new("item_sc_mocha", "cat_sc_hot", "موکا", "Mocha", null, null, 140_000, 0, "mocha"),
new("item_sc_iced", "cat_sc_cold", "آیس آمریکانو", "Iced americano", null, null, 115_000, 0, "iced_coffee"),
new("item_sc_cake", "cat_sc_snack", "چیزکیک", "Cheesecake", null, null, 165_000, 10, "cheesecake"),
]);
private static MenuTemplate BrunchTemplate() => new(
[
new("cat_sc_br", "صبحانه", "Breakfast", null, 1, IconPresetId: "breakfast", IconStyle: "pastel"),
new("cat_sc_br_d", "نوشیدنی", "Drinks", null, 2, IconPresetId: "drinks-hot"),
],
[
new("item_sc_omelette", "cat_sc_br", "املت", "Omelette", null, "نان سنگک", 155_000, 0, "omelette"),
new("item_sc_avocado", "cat_sc_br", "توست آووکادو", "Avocado toast", null, null, 195_000, 0, "avocado_toast"),
new("item_sc_tea", "cat_sc_br_d", "چای", "Tea", null, null, 65_000, 0, "miso_soup"),
]);
private static MenuTemplate RestaurantTemplate() => new(
[
new("cat_sc_main", "غذای اصلی", "Mains", null, 1, IconPresetId: "food-mains", IconStyle: "bold"),
new("cat_sc_salad", "سالاد", "Salads", null, 2, IconPresetId: "food-mains"),
new("cat_sc_drink", "نوشیدنی", "Drinks", null, 3, IconPresetId: "drinks-cold"),
],
[
new("item_sc_burger", "cat_sc_main", "همبرگر", "Burger", null, null, 265_000, 0, "hamburger"),
new("item_sc_pasta", "cat_sc_main", "پاستا", "Pasta", null, null, 245_000, 0, "spaghetti_bolognese"),
new("item_sc_salad", "cat_sc_salad", "سالاد سزار", "Caesar salad", null, null, 185_000, 0, "caesar_salad"),
new("item_sc_lemon", "cat_sc_drink", "لیموناد", "Lemonade", null, null, 95_000, 0, "lemonade"),
]);
private static MenuTemplate DessertTemplate() => new(
[
new("cat_sc_des", "دسر", "Desserts", null, 1, IconPresetId: "dessert", IconStyle: "soft"),
new("cat_sc_des_d", "قهوه", "Coffee", null, 2, IconPresetId: "drinks-hot"),
],
[
new("item_sc_tiramisu", "cat_sc_des", "تیرامیسو", "Tiramisu", null, null, 175_000, 0, "tiramisu"),
new("item_sc_macaron", "cat_sc_des", "ماکارون", "Macaron", null, null, 95_000, 0, "macarons"),
new("item_sc_capp", "cat_sc_des_d", "کاپوچینو", "Cappuccino", null, null, 110_000, 0, "cappuccino"),
]);
private static MenuTemplate TraditionalTemplate() => new(
[
new("cat_sc_tr", "نوشیدنی سنتی", "Traditional drinks", null, 1, IconPresetId: "drinks-hot", IconStyle: "duotone"),
new("cat_sc_tr_f", "غذا", "Food", null, 2, IconPresetId: "food-mains"),
],
[
new("item_sc_tea_tr", "cat_sc_tr", "چای ایرانی", "Persian tea", null, null, 55_000, 0, "miso_soup"),
new("item_sc_kebab", "cat_sc_tr_f", "چلوکباب", "Kebab plate", null, null, 320_000, 0, "steak"),
new("item_sc_soup", "cat_sc_tr_f", "سوپ", "Soup", null, null, 120_000, 0, "miso_soup"),
]);
}