56195c8a59
Закрытие аудита 2026-05-09 (b6ae8dd):
- P0-01: применён 'tenant' middleware (alias уже в bootstrap/app.php:17) к 3 auth:sanctum-группам:
/api/notifications, /api/reminders, /api/reports/jobs (web.php:44/52/63).
/api/deals и /api/admin/* остаются без auth (P1-10/Б-1) — в реестр Спринта 1 Phase F.
- O-refactor-03: HasPasswordRules trait извлекает rules + messages, подключён в Login/Register.
- P2-01: bcrypt('test') → bcrypt('test1234') в AdminIncidentsIndexTest (≥8 chars).
- bonus-fix: SetTenantContext::resolveTenantId — property_exists() заменён на isset() для
Eloquent magic-attributes (auth-путь резолюции tenant_id никогда не работал из-за этого
бага; тесты-смоки middleware покрывали только X-Tenant-Id header / subdomain). Без фикса
P0-01 ломает 58 тестов в /api/notifications + /api/reminders + /api/reports/jobs.
Pest: 416/416 PASS.
Larastan: 0 errors.
Pint: clean.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
44 lines
1.5 KiB
PHP
44 lines
1.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Http\Requests\Auth;
|
|
|
|
use App\Http\Requests\Auth\Concerns\HasPasswordRules;
|
|
use Illuminate\Foundation\Http\FormRequest;
|
|
use Illuminate\Validation\Rule;
|
|
|
|
/**
|
|
* Валидация POST /api/auth/register.
|
|
*
|
|
* По ТЗ §1.5/§4.1: 2 обязательных click-wrap'а — оферта + согласие на ПДн
|
|
* (3-й «маркетинговый» из handoff НЕ требуется — расхождение #2 реестра v1.13).
|
|
*/
|
|
class RegisterRequest extends FormRequest
|
|
{
|
|
use HasPasswordRules;
|
|
|
|
/** @return array<string, mixed> */
|
|
public function rules(): array
|
|
{
|
|
return [
|
|
'email' => ['required', 'string', 'email', 'max:255', Rule::unique('users', 'email')],
|
|
'password' => $this->passwordRules(),
|
|
'accept_offer' => ['required', 'accepted'],
|
|
'accept_pdn' => ['required', 'accepted'],
|
|
];
|
|
}
|
|
|
|
/** @return array<string, string> */
|
|
public function messages(): array
|
|
{
|
|
return array_merge($this->passwordMessages(), [
|
|
'email.required' => 'Укажите email.',
|
|
'email.email' => 'Email указан некорректно.',
|
|
'email.unique' => 'Аккаунт с таким email уже существует.',
|
|
'accept_offer.accepted' => 'Необходимо принять оферту.',
|
|
'accept_pdn.accepted' => 'Необходимо согласие на обработку персональных данных.',
|
|
]);
|
|
}
|
|
}
|