diff --git a/app/Http/Controllers/Mobile/MobileRegisterController.php b/app/Http/Controllers/Mobile/MobileRegisterController.php old mode 100644 new mode 100755 index 8d982f1..a950809 --- a/app/Http/Controllers/Mobile/MobileRegisterController.php +++ b/app/Http/Controllers/Mobile/MobileRegisterController.php @@ -2,125 +2,62 @@ namespace App\Http\Controllers\Mobile; -use Illuminate\Http\Request; -use Illuminate\Support\Facades\Validator; -use Illuminate\Support\Facades\Hash; +use App\Http\Requests\Auth\RegisterRequest; +use App\Services\Auth\RegisterService; +use Illuminate\Http\JsonResponse; +use Illuminate\Http\Response; use Illuminate\Support\Facades\Auth; -use Illuminate\Validation\Rule; -use App\Rules\MinWords; -use App\Models\CircumferenceMeasure; -use App\Models\UserDetailz; -use App\Models\User; +use Laravel\Fortify\Http\Requests\LoginRequest; +use Laravel\Sanctum\NewAccessToken; -class MobileRegisterController { +class MobileRegisterController +{ + private RegisterService $service; - public function register(Request $request) { - - $validator = Validator::make($request->all(), [ - 'email' => 'required|email|unique:users,email', - 'password' => 'required|min:6', - 'password_confirmation' => 'required|same:password', - ]); - - if ($validator->fails()) { - return response()->json(['errors' => $validator->errors()], 422); - } - - $detailz = [ - 'first_name' => $request->first_name, - 'last_name' => $request->last_name, - 'birthdate' => $request->birthdate, - 'gender' => $request->gender, - 'country' => $request->country, - 'city' => $request->city, - 'lang' => $request->lang, - 'weight' => $request->weight, - 'height' => $request->height, - 'chest_circumference' => $request->chest_circumference ?? 0, - 'waist_circumference' => $request->waist_circumference ?? 0, - 'hip_circumference' => $request->hip_circumference ?? 0, - 'blood_pressure_up' => $request->blood_pressure_up ?? 0, - 'blood_pressure_down' => $request->blood_pressure_down ?? 0, - 'has_hypo' => $request->has_hypo ?? false, - 'has_hyper' => $request->has_hyper ?? false, - 'about_alergy' => $request->about_alergy ?? '', - 'about_taking_pils' => $request->about_taking_pils ?? '', - 'about_sport_hobbies' => $request->about_sport_hobbies ?? '', - 'favorite_foods' => $request->favorite_foods ?? '', - 'unfavorite_foods' => $request->unfavorite_foods ?? '', - 'additional_info' => $request->additional_info?? '', - ]; - - $validator = Validator::make($detailz, [ - 'first_name' => ['required', 'string', 'max:255'], - 'last_name' => ['required', 'string', 'max:255'], - 'birthdate' => ['required', 'date'], - 'gender' => ['required', Rule::in(['male', 'female'])], - 'country' => ['required', 'string', 'max:255'], - 'city' => ['required', 'string', 'max:255'], - 'lang' => ['required', 'string', 'max:255'], - 'weight' => ['required', 'integer'], - 'height' => ['required', 'integer'], - 'chest_circumference' => ['required', 'integer'], - 'waist_circumference' => ['required', 'integer'], - 'hip_circumference' => ['required', 'integer'], - 'blood_pressure_up' => ['required', 'integer'], - 'blood_pressure_down' => ['required', 'integer'], - 'has_hypo' => ['required', Rule::in(['0', '1'])], - 'has_hyper' => ['required', Rule::in(['0', '1'])], - 'about_alergy' => ['sometimes', 'nullable', new MinWords(1)], - 'about_taking_pils' => ['sometimes', 'nullable', new MinWords(1)], - 'about_sport_hobbies' => ['sometimes', 'nullable', new MinWords(1)], - 'favorite_foods' => ['sometimes', 'nullable', new MinWords(1)], - 'unfavorite_foods' => ['sometimes', 'nullable', new MinWords(1)], - 'additional_info' => ['sometimes', 'nullable', new MinWords(1)], - ]); - - if ($validator->fails()) { - return response()->json(['errors' => $validator->errors()], 422); - } - - //Валидация пройдена успешно - - $newUser = User::create([ - 'name' => $request->first_name, - 'email' => $request->email, - 'password' => Hash::make($request->password), - ]); - - $token = $newUser->createToken('mobile'); - - $detailz['user_id'] = $newUser->id; - $detailz['is_mood_fillable'] = true; - $detailz['is_bedtime_fillable'] = true; - - UserDetailz::create($detailz); - - CircumferenceMeasure::create([ - 'user_id' => $newUser->id, - 'chest_circumference' => $detailz['chest_circumference'], - 'waist_circumference' => $detailz['waist_circumference'], - 'hip_circumference' => $detailz['hip_circumference'] - ]); - - $credentials = $request->only('email', 'password'); - - if (Auth::attempt($credentials)) { - $token = $newUser->createToken('mobile'); - return response()->json(['token' => $token], 200); - } else { - return response()->json(['error' => 'Упс! Произошла ошибка при регистрации. Проверьте введенные данные'], 401); - } - } - - public function login(Request $request) + public function __construct(RegisterService $service) { - $credentials = $request->only('email', 'password'); - if (Auth::attempt($credentials)) { - $token = $request->user()->createToken('mobile'); - return response()->json(['token' => $token], 200); - } else { - return response()->json(['error' => 'Упс! Произошла ошибка при аутентифицации. Проверьте введенные данные'], 401); - } + $this->service = $service; } -} \ No newline at end of file + + public function register(RegisterRequest $request): JsonResponse + { + $this->service->registerCommand($request); + + if (!$token = $this->attemptLoginAndCreateToken($request)) { + return response()->json(['error' => 'Упс! Произошла ошибка при регистрации. Проверьте введенные данные'], + Response::HTTP_UNPROCESSABLE_ENTITY); + } + + return response()->json(['token' => $token], Response::HTTP_OK); + + // $this->login($request->only('email', 'password')); + } + + public function login(LoginRequest $request): JsonResponse + { + if (!$token = $this->attemptLoginAndCreateToken($request)) { + return response()->json(['error' => 'Упс! Произошла ошибка при аутентификации. Проверьте введенные данные'], + Response::HTTP_UNAUTHORIZED); + } + + return response()->json(['token' => $token], Response::HTTP_OK); + } + + private function attemptLoginAndCreateToken(RegisterRequest|LoginRequest $request): ?string + { + if (Auth::attempt($request->only('email', 'password'))) { + return $request->user()->createToken('mobile')->plainTextToken; + } + + return null; + } + + // public function logout(Request $request) + // { + // auth()->user()->tokens()->delete(); + // return [ + // 'message' => 'Logged out' + // ]; + // } + +} diff --git a/app/Http/Requests/Auth/LoginRequest.php b/app/Http/Requests/Auth/LoginRequest.php new file mode 100644 index 0000000..6c8c3b4 --- /dev/null +++ b/app/Http/Requests/Auth/LoginRequest.php @@ -0,0 +1,31 @@ + + */ + public function rules(): array + { + return [ + 'email' => 'required|email|unique:users,email', + 'password' => 'required|min:6', + ]; + } +} diff --git a/app/Http/Requests/Auth/RegisterRequest.php b/app/Http/Requests/Auth/RegisterRequest.php new file mode 100755 index 0000000..c1972e8 --- /dev/null +++ b/app/Http/Requests/Auth/RegisterRequest.php @@ -0,0 +1,87 @@ + $field) { + $data[$field] = $data[$field] ?? $defaults_values[$index]; + } + + return $data; + } + + /** + * Get the validation rules that apply to the request. + * + * @return array|string> + */ + public function rules(): array + { + return [ + 'email' => 'required|email|unique:users,email', + 'password' => 'required|min:6', + 'password_confirmation' => 'required|same:password', + 'first_name' => ['required', 'string', 'max:255'], + 'last_name' => ['required', 'string', 'max:255'], + 'birthdate' => ['required', 'date'], + 'gender' => ['required', Rule::in(['male', 'female'])], + 'country' => ['required', 'string', 'max:255'], + 'city' => ['required', 'string', 'max:255'], + 'lang' => ['required', 'string', 'max:255'], + 'weight' => ['required', 'integer'], + 'height' => ['required', 'integer'], + 'chest_circumference' => ['required', 'integer'], + 'waist_circumference' => ['required', 'integer'], + 'hip_circumference' => ['required', 'integer'], + 'blood_pressure_up' => ['required', 'integer'], + 'blood_pressure_down' => ['required', 'integer'], + 'has_hypo' => ['required', Rule::in(['0', '1'])], + 'has_hyper' => ['required', Rule::in(['0', '1'])], + 'about_alergy' => ['sometimes', 'nullable', new MinWords(1)], + 'about_taking_pils' => ['sometimes', 'nullable', new MinWords(1)], + 'about_sport_hobbies' => ['sometimes', 'nullable', new MinWords(1)], + 'favorite_foods' => ['sometimes', 'nullable', new MinWords(1)], + 'unfavorite_foods' => ['sometimes', 'nullable', new MinWords(1)], + 'additional_info' => ['sometimes', 'nullable', new MinWords(1)], + ]; + } +} diff --git a/app/Services/Auth/RegisterService.php b/app/Services/Auth/RegisterService.php new file mode 100644 index 0000000..392ddbe --- /dev/null +++ b/app/Services/Auth/RegisterService.php @@ -0,0 +1,58 @@ + $request->first_name, + 'email' => $request->email, + 'password' => Hash::make($request->password), + ]); + + $token = $newUser->createToken('mobile'); + + UserDetailz::create($this->buildUserDetailz($request, $newUser)); + + CircumferenceMeasure::create([ + 'user_id' => $newUser->id, + 'chest_circumference' => $request->chest_circumference, + 'waist_circumference' => $request->waist_circumference, + 'hip_circumference' => $request->hip_circumference + ]); + } + + public function login(){} + + private function buildUserDetailz(RegisterRequest $request, User $newUser): array + { + $userDetailzData = []; + + $fields = [ + 'first_name', 'last_name', 'birthdate', 'gender', 'country', 'city', 'lang', 'weight', 'height', + 'chest_circumference', 'waist_circumference', 'hip_circumference', 'blood_pressure_up', 'blood_pressure_down', + 'has_hypo', 'has_hyper', 'about_alergy', 'about_taking_pils', 'about_sport_hobbies', 'favorite_foods', + 'unfavorite_foods', 'additional_info', 'is_mood_fillable', 'is_bedtime_fillable' + ]; + + foreach($fields as $index => $field) + { + $userDetailzData[$field] = $request->{$field}; + } + + $userDetailzData['user_id'] = $newUser->id; + + return $userDetailzData; + } +}