Дмитрий
|
f9d8926945
|
phase2(admin-tenant-detail-backend): GET /api/admin/tenants/{subdomain} с 4 секциями
- AdminTenantsController +show($subdomain): возвращает tenant base + users +
projects + balance_history + activity + computed metrics (leads_today/week/
month, avg_lead_cost_rub, runway_days). Lookup по subdomain (естественный
URL slug) + whereNull deleted_at. Без auth-middleware (saas-admin SSO ⏸ Б-1).
- 4 private fetch'ера + computeMetrics:
- fetchUsers: ORDER last_active_at DESC, LIMIT 50, поля email/first/last/
is_active/totp_enabled/last_active_at/last_login_at.
- fetchProjects: LEFT JOIN sub-queries для suppliers_count + leads_today
(deals в текущем дне). Поля name/tag/is_active/daily_limit_target.
- fetchBalanceHistory: ORDER created_at DESC, LIMIT 30. Поля type/amount_rub/
amount_leads/balance_rub_after/description/created_at.
- fetchActivity: LEFT JOIN users (actor_email), LIMIT 20. context json_decode.
- computeMetrics: один SELECT с FILTER для leads counts; AVG cost_rub за
30 дней; runway_days = balance / (month_spend / 30).
- routes/web.php: GET /api/admin/tenants/{subdomain} where [a-z0-9_-]+.
- Pest +13 в AdminTenantShowTest.php (всего 416/416, +13 от 403, 1388 assertions):
404 unknown / 404 soft-deleted / базовые поля / 4 секции + metrics keys в response /
users изоляция / projects suppliers_count + leads_today / balance_history ORDER+LIMIT 30 /
balance_history изоляция / activity actor_email LEFT JOIN (user + system events) /
metrics leads_today/week/month / metrics runway_days computed / tariff_name+mrr_rub /
mrr_rub null для trial.
- phpstan-baseline регенерирован.
Этап A эпика AdminTenantDetailView (backend) закрыт. Этап B: frontend
integration + Vitest.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-09 14:32:24 +03:00 |
|