Wire production domain, CORS for tenant subdomains, celery volume mounts, and nginx reverse proxy configs for apex, API, identity, auth, and wildcard tenants. Co-authored-by: Cursor <cursoragent@cursor.com>
175 lines
8.7 KiB
Markdown
175 lines
8.7 KiB
Markdown
# پیشرفت پروژه (Progress)
|
||
|
||
## فاز ۱ — Core Platform ✅
|
||
|
||
### زیرساخت و ساختار
|
||
- [x] ساختار کامل پروژه با جداسازی اجباری `backend/` و `frontend/`
|
||
- [x] کتابخانه مشترک `backend/shared-lib`
|
||
- [x] بخش ۲.۱ معماری: Frontend & Backend Separation
|
||
|
||
### سرویس هسته (core-service)
|
||
- [x] پیکربندی، دیتابیس، cache، logging، security پایه
|
||
- [x] مدلها، APIها، Entitlement، Celery، Outbox
|
||
- [x] تستها و مستندات
|
||
|
||
### Frontend
|
||
- [x] Next.js مستقل، API Client، White-label theme
|
||
|
||
---
|
||
|
||
## فاز ۲ — Identity & Access + SSO ✅
|
||
|
||
### shared-lib
|
||
- [x] `shared/auth/jwt.py` — JWTValidator مشترک
|
||
- [x] `shared/auth/roles.py` — نقشهای استاندارد پلتفرم
|
||
- [x] رویدادهای Identity در `shared/events.py`
|
||
|
||
### Identity & Access Service
|
||
- [x] سرویس مستقل در `backend/services/identity-access/`
|
||
- [x] دیتابیس `identity_access_db` (database-per-service)
|
||
- [x] مدلها: UserProfile, TenantMembership
|
||
- [x] Keycloak Admin Client + token exchange (BFF)
|
||
- [x] APIها: `/auth/config`, `/auth/token`, `/auth/me`, `/users`, `/tenants/{id}/members`
|
||
- [x] Alembic migration + Dockerfile
|
||
- [x] تستهای پایه
|
||
|
||
### Keycloak
|
||
- [x] Realm import: `infrastructure/keycloak/realm/superapp-realm.json`
|
||
- [x] Clients: superapp-frontend, core-service, identity-access-service
|
||
- [x] نقشها و کاربر admin نمونه
|
||
- [x] docker-compose با `--import-realm`
|
||
|
||
### محافظت APIهای Core
|
||
- [x] `AUTH_REQUIRED` قابل تنظیم از env
|
||
- [x] `require_platform_admin`, `require_tenant_admin`, `require_authenticated`
|
||
- [x] اعمال روی همه endpointهای مدیریتی
|
||
|
||
### Frontend SSO
|
||
- [x] `lib/auth.ts` — OIDC flow
|
||
- [x] صفحات `/login`, `/auth/callback`, `/dashboard`
|
||
- [x] `AuthGuard` و `useAuth` hook
|
||
- [x] API Client با Bearer token
|
||
|
||
### زیرساخت
|
||
- [x] `identity-access-service` در docker-compose (پورت 8001)
|
||
- [x] `frontend` در docker-compose (پورت 3000، dev + hot-reload)
|
||
- [x] ارتقای Next.js به `15.5.18` (پچ امنیتی — نسخه 14 دیگر پشتیبانی امنیتی ندارد)
|
||
- [x] `infrastructure/postgres/init-dbs.sql` برای ساخت identity_access_db
|
||
- [x] بهروزرسانی `.env.example`
|
||
|
||
### مستندات
|
||
- [x] architecture.md (بخش SSO فاز ۲)
|
||
- [x] database_schema.md (identity_access_db)
|
||
- [x] services_contracts.md (APIهای Identity)
|
||
- [x] progress.md, last_step.md
|
||
|
||
---
|
||
|
||
## فاز ۳ — OTP Login + Tenant Management ✅
|
||
|
||
### Backend (core-service)
|
||
- [x] مدل `users` و migration Alembic (`0002_users`)
|
||
- [x] OTP request/verify: `/api/v1/auth/otp/request`, `/api/v1/auth/otp/verify`
|
||
- [x] ثبتنام خودکار کاربر + audit log
|
||
- [x] یکپارچگی Payamak-Panel SendOtp
|
||
- [x] JWT محلی (HS256) برای کاربران OTP
|
||
- [x] Admin Tenant CRUD: `/api/v1/admin/tenants` با owner mapping
|
||
- [x] فیلتر لیست tenant بر اساس مالک (Platform Admin: همه / Tenant Admin: فقط مالک)
|
||
|
||
### Frontend
|
||
- [x] `lib/api.ts` — API Client یکپارچه با Bearer token
|
||
- [x] `/admin/login` — جریان OTP دو مرحلهای با countdown
|
||
- [x] `/admin/tenants` — داشبورد لیست tenant
|
||
- [x] `/admin/tenants/new` — فرم ایجاد tenant
|
||
|
||
### تستها
|
||
- [x] `test_otp_auth.py` — OTP flow و tenant با JWT
|
||
|
||
### مستندات
|
||
- [x] architecture.md (بخش OTP)
|
||
- [x] progress.md, last_step.md
|
||
- [x] `.env.example` (Payamak + NEXT_PUBLIC_BACKEND_URL)
|
||
|
||
---
|
||
|
||
## فاز ۴ — Tenant Onboarding و Workspace Activation ✅
|
||
|
||
> در بریف پروژه این فاز با عنوان **«Phase 3: operationalizing tenant
|
||
> onboarding and workspace activation»** معرفی شده است. چون در شمارهگذاری
|
||
> داخلی این سند «فاز ۳» قبلاً به OTP Login + Tenant Management اختصاص
|
||
> یافته بود، این تحویل بهعنوان فاز ۴ ثبت میشود (محتوا دقیقاً همان
|
||
> «Phase 3» بریف است).
|
||
|
||
### Backend (core-service)
|
||
- [x] مدل `TenantMembership` + جدول `tenant_memberships` (نقش/وضعیت/owner)
|
||
- [x] چرخهٔ عمر tenant: `draft` / `pending_activation` / `active` /
|
||
`suspended` / `archived`
|
||
- [x] پروفایل/برندینگ روی `tenants`: `business_type`, `default_locale`,
|
||
`timezone`, `primary_color`, `secondary_color`, `logo_url`,
|
||
`favicon_url`, `onboarding_completed`
|
||
- [x] `domains.is_primary` و `domains.verification_status`
|
||
- [x] `users.current_tenant_id` (tenant انتخابشده جاری)
|
||
- [x] Seed پلنهای پیشفرض `FREE`/`STARTER` (migration + `ensure_default_plan`)
|
||
- [x] `UserService.resolve_current` — یکپارچهسازی resolve کاربر Core از JWT
|
||
محلی (OTP) یا JWT کیکلوک (SSO، بر اساس `keycloak_sub`)
|
||
- [x] `MembershipService` — عضویت owner، لیست عضویتها، `ensure_role`
|
||
(authorization سبک با bypass برای `platform_admin`)
|
||
- [x] `OnboardingService` — ایجاد tenant، برندینگ، دامنه، تکمیل/فعالسازی
|
||
- [x] `TenantContextService` — ساخت `TenantContextRead` کامل برای frontend
|
||
- [x] APIهای جدید: `GET /me`, `GET /me/tenants`, `POST /onboarding/tenant`,
|
||
`PATCH /onboarding/tenant/{id}/branding`,
|
||
`PATCH /onboarding/tenant/{id}/domain`,
|
||
`POST /onboarding/tenant/{id}/complete`, `GET /tenant/current`,
|
||
`POST /tenant/switch`
|
||
- [x] Migration `0005_tenant_onboarding` (ستونها، جدول جدید، seed پلنها)
|
||
- [x] `PLATFORM_BASE_DOMAIN` در config برای تخصیص خودکار زیردامنه
|
||
|
||
### تستها
|
||
- [x] `app/tests/test_onboarding.py` — جریان کامل onboarding (ساخت tenant،
|
||
برندینگ، دامنه، تکمیل، `/me`, `/tenant/current`, `/tenant/switch`) +
|
||
حالات forbidden/duplicate/owner-required
|
||
- [x] کل test suite موجود (`test_otp_auth`, `test_tenants`, `test_domains`, ...)
|
||
بدون رگرسیون اجرا شد
|
||
|
||
### Frontend
|
||
- [x] `lib/api.ts` — انواع و متدهای `api.me`, `api.onboarding`,
|
||
`api.tenantContext` (بدون تغییر ساختار قبلی `api.tenants`/`api.auth`)
|
||
- [x] `hooks/useMe.ts` — بارگذاری `/api/v1/me`
|
||
- [x] `app/onboarding/page.tsx` — ویزارد تکصفحهای ۴ مرحلهای (کسبوکار →
|
||
برندینگ → دامنه → بازبینی) با قابلیت ازسرگیری onboarding ناتمام
|
||
- [x] `app/dashboard/page.tsx` — داشبورد واقعی workspace (نام، وضعیت، پلن،
|
||
دامنه، وضعیت onboarding، نقش کاربر) + redirect خودکار به `/onboarding`
|
||
در صورت نیاز
|
||
- [x] `components/TenantSwitcher.tsx` — سوییچر ساده (فقط با بیش از یک
|
||
عضویت نمایش داده میشود)
|
||
- [x] Type-check تمیز (`tsc --noEmit`)
|
||
|
||
### زیرساخت
|
||
- [x] `PLATFORM_BASE_DOMAIN` در `.env` و `.env.example`
|
||
|
||
### مستندات
|
||
- [x] architecture.md (بخش ۱۱ — فاز ۴)
|
||
- [x] database_schema.md (`tenant_memberships` جدید Core، ستونهای جدید
|
||
`tenants`/`domains`/`users`، توضیح تمایز با جدول همنام Identity)
|
||
- [x] services_contracts.md (بخش ۷ — Onboarding و Tenant Context)
|
||
- [x] progress.md, last_step.md
|
||
|
||
### محدودیتهای شناختهشده (عمداً خارج از این فاز)
|
||
- [ ] درگاه پرداخت واقعی برای اشتراک (فقط ساختار provisioning پیاده شده)
|
||
- [ ] تأیید واقعی دامنهٔ اختصاصی (DNS/TXT) — فعلاً فقط `pending`
|
||
- [ ] tenantهای ساختهشده از مسیر قدیمی `POST /admin/tenants` عضویت/پلن
|
||
خودکار نمیگیرند (آن مسیر به فاز ۱/۲ تعلق دارد و در این فاز بازنویسی
|
||
نشده)
|
||
- [ ] JIT provisioning کامل کاربر Core از JWT کیکلوک (کاربر SSO بدون رکورد
|
||
Core فعلاً خطای `forbidden` میگیرد)
|
||
|
||
## فازهای بعدی (Backlog)
|
||
- [ ] پیادهسازی اولین ماژول بیزینسی واقعی (نگاه کنید به `last_step.md`)
|
||
- [ ] White-label runtime rendering (تشخیص tenant از دامنه + اعمال برند در frontend)
|
||
- [ ] JIT provisioning کامل کاربر Core از SSO کیکلوک
|
||
- [ ] Permission management پیشرفته (نقشهای سفارشی، دعوت اعضا)
|
||
- [ ] تأیید واقعی دامنهٔ اختصاصی (DNS/TXT) و درگاه پرداخت
|
||
- [ ] Subscription & Entitlement بهعنوان سرویس مستقل
|
||
- [ ] Message bus واقعی برای انتشار رویدادها
|
||
- [ ] Reverse proxy (Nginx/Traefik) و TLS
|