Adds a signed broker integration for online plan purchases:
- FlatPayService: POST /v1/pay/request with X-Api-Key + X-Signature =
hex(HMAC-SHA256(secret, raw JSON bytes)); the exact serialized bytes are both
signed and sent. VerifyWebhook does a fixed-time compare of the digest, plus an
in-memory first-seen idempotency set.
- POST /api/payment/request (auth, ManageBilling): parses a "Tier:Months" product
(e.g. "Pro:12"), prices it via the plan catalog, creates a Pending SubscriptionPayment
(provider=FlatPay) as the order, and returns the broker payment URL. The order id is
the client_ref / metadata.payment_id.
- POST /api/payment/webhook (anonymous; HMAC is the auth — 401 on bad signature):
on status=Paid + first-seen id, grants the order via the shared plan-activation
path (extracted ActivatePaymentAsync, reused by all providers). Always 200 after a
valid signature so the broker won't retry an accepted job.
- Config FlatPay__{ApiKey,Secret,BaseUrl,ReturnUrl} (env-supplied; secrets stay out
of git), compose + .env.example wiring. PaymentProvider.FlatPay appended (int, no
migration).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Meezi — Day 1 Quick Start
Step 1 — Copy these 4 files to your project root
.cursorrules ← AI rules for Cursor MEEZI_CURSOR_GUIDE.md ← Full development guide docker-compose.yml ← Local DB + Redis README.md ← This file
Step 2 — Start local services
docker-compose up -d
Step 3 — Create project structure
mkdir meezi && cd meezi git init
mkdir src web mobile cd src dotnet new sln -n Meezi dotnet new webapi -n Meezi.API --use-controllers dotnet new classlib -n Meezi.Core dotnet new classlib -n Meezi.Infrastructure dotnet new classlib -n Meezi.Shared dotnet sln add Meezi.API Meezi.Core Meezi.Infrastructure Meezi.Shared
cd ../web npx create-next-app@latest dashboard --typescript --tailwind --app
cd ../mobile flutter create meezi_app --org ir.meezi
Step 4 — Open in Cursor
cursor . (from the meezi/ root folder)
Step 5 — Paste this FIRST prompt in Cursor chat (Cmd+L)
Read .cursorrules and MEEZI_CURSOR_GUIDE.md completely. Then do Sprint 1 Week 1:
- Set up the .NET solution with proper references between projects
- Add all NuGet packages listed in the guide to each project
- Create the complete EF Core entity schema from the guide
- Set up AppDbContext with all DbSets
- Create TenantMiddleware and ITenantContext
- Set up Program.cs with full middleware pipeline
Cursor Chat Tips
Ask one sprint at a time
"Do Sprint 2: build the POS order APIs (menu, tables, orders)"
Reference specific sections
"Build the CRM endpoint from Step 10 of MEEZI_CURSOR_GUIDE.md"
Debug with context
"The order API returns 403. Check if TenantMiddleware is injecting CafeId correctly"
Generate Flutter screens
"Build the Flutter POS screen from Sprint 2 in the guide. RTL, Farsi, Riverpod state"
Useful Cursor Keyboard Shortcuts
Cmd+L → Open AI chat Cmd+K → Inline AI edit (select code first) Cmd+I → Composer (multi-file edits) Cmd+. → Quick fix / suggestion Tab → Accept autocomplete
Local URLs when running
Backend API: https://localhost:7001 API Swagger: https://localhost:7001/swagger Dashboard: http://localhost:3000 Hangfire UI: https://localhost:7001/hangfire Flutter web: http://localhost:8080