Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 59
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
Sepa
0.00% covered (danger)
0.00%
0 / 59
0.00% covered (danger)
0.00%
0 / 3
182
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 send_vefification_email
0.00% covered (danger)
0.00%
0 / 54
0.00% covered (danger)
0.00%
0 / 1
110
 isEmailValid
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3namespace App\Http\Controllers;
4
5use App\Exceptions\AppException;
6use App\Services\SendgridLogger;
7use Illuminate\Contracts\Routing\ResponseFactory;
8use Illuminate\Http\Request;
9use Illuminate\Http\Response;
10use Illuminate\Support\Facades\Validator;
11use SendGrid\Mail\Mail;
12
13class Sepa extends Controller
14{
15    public function __construct() {}
16
17    public function send_vefification_email(Request $request): ResponseFactory|Response
18    {
19
20        try {
21
22            $data = $request->all();
23
24            $validator = Validator::make($data, [
25                'email' => ['required', 'email'],
26                'verification_link' => ['required', 'url'],
27            ]);
28
29            if ($validator->fails()) {
30
31                if ($validator->errors()->has('verification_link')
32                    && ! $request->has('verification_link')) {
33
34                    return response()->json([
35                        'status' => 'error',
36                        'message' => 'Missing required field: verification_link',
37                        'code' => 'MISSING_FIELD',
38                    ], 400);
39                }
40
41                if ($validator->errors()->has('email')
42                    && ! $request->has('email')) {
43
44                    return response()->json([
45                        'status' => 'error',
46                        'message' => 'Missing required field: email',
47                        'code' => 'MISSING_FIELD',
48                    ], 400);
49                }
50
51                if (! $this->isEmailValid($data['email'])) {
52                    return response([
53                        'status' => 'error',
54                        'message' => 'Invalid email address format',
55                        'code' => 'INVALID_EMAIL',
56                    ], 400);
57                }
58
59            }
60
61            $toEmail = $data['email'];
62
63            $mail = new Mail;
64
65            $mail->setFrom('fire@fire.es', 'Fire Service Titan');
66            $mail->addTo($toEmail);
67            $mail->setTemplateId('d-39337e738fc04ba68767b7d13124e2cf');
68            $mail->addDynamicTemplateDatas([
69                'verification_link' => $data['verification_link'],
70            ]);
71
72            $sendgrid = new \SendGrid(config('services.sendgrid.api_key'));
73
74            try {
75                $response = $sendgrid->send($mail);
76                SendgridLogger::log($mail, $response);
77            } catch (\Throwable $sendException) {
78                SendgridLogger::logException($mail, $sendException);
79                throw $sendException;
80            }
81
82            if ($response->statusCode() == 202) {
83                return response([
84                    'status' => 'success',
85                    'message' => 'Verification email sent successfully',
86                    'email' => $toEmail,
87                ], 200);
88            }
89
90            return response([
91                'status' => 'error',
92                'message' => 'Failed to send email. Please try again later.',
93                'code' => 'EMAIL_DELIVERY_FAILED',
94            ], 500);
95
96        } catch (\Exception $e) {
97            report(AppException::fromException($e, 'SEND_VERIFICATION_EMAIL_EXCEPTION'));
98
99            return response(['message' => 'KO', 'error' => $e->getMessage()]);
100        }
101
102    }
103
104    public function isEmailValid($email): bool
105    {
106
107        $pattern = '/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/';
108
109        if (preg_match($pattern, (string) $email)) {
110            return true;
111        } else {
112            return false;
113        }
114
115    }
116}