Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
67 / 67
100.00% covered (success)
100.00%
6 / 6
CRAP
100.00% covered (success)
100.00%
1 / 1
AuthController
100.00% covered (success)
100.00%
67 / 67
100.00% covered (success)
100.00%
6 / 6
10
100.00% covered (success)
100.00%
1 / 1
 login
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
2
 logout
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
1
 forgot
100.00% covered (success)
100.00%
18 / 18
100.00% covered (success)
100.00%
1 / 1
2
 register
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
1
 reset
100.00% covered (success)
100.00%
26 / 26
100.00% covered (success)
100.00%
1 / 1
3
 user
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3namespace App\Http\Controllers;
4
5use App\Http\Resources\AuthResource;
6use App\Mail\Reset;
7use App\Models\User;
8use Carbon\Carbon;
9use Illuminate\Http\JsonResponse;
10use Illuminate\Http\Request;
11use Illuminate\Http\Response;
12use Illuminate\Support\Facades\Auth;
13use Illuminate\Support\Facades\Cookie;
14use Illuminate\Support\Facades\DB;
15use Illuminate\Support\Facades\Hash;
16use Illuminate\Support\Facades\Mail;
17use Illuminate\Support\Str;
18
19class AuthController extends Controller
20{
21    public function login(Request $request): JsonResponse|Response
22    {
23        if (! Auth::attempt($request->only('email', 'password'))) {
24            return response()->json([
25                'message' => __('validation.invalid_credentials'),
26                'errors' => ['form_info' => __('validation.invalid_credentials')],
27            ], 422);
28        }
29
30        $user = Auth::user();
31        $token = $user->createToken('token')->plainTextToken;
32
33        return response(new AuthResource($user))
34            ->cookie('jwt', $token, 3 * 60 * 24);
35    }
36
37    public function logout(Request $request): Response
38    {
39        Cookie::queue(Cookie::forget('jwt'));
40        Cookie::queue(Cookie::forget(config('session.cookie')));
41
42        $request->user()->tokens()->delete();
43
44        return response(['message' => 'logout']);
45    }
46
47    public function forgot(Request $request): JsonResponse
48    {
49        $data = $request->validate([
50            'email' => 'required|email',
51        ]);
52
53        $user = User::whereEmail($data['email'])->first();
54        if (! $user) {
55            return response()->json([
56                'message' => 'Check your email',
57            ]);
58        }
59
60        $token = Str::random(12);
61
62        DB::table('password_reset_tokens')->insert([
63            'email' => $user->email,
64            'token' => $token,
65            'created_at' => now(),
66        ]);
67
68        Mail::to($user->email)->queue(new Reset($token));
69
70        return response()->json([
71            'message' => 'Check your email',
72        ]);
73    }
74
75    public function register(Request $request)
76    {
77        $data = $request->validate([
78            'name' => ['required', 'string', 'min:3'],
79            'email' => ['required', 'email', 'unique:users,email'],
80            'password' => ['required', 'min:8'],
81        ]);
82
83        $user = User::create($data);
84        $token = $user->createToken('token')->plainTextToken;
85
86        return response(new AuthResource($user))
87            ->cookie('jwt', $token, 3 * 60 * 24);
88    }
89
90    public function reset(Request $request): JsonResponse
91    {
92        $data = $request->validate([
93            'email' => 'exists:users,email',
94            'token' => 'exists:password_reset_tokens,token',
95            'password' => ['required', 'regex:/^(?=.*?[A-Z])(?=.*[a-z])(?=.*[0-9]).{8,}$/'],
96            'confirm_password' => 'same:password',
97        ], [
98            'password.regex' => __('validation.password_rules'),
99            'confirm_password.same' => __('validation.password_confirm'),
100        ]);
101
102        $token = DB::table('password_reset_tokens')
103            ->whereEmail($data['email'])
104            ->whereToken($data['token'])
105            ->orderBy('created_at', 'desc')
106            ->first();
107
108        if ($token !== null
109            && (new Carbon($token->created_at))->addDay() > now()) {
110            $user = User::whereEmail($data['email'])->first();
111            $user->update(['password' => Hash::make($data['password'])]);
112
113            DB::table('password_reset_tokens')
114                ->whereEmail($data['email'])
115                ->delete();
116
117            return response()->json(['message' => 'New password success']);
118        }
119
120        return response()->json([
121            'message' => __('validation.invalid_credentials'),
122            'errors' => ['form_info' => __('validation.invalid_credentials')],
123        ], 422);
124    }
125
126    public function user(Request $request): JsonResponse
127    {
128        return response()->json(new AuthResource($request->user()));
129    }
130}