Forráskód Böngészése

feat: add bloqueio de email repetido somente para responsaveis por mesmo aluno

Gustavo Mantovani 1 napja
szülő
commit
5c371753df

+ 4 - 4
app/Http/Requests/StoreStudentRequest.php

@@ -23,8 +23,9 @@ protected function prepareForValidation(): void
                 ->findOwnedDraft($user, $token);
 
             if ($this->registrationDraft !== null) {
-                // Os dados validados do rascunho são a fonte oficial. Assim, o
-                // payload final não consegue sobrescrevê-los sem nova validação.
+                // os dados validados do rascunho sao a fonte oficial. assim, o
+                // payload final nao consegue sobrescreve-los sem nova validacao.
+
                 $this->merge($this->registrationDraft['data']);
             }
         }
@@ -42,8 +43,7 @@ public function rules(): array
             Rule::requiredIf(fn (): bool => $this->studentIsMinor()),
         ];
 
-        $rules['responsible'][]      = 'required_array_keys:name,birth_date,cpf,degree,email,phone,postal_code,street,neighborhood,city_id,state_id';
-        $rules['responsible.email'] .= '|unique:student_responsibles,email';
+        $rules['responsible'][] = 'required_array_keys:name,birth_date,cpf,degree,email,phone,postal_code,street,neighborhood,city_id,state_id';
 
         return $rules;
     }

+ 19 - 9
app/Http/Requests/StudentResponsibleRequest.php

@@ -5,26 +5,36 @@
 use App\Rules\AdultBirthDate;
 use App\ValueObjects\Cpf;
 use Illuminate\Foundation\Http\FormRequest;
+use Illuminate\Validation\Rule;
 
 class StudentResponsibleRequest extends FormRequest
 {
     public function rules(): array
     {
         return [
-            'student_id'     => 'required|exists:students,id',
-            'name'           => 'required|string|max:255',
-            'birth_date'     => ['required', 'date', new AdultBirthDate],
-            'cpf'            => ['required', 'string', 'max:20', Cpf::rule()],
-            'gender'         => 'nullable|string|in:male,female,other,no_preference',
-            'degree'         => 'required|string|max:255',
-            'email'          => 'required|email|max:255',
+            'student_id' => 'required|integer|exists:students,id',
+            'name'       => 'required|string|max:255',
+            'birth_date' => ['required', 'date', new AdultBirthDate],
+            'cpf'        => ['required', 'string', 'max:20', Cpf::rule()],
+            'gender'     => 'nullable|string|in:male,female,other,no_preference',
+            'degree'     => 'required|string|max:255',
+
+            'email' => [
+                'required',
+                'email',
+                'max:255',
+                Rule::unique('student_responsibles', 'email')
+                    ->where(fn ($query) => $query->where('student_id', $this->input('student_id')))
+                    ->ignore($this->route('id')),
+            ],
+
             'phone'          => 'required|string|max:20',
             'street'         => 'required|string|max:255',
             'address_number' => 'nullable|string|max:20',
             'postal_code'    => 'required|string|max:10',
             'neighborhood'   => 'required|string|max:255',
-            'city_id'        => 'required|exists:cities,id',
-            'state_id'       => 'required|exists:states,id',
+            'city_id'        => 'required|integer|exists:cities,id',
+            'state_id'       => 'required|integer|exists:states,id',
             'complement'     => 'nullable|string|max:255',
             'notes'          => 'nullable|string',
         ];

+ 28 - 0
database/migrations/2026_08_04_000001_update_student_responsibles_email_uniqueness.php

@@ -0,0 +1,28 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    public function up(): void
+    {
+        Schema::table('student_responsibles', function (Blueprint $table): void {
+            $table->dropUnique('student_responsibles_email_unique');
+
+            $table->unique(
+                ['student_id', 'email'],
+                'student_responsibles_student_id_email_unique',
+            );
+        });
+    }
+
+    public function down(): void
+    {
+        Schema::table('student_responsibles', function (Blueprint $table): void {
+            $table->dropUnique('student_responsibles_student_id_email_unique');
+            $table->unique('email');
+        });
+    }
+};