03376b3ea1
Rewrites dashboard and finder Dockerfiles to use a clean multi-stage build (deps → builder → runner) that installs npm packages inside Alpine Linux, avoiding the SWC musl binary issue when building from Windows host. Uses registry.npmmirror.com for reliable installs from restricted networks (Iran). - docker/api/Dockerfile: .NET 10 multi-stage build - docker/web/Dockerfile: Node 20-alpine multi-stage, npmmirror - docker/finder/Dockerfile: Node 20-alpine multi-stage, npmmirror - docker/website/Dockerfile: marketing website build - scripts/: PowerShell helper scripts for local dev Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
8.9 KiB
8.9 KiB
Meezi — Current State & Handoff for Next-Step Planning
Purpose: Give this file to Claude (or any planner) to design the next implementation batch.
Product: Meezi (میزی) — Persian-first SaaS POS + community for Iranian cafés (Tehran/Karaj V1).
Full product context:.cursorrules,MEEZI_CURSOR_GUIDE.md(read before planning).
Last updated: 2026-05-21
1. Stack snapshot (current)
| Layer | Technology | Location |
|---|---|---|
| Backend | ASP.NET Core 10, C# | src/Meezi.API |
| Core / infra | EF Core 10, Npgsql | src/Meezi.Core, src/Meezi.Infrastructure |
| Web dashboard | Next.js 14, TypeScript, next-intl | web/dashboard |
| Mobile | Flutter 3 | mobile/meezi_app, mobile/meezi_pos |
| DB / cache | PostgreSQL 16, Redis | docker-compose.yml |
| Jobs / realtime | Hangfire, SignalR KDS | API |
| SDK pin | global.json → 10.0.100 |
repo root |
| Central packages | Directory.Packages.props |
repo root |
| Target framework | net10.0 via Directory.Build.props |
all C# projects |
Build / test status (local):
dotnet build src/Meezi.API/Meezi.API.csproj -c Release— OKdotnet test tests/Meezi.API.Tests/Meezi.API.Tests.csproj -c Release— 13/13 passed- CI (
.github/workflows/ci.yml) — API on10.0.x, webnpm run build, Flutter analyze (continue-on-error)
2. Recently completed (do not re-plan unless fixing gaps)
2.1 .NET 10 migration
- All backend projects on
net10.0. - Central package management; Microsoft + EF + Npgsql at 10.0.0.
- FluentValidation:
FluentValidation+FluentValidation.DependencyInjectionExtensions(noFluentValidation.AspNetCore). - Docker API image:
dotnet/sdk:10.0,dotnet/aspnet:10.0; Dockerfile copiesglobal.json,Directory.Build.props,Directory.Packages.props. Program.csrefactored:Program.BuildWebApplication(args, configureBeforeServices, configureAfterServices)+Mainfor integration tests.- Testing mode:
Testing:Enabled=true→ Hangfire memory storage, no Hangfire server/dashboard/recurring jobs; faster Redis connect options. - Fix:
RefreshTokenStoreusesvalue.ToString()for JSON deserialize (.NET 10 overload ambiguity). - Integration tests:
MeeziWebApplicationFactory+UseTestServer(), in-memory EF, config beforeAddMeeziServices.
2.2 POS table-session workflow (backend + dashboard)
Domain / DB
Order.GuestPhone,Table.IsCleaning,TableBoardStatus.Cleaning.- Migration:
PosTableSessionFields(20260520165836_PosTableSessionFields).
API (OrderService, controllers)
- Single open order per table (merge/upsert).
POST /api/cafes/{cafeId}/orders/{id}/items— append lines.PATCH /api/cafes/{cafeId}/orders/{id}/session— guest name/phone, customer link.GET .../orders/open?search=— open orders search.GET .../tables/{id}/active-order.PATCH .../tables/{id}/cleaning.- Guards:
TABLE_OCCUPIED, cleaning blocks new orders. OrderDto:GuestPhone,CustomerPhone,PaidAmount,Payments[].
Dashboard POS (web/dashboard)
pos-table-board.tsx— table board (order + pay modes).pos-screen.tsx— URL session?tableId=&orderId=, hydrate/append, debounced session PATCH.pos-pay-panel.tsx— pay by table board, dropdown, search, split payments (Cash/Card/Credit).pos-customer-picker.tsx— CRM search + quick-create guest.cart.store.ts—customerId,activeOrderId,hydrateFromOrder,getPendingLines.- i18n:
fa.json,en.json,ar.jsonPOS strings.
Tests
tests/Meezi.API.Tests/OrderSessionTests.cs— merge per table, append, search, payment frees board, cleaning block (in-memory DB).
2.3 Docker / local dev (Iran constraints)
docker-compose.yml— defaultupruns full stack (nofullprofile gate).docker/api/Dockerfile— Docker Hub images (notmcr.microsoft.com).scripts/docker-up-full.ps1,scripts/run-local-dev.ps1,docs/DOCKER.md, registry mirror example.- Known ops: Docker Desktop/WSL 500/EOF; image pulls often need VPN/mirror in Iran. Documented workaround: postgres+redis in Docker, API via
dotnet run, dashboard vianpm run dev.
3. Key files (quick navigation)
src/Meezi.API/
Program.cs # BuildWebApplication + Main
Extensions/ServiceCollectionExtensions.cs # DI, Hangfire, Redis, Testing:Enabled
Services/OrderService.cs # Table session / append / search
Services/TableService.cs # Board, cleaning
Services/RefreshTokenStore.cs
Controllers/OrdersController.cs
Controllers/TablesController.cs
src/Meezi.Core/Entities/
Order.cs, Table.cs
src/Meezi.Infrastructure/Data/Migrations/
*PosTableSessionFields*
web/dashboard/src/components/pos/
pos-screen.tsx, pos-table-board.tsx, pos-pay-panel.tsx, pos-customer-picker.tsx
web/dashboard/src/lib/stores/cart.store.ts
tests/Meezi.API.Tests/
OrderSessionTests.cs
Integration/HealthIntegrationTests.cs
Integration/MeeziWebApplicationFactory.cs
docker/api/Dockerfile
docker-compose.yml
global.json, Directory.Build.props, Directory.Packages.props
4. Open issues & tech debt (good planning inputs)
| Item | Severity | Notes |
|---|---|---|
| NU1903 AutoMapper 12.0.1 | Medium | Transitive vulnerability warning on build |
| NU1903 System.Security.Cryptography.Xml 9.0.0 | Medium | Via Infrastructure transitive |
| Docker full stack in Iran | Ops | Pull timeouts; mirror/VPN documented |
| E2E tests | Low | No Playwright/API E2E for POS flow yet |
| Flutter / mobile | — | Not updated for table-session APIs |
MEEZI_PRD.md |
— | Referenced in rules but may be missing at repo root; use .cursorrules + guide |
| Hangfire in production | — | PostgreSQL storage; tests use memory only when Testing:Enabled |
5. Suggested themes for the next planning batch
Use these as prompts for Claude; pick 1–3 per sprint.
A. Hardening & quality
- Bump or replace packages with NU1903 warnings.
- More integration tests: auth, append-items HTTP, payment split, cleaning API.
- E2E: dashboard POS happy path (table → items → pay → board free).
B. POS / operations polish
- Receipt print preview / thermal bridge alignment with session order id.
- Table board realtime (SignalR invalidate on order/payment/cleaning).
- Edge cases: void line, transfer table, merge tables, staff permissions per action.
C. CRM & customer on orders
- Enforce plan limits on CRM create from POS picker.
- Sync
GuestPhonewith SMS OTP / Kavenegar flows where applicable. - Customer history on pay panel (last visit, points if in scope).
D. Infrastructure & deploy
- Verify
docker composebuild on .NET 10 in CI (optional job). - Arvan Cloud deploy checklist; env-specific
appsettings. - Redis required services: mock or Testcontainers for CI integration tests.
E. Mobile (Flutter POS)
- Offline Drift sync for open table orders.
- Call new append/session/active-order endpoints from
meezi_pos.
F. Billing / plan limits
- Enforce
PLAN_LIMIT_REACHEDon daily orders, terminals, SMS from POS paths. - Upgrade CTA in dashboard when limits hit.
6. API conventions (must keep in plans)
- Multi-tenant: every EF query filters
CafeId == _tenant.CafeId. - Responses:
ApiResponse<T>/ApiErrorwith codes e.g.PLAN_LIMIT_REACHED,TABLE_OCCUPIED. - Protected routes:
/api/cafes/{cafeId}/...— JWTcafeIdmust match. - i18n: no hardcoded UI strings in dashboard; use
messages/{fa,ar,en}.json. - RTL:
ms-*/me-*only in dashboard CSS.
7. How to run locally (for validators)
# DB + Redis
docker compose up -d postgres redis
# API (.NET 10)
cd src/Meezi.API
dotnet run
# http://localhost:5080 (or per launchSettings)
# Dashboard
cd web/dashboard
npm run dev
# http://localhost:3101 (typical)
# Tests
dotnet test tests/Meezi.API.Tests/Meezi.API.Tests.csproj -c Release
appsettings.json (API): Postgres localhost:5434, Redis localhost:6381 — matches docker-compose / .env.example defaults.
8. Planning instructions for Claude
When generating a plan from this file:
- Read
.cursorrulesandMEEZI_CURSOR_GUIDE.mdfor non-negotiables. - Do not redo .NET 10 migration or POS table-session core unless fixing a listed gap.
- Propose small, reviewable PRs (backend / web / mobile / infra separated).
- Include test plan per feature (unit + manual steps).
- Call out Iran/Docker constraints if the plan involves container builds or image pulls.
- Respect plan tiers: Free / Pro / Business / Enterprise limits on orders, CRM, SMS, branches.
9. Out of scope for next batch (unless user asks)
- Rewriting Next.js or Flutter major versions.
- Full Sepidz parity / enterprise white-label.
- Tax (Taraz) production integration beyond stubs.
- Snappfood production webhook hardening (HMAC exists; expand when needed).
End of handoff — attach this file plus the specific user goal when asking Claude to plan.