feat: add verify with link and back to app

This commit is contained in:
2025-09-18 23:18:36 +03:30
parent e44d4064df
commit afd7e349d4
6 changed files with 403 additions and 58 deletions
+136 -58
View File
@@ -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([