feat: add verify with link and back to app
This commit is contained in:
@@ -139,44 +139,63 @@ public function login(Request $request)
|
||||
'token' => $token,
|
||||
]);
|
||||
}
|
||||
public function resendEmailVerification(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'email' => 'required|email',
|
||||
]);
|
||||
|
||||
$user = User::where('email', $request->email)->first();
|
||||
|
||||
if (!$user) {
|
||||
return response()->json(['message' => 'User not found'], 404);
|
||||
}
|
||||
|
||||
if ($user->email_verified_at) {
|
||||
return response()->json(['message' => 'Email is already verified'], 400);
|
||||
}
|
||||
|
||||
// Generate new code
|
||||
$code = rand(1000, 9999);
|
||||
|
||||
// Delete previous codes
|
||||
\DB::table('email_verifications')->where('user_id', $user->id)->delete();
|
||||
|
||||
// Insert new verification code
|
||||
\DB::table('email_verifications')->insert([
|
||||
'user_id' => $user->id,
|
||||
'code' => $code,
|
||||
'expires_at' => now()->addMinutes(15),
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
|
||||
// Send email
|
||||
\Mail::to($user->email)->send(new \App\Mail\VerifyEmailCodeMail($code));
|
||||
|
||||
return response()->json([
|
||||
'message' => 'Verification email resent successfully'
|
||||
]);
|
||||
public function resendEmailVerification(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'email' => 'required|email',
|
||||
'method' => 'string|in:code,link|nullable',
|
||||
'package_name' => 'string|required',
|
||||
]);
|
||||
|
||||
$method = $data['method'] ?? 'code';
|
||||
$packageNameValue = $data['package_name'];
|
||||
unset($data['package_name']);
|
||||
|
||||
$user = User::where('email', $data['email'])->first();
|
||||
// return response()->json(['message' => $user]);
|
||||
|
||||
if (!$user) {
|
||||
return response()->json(['message' => 'User not found'], 404);
|
||||
}
|
||||
|
||||
if ($user->email_verified_at) {
|
||||
return response()->json(['message' => 'Email is already verified'], 400);
|
||||
}
|
||||
|
||||
$code = rand(1000, 9999);
|
||||
$token = Str::random(64);
|
||||
|
||||
\DB::table('email_verifications')->where('user_id', $user->id)->delete();
|
||||
|
||||
\DB::table('email_verifications')->insert([
|
||||
'user_id' => $user->id,
|
||||
'code' => $code,
|
||||
'token' => $token,
|
||||
'expires_at' => now()->addMinutes(15),
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
|
||||
try {
|
||||
if ($method === 'code') {
|
||||
\Mail::to($user->email)->send(new \App\Mail\VerifyEmailCodeMail($code));
|
||||
} else {
|
||||
$verificationUrl = url("api/auth/verify-email-link/{$token}?package={$packageNameValue}");
|
||||
\Mail::to($user->email)->send(new \App\Mail\VerifyEmailLinkMail($verificationUrl));
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
// rollback verification
|
||||
\DB::table('email_verifications')->where('user_id', $user->id)->delete();
|
||||
|
||||
return response()->json([
|
||||
'error' => $e->getMessage(),
|
||||
'message' => 'ارسال ایمیل با مشکل مواجه شد، لطفا دوباره تلاش کنید'
|
||||
], 400);
|
||||
}
|
||||
|
||||
return response()->json(['message' => 'Verification email resent successfully']);
|
||||
}
|
||||
|
||||
public function register(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
@@ -186,11 +205,16 @@ public function register(Request $request)
|
||||
'password' => 'string|nullable|required_with:email',
|
||||
'mobile' => ['string', new MobileNumber, 'nullable', 'required_without:email'],
|
||||
'fcm_token' => 'string|nullable',
|
||||
'package_name' => 'string|required'
|
||||
'package_name' => 'string|required',
|
||||
'method' => 'string|in:code,link|nullable'
|
||||
]);
|
||||
|
||||
$packageNameValue = $data['package_name'];
|
||||
unset($data['package_name']);
|
||||
$method = $data['method'] ?? 'code';
|
||||
unset($data['method']);
|
||||
|
||||
// Extract and remove package_name
|
||||
$packageNameValue = $data['package_name'];
|
||||
unset($data['package_name']);
|
||||
|
||||
if (isset($data['mobile'])) {
|
||||
$data['mobile'] = MobileNumberHelper::formatMobile($data['mobile']);
|
||||
@@ -203,21 +227,35 @@ public function register(Request $request)
|
||||
return response()->json(['message' => 'Email already exists'], 400);
|
||||
}
|
||||
|
||||
$code = rand(1000, 9999);
|
||||
$token = Str::random(64);
|
||||
// ✅ Check if email can receive a message before creating the user
|
||||
if (isset($data['email'])) {
|
||||
$code = rand(1000, 9999);
|
||||
|
||||
try {
|
||||
// Try sending email
|
||||
\Mail::to($data['email'])->send(new \App\Mail\VerifyEmailCodeMail($code));
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => $e->getCode(),
|
||||
'error' => $e->getMessage(),
|
||||
'message' => 'لطفا آدرس ایمیل خود را بررسی کنید و مجدد تلاش کنید',
|
||||
// $code = rand(1000, 9999);
|
||||
try {
|
||||
if ($method === 'code') {
|
||||
\Mail::to($data['email'])->send(new \App\Mail\VerifyEmailCodeMail($code));
|
||||
} else {
|
||||
$verificationUrl = url("api/auth/verify-email-link/{$token}?package={$packageNameValue}");
|
||||
\Mail::to($data['email'])->send(new \App\Mail\VerifyEmailLinkMail($verificationUrl));
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'error' => $e->getMessage(),
|
||||
'message' => 'لطفا آدرس ایمیل خود را بررسی کنید و مجدد تلاش کنید'
|
||||
], 400);
|
||||
}
|
||||
// try {
|
||||
// // Try sending email
|
||||
// \Mail::to($data['email'])->send(new \App\Mail\VerifyEmailCodeMail($code));
|
||||
// } catch (\Exception $e) {
|
||||
// return response()->json([
|
||||
// 'code' => $e->getCode(),
|
||||
// 'error' => $e->getMessage(),
|
||||
// 'message' => 'لطفا آدرس ایمیل خود را بررسی کنید و مجدد تلاش کنید',
|
||||
|
||||
], 400);
|
||||
}
|
||||
// ], 400);
|
||||
// }
|
||||
}
|
||||
|
||||
// Hash password
|
||||
@@ -237,15 +275,17 @@ public function register(Request $request)
|
||||
}
|
||||
|
||||
// Save email verification code after user is created
|
||||
if (isset($data['email'])) {
|
||||
\DB::table('email_verifications')->insert([
|
||||
'user_id' => $user->id,
|
||||
'code' => $code,
|
||||
// if (isset($data['email'])) {
|
||||
\DB::table('email_verifications')->where('user_id', $user->id)->delete();
|
||||
\DB::table('email_verifications')->insert([
|
||||
'user_id' => $user->id,
|
||||
'code' => $code,
|
||||
'token' => $token,
|
||||
'expires_at' => now()->addMinutes(15),
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
}
|
||||
]);
|
||||
// }
|
||||
|
||||
// Create token
|
||||
$token = $user->createToken('token', $user->is_admin ? ['admin'] : ['user'])->plainTextToken;
|
||||
@@ -286,6 +326,44 @@ public function verifyEmailCode(Request $request)
|
||||
$token = $user->createToken('token', $user->is_admin ? ['admin'] : ['user'])->plainTextToken;
|
||||
return response()->json(['message' => 'Email verified successfully', 'token' => $token]);
|
||||
}
|
||||
public function verifyEmailLink(Request $request, $token)
|
||||
{
|
||||
$record = \DB::table('email_verifications')
|
||||
->where('token', $token)
|
||||
->where('expires_at', '>', now())
|
||||
->first();
|
||||
|
||||
if (!$record) {
|
||||
return response()->json(['message' => 'Invalid or expired token'], 400);
|
||||
}
|
||||
|
||||
$user = User::find($record->user_id);
|
||||
if (!$user) {
|
||||
return response()->json(['message' => 'User not found'], 404);
|
||||
}
|
||||
|
||||
$user->update(['email_verified_at' => now()]);
|
||||
|
||||
\DB::table('email_verifications')->where('id', $record->id)->delete();
|
||||
|
||||
// Optionally redirect to app deep link
|
||||
$packageName = $request->query('package');
|
||||
if ($packageName && $package = \App\Models\PackageName::where('name', $packageName)->first()) {
|
||||
if ($package->web_app_url) {
|
||||
return redirect()->away($package->web_app_url . '?verified=1');
|
||||
}
|
||||
}
|
||||
|
||||
// $packageName = $request->query('package') ?? 'default';
|
||||
$deepLink = "approagency://{$packageName}?verified=1";
|
||||
|
||||
return view('emails.verified', [
|
||||
'status' => 'success',
|
||||
'message' => 'ایمیل شما با موفقیت تایید شد',
|
||||
'deepLink' => $deepLink,
|
||||
]);
|
||||
}
|
||||
|
||||
public function loginOTP(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
namespace App\Mail;
|
||||
|
||||
use Illuminate\Bus\Queueable;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Mail\Mailable;
|
||||
use Illuminate\Mail\Mailables\Content;
|
||||
use Illuminate\Mail\Mailables\Envelope;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
|
||||
class VerifyEmailLinkMail extends Mailable
|
||||
{
|
||||
use Queueable, SerializesModels;
|
||||
|
||||
public $verificationUrl;
|
||||
|
||||
/**
|
||||
* Create a new message instance.
|
||||
*/
|
||||
public function __construct($verificationUrl)
|
||||
{
|
||||
$this->verificationUrl = $verificationUrl;
|
||||
}
|
||||
public function build()
|
||||
{
|
||||
return $this->subject('Verify Your Email Address')
|
||||
->markdown('emails.verify-link')
|
||||
->with([
|
||||
'verificationUrl' => $this->verificationUrl,
|
||||
]);
|
||||
}
|
||||
/**
|
||||
* Get the message envelope.
|
||||
*/
|
||||
public function envelope(): Envelope
|
||||
{
|
||||
return new Envelope(
|
||||
subject: 'Verify Email Link Mail',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the message content definition.
|
||||
*/
|
||||
public function content(): Content
|
||||
{
|
||||
return new Content(
|
||||
markdown: 'emails.verify-link',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the attachments for the message.
|
||||
*
|
||||
* @return array<int, \Illuminate\Mail\Mailables\Attachment>
|
||||
*/
|
||||
public function attachments(): array
|
||||
{
|
||||
return [];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user