all(), [ 'first_name' => 'required|string|regex:/^([А-Я][А-Яа-я]*)$/u', 'last_name' => 'required|string|regex:/^([А-Я][А-Яа-я]*)$/u', 'patronymic' => 'string|regex:/^([А-Я][А-Яа-я]*)$/u', 'avatar' => 'image|mimes:png,jpg,jpeg|max:4096', 'email' => 'required|string|email|unique:users', 'password' => 'required|string|min:3' ]); if ($v->fails()) return $this->error($v->errors(), 'Validation failed'); $data = $v->validated(); $password = $data['password']; if (!preg_match('/[A-ZА-Я]/', $password)) return $this->error(['password' => ['Пароль должен содержать минимум 1 прописную букву']], 'Validation failed'); if (!preg_match('/[a-zа-я]/', $password)) return $this->error(['password' => ['Пароль должен содержать минимум 1 строчную букву']], 'Validation failed'); if (!preg_match('/\d/', $password)) return $this->error(['password' => ['Пароль должен содержать минимум 1 цифру']], 'Validation failed'); $avatar = $request->file('avatar'); if ($avatar) { $filename = Str::random() . '.' . $avatar->getClientOriginalExtension(); $avatar->move(public_path('images'), $filename); $data['avatar'] = url('/images/' . $filename); } else { unset($data['avatar']); } $user = User::query()->create($data); return $this->success(new UserResource($user), 'Successfully registered'); } public function login(Request $request) { $v = validator($request->all(), [ 'email' => 'required|string|email|exists:users', 'password' => 'required|string' ]); if ($v->fails()) return $this->error($v->errors(), 'Validation failed'); if (!Auth::attempt($v->validated())) return $this->error(message: 'Login failed', status: 401); $user = Auth::user(); $token = Str::random(); $user->update(compact('token')); return $this->success([ 'profile' => new UserResource($user), 'credentials' => compact('token') ], 'Successfully logged in!'); } public function logout() { Auth::user()->update(['token' => null]); return $this->success(message: 'Successfully logged out!'); } }