diff --git a/app/Http/Requests/UserRequest.php b/app/Http/Requests/UserRequest.php index 5c62ad1..6e726bc 100644 --- a/app/Http/Requests/UserRequest.php +++ b/app/Http/Requests/UserRequest.php @@ -2,19 +2,12 @@ namespace App\Http\Requests; +use App\Rules\RequiredIfAny; use Illuminate\Validation\Rule; use App\Rules\Uniqueish; class UserRequest extends BaseRequest { - /** - * Fields that are required unless all are null. - * - * @var string[] - */ - protected $required_with_all = ['first_name','last_name','display_name','phone']; - - /** * Apply the additional POST base rules to this request * @@ -22,10 +15,18 @@ class UserRequest extends BaseRequest */ public function postRules() { + $user = auth()->user(); + $isAdminUser = $user->hasPermission('admin/users'); + return [ - 'first_name' => 'required|string|max:255|min:2', - 'last_name' => 'required|string|max:255|min:2', - 'display_name' => 'required|string|max:255|uniqueish:users', + 'first_name' => ($isAdminUser === true ? 'required_with:last_name,display_name,phone' : 'required') . '|string|max:255|min:2', + 'last_name' => ($isAdminUser === true ? 'required_with:first_name,display_name,phone' : 'required') . '|string|max:255|min:2', + 'display_name' => [ + $isAdminUser === true ? 'required_with:first_name,last_name,phone' : 'required', + 'string', + 'max:255', + new Uniqueish('users') + ], 'email' => 'required|string|email|max:255|unique:users', 'phone' => ['string', 'regex:/^(\+|00)?[0-9][0-9 \-\(\)\.]{7,32}$/'], 'email_verified_at' => 'date' @@ -39,34 +40,36 @@ class UserRequest extends BaseRequest */ public function putRules() { - $user = $this->route('user'); - - $required_with_all = count($this->required_with_all) > 0 ? 'required_with_all:' . implode(',', $this->required_with_all) : ''; + $user = auth()->user(); + $ruleUser = $this->route('user'); + $isAdminUser = $user->hasPermission('admin/users'); return [ - 'first_name' => "nullable|string|required_if_any:users,last_name,display_name,phone,password|between:2,255", - 'last_name' => "nullable|required_if_any:users,first_name,display_name,phone,password|string|max:255|min:2", - 'display_name' => [ - 'nullable', - 'required_if_any:users,first_name,last_name,phone,password', + 'first_name' => [ + $isAdminUser === true ? 'required_with:last_name,display_name,phone' : 'required', 'string', - 'max:255', - 'min:2', - (new Uniqueish('users', 'display_name'))->ignore($user->id), + 'between:2,255', + ], + 'last_name' => $isAdminUser === true ? 'required_with:first_name,display_name,phone|string|between:2,255' : 'required|string|between:2,255', + 'display_name' => [ + $isAdminUser === true ? 'required_with:first_name,last_name,phone' : 'required', + 'string', + 'between:2,255', + (new Uniqueish('users', 'display_name'))->ignore($ruleUser->id) ], 'email' => [ 'string', 'email', 'max:255', - Rule::unique('users')->ignore($user->id)->when( - $this->email !== $user->email, + Rule::unique('users')->ignore($ruleUser->id)->when( + $this->email !== $ruleUser->email, function ($query) { return $query->where('email', $this->email); } ), ], 'phone' => ['nullable', 'regex:/^(\+|00)?[0-9][0-9 \-\(\)\.]{7,32}$/'], - 'password' => "nullable|{$required_with_all}|string|min:8" + 'password' => "nullable|string|min:8" ]; } }