UserRequest.php 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. <?php
  2. namespace App\Http\Requests;
  3. use App\Enums\GenderEnum;
  4. use App\Enums\LanguageEnum;
  5. use App\Enums\UserTypeEnum;
  6. use App\Models\User;
  7. use Illuminate\Foundation\Http\FormRequest;
  8. use Illuminate\Validation\Rule;
  9. class UserRequest extends FormRequest
  10. {
  11. public function rules(): array
  12. {
  13. $rules = [
  14. 'avatar' => 'sometimes|string|nullable',
  15. 'name' => 'sometimes|string|nullable',
  16. 'email' => [
  17. 'sometimes',
  18. 'email',
  19. Rule::unique('users', 'email')
  20. ->where('type', $this->emailUniqueType())
  21. ->ignore($this->route('id')),
  22. ],
  23. 'password' => 'sometimes|string|nullable',
  24. 'type' => ['sometimes', Rule::enum(UserTypeEnum::class)],
  25. 'language' => ['sometimes', Rule::enum(LanguageEnum::class)],
  26. 'phone' => 'sometimes|string|nullable',
  27. 'gender' => 'sometimes|string|in:'.implode(',', GenderEnum::toArray()),
  28. 'push_notifications_enabled' => 'sometimes|boolean',
  29. ];
  30. if ($this->isMethod('post')) {
  31. $rules['name'] = 'required|string|max:255';
  32. $rules['email'] = [
  33. 'required',
  34. 'email',
  35. Rule::unique('users', 'email')->where('type', $this->emailUniqueType()),
  36. ];
  37. $rules['password'] = 'required|string|min:6';
  38. if (! $this->has('language')) {
  39. $this->merge(['language' => LanguageEnum::PORTUGUESE->value]);
  40. }
  41. }
  42. return $rules;
  43. }
  44. private function emailUniqueType(): string
  45. {
  46. if ($this->filled('type')) {
  47. return $this->input('type');
  48. }
  49. $id = $this->route('id');
  50. $type = $id ? User::query()->whereKey($id)->value('type') : null;
  51. if ($type instanceof UserTypeEnum) {
  52. $type = $type->value;
  53. }
  54. return $type ?? UserTypeEnum::USER->value;
  55. }
  56. }