// A. olması gereken senaryoya göre (talep önce serviste düzenlenmeli ve düzenlenen talep içeriğine göre userrequest sınıfında doğrulanmalı) sınıflar ve metodları

/* UserController */
    public function store(UserRequest $request)
    {
        $req = $this->form->extractEmptyPasswords($request);

        return User::updateOrCreate(
            ['id'=>$req['id']],
            $req // array comes from request->all()
        );

    } 

/* UserRequest */
    public function rules()
    {
        if(isset($this->id)){
            // get rules to update a existing user
            $rules = [
                'name' => 'sometimes|required|string',
                'email' => 'sometimes|required|unique:users,id,'.$this->id,
                'password' => 'sometimes|required|min:6|confirmed',
            ];
        }else{
            // get rules to create a new user
            $rules = [
                'name' => 'required|string',
                'email' => 'required|unique:users',
                'password' => 'required|min:6|confirmed',
            ];
        }
        return $rules;
  
/* UserFormServices */
    public function extractEmptyPasswords($request){
        // if password field is empty
        // extract password and password confirmation 
        // fields from the request
        if(empty($request->password)){
            $req = $request->except(['password','password_confirmation']);
        }else{
        // otherwise get all request fields
            $req = $request->all();
        }
        
        return $req;
    }

// B. UserRequest ile UserFormService işlem sıralamalarını yönetemediğim için etrafından dolandığım hali ile sınıflar ve metodları
/* UserController */
    public function store(Request $request)
    {
        $req = $this->form->extractEmptyPasswords($request);
        $rules = $this->form->getValidateRules($req);
        $validator = Validator::make($req,$rules);
        if($validator->fails()) dd($validator->errors());
        
        return User::updateOrCreate(
            ['id'=>$req['id']],
            $req // array comes from request->all()
        );        
    }    

/* UserFormService */ 
     /**
     * check if input contains the empty password
     * and process accordingly to that
     * @param  object $request -Illuminate\Http\Request;
     * @return object $req  
     */
    public function extractEmptyPasswords($request){
        // if password field is empty
        // extract password and password confirmation 
        // fields from the request
        if(empty($request->password)){
            $req = $request->except(['password','password_confirmation']);
        }else{
        // otherwise get all request fields
            $req = $request->all();
        }
        
        return $req;
    }
    /**
     * get the appropriate verification 
     * rules for the request
     * @param  object $req 
     * @return array $rules  
     */
    public function getValidateRules($req){       
        if(isset($req['id'])){
            // get rules to update a existing user
            $rules = [
                'name' => 'sometimes|required|string',
                'email' => 'sometimes|required|unique:users,id,'.$req['id'],
                'password' => 'sometimes|required|min:6|confirmed',
            ];
        }else{
            // get rules to create a new user
            $rules = [
                'name' => 'required|string',
                'email' => 'required|unique:users',
                'password' => 'required|min:6|confirmed',
            ];
        }
        return $rules;
    }