From 7282aea0e7a991b072adb74a3edf90a62a957ad9 Mon Sep 17 00:00:00 2001 From: Tajim Date: Fri, 11 Sep 2026 20:15:56 +0600 Subject: [PATCH] feat(validation): clarify username format and uniqueness error messages --- app/Http/Controllers/AuthController.php | 2 +- .../Requests/Profile/UpdateProfileRequest.php | 13 +++++++ app/Http/Requests/User/StoreUserRequest.php | 13 +++++++ app/Http/Requests/User/UpdateUserRequest.php | 13 +++++++ tests/Feature/ProfileUsernameTest.php | 34 +++++++++++++++++++ 5 files changed, 74 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index 860dbdca..4efd2f1d 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -168,7 +168,7 @@ public function completeOnboarding(Request $request) 'appreciations.*' => ['integer', 'distinct', 'exists:users,id'], ], [ 'school.required' => 'Please enter your school, college, or institution name.', - 'username.regex' => 'Username can only contain letters, numbers, and underscores.', + 'username.regex' => "Username can only contain letters, numbers, and underscores. Dots aren't allowed.", 'username.unique' => 'This username is already taken. Please choose another one.', 'image.image' => 'The uploaded file must be an image (PNG, JPG, JPEG, WEBP).', 'image.max' => 'The profile image may not be greater than 5MB.', diff --git a/app/Http/Requests/Profile/UpdateProfileRequest.php b/app/Http/Requests/Profile/UpdateProfileRequest.php index fdaa37ee..734b5539 100644 --- a/app/Http/Requests/Profile/UpdateProfileRequest.php +++ b/app/Http/Requests/Profile/UpdateProfileRequest.php @@ -46,4 +46,17 @@ public function rules(): array 'receive_emails' => ['sometimes', 'boolean'], ]; } + + /** + * Get custom messages for validator errors. + * + * @return array + */ + public function messages(): array + { + return [ + 'username.regex' => "Username can only contain letters, numbers, and underscores. Dots aren't allowed.", + 'username.unique' => 'This username is already taken. Please choose another one.', + ]; + } } diff --git a/app/Http/Requests/User/StoreUserRequest.php b/app/Http/Requests/User/StoreUserRequest.php index 9d34b96c..fdf6b3c7 100644 --- a/app/Http/Requests/User/StoreUserRequest.php +++ b/app/Http/Requests/User/StoreUserRequest.php @@ -48,4 +48,17 @@ protected function passedValidation(): void 'email_verified_at' => now(), ]); } + + /** + * Get custom messages for validator errors. + * + * @return array + */ + public function messages(): array + { + return [ + 'username.regex' => "Username can only contain letters, numbers, and underscores. Dots aren't allowed.", + 'username.unique' => 'This username is already taken. Please choose another one.', + ]; + } } diff --git a/app/Http/Requests/User/UpdateUserRequest.php b/app/Http/Requests/User/UpdateUserRequest.php index 5cf27228..f68c8828 100644 --- a/app/Http/Requests/User/UpdateUserRequest.php +++ b/app/Http/Requests/User/UpdateUserRequest.php @@ -53,4 +53,17 @@ public function rules(): array return $rules; } + + /** + * Get custom messages for validator errors. + * + * @return array + */ + public function messages(): array + { + return [ + 'username.regex' => "Username can only contain letters, numbers, and underscores. Dots aren't allowed.", + 'username.unique' => 'This username is already taken. Please choose another one.', + ]; + } } diff --git a/tests/Feature/ProfileUsernameTest.php b/tests/Feature/ProfileUsernameTest.php index 39004a98..30fa03e6 100644 --- a/tests/Feature/ProfileUsernameTest.php +++ b/tests/Feature/ProfileUsernameTest.php @@ -57,3 +57,37 @@ expect($user->fresh()->name)->toBe('Updated Name'); expect($user->fresh()->username)->toBe('my_handle'); }); + +test('username update shows clear validation message when format is invalid (e.g. dots)', function () { + $user = User::factory()->create([ + 'username' => 'valid_user', + ]); + + $response = $this->actingAs($user)->put('/profile', [ + 'name' => $user->name, + 'username' => 'invalid.user', + ]); + + $response->assertSessionHasErrors([ + 'username' => "Username can only contain letters, numbers, and underscores. Dots aren't allowed.", + ]); +}); + +test('username update shows clear validation message when username is already taken', function () { + User::factory()->create([ + 'username' => 'taken_user', + ]); + + $user = User::factory()->create([ + 'username' => 'valid_user', + ]); + + $response = $this->actingAs($user)->put('/profile', [ + 'name' => $user->name, + 'username' => 'taken_user', + ]); + + $response->assertSessionHasErrors([ + 'username' => 'This username is already taken. Please choose another one.', + ]); +});